1
1
import { create } from 'zustand' ;
2
2
import { devtools , persist } from 'zustand/middleware' ;
3
3
import type { Options } from 'espree' ;
4
- import { defaultJavascriptCode , defaultJSONCode } from '../lib/const'
4
+ import { defaultJavascriptCode , defaultJSONCode } from '../lib/const'
5
+ import { storeState } from '../lib/utils' ;
5
6
export type SourceType = Exclude < Options [ 'sourceType' ] , undefined > ;
6
7
export type Version = Exclude < Options [ 'ecmaVersion' ] , undefined > ;
7
8
@@ -22,7 +23,7 @@ type ExplorerState = {
22
23
setParser : ( parser : string ) => void ;
23
24
24
25
sourceType : SourceType ;
25
- setSourceType : ( sourceType : string ) => void ;
26
+ setSourceType : ( sourceType : SourceType ) => void ;
26
27
27
28
esVersion : Version ;
28
29
setEsVersion : ( esVersion : string ) => void ;
@@ -53,62 +54,65 @@ type ExplorerState = {
53
54
54
55
} ;
55
56
57
+ const createSetter = < T extends keyof ExplorerState > (
58
+ key : T ,
59
+ set : ( state : Partial < ExplorerState > ) => void
60
+ ) => ( value : ExplorerState [ T ] ) => {
61
+ set ( { [ key ] : value } ) ;
62
+ storeState ( ) ;
63
+ } ;
64
+
56
65
export const useExplorer = create < ExplorerState > ( ) (
57
66
devtools (
58
67
persist (
59
68
( set ) => ( {
60
69
tool : 'ast' ,
61
- setTool : ( tool ) => set ( { tool } ) ,
70
+ setTool : createSetter ( ' tool' , set ) ,
62
71
63
72
JSCode : defaultJavascriptCode ,
64
- setJSCode : ( JSCode ) => set ( { JSCode } ) ,
73
+ setJSCode : createSetter ( ' JSCode' , set ) ,
65
74
66
75
JSONCode : defaultJSONCode ,
67
- setJSONCode : ( JSONCode ) => set ( { JSONCode } ) ,
76
+ setJSONCode : createSetter ( ' JSONCode' , set ) ,
68
77
69
78
language : 'javascript' ,
70
- setLanguage : ( language ) => set ( { language } ) ,
79
+ setLanguage : createSetter ( ' language' , set ) ,
71
80
72
81
parser : 'espree' ,
73
- setParser : ( parser ) => set ( { parser } ) ,
82
+ setParser : createSetter ( ' parser' , set ) ,
74
83
75
84
sourceType : 'module' ,
76
- setSourceType : ( sourceType ) =>
77
- set ( { sourceType : sourceType as SourceType } ) ,
85
+ setSourceType : createSetter ( 'sourceType' , set ) ,
78
86
79
87
esVersion : 'latest' ,
80
- setEsVersion : ( esVersion ) =>
81
- set ( {
82
- esVersion :
83
- esVersion === 'latest'
84
- ? 'latest'
85
- : ( Number ( esVersion ) as Options [ 'ecmaVersion' ] ) ,
86
- } ) ,
88
+ setEsVersion : ( esVersion ) => {
89
+ const version = esVersion === 'latest' ? 'latest' : Number ( esVersion ) ;
90
+ createSetter ( 'esVersion' , set ) ( version as Version ) ;
91
+ } ,
87
92
88
93
isJSX : true ,
89
- setIsJSX : ( isJSX ) => set ( { isJSX } ) ,
94
+ setIsJSX : createSetter ( ' isJSX' , set ) ,
90
95
91
96
jsonMode : 'jsonc' ,
92
- setJsonMode : ( mode ) => set ( { jsonMode : mode } ) ,
97
+ setJsonMode : createSetter ( ' jsonMode' , set ) ,
93
98
94
99
wrap : true ,
95
- setWrap : ( wrap ) => set ( { wrap } ) ,
100
+ setWrap : createSetter ( ' wrap' , set ) ,
96
101
97
102
astViewMode : 'json' ,
98
- setAstViewMode : ( mode ) => set ( { astViewMode : mode } ) ,
103
+ setAstViewMode : createSetter ( ' astViewMode' , set ) ,
99
104
100
105
scopeViewMode : 'flat' ,
101
- setScopeViewMode : ( mode ) => set ( { scopeViewMode : mode } ) ,
106
+ setScopeViewMode : createSetter ( ' scopeViewMode' , set ) ,
102
107
103
108
pathViewMode : 'code' ,
104
- setPathViewMode : ( mode ) => set ( { pathViewMode : mode } ) ,
109
+ setPathViewMode : createSetter ( ' pathViewMode' , set ) ,
105
110
106
111
pathIndexes : 1 ,
107
- setPathIndexes : ( indexes ) => set ( { pathIndexes : indexes } ) ,
112
+ setPathIndexes : createSetter ( ' pathIndexes' , set ) ,
108
113
109
114
pathIndex : 0 ,
110
- setPathIndex : ( index ) => set ( { pathIndex : index } ) ,
111
-
115
+ setPathIndex : createSetter ( 'pathIndex' , set ) ,
112
116
} ) ,
113
117
{
114
118
name : 'eslint-explorer' ,
0 commit comments