as-model 0.2.9 → 0.3.0

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 (3) hide show
  1. package/README.md +558 -558
  2. package/index.d.ts +64 -47
  3. package/package.json +68 -68
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 = ModelInstance> = (
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);
@@ -51,11 +59,11 @@ export declare type Dispatch = (action: Action) => any;
51
59
  export declare interface Key<
52
60
  S = any,
53
61
  T extends ModelInstance = any,
54
- R extends (instance: () => T) => any = (instance: () => T) => T
62
+ R extends undefined | ((instance: () => T) => any) = undefined
55
63
  > extends Model<S, T> {
56
64
  (s: S): T;
57
65
  source: Model<S, T>;
58
- selector: R;
66
+ wrapper: R;
59
67
  modelKeyIdentifier: () => boolean;
60
68
  [k: string]: any;
61
69
  defaultState?: S;
@@ -87,7 +95,7 @@ export declare interface Config {
87
95
  export declare interface StoreIndex<
88
96
  S = any,
89
97
  T extends ModelInstance = any,
90
- R extends (instance: () => T) => any = (instance: () => T) => T
98
+ R extends undefined | ((instance: () => T) => any) = undefined
91
99
  > {
92
100
  key: Key<S, T, R>;
93
101
  }
@@ -95,11 +103,11 @@ export declare interface StoreIndex<
95
103
  export declare interface Store<
96
104
  S = any,
97
105
  T extends ModelInstance = any,
98
- R extends (instance: () => T) => any = (instance: () => T) => T
106
+ R extends undefined | ((instance: () => T) => any) = undefined
99
107
  > extends StoreIndex<S, T, R> {
100
108
  subscribe: (dispatcher: Dispatch) => () => void;
101
109
  getToken: () => Token;
102
- getInstance: () => ReturnType<R>;
110
+ getInstance: () => R extends undefined ? T : ReturnType<R>;
103
111
  getStoreInstance: () => T;
104
112
  update: (args?: {
105
113
  model?: Model<S, T>;
@@ -119,9 +127,9 @@ export declare function createStore<
119
127
  S,
120
128
  T extends ModelInstance,
121
129
  D extends S,
122
- R extends (instance: () => T) => any = (instance: () => T) => T
130
+ R extends undefined | ((instance: () => T) => any) = undefined
123
131
  >(
124
- model: Model<S, T> | Key<S, T, R> | ModelUsage<S, T, Model<S, T>, R>,
132
+ model: Model<S, T> | Key<S, T, R> | ModelUsage<Model<S, T>, R>,
125
133
  state?: D
126
134
  ): Store<S, T, R>;
127
135
 
@@ -130,7 +138,7 @@ export declare function createStore<
130
138
  export declare interface ModelKey<
131
139
  S = any,
132
140
  T extends ModelInstance = any,
133
- R extends (instance: () => T) => any = (instance: () => T) => T
141
+ R extends undefined | ((instance: () => T) => any) = undefined
134
142
  > extends Key<S, T, R> {
135
143
  (s: S): T;
136
144
  createStore: <D extends S>(state?: D) => Store<S, T, R>;
@@ -141,9 +149,9 @@ export declare function createKey<
141
149
  S,
142
150
  T extends ModelInstance,
143
151
  D extends S,
144
- R extends (instance: () => T) => any = (instance: () => T) => T
152
+ R extends undefined | ((instance: () => T) => any) = undefined
145
153
  >(
146
- model: Model<S, T> | ModelUsage<S, T, Model<S, T>, R>,
154
+ model: Model<S, T> | ModelUsage<Model<S, T>, R>,
147
155
  state?: D
148
156
  ): ModelKey<S, T, R>;
149
157
 
@@ -153,7 +161,7 @@ export declare interface StoreCollection {
153
161
  find: <
154
162
  S,
155
163
  T extends ModelInstance,
156
- R extends (instance: () => T) => any = (instance: () => T) => T
164
+ R extends undefined | ((instance: () => T) => any) = undefined
157
165
  >(
158
166
  key: Key<S, T, R> | StoreIndex<S, T, R>
159
167
  ) => Store<S, T, R> | null;
@@ -169,30 +177,40 @@ export declare function createStores(
169
177
  /** model API * */
170
178
 
171
179
  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
180
+ M extends Model,
181
+ R extends undefined | ((instance: () => Instance<M>) => any) = undefined
176
182
  > = 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>(
183
+ createKey: <D extends PickState<M>>(
184
+ state?: D
185
+ ) => ModelKey<PickState<M>, Instance<M>, R>;
186
+ createStore: <D extends PickState<M>>(
187
+ state?: D
188
+ ) => Store<PickState<M>, Instance<M>, R>;
189
+ produce: <
190
+ C extends (instance: () => Instance<M>) => any = (
191
+ instance: () => Instance<M>
192
+ ) => Instance<M>
193
+ >(
180
194
  s: C
181
- ) => ModelUsage<S, T, M, C>;
195
+ ) => ModelUsage<M, C>;
182
196
  wrapper: R;
183
- extends: <E extends Record<string, any>>(e: E) => ModelUsage<S, T, M, R> & E;
197
+ extends: <E extends Record<string, any>>(e: E) => ModelUsage<M, R> & E;
184
198
  };
185
199
 
186
200
  // eslint-disable-next-line @typescript-eslint/naming-convention
187
201
  export declare interface model {
202
+ <M extends Model>(modelFn: M): ModelUsage<M, undefined>;
203
+ <M extends Model, R extends (instance: () => Instance<M>) => any>(
204
+ modelFn: M,
205
+ s: R
206
+ ): ModelUsage<M, R>;
188
207
  <
189
- S,
190
- T extends ModelInstance,
191
- R extends (instance: () => T) => any = (instance: () => T) => T
208
+ M extends Model,
209
+ R extends undefined | ((instance: () => Instance<M>) => any) = undefined
192
210
  >(
193
- modelFn: Model<S, T>,
211
+ modelFn: M,
194
212
  s?: R
195
- ): ModelUsage<S, T, typeof modelFn, R>;
213
+ ): ModelUsage<M, R>;
196
214
  createField: <P extends () => any>(
197
215
  callback: P,
198
216
  deps?: any[]
@@ -212,12 +230,12 @@ export interface SignalOptions {
212
230
  declare interface SignalStore<
213
231
  S = any,
214
232
  T extends ModelInstance = any,
215
- R extends (instance: () => T) => any = (instance: () => T) => any
233
+ R extends undefined | ((instance: () => T) => any) = undefined
216
234
  > extends StoreIndex<S, T, R> {
217
235
  getToken: () => Token;
218
236
  subscribe: (dispatcher: Dispatch) => () => void;
219
237
  getSignal: () => {
220
- (options?: SignalOptions): ReturnType<R>;
238
+ (options?: SignalOptions): R extends undefined ? T : ReturnType<R>;
221
239
  startStatistics: () => void;
222
240
  stopStatistics: () => void;
223
241
  subscribe: (dispatcher: Dispatch) => () => void;
@@ -228,20 +246,20 @@ declare interface SignalStore<
228
246
  export declare function createSignal<
229
247
  S,
230
248
  T extends ModelInstance,
231
- R extends (instance: () => T) => any = (instance: () => T) => T
249
+ R extends undefined | ((instance: () => T) => any) = undefined
232
250
  >(store: Store<S, T, R>): SignalStore<S, T, R>;
233
251
 
234
252
  /** createSelector * */
235
253
 
236
254
  declare type SelectMethod<
237
255
  T extends ModelInstance = any,
238
- R extends (instance: () => T) => any = (instance: () => T) => T
256
+ R extends undefined | ((instance: () => T) => any) = undefined
239
257
  > = {
240
- (): ReturnType<R>;
241
- <C extends (instance: () => ReturnType<R>) => any>(
258
+ (): R extends undefined ? T : ReturnType<R>;
259
+ <C extends (instance: () => R extends undefined ? T : ReturnType<R>) => any>(
242
260
  selector: C
243
261
  ): ReturnType<C>;
244
- <C extends (instance: () => ReturnType<R>) => any>(
262
+ <C extends (instance: () => R extends undefined ? T : ReturnType<R>) => any>(
245
263
  selector?: C
246
264
  ): ReturnType<R> | ReturnType<C>;
247
265
  };
@@ -250,7 +268,7 @@ declare type SelectMethod<
250
268
  declare interface SelectorStore<
251
269
  S = any,
252
270
  T extends ModelInstance = any,
253
- R extends (instance: () => T) => any = (instance: () => T) => T
271
+ R extends undefined | ((instance: () => T) => any) = undefined
254
272
  > extends StoreIndex<S, T, R> {
255
273
  getToken: () => Token;
256
274
  subscribe: (dispatcher: Dispatch) => () => void;
@@ -264,7 +282,7 @@ declare interface SelectorOption<T = any> {
264
282
  export declare function createSelector<
265
283
  S,
266
284
  T extends ModelInstance,
267
- R extends (instance: () => T) => any = (instance: () => T) => T
285
+ R extends undefined | ((instance: () => T) => any) = undefined
268
286
  >(store: Store<S, T, R>, opts?: SelectorOption): SelectorStore<S, T, R>;
269
287
 
270
288
  /** config * */
@@ -273,18 +291,18 @@ export declare function config(configuration: Config): {
273
291
  S,
274
292
  T extends ModelInstance,
275
293
  D extends S,
276
- R extends (instance: () => T) => any = (instance: () => T) => T
294
+ R extends undefined | ((instance: () => T) => any) = undefined
277
295
  >(
278
- model: Model<S, T> | Key<S, T, R> | ModelUsage<S, T, R>,
296
+ model: Model<S, T> | Key<S, T, R> | ModelUsage<Model<S, T>, R>,
279
297
  state?: D
280
298
  ) => Store<S, T, R>;
281
299
  createKey: <
282
300
  S,
283
301
  T extends ModelInstance,
284
302
  D extends S,
285
- R extends (instance: () => T) => any = (instance: () => T) => T
303
+ R extends undefined | ((instance: () => T) => any) = undefined
286
304
  >(
287
- model: Model<S, T> | ModelUsage<S, T, R>,
305
+ model: Model<S, T> | ModelUsage<Model<S, T>, R>,
288
306
  state?: D
289
307
  ) => ModelKey<S, T, R>;
290
308
  createStores: (...modelKeys: (ModelKey | StoreIndex)[]) => StoreCollection;
@@ -297,28 +315,27 @@ export declare const validations: {
297
315
  isModelKey: <
298
316
  S,
299
317
  T extends ModelInstance,
300
- R extends (ins: () => T) => any = (ins: () => T) => T
318
+ R extends undefined | ((instance: () => T) => any) = undefined
301
319
  >(
302
320
  data: any
303
321
  ) => data is ModelKey<S, T, R>;
304
322
  isModelStore: <
305
323
  S,
306
324
  T extends ModelInstance,
307
- R extends (ins: () => T) => any = (ins: () => T) => T
325
+ R extends undefined | ((instance: () => T) => any) = undefined
308
326
  >(
309
327
  data: any
310
328
  ) => data is Store<S, T, R>;
311
329
  isModelUsage: <
312
- S,
313
- T extends ModelInstance,
314
- R extends (ins: () => T) => any = (ins: () => T) => T
330
+ M extends Model,
331
+ R extends undefined | ((instance: () => T) => any) = undefined
315
332
  >(
316
- data: any
317
- ) => data is ModelUsage<S, T, typeof data, R>;
333
+ data: M
334
+ ) => data is ModelUsage<typeof data, R>;
318
335
  isStoreIndex: <
319
336
  S,
320
337
  T extends ModelInstance,
321
- R extends (ins: () => T) => any = (ins: () => T) => T
338
+ R extends undefined | ((instance: () => T) => any) = undefined
322
339
  >(
323
340
  data: any
324
341
  ) => data is StoreIndex<S, T, R>;
package/package.json CHANGED
@@ -1,68 +1,68 @@
1
- {
2
- "private": false,
3
- "name": "as-model",
4
- "version": "0.2.9",
5
- "description": "This is a model state management tool",
6
- "license": "MIT",
7
- "author": "Jimmy.Harding",
8
- "homepage": "https://github.com/filefoxper/a-model",
9
- "repository": {
10
- "type": "git",
11
- "url": "https://github.com/filefoxper/a-model"
12
- },
13
- "main": "dist/index.js",
14
- "module": "esm/index.js",
15
- "files": [
16
- "dist",
17
- "esm",
18
- "index.d.ts"
19
- ],
20
- "scripts": {
21
- "build": "node ./build.js",
22
- "docs": "docsify serve ./docs",
23
- "lint": "eslint src --fix --ext .ts,.tsx ",
24
- "lint-init": "eslint --init",
25
- "test": "jest --coverage"
26
- },
27
- "typings": "index.d.ts",
28
- "devDependencies": {
29
- "@babel/cli": "^7.27.2",
30
- "@babel/core": "^7.27.4",
31
- "@babel/eslint-parser": "^7.27.5",
32
- "@babel/plugin-transform-runtime": "^7.27.4",
33
- "@babel/preset-env": "^7.27.2",
34
- "@babel/preset-typescript": "^7.27.1",
35
- "@babel/runtime": "^7.27.6",
36
- "@pmnps/plugin-publish": "4.5.0",
37
- "@types/jest": "^29.5.14",
38
- "babel-jest": "29.7.0",
39
- "esbuild": "^0.25.0",
40
- "esbuild-plugin-es5": "2.1.1",
41
- "eslint": "^8.49.0",
42
- "eslint-config-airbnb": "^19.0.4",
43
- "eslint-config-airbnb-typescript": "^17.1.0",
44
- "eslint-config-prettier": "^9.0.0",
45
- "eslint-import-resolver-typescript": "^3.6.0",
46
- "eslint-plugin-import": "^2.28.1",
47
- "eslint-plugin-jsx-a11y": "^6.7.1",
48
- "eslint-plugin-prettier": "^5.0.0",
49
- "eslint-plugin-react": "^7.33.2",
50
- "eslint-plugin-react-hooks": "^4.6.0",
51
- "eslint-plugin-unused-imports": "^2.0.0",
52
- "eslint-webpack-plugin": "^4.0.1",
53
- "jest": "29.7.0",
54
- "jest-environment-jsdom": "29.7.0",
55
- "pmnps": "^4.5.3",
56
- "prettier": "^3.0.3",
57
- "prettier-eslint": "^15.0.1",
58
- "prettier-eslint-cli": "^7.1.0",
59
- "ts-node": "^10.8.1",
60
- "typescript": "^4.9.5"
61
- },
62
- "keywords": [
63
- "model",
64
- "state",
65
- "state-management",
66
- "typescript"
67
- ]
68
- }
1
+ {
2
+ "private": false,
3
+ "name": "as-model",
4
+ "version": "0.3.0",
5
+ "description": "This is a model state management tool",
6
+ "license": "MIT",
7
+ "author": "Jimmy.Harding",
8
+ "homepage": "https://github.com/filefoxper/a-model",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "https://github.com/filefoxper/a-model"
12
+ },
13
+ "main": "dist/index.js",
14
+ "module": "esm/index.js",
15
+ "files": [
16
+ "dist",
17
+ "esm",
18
+ "index.d.ts"
19
+ ],
20
+ "scripts": {
21
+ "build": "node ./build.js",
22
+ "docs": "docsify serve ./docs",
23
+ "lint": "eslint src --fix --ext .ts,.tsx ",
24
+ "lint-init": "eslint --init",
25
+ "test": "jest --coverage"
26
+ },
27
+ "typings": "index.d.ts",
28
+ "devDependencies": {
29
+ "@babel/cli": "^7.27.2",
30
+ "@babel/core": "^7.27.4",
31
+ "@babel/eslint-parser": "^7.27.5",
32
+ "@babel/plugin-transform-runtime": "^7.27.4",
33
+ "@babel/preset-env": "^7.27.2",
34
+ "@babel/preset-typescript": "^7.27.1",
35
+ "@babel/runtime": "^7.27.6",
36
+ "@pmnps/plugin-publish": "4.5.0",
37
+ "@types/jest": "^29.5.14",
38
+ "babel-jest": "29.7.0",
39
+ "esbuild": "^0.25.0",
40
+ "esbuild-plugin-es5": "2.1.1",
41
+ "eslint": "^8.49.0",
42
+ "eslint-config-airbnb": "^19.0.4",
43
+ "eslint-config-airbnb-typescript": "^17.1.0",
44
+ "eslint-config-prettier": "^9.0.0",
45
+ "eslint-import-resolver-typescript": "^3.6.0",
46
+ "eslint-plugin-import": "^2.28.1",
47
+ "eslint-plugin-jsx-a11y": "^6.7.1",
48
+ "eslint-plugin-prettier": "^5.0.0",
49
+ "eslint-plugin-react": "^7.33.2",
50
+ "eslint-plugin-react-hooks": "^4.6.0",
51
+ "eslint-plugin-unused-imports": "^2.0.0",
52
+ "eslint-webpack-plugin": "^4.0.1",
53
+ "jest": "29.7.0",
54
+ "jest-environment-jsdom": "29.7.0",
55
+ "pmnps": "^4.5.3",
56
+ "prettier": "^3.0.3",
57
+ "prettier-eslint": "^15.0.1",
58
+ "prettier-eslint-cli": "^7.1.0",
59
+ "ts-node": "^10.8.1",
60
+ "typescript": "^4.9.5"
61
+ },
62
+ "keywords": [
63
+ "model",
64
+ "state",
65
+ "state-management",
66
+ "typescript"
67
+ ]
68
+ }