@@ -101,40 +101,77 @@ function select_geode_object(object_map) {
101101 return
102102}
103103
104-
105- async function get_allowed_objects () {
106- toggle_loading ()
107- allowed_objects .value = {}
108- const promise_array = filenames .map ((filename ) => {
109- const params = { filename, supported_feature }
110- return api_fetch ({ schema, params })
111- })
112- const responses = await Promise .all (promise_array)
113- const allowed_objects_list = responses .map (
114- (response ) => response .data .value .allowed_objects ,
115- )
116- const all_keys = [... new Set (allowed_objects_list .flatMap (Object .keys ))]
117- const common_keys = all_keys .filter ((key ) =>
118- allowed_objects_list .every ((obj ) => key in obj),
119- )
120- const final_object = {}
121- for (const key of common_keys) {
122- const load_scores = allowed_objects_list .map ((obj ) => obj[key].is_loadable )
123- const priorities = allowed_objects_list
124- .map ((obj ) => obj[key].object_priority )
125- .filter ((p ) => p !== undefined && p !== null )
126- final_object[key] = { is_loadable: Math .min (... load_scores) }
127- if (priorities .length ) {
128- final_object[key].object_priority = Math .max (... priorities)
104+ function select_geode_object (object_map ) {
105+ const object_keys = Object .keys (object_map)
106+ if (! object_keys .length ) {
107+ return null
108+ }
109+ const highest_load_score = Math .max (
110+ ... object_keys .map ((key ) => object_map[key].is_loadable ),
111+ )
112+ if (highest_load_score <= 0 ) {
113+ return null
114+ }
115+ const best_score_objects = object_keys .filter (
116+ (key ) => object_map[key].is_loadable === highest_load_score,
117+ )
118+ if (best_score_objects .length === 1 ) {
119+ return best_score_objects[0 ]
129120 }
121+ const highest_priority = Math .max (
122+ ... best_score_objects .map (
123+ (key ) => object_map[key].object_priority ?? - Infinity ,
124+ ),
125+ )
126+ const best_priority_objects = best_score_objects .filter (
127+ (key ) => object_map[key].object_priority === highest_priority,
128+ )
129+ if (highest_priority !== - Infinity && best_priority_objects .length === 1 ) {
130+ return best_priority_objects[0 ]
131+ }
132+ return null
130133 }
131- allowed_objects .value = final_object
132- const selected_object = select_geode_object (final_object)
133- if (selected_object) {
134- set_geode_object (selected_object)
134+
135+ async function get_allowed_objects () {
136+ toggle_loading ()
137+ allowed_objects .value = {}
138+ const promise_array = filenames .map ((filename ) => {
139+ const params = { filename, supported_feature }
140+ return api_fetch ({ schema, params })
141+ })
142+ const responses = await Promise .all (promise_array)
143+ const allowed_objects_list = responses .map (
144+ (response ) => response .data .value .allowed_objects ,
145+ )
146+ const all_keys = [... new Set (allowed_objects_list .flatMap (Object .keys ))]
147+ const common_keys = all_keys .filter ((key ) =>
148+ allowed_objects_list .every ((obj ) => key in obj),
149+ )
150+ const final_object = {}
151+ for (const key of common_keys) {
152+ const load_scores = allowed_objects_list .map (
153+ (obj ) => obj[key].is_loadable ,
154+ )
155+ const priorities = allowed_objects_list
156+ .map ((obj ) => obj[key].object_priority )
157+ .filter ((p ) => p !== undefined && p !== null )
158+ final_object[key] = { is_loadable: Math .min (... load_scores) }
159+ if (priorities .length ) {
160+ final_object[key].object_priority = Math .max (... priorities)
161+ }
162+ }
163+ allowed_objects .value = final_object
164+ let already_selected = false
165+ const selected_object = select_geode_object (final_object)
166+ if (selected_object) {
167+ set_geode_object (selected_object)
168+ already_selected = true
169+ }
170+ if (! already_selected && Object .keys (final_object).length === 1 ) {
171+ set_geode_object (Object .keys (final_object)[0 ])
172+ }
173+ toggle_loading ()
135174 }
136- toggle_loading ()
137- }
138175
139176 function set_geode_object (input_geode_object ) {
140177 if (input_geode_object != " " ) {
0 commit comments