@@ -19,6 +19,7 @@ import {
1919} from "../../auth/meta/verification-uri.js" ;
2020import type {
2121 AccountNameFlow ,
22+ ExistingProviderRef ,
2223 LoginFlow ,
2324 OAuthKind ,
2425 OAuthLoginStart ,
@@ -82,19 +83,40 @@ export function suggestOAuthProfileSlug(existing: readonly string[]): string {
8283 return `default-${ String ( n ) } ` ;
8384}
8485
86+ function providerNameList ( rows : readonly ExistingProviderRef [ ] ) : string [ ] {
87+ return rows . map ( ( row ) => ( typeof row === "string" ? row : row . name ) ) ;
88+ }
89+
8590// `meta/<slug>` and `meta-api/<slug>` are one namespace: signing in under a
8691// slug that already names an API-key row is rejected.
8792export function suggestMetaOAuthProfileSlug (
8893 authProfiles : readonly string [ ] ,
89- existingProviderNames : readonly string [ ] ,
94+ existingProviderNames : readonly ExistingProviderRef [ ] ,
9095) : string {
96+ const names = providerNameList ( existingProviderNames ) ;
9197 return suggestOAuthProfileSlug ( [
9298 ...authProfiles ,
93- ...instanceSlugsForKind ( "meta" , existingProviderNames ) ,
94- ...instanceSlugsForKind ( "meta-api" , existingProviderNames ) ,
99+ ...instanceSlugsForKind ( "meta" , names ) ,
100+ ...instanceSlugsForKind ( "meta-api" , names ) ,
95101 ] ) ;
96102}
97103
104+ /** Settings rows for the slug guard. A keyless `meta/<slug>` is not an API key. */
105+ export function catalogRowsForMetaOAuthGuard (
106+ providers : Readonly < Record < string , { readonly apiKey ?: string } > > | undefined ,
107+ ) : ExistingProviderRef [ ] {
108+ const rows : ExistingProviderRef [ ] = [ ] ;
109+ for ( const [ name , provider ] of Object . entries ( providers ?? { } ) ) {
110+ const apiKey = provider . apiKey ;
111+ if ( typeof apiKey === "string" && apiKey . length > 0 ) {
112+ rows . push ( { name, apiKey } ) ;
113+ } else {
114+ rows . push ( { name } ) ;
115+ }
116+ }
117+ return rows ;
118+ }
119+
98120/** True when `slug` names an API-key row, not an OAuth profile. */
99121export function metaOAuthSlugBlockedByApiKey (
100122 slug : string ,
@@ -422,7 +444,10 @@ export function createAccountNameFlow(
422444 }
423445 applySuggestion (
424446 suggestOAuthProfileSlug (
425- instanceSlugsForKind ( state . choice . id , state . existingProviderNames ) ,
447+ instanceSlugsForKind (
448+ state . choice . id ,
449+ providerNameList ( state . existingProviderNames ) ,
450+ ) ,
426451 ) ,
427452 ) ;
428453 } ;
@@ -442,7 +467,7 @@ export function createAccountNameFlow(
442467 state . values . name = resolveApiKeyInstanceName (
443468 state . choice . id ,
444469 slug ,
445- state . existingProviderNames ,
470+ providerNameList ( state . existingProviderNames ) ,
446471 ) ;
447472 }
448473 state . stepIndex += 1 ;
@@ -502,7 +527,10 @@ export function createAccountNameFlow(
502527 return ;
503528 }
504529 handleNames (
505- instanceSlugsForKind ( state . choice . id , state . existingProviderNames ) ,
530+ instanceSlugsForKind (
531+ state . choice . id ,
532+ providerNameList ( state . existingProviderNames ) ,
533+ ) ,
506534 ) ;
507535 } ;
508536
0 commit comments