1+ import { type SalesforceUrlPath , waitForPageErrors } from '../../browserforce.js' ;
12import { BrowserforcePlugin } from '../../plugin.js' ;
23
34const CONSUMER_SECRET_SELECTOR = '#ConsumerSecret' ;
45const CONSUMER_KEY_SELECTOR = '#ConsumerKey' ;
56const SAVE_BUTTON_SELECTOR = 'input[id$=":saveBtn"], #topButtonRow > input[name="save"], button[title="Save"]' ;
67
7- const getUrl = ( orgId : string ) => `/${ orgId } /e` ;
8+ const getUrl = ( orgId : string ) : SalesforceUrlPath => `/${ orgId } /e` as SalesforceUrlPath ;
89
910type AuthProviderConfig = {
1011 consumerSecret ?: string ;
1112 consumerKey ?: string ;
1213} ;
1314
14- type Config = {
15+ export type Config = {
1516 [ developerName : string ] : AuthProviderConfig ;
1617} ;
1718
@@ -35,11 +36,9 @@ export class AuthProviders extends BrowserforcePlugin {
3536 const developerNamesList = developerNames . map ( ( name ) => `'${ name } '` ) . join ( ',' ) ;
3637
3738 // Query AuthProviders using standard REST API (not Tooling API)
38- const authProviders = await this . org
39- . getConnection ( )
40- . query < AuthProviderRecord > (
41- `SELECT Id, DeveloperName FROM AuthProvider WHERE DeveloperName IN (${ developerNamesList } )` ,
42- ) ;
39+ const authProviders = await this . browserforce . connection . query < AuthProviderRecord > (
40+ `SELECT Id, DeveloperName FROM AuthProvider WHERE DeveloperName IN (${ developerNamesList } )` ,
41+ ) ;
4342
4443 if ( authProviders . records . length === 0 ) {
4544 throw new Error ( `No AuthProviders found with DeveloperNames: ${ developerNames . join ( ', ' ) } ` ) ;
@@ -73,79 +72,68 @@ export class AuthProviders extends BrowserforcePlugin {
7372 this . browserforce . logger ?. log ( 'editPageUrl' , editPageUrl ) ;
7473 console . log ( `[AuthProviders] Navigating to edit page for ${ developerName } : ${ editPageUrl } ` ) ;
7574
76- const page = await this . browserforce . openPage ( editPageUrl ) ;
75+ await using page = await this . browserforce . openPage ( editPageUrl ) ;
7776
7877 // Wait for the page/frame to load - handle both Lightning (iframe) and Classic UI
7978 // Use ConsumerSecret as the selector to wait for, or fallback to ConsumerKey
80- const formSelector = `${ CONSUMER_SECRET_SELECTOR } , ${ CONSUMER_KEY_SELECTOR } , form ` ;
79+ const formSelector = `${ CONSUMER_SECRET_SELECTOR } , ${ CONSUMER_KEY_SELECTOR } ` ;
8180 const frameOrPage = await this . browserforce . waitForSelectorInFrameOrPage ( page , formSelector ) ;
8281
8382 try {
84- // Update ConsumerSecret if provided
85- if ( authProviderConfig . consumerSecret !== undefined ) {
86- await frameOrPage . waitForSelector ( CONSUMER_SECRET_SELECTOR , { timeout : 10000 } ) ;
87- await frameOrPage . $eval (
88- CONSUMER_SECRET_SELECTOR ,
89- ( e : HTMLInputElement , v : string ) => {
90- e . value = v ;
91- } ,
92- authProviderConfig . consumerSecret ,
93- ) ;
94- }
83+ // Check if there's anything to update
84+ const hasUpdates = authProviderConfig . consumerSecret !== undefined || authProviderConfig . consumerKey !== undefined ;
85+
86+ if ( hasUpdates ) {
87+ // Update ConsumerSecret if provided
88+ if ( authProviderConfig . consumerSecret !== undefined ) {
89+ await frameOrPage . locator ( CONSUMER_SECRET_SELECTOR ) . waitFor ( { timeout : 10000 } ) ;
90+ await frameOrPage . locator ( CONSUMER_SECRET_SELECTOR ) . fill ( authProviderConfig . consumerSecret ) ;
91+ }
9592
96- // Update ConsumerKey if provided
97- if ( authProviderConfig . consumerKey !== undefined ) {
98- await frameOrPage . waitForSelector ( CONSUMER_KEY_SELECTOR , { timeout : 10000 } ) ;
99- await frameOrPage . $eval (
100- CONSUMER_KEY_SELECTOR ,
101- ( e : HTMLInputElement , v : string ) => {
102- e . value = v ;
103- } ,
104- authProviderConfig . consumerKey ,
105- ) ;
106- }
93+ // Update ConsumerKey if provided
94+ if ( authProviderConfig . consumerKey !== undefined ) {
95+ await frameOrPage . locator ( CONSUMER_KEY_SELECTOR ) . waitFor ( { timeout : 10000 } ) ;
96+ await frameOrPage . locator ( CONSUMER_KEY_SELECTOR ) . fill ( authProviderConfig . consumerKey ) ;
97+ }
10798
108- // Save the changes
109- await frameOrPage . waitForSelector ( SAVE_BUTTON_SELECTOR , { timeout : 10000 } ) ;
110-
111- // Click save button - don't wait for navigation as it may redirect to a non-existent page
112- // Instead, wait for the click to complete and then check for errors
113- const saveButton = await frameOrPage . $ ( SAVE_BUTTON_SELECTOR ) ;
114- if ( ! saveButton ) {
115- throw new Error ( `Save button not found for AuthProvider ' ${ developerName } '` ) ;
116- }
117-
118- // Click the save button
119- await saveButton . click ( ) ;
120-
121- // Wait for save to complete - give it time to process
122- // The page might reload or show a success/error message
123- await new Promise ( ( resolve ) => setTimeout ( resolve , 3000 ) ) ;
124-
125- // Check for errors on the page/frame
126- // If the frame still exists, check it; otherwise check the main page
127- try {
128- // Try to check for errors in the frame first
129- const errorElements = await frameOrPage . $$ ( 'div.errorMsg, div.error, .errorMessage, #errorTitle' ) ;
130- if ( errorElements . length > 0 ) {
131- const errorText = await frameOrPage . evaluate ( ( ) => {
132- const errorDiv = document . querySelector ( 'div.errorMsg, div.error, .errorMessage, #errorTitle' ) ;
133- return errorDiv ? errorDiv . textContent : null ;
134- } ) ;
135- if ( errorText && ! errorText . includes ( 'page no longer exists' ) ) {
136- throw new Error ( `Save failed: ${ errorText } ` ) ;
99+ // Save the changes
100+ await frameOrPage . locator ( SAVE_BUTTON_SELECTOR ) . waitFor ( { timeout : 10000 } ) ;
101+
102+ // Click save button - don't wait for navigation as it may redirect to a non-existent page
103+ // Instead, wait for the click to complete and then check for errors
104+ const saveButtonLocator = frameOrPage . locator ( SAVE_BUTTON_SELECTOR ) ;
105+ const saveButtonCount = await saveButtonLocator . count ( ) ;
106+ if ( saveButtonCount === 0 ) {
107+ throw new Error ( `Save button not found for AuthProvider ' ${ developerName } '` ) ;
108+ }
109+
110+ // Click the save button
111+ await saveButtonLocator . first ( ) . click ( ) ;
112+
113+ // Wait for save to complete - give it time to process
114+ // The page might reload or show a success/error message
115+ await new Promise ( ( resolve ) => setTimeout ( resolve , 3000 ) ) ;
116+
117+ // Check for errors on the page/frame
118+ // If the frame still exists, check it; otherwise check the main page
119+ try {
120+ // Try to check for errors in the frame first
121+ const errorLocator = frameOrPage . locator ( 'div.errorMsg, div.error, .errorMessage, #errorTitle' ) ;
122+ const errorCount = await errorLocator . count ( ) ;
123+ if ( errorCount > 0 ) {
124+ const errorText = await errorLocator . first ( ) . textContent ( ) ;
125+ if ( errorText && ! errorText . includes ( 'page no longer exists' ) ) {
126+ throw new Error ( `Save failed: ${ errorText . trim ( ) } ` ) ;
127+ }
137128 }
129+ } catch ( e ) {
130+ // If checking frame fails, check the main page
131+ await waitForPageErrors ( page ) ;
138132 }
139- } catch ( e ) {
140- // If checking frame fails, check the main page
141- await this . browserforce . throwPageErrors ( page ) ;
142133 }
143134 } catch ( error ) {
144- await page . close ( ) ;
145135 throw new Error ( `Failed to update AuthProvider '${ developerName } ': ${ error . message } ` ) ;
146136 }
147-
148- await page . close ( ) ;
149137 }
150138 }
151139}
0 commit comments