@@ -7,10 +7,10 @@ export interface ModConf {
7
7
//cli
8
8
MSUCLI : string ;
9
9
MSUBSU : string ;
10
- MSURSP : string
10
+ MSURSP : string ;
11
11
KSUCLI : string ;
12
12
KSUBSU : string ;
13
- KSURSP : string
13
+ KSURSP : string ;
14
14
15
15
// default paths
16
16
ADB : string ;
@@ -77,12 +77,14 @@ export const INITIAL_MOD_CONF: ModConf = {
77
77
78
78
export interface ModConfContext {
79
79
_modConf : ModConf ;
80
+ __modConf : ModConf ;
80
81
modConf < K extends keyof ModConf > ( key : K , adds ?: Record < string , any > ) : ModConf [ K ] ;
81
82
setModConf < K extends keyof ModConf > ( key : K , state : SetStateAction < ModConf [ K ] > , callback ?: ( state : ModConf [ K ] ) => void ) : void ;
82
83
}
83
84
84
85
export const ModConfContext = createContext < ModConfContext > ( {
85
86
_modConf : INITIAL_MOD_CONF ,
87
+ __modConf : INITIAL_MOD_CONF ,
86
88
modConf < K extends keyof ModConf > ( key : K , adds ?: Record < string , any > ) {
87
89
return key ;
88
90
} ,
@@ -108,6 +110,41 @@ export function formatString(template: string, object: object): string {
108
110
} ) ;
109
111
}
110
112
113
+ export function formatObjectEntries < O extends object = object > ( object : O ) : O {
114
+ const formatValue = ( value : any ) : any => {
115
+ if ( typeof value === "string" ) {
116
+ return value . replace ( / \< ( \w + ( \. \w + ) * ) \> / gi, ( match , key ) => {
117
+ const keys = key . split ( "." ) ;
118
+ let tempValue = object ;
119
+ for ( const k of keys ) {
120
+ if ( k in tempValue ) {
121
+ tempValue = tempValue [ k ] ;
122
+ } else {
123
+ return match ;
124
+ }
125
+ }
126
+ return formatValue ( tempValue ) ;
127
+ } ) ;
128
+ } else if ( Array . isArray ( value ) ) {
129
+ return value . map ( ( item : any ) => formatValue ( item ) ) ;
130
+ } else if ( typeof value === "object" && value !== null ) {
131
+ const formattedObject : any = { } ;
132
+ for ( const prop in value ) {
133
+ formattedObject [ prop ] = formatValue ( value [ prop ] ) ;
134
+ }
135
+ return formattedObject ;
136
+ }
137
+ return value ;
138
+ } ;
139
+
140
+ const formattedObject : any = { } ;
141
+ for ( const key in object ) {
142
+ const formattedValue = formatValue ( object [ key ] ) ;
143
+ formattedObject [ key ] = formattedValue ;
144
+ }
145
+ return formattedObject ;
146
+ }
147
+
111
148
export const ModConfProvider = ( props : React . PropsWithChildren ) => {
112
149
const [ modConf , setModConf ] = useNativeStorage ( "modconf_v3" , INITIAL_MOD_CONF ) ;
113
150
@@ -129,6 +166,7 @@ export const ModConfProvider = (props: React.PropsWithChildren) => {
129
166
const contextValue = React . useMemo (
130
167
( ) => ( {
131
168
_modConf : defaultComposer ( INITIAL_MOD_CONF , modConf ) ,
169
+ __modConf : formatObjectEntries < ModConf > ( defaultComposer ( INITIAL_MOD_CONF , modConf ) ) ,
132
170
modConf : ( key , adds ) => {
133
171
return formatString ( defaultComposer ( INITIAL_MOD_CONF , modConf ) [ key ] , { ...modConf , ...adds } ) ;
134
172
} ,
0 commit comments