as-model 0.2.9 → 0.3.1

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.
Files changed (2) hide show
  1. package/index.d.ts +133 -125
  2. package/package.json +1 -1
package/index.d.ts CHANGED
@@ -27,10 +27,18 @@ declare type ValidInstance<S, T extends ModelInstance> = {
27
27
  : T[K];
28
28
  };
29
29
 
30
- export declare type Model<S, T extends ModelInstance> = (
30
+ export declare type Model<S = any, T extends ModelInstance = any> = (
31
31
  state: S
32
32
  ) => ValidInstance<S, T>;
33
33
 
34
+ export type PickState<R extends Model> = R extends (state: infer S) => any
35
+ ? S
36
+ : never;
37
+
38
+ export type Instance<R extends Model> = R extends (state: any) => infer T
39
+ ? T
40
+ : never;
41
+
34
42
  export declare type Action<S = any, T extends ModelInstance = ModelInstance> = {
35
43
  type: null | string;
36
44
  method: null | ((...args: any[]) => any);
@@ -49,22 +57,18 @@ export interface Token {
49
57
  export declare type Dispatch = (action: Action) => any;
50
58
 
51
59
  export declare interface Key<
52
- S = any,
53
- T extends ModelInstance = any,
54
- R extends (instance: () => T) => any = (instance: () => T) => T
55
- > extends Model<S, T> {
56
- (s: S): T;
57
- source: Model<S, T>;
58
- selector: R;
60
+ M extends Model = any,
61
+ R extends undefined | ((instance: () => Instance<M>) => any) = undefined
62
+ > extends M {
63
+ (s: PickState<M>): Instance<M>;
64
+ source: M;
65
+ wrapper: R;
59
66
  modelKeyIdentifier: () => boolean;
60
67
  [k: string]: any;
61
- defaultState?: S;
68
+ defaultState?: PickState<M>;
62
69
  }
63
70
 
64
- declare interface UpdaterStore<
65
- S = any,
66
- T extends ModelInstance = ModelInstance
67
- > {
71
+ declare interface UpdaterStore<S = any, T extends ModelInstance = any> {
68
72
  getState: () => { state: S; instance: T };
69
73
  dispatch: (action: Action) => void;
70
74
  }
@@ -85,114 +89,110 @@ export declare interface Config {
85
89
  /** createStore * */
86
90
 
87
91
  export declare interface StoreIndex<
88
- S = any,
89
- T extends ModelInstance = any,
90
- R extends (instance: () => T) => any = (instance: () => T) => T
92
+ M extends Model,
93
+ R extends undefined | ((instance: () => Instance<M>) => any) = undefined
91
94
  > {
92
- key: Key<S, T, R>;
95
+ key: Key<M, R>;
93
96
  }
94
97
 
95
98
  export declare interface Store<
96
- S = any,
97
- T extends ModelInstance = any,
98
- R extends (instance: () => T) => any = (instance: () => T) => T
99
- > extends StoreIndex<S, T, R> {
99
+ M extends Model,
100
+ R extends undefined | ((instance: () => Instance<M>) => any) = undefined
101
+ > extends StoreIndex<M, R> {
100
102
  subscribe: (dispatcher: Dispatch) => () => void;
101
103
  getToken: () => Token;
102
- getInstance: () => ReturnType<R>;
103
- getStoreInstance: () => T;
104
+ getInstance: () => R extends undefined
105
+ ? Instance<M>
106
+ : ReturnType<R extends undefined ? never : R>;
107
+ getStoreInstance: () => Instance<M>;
104
108
  update: (args?: {
105
- model?: Model<S, T>;
106
- key?: Key<S, T, R>;
107
- initialState?: S;
108
- state?: S;
109
+ model?: M;
110
+ key?: Key<M, R>;
111
+ initialState?: PickState<M>;
112
+ state?: PickState<M>;
109
113
  }) => void;
110
114
  destroy: () => void;
111
115
  payload: <P>(
112
116
  callback?: (payload: P | undefined) => P | undefined
113
117
  ) => P | undefined;
114
118
  isDestroyed: () => boolean;
115
- extends: <E extends Record<string, any>>(e: E) => Store<S, T, R> & E;
119
+ extends: <E extends Record<string, any>>(e: E) => Store<M, R> & E;
116
120
  }
117
121
 
118
122
  export declare function createStore<
119
- S,
120
- T extends ModelInstance,
121
- D extends S,
122
- R extends (instance: () => T) => any = (instance: () => T) => T
123
- >(
124
- model: Model<S, T> | Key<S, T, R> | ModelUsage<S, T, Model<S, T>, R>,
125
- state?: D
126
- ): Store<S, T, R>;
123
+ M extends Model,
124
+ D extends PickState<M>,
125
+ R extends undefined | ((instance: () => Instance<M>) => any) = undefined
126
+ >(model: M | Key<M, R> | ModelUsage<M, R>, state?: D): Store<M, R>;
127
127
 
128
128
  /** createKey * */
129
129
 
130
130
  export declare interface ModelKey<
131
- S = any,
132
- T extends ModelInstance = any,
133
- R extends (instance: () => T) => any = (instance: () => T) => T
134
- > extends Key<S, T, R> {
135
- (s: S): T;
136
- createStore: <D extends S>(state?: D) => Store<S, T, R>;
137
- extends: <E extends Record<string, any>>(e: E) => ModelKey<S, T, R> & E;
131
+ M extends Model = any,
132
+ R extends undefined | ((instance: () => Instance<M>) => any) = undefined
133
+ > extends Key<M, R> {
134
+ (s: PickState<M>): Instance<M>;
135
+ createStore: <D extends PickState<M>>(initialState?: D) => Store<M, R>;
136
+ extends: <E extends Record<string, any>>(e: E) => ModelKey<M, R> & E;
138
137
  }
139
138
 
140
139
  export declare function createKey<
141
- S,
142
- T extends ModelInstance,
143
- D extends S,
144
- R extends (instance: () => T) => any = (instance: () => T) => T
145
- >(
146
- model: Model<S, T> | ModelUsage<S, T, Model<S, T>, R>,
147
- state?: D
148
- ): ModelKey<S, T, R>;
140
+ M extends Model = any,
141
+ D extends PickState<M>,
142
+ R extends undefined | ((instance: () => Instance<M>) => any) = undefined
143
+ >(model: M | ModelUsage<M, R>, initialState?: D): ModelKey<M, R>;
149
144
 
150
145
  /** createStores * */
151
146
 
152
147
  export declare interface StoreCollection {
153
148
  find: <
154
- S,
155
- T extends ModelInstance,
156
- R extends (instance: () => T) => any = (instance: () => T) => T
149
+ M extends Model = any,
150
+ R extends undefined | ((instance: () => Instance<M>) => any) = undefined
157
151
  >(
158
- key: Key<S, T, R> | StoreIndex<S, T, R>
159
- ) => Store<S, T, R> | null;
160
- update: (...keys: (ModelKey | StoreIndex)[]) => void;
152
+ key: Key<M, R> | StoreIndex<M, R>
153
+ ) => Store<M, R> | null;
154
+ update: (...keys: (ModelKey<any, any> | StoreIndex<any, any>)[]) => void;
161
155
  keys: () => Key[];
162
156
  destroy: () => void;
163
157
  }
164
158
 
165
159
  export declare function createStores(
166
- ...modelKeys: (ModelKey | StoreIndex)[]
160
+ ...modelKeys: (ModelKey<any, any> | StoreIndex<any, any>)[]
167
161
  ): StoreCollection;
168
162
 
169
163
  /** model API * */
170
164
 
171
165
  export declare type ModelUsage<
172
- S,
173
- T extends ModelInstance,
174
- M extends Model<S, T>,
175
- R extends (instance: () => T) => any = (instance: () => T) => T
166
+ M extends Model,
167
+ R extends undefined | ((instance: () => Instance<M>) => any) = undefined
176
168
  > = M & {
177
- createKey: <D extends S>(state?: D) => ModelKey<S, T, R>;
178
- createStore: <D extends S>(state?: D) => Store<S, T, R>;
179
- produce: <C extends (instance: () => T) => any = (instance: () => T) => T>(
169
+ createKey: <D extends PickState<M>>(state?: D) => ModelKey<M, R>;
170
+ createStore: <D extends PickState<M>>(state?: D) => Store<M, R>;
171
+ produce: <
172
+ C extends (instance: () => Instance<M>) => any = (
173
+ instance: () => Instance<M>
174
+ ) => Instance<M>
175
+ >(
180
176
  s: C
181
- ) => ModelUsage<S, T, M, C>;
177
+ ) => ModelUsage<M, C>;
182
178
  wrapper: R;
183
- extends: <E extends Record<string, any>>(e: E) => ModelUsage<S, T, M, R> & E;
179
+ extends: <E extends Record<string, any>>(e: E) => ModelUsage<M, R> & E;
184
180
  };
185
181
 
186
182
  // eslint-disable-next-line @typescript-eslint/naming-convention
187
183
  export declare interface model {
184
+ <M extends Model>(modelFn: M): ModelUsage<M, undefined>;
185
+ <M extends Model, R extends (instance: () => Instance<M>) => any>(
186
+ modelFn: M,
187
+ s: R
188
+ ): ModelUsage<M, R>;
188
189
  <
189
- S,
190
- T extends ModelInstance,
191
- R extends (instance: () => T) => any = (instance: () => T) => T
190
+ M extends Model,
191
+ R extends undefined | ((instance: () => Instance<M>) => any) = undefined
192
192
  >(
193
- modelFn: Model<S, T>,
193
+ modelFn: M,
194
194
  s?: R
195
- ): ModelUsage<S, T, typeof modelFn, R>;
195
+ ): ModelUsage<M, R>;
196
196
  createField: <P extends () => any>(
197
197
  callback: P,
198
198
  deps?: any[]
@@ -210,51 +210,66 @@ export interface SignalOptions {
210
210
 
211
211
  // eslint-disable-next-line @typescript-eslint/no-redeclare
212
212
  declare interface SignalStore<
213
- S = any,
214
- T extends ModelInstance = any,
215
- R extends (instance: () => T) => any = (instance: () => T) => any
216
- > extends StoreIndex<S, T, R> {
213
+ M extends Model = any,
214
+ R extends undefined | ((instance: () => Instance<M>) => any) = undefined
215
+ > extends StoreIndex<M, R> {
217
216
  getToken: () => Token;
218
217
  subscribe: (dispatcher: Dispatch) => () => void;
219
218
  getSignal: () => {
220
- (options?: SignalOptions): ReturnType<R>;
219
+ (
220
+ options?: SignalOptions
221
+ ): R extends undefined
222
+ ? Instance<M>
223
+ : ReturnType<R extends undefined ? never : R>;
221
224
  startStatistics: () => void;
222
225
  stopStatistics: () => void;
223
226
  subscribe: (dispatcher: Dispatch) => () => void;
224
- store: Store<S, T, R>;
227
+ store: Store<M, R>;
225
228
  };
226
229
  }
227
230
 
228
231
  export declare function createSignal<
229
- S,
230
- T extends ModelInstance,
231
- R extends (instance: () => T) => any = (instance: () => T) => T
232
- >(store: Store<S, T, R>): SignalStore<S, T, R>;
232
+ M extends Model = any,
233
+ R extends undefined | ((instance: () => Instance<M>) => any) = undefined
234
+ >(store: Store<M, R>): SignalStore<M, R>;
233
235
 
234
236
  /** createSelector * */
235
237
 
236
238
  declare type SelectMethod<
237
239
  T extends ModelInstance = any,
238
- R extends (instance: () => T) => any = (instance: () => T) => T
240
+ R extends undefined | ((instance: () => T) => any) = undefined
239
241
  > = {
240
- (): ReturnType<R>;
241
- <C extends (instance: () => ReturnType<R>) => any>(
242
+ (): R extends undefined ? T : ReturnType<R extends undefined ? never : R>;
243
+ <
244
+ C extends (
245
+ instance: () => R extends undefined
246
+ ? T
247
+ : ReturnType<R extends undefined ? never : R>
248
+ ) => any
249
+ >(
242
250
  selector: C
243
251
  ): ReturnType<C>;
244
- <C extends (instance: () => ReturnType<R>) => any>(
252
+ <
253
+ C extends (
254
+ instance: () => R extends undefined
255
+ ? T
256
+ : ReturnType<R extends undefined ? never : R>
257
+ ) => any
258
+ >(
245
259
  selector?: C
246
- ): ReturnType<R> | ReturnType<C>;
260
+ ):
261
+ | (R extends undefined ? T : ReturnType<R extends undefined ? never : R>)
262
+ | ReturnType<C>;
247
263
  };
248
264
 
249
265
  // eslint-disable-next-line @typescript-eslint/no-redeclare
250
266
  declare interface SelectorStore<
251
- S = any,
252
- T extends ModelInstance = any,
253
- R extends (instance: () => T) => any = (instance: () => T) => T
254
- > extends StoreIndex<S, T, R> {
267
+ M extends Model = any,
268
+ R extends undefined | ((instance: () => Instance<M>) => any) = undefined
269
+ > extends StoreIndex<M, R> {
255
270
  getToken: () => Token;
256
271
  subscribe: (dispatcher: Dispatch) => () => void;
257
- select: SelectMethod<T, R>;
272
+ select: SelectMethod<Instance<M>, R>;
258
273
  }
259
274
 
260
275
  declare interface SelectorOption<T = any> {
@@ -262,31 +277,28 @@ declare interface SelectorOption<T = any> {
262
277
  }
263
278
 
264
279
  export declare function createSelector<
265
- S,
266
- T extends ModelInstance,
267
- R extends (instance: () => T) => any = (instance: () => T) => T
268
- >(store: Store<S, T, R>, opts?: SelectorOption): SelectorStore<S, T, R>;
280
+ M extends Model = any,
281
+ R extends undefined | ((instance: () => Instance<M>) => any) = undefined
282
+ >(store: Store<M, R>, opts?: SelectorOption): SelectorStore<M, R>;
269
283
 
270
284
  /** config * */
271
285
  export declare function config(configuration: Config): {
272
286
  createStore: <
273
- S,
274
- T extends ModelInstance,
275
- D extends S,
276
- R extends (instance: () => T) => any = (instance: () => T) => T
287
+ M extends Model,
288
+ D extends PickState<M>,
289
+ R extends undefined | ((instance: () => Instance<M>) => any) = undefined
277
290
  >(
278
- model: Model<S, T> | Key<S, T, R> | ModelUsage<S, T, R>,
291
+ modelLike: M | Key<M, R> | ModelUsage<M, R>,
279
292
  state?: D
280
- ) => Store<S, T, R>;
293
+ ) => Store<M, R>;
281
294
  createKey: <
282
- S,
283
- T extends ModelInstance,
284
- D extends S,
285
- R extends (instance: () => T) => any = (instance: () => T) => T
295
+ M extends Model,
296
+ D extends PickState<M>,
297
+ R extends undefined | ((instance: () => Instance<M>) => any) = undefined
286
298
  >(
287
- model: Model<S, T> | ModelUsage<S, T, R>,
299
+ modelLike: M | ModelUsage<M, R>,
288
300
  state?: D
289
- ) => ModelKey<S, T, R>;
301
+ ) => ModelKey<M, R>;
290
302
  createStores: (...modelKeys: (ModelKey | StoreIndex)[]) => StoreCollection;
291
303
  model: model;
292
304
  };
@@ -295,33 +307,29 @@ export declare function config(configuration: Config): {
295
307
  export declare const validations: {
296
308
  isInstanceFromNoStateModel: (instance: any) => boolean;
297
309
  isModelKey: <
298
- S,
299
- T extends ModelInstance,
300
- R extends (ins: () => T) => any = (ins: () => T) => T
310
+ M extends Model,
311
+ R extends undefined | ((instance: () => Instance<M>) => any) = undefined
301
312
  >(
302
313
  data: any
303
- ) => data is ModelKey<S, T, R>;
314
+ ) => data is ModelKey<M, R>;
304
315
  isModelStore: <
305
- S,
306
- T extends ModelInstance,
307
- R extends (ins: () => T) => any = (ins: () => T) => T
316
+ M extends Model,
317
+ R extends undefined | ((instance: () => Instance<M>) => any) = undefined
308
318
  >(
309
319
  data: any
310
- ) => data is Store<S, T, R>;
320
+ ) => data is Store<M, R>;
311
321
  isModelUsage: <
312
- S,
313
- T extends ModelInstance,
314
- R extends (ins: () => T) => any = (ins: () => T) => T
322
+ M extends Model,
323
+ R extends undefined | ((instance: () => Instance<M>) => any) = undefined
315
324
  >(
316
- data: any
317
- ) => data is ModelUsage<S, T, typeof data, R>;
325
+ data: M
326
+ ) => data is ModelUsage<typeof data, R>;
318
327
  isStoreIndex: <
319
- S,
320
- T extends ModelInstance,
321
- R extends (ins: () => T) => any = (ins: () => T) => T
328
+ M extends Model,
329
+ R extends undefined | ((instance: () => Instance<M>) => any) = undefined
322
330
  >(
323
331
  data: any
324
- ) => data is StoreIndex<S, T, R>;
332
+ ) => data is StoreIndex<M, R>;
325
333
  };
326
334
 
327
335
  /** tools * */
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "private": false,
3
3
  "name": "as-model",
4
- "version": "0.2.9",
4
+ "version": "0.3.1",
5
5
  "description": "This is a model state management tool",
6
6
  "license": "MIT",
7
7
  "author": "Jimmy.Harding",