@@ -7,7 +7,7 @@ import { api } from '@/scripts/api'
77import { app } from '@/scripts/app'
88import type { SettingParams } from '@/types/settingTypes'
99import type { TreeNode } from '@/types/treeExplorerTypes'
10- import { compareVersions } from '@/utils/formatUtil'
10+ import { compareVersions , isSemVer } from '@/utils/formatUtil'
1111
1212export const getSettingInfo = ( setting : SettingParams ) => {
1313 const parts = setting . category || setting . id . split ( '.' )
@@ -21,16 +21,24 @@ export interface SettingTreeNode extends TreeNode {
2121 data ?: SettingParams
2222}
2323
24- function tryMigrateDeprecatedValue ( setting : SettingParams , value : any ) {
24+ function tryMigrateDeprecatedValue (
25+ setting : SettingParams | undefined ,
26+ value : unknown
27+ ) {
2528 return setting ?. migrateDeprecatedValue ?.( value ) ?? value
2629}
2730
28- function onChange ( setting : SettingParams , newValue : any , oldValue : any ) {
31+ function onChange (
32+ setting : SettingParams | undefined ,
33+ newValue : unknown ,
34+ oldValue : unknown
35+ ) {
2936 if ( setting ?. onChange ) {
3037 setting . onChange ( newValue , oldValue )
3138 }
3239 // Backward compatibility with old settings dialog.
3340 // Some extensions still listens event emitted by the old settings dialog.
41+ // @ts -expect-error 'setting' is possibly 'undefined'.ts(18048)
3442 app . ui . settings . dispatchChange ( setting . id , newValue , oldValue )
3543}
3644
@@ -77,46 +85,64 @@ export const useSettingStore = defineStore('setting', () => {
7785 return _ . cloneDeep ( settingValues . value [ key ] ?? getDefaultValue ( key ) )
7886 }
7987
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+
80100 /**
81101 * Get the default value of a setting.
82102 * @param key - The key of the setting to get.
83103 * @returns The default value of the setting.
84104 */
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
87112
88113 const versionedDefault = getVersionedDefaultValue ( key , param )
89114
90115 if ( versionedDefault ) {
91116 return versionedDefault
92117 }
93118
94- return typeof param ? .defaultValue === 'function'
119+ return typeof param . defaultValue === 'function'
95120 ? param . defaultValue ( )
96- : param ? .defaultValue
121+ : param . defaultValue
97122 }
98123
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 {
103128 // 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' ) {
105131 const installedVersion = get ( 'Comfy.InstalledVersion' )
106132
107133 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 )
110136 )
111137
112- for ( const version of sortedVersions . reverse ( ) ) {
138+ for ( const version of sortedVersions ) {
113139 // Ensure the version is in a valid format before comparing
114- if ( ! isValidVersionFormat ( version ) ) {
140+ if ( ! isSemVer ( version ) ) {
115141 continue
116142 }
117143
118144 if ( compareVersions ( installedVersion , version ) >= 0 ) {
119- const versionedDefault = param . defaultsByInstallVersion [ version ]
145+ const versionedDefault = defaultsByInstallVersion [ version ]
120146 return typeof versionedDefault === 'function'
121147 ? versionedDefault ( )
122148 : versionedDefault
@@ -128,12 +154,6 @@ export const useSettingStore = defineStore('setting', () => {
128154 return null
129155 }
130156
131- function isValidVersionFormat (
132- version : string
133- ) : version is `${number } .${number } .${number } ` {
134- return / ^ \d + \. \d + \. \d + $ / . test ( version )
135- }
136-
137157 /**
138158 * Register a setting.
139159 * @param setting - The setting to register.
0 commit comments