@@ -7,7 +7,7 @@ import { api } from '@/scripts/api'
7
7
import { app } from '@/scripts/app'
8
8
import type { SettingParams } from '@/types/settingTypes'
9
9
import type { TreeNode } from '@/types/treeExplorerTypes'
10
- import { compareVersions } from '@/utils/formatUtil'
10
+ import { compareVersions , isSemVer } from '@/utils/formatUtil'
11
11
12
12
export const getSettingInfo = ( setting : SettingParams ) => {
13
13
const parts = setting . category || setting . id . split ( '.' )
@@ -21,16 +21,24 @@ export interface SettingTreeNode extends TreeNode {
21
21
data ?: SettingParams
22
22
}
23
23
24
- function tryMigrateDeprecatedValue ( setting : SettingParams , value : any ) {
24
+ function tryMigrateDeprecatedValue (
25
+ setting : SettingParams | undefined ,
26
+ value : unknown
27
+ ) {
25
28
return setting ?. migrateDeprecatedValue ?.( value ) ?? value
26
29
}
27
30
28
- function onChange ( setting : SettingParams , newValue : any , oldValue : any ) {
31
+ function onChange (
32
+ setting : SettingParams | undefined ,
33
+ newValue : unknown ,
34
+ oldValue : unknown
35
+ ) {
29
36
if ( setting ?. onChange ) {
30
37
setting . onChange ( newValue , oldValue )
31
38
}
32
39
// Backward compatibility with old settings dialog.
33
40
// Some extensions still listens event emitted by the old settings dialog.
41
+ // @ts -expect-error 'setting' is possibly 'undefined'.ts(18048)
34
42
app . ui . settings . dispatchChange ( setting . id , newValue , oldValue )
35
43
}
36
44
@@ -77,46 +85,64 @@ export const useSettingStore = defineStore('setting', () => {
77
85
return _ . cloneDeep ( settingValues . value [ key ] ?? getDefaultValue ( key ) )
78
86
}
79
87
88
+ /**
89
+ * Gets the setting params, asserting the type that is intentionally left off
90
+ * of {@link settingsById}.
91
+ * @param key The key of the setting to get.
92
+ * @returns The setting.
93
+ */
94
+ function getSettingById < K extends keyof Settings > (
95
+ key : K
96
+ ) : SettingParams < Settings [ K ] > | undefined {
97
+ return settingsById . value [ key ] as SettingParams < Settings [ K ] > | undefined
98
+ }
99
+
80
100
/**
81
101
* Get the default value of a setting.
82
102
* @param key - The key of the setting to get.
83
103
* @returns The default value of the setting.
84
104
*/
85
- function getDefaultValue < K extends keyof Settings > ( key : K ) : Settings [ K ] {
86
- const param = settingsById . value [ key ]
105
+ function getDefaultValue < K extends keyof Settings > (
106
+ key : K
107
+ ) : Settings [ K ] | undefined {
108
+ // Assertion: settingsById is not typed.
109
+ const param = getSettingById ( key )
110
+
111
+ if ( param === undefined ) return
87
112
88
113
const versionedDefault = getVersionedDefaultValue ( key , param )
89
114
90
115
if ( versionedDefault ) {
91
116
return versionedDefault
92
117
}
93
118
94
- return typeof param ? .defaultValue === 'function'
119
+ return typeof param . defaultValue === 'function'
95
120
? param . defaultValue ( )
96
- : param ? .defaultValue
121
+ : param . defaultValue
97
122
}
98
123
99
- function getVersionedDefaultValue < K extends keyof Settings > (
100
- key : K ,
101
- param : SettingParams
102
- ) : Settings [ K ] | null {
124
+ function getVersionedDefaultValue <
125
+ K extends keyof Settings ,
126
+ TValue = Settings [ K ]
127
+ > ( key : K , param : SettingParams < TValue > | undefined ) : TValue | null {
103
128
// get default versioned value, skipping if the key is 'Comfy.InstalledVersion' to prevent infinite loop
104
- if ( param ?. defaultsByInstallVersion && key !== 'Comfy.InstalledVersion' ) {
129
+ const defaultsByInstallVersion = param ?. defaultsByInstallVersion
130
+ if ( defaultsByInstallVersion && key !== 'Comfy.InstalledVersion' ) {
105
131
const installedVersion = get ( 'Comfy.InstalledVersion' )
106
132
107
133
if ( installedVersion ) {
108
- const sortedVersions = Object . keys ( param . defaultsByInstallVersion ) . sort (
109
- ( a , b ) => compareVersions ( a , b )
134
+ const sortedVersions = Object . keys ( defaultsByInstallVersion ) . sort (
135
+ ( a , b ) => compareVersions ( b , a )
110
136
)
111
137
112
- for ( const version of sortedVersions . reverse ( ) ) {
138
+ for ( const version of sortedVersions ) {
113
139
// Ensure the version is in a valid format before comparing
114
- if ( ! isValidVersionFormat ( version ) ) {
140
+ if ( ! isSemVer ( version ) ) {
115
141
continue
116
142
}
117
143
118
144
if ( compareVersions ( installedVersion , version ) >= 0 ) {
119
- const versionedDefault = param . defaultsByInstallVersion [ version ]
145
+ const versionedDefault = defaultsByInstallVersion [ version ]
120
146
return typeof versionedDefault === 'function'
121
147
? versionedDefault ( )
122
148
: versionedDefault
@@ -128,12 +154,6 @@ export const useSettingStore = defineStore('setting', () => {
128
154
return null
129
155
}
130
156
131
- function isValidVersionFormat (
132
- version : string
133
- ) : version is `${number } .${number } .${number } ` {
134
- return / ^ \d + \. \d + \. \d + $ / . test ( version )
135
- }
136
-
137
157
/**
138
158
* Register a setting.
139
159
* @param setting - The setting to register.
0 commit comments