sfdx-browserforce-plugin 5.1.1 → 5.2.0-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +54 -16
- package/lib/browserforce-command.d.ts +15 -0
- package/lib/browserforce-command.js +61 -0
- package/lib/browserforce-command.js.map +1 -0
- package/lib/browserforce.d.ts +29 -0
- package/lib/browserforce.js +194 -0
- package/lib/browserforce.js.map +1 -0
- package/lib/commands/browserforce/apply.d.ts +10 -0
- package/lib/commands/browserforce/apply.js +54 -0
- package/lib/commands/browserforce/apply.js.map +1 -0
- package/lib/commands/browserforce/plan.d.ts +10 -0
- package/lib/commands/browserforce/plan.js +56 -0
- package/lib/commands/browserforce/plan.js.map +1 -0
- package/lib/config-parser.d.ts +16 -0
- package/lib/config-parser.js +24 -0
- package/lib/config-parser.js.map +1 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -0
- package/lib/jsforce-utils.d.ts +5 -0
- package/lib/jsforce-utils.js +14 -0
- package/lib/jsforce-utils.js.map +1 -0
- package/lib/pages/login.d.ts +8 -0
- package/lib/pages/login.js +39 -0
- package/lib/pages/login.js.map +1 -0
- package/lib/plugin.d.ts +17 -0
- package/lib/plugin.js +30 -0
- package/lib/plugin.js.map +1 -0
- package/lib/plugins/activity-settings/index.d.ts +9 -0
- package/lib/plugins/activity-settings/index.e2e-spec.d.ts +1 -0
- package/lib/plugins/activity-settings/index.e2e-spec.js +36 -0
- package/lib/plugins/activity-settings/index.e2e-spec.js.map +1 -0
- package/lib/plugins/activity-settings/index.js +34 -0
- package/lib/plugins/activity-settings/index.js.map +1 -0
- package/lib/plugins/company-information/index.d.ts +8 -0
- package/lib/plugins/company-information/index.e2e-spec.d.ts +1 -0
- package/lib/plugins/company-information/index.e2e-spec.js +37 -0
- package/lib/plugins/company-information/index.e2e-spec.js.map +1 -0
- package/lib/plugins/company-information/index.js +60 -0
- package/lib/plugins/company-information/index.js.map +1 -0
- package/lib/plugins/customer-portal/available-custom-objects/index.d.ts +14 -0
- package/lib/plugins/customer-portal/available-custom-objects/index.js +114 -0
- package/lib/plugins/customer-portal/available-custom-objects/index.js.map +1 -0
- package/lib/plugins/customer-portal/available-custom-objects/index.test.d.ts +1 -0
- package/lib/plugins/customer-portal/available-custom-objects/index.test.js +39 -0
- package/lib/plugins/customer-portal/available-custom-objects/index.test.js.map +1 -0
- package/lib/plugins/customer-portal/enabled/index.d.ts +6 -0
- package/lib/plugins/customer-portal/enabled/index.js +26 -0
- package/lib/plugins/customer-portal/enabled/index.js.map +1 -0
- package/lib/plugins/customer-portal/enabled/index.test.d.ts +1 -0
- package/lib/plugins/customer-portal/enabled/index.test.js +34 -0
- package/lib/plugins/customer-portal/enabled/index.test.js.map +1 -0
- package/lib/plugins/customer-portal/index.d.ts +15 -0
- package/lib/plugins/customer-portal/index.e2e-spec.d.ts +1 -0
- package/lib/plugins/customer-portal/index.e2e-spec.js +202 -0
- package/lib/plugins/customer-portal/index.e2e-spec.js.map +1 -0
- package/lib/plugins/customer-portal/index.js +59 -0
- package/lib/plugins/customer-portal/index.js.map +1 -0
- package/lib/plugins/customer-portal/index.test.d.ts +1 -0
- package/lib/plugins/customer-portal/index.test.js +84 -0
- package/lib/plugins/customer-portal/index.test.js.map +1 -0
- package/lib/plugins/customer-portal/portals/index.d.ts +25 -0
- package/lib/plugins/customer-portal/portals/index.js +216 -0
- package/lib/plugins/customer-portal/portals/index.js.map +1 -0
- package/lib/plugins/customer-portal/portals/index.test.d.ts +1 -0
- package/lib/plugins/customer-portal/portals/index.test.js +140 -0
- package/lib/plugins/customer-portal/portals/index.test.js.map +1 -0
- package/lib/plugins/density-settings/index.d.ts +10 -0
- package/lib/plugins/density-settings/index.e2e-spec.d.ts +1 -0
- package/lib/plugins/density-settings/index.e2e-spec.js +39 -0
- package/lib/plugins/density-settings/index.e2e-spec.js.map +1 -0
- package/lib/plugins/density-settings/index.js +54 -0
- package/lib/plugins/density-settings/index.js.map +1 -0
- package/lib/plugins/deprecated.d.ts +4 -0
- package/lib/plugins/deprecated.js +28 -0
- package/lib/plugins/deprecated.js.map +1 -0
- package/lib/plugins/email-deliverability/index.d.ts +9 -0
- package/lib/plugins/email-deliverability/index.e2e-spec.d.ts +1 -0
- package/lib/plugins/email-deliverability/index.e2e-spec.js +55 -0
- package/lib/plugins/email-deliverability/index.e2e-spec.js.map +1 -0
- package/lib/plugins/email-deliverability/index.js +42 -0
- package/lib/plugins/email-deliverability/index.js.map +1 -0
- package/lib/plugins/high-velocity-sales-settings/index.d.ts +10 -0
- package/lib/plugins/high-velocity-sales-settings/index.e2e-spec.d.ts +1 -0
- package/lib/plugins/high-velocity-sales-settings/index.e2e-spec.js +29 -0
- package/lib/plugins/high-velocity-sales-settings/index.e2e-spec.js.map +1 -0
- package/lib/plugins/high-velocity-sales-settings/index.js +42 -0
- package/lib/plugins/high-velocity-sales-settings/index.js.map +1 -0
- package/lib/plugins/high-velocity-sales-settings/page.d.ts +7 -0
- package/lib/plugins/high-velocity-sales-settings/page.js +28 -0
- package/lib/plugins/high-velocity-sales-settings/page.js.map +1 -0
- package/lib/plugins/history-tracking/index.d.ts +17 -0
- package/lib/plugins/history-tracking/index.e2e-spec.d.ts +1 -0
- package/lib/plugins/history-tracking/index.e2e-spec.js +106 -0
- package/lib/plugins/history-tracking/index.e2e-spec.js.map +1 -0
- package/lib/plugins/history-tracking/index.js +176 -0
- package/lib/plugins/history-tracking/index.js.map +1 -0
- package/lib/plugins/home-page-layouts/index.d.ts +14 -0
- package/lib/plugins/home-page-layouts/index.e2e-spec.d.ts +1 -0
- package/lib/plugins/home-page-layouts/index.e2e-spec.js +47 -0
- package/lib/plugins/home-page-layouts/index.e2e-spec.js.map +1 -0
- package/lib/plugins/home-page-layouts/index.js +94 -0
- package/lib/plugins/home-page-layouts/index.js.map +1 -0
- package/lib/plugins/home-page-layouts/index.test.d.ts +1 -0
- package/lib/plugins/home-page-layouts/index.test.js +104 -0
- package/lib/plugins/home-page-layouts/index.test.js.map +1 -0
- package/lib/plugins/index.d.ts +24 -0
- package/lib/plugins/index.js +25 -0
- package/lib/plugins/index.js.map +1 -0
- package/lib/plugins/lightning-experience-settings/index.d.ts +18 -0
- package/lib/plugins/lightning-experience-settings/index.e2e-spec.d.ts +1 -0
- package/lib/plugins/lightning-experience-settings/index.e2e-spec.js +40 -0
- package/lib/plugins/lightning-experience-settings/index.e2e-spec.js.map +1 -0
- package/lib/plugins/lightning-experience-settings/index.js +101 -0
- package/lib/plugins/lightning-experience-settings/index.js.map +1 -0
- package/lib/plugins/linkedin-sales-navigator-settings/index.d.ts +8 -0
- package/lib/plugins/linkedin-sales-navigator-settings/index.e2e-spec.d.ts +1 -0
- package/lib/plugins/linkedin-sales-navigator-settings/index.e2e-spec.js +29 -0
- package/lib/plugins/linkedin-sales-navigator-settings/index.e2e-spec.js.map +1 -0
- package/lib/plugins/linkedin-sales-navigator-settings/index.js +15 -0
- package/lib/plugins/linkedin-sales-navigator-settings/index.js.map +1 -0
- package/lib/plugins/linkedin-sales-navigator-settings/page.d.ts +10 -0
- package/lib/plugins/linkedin-sales-navigator-settings/page.js +42 -0
- package/lib/plugins/linkedin-sales-navigator-settings/page.js.map +1 -0
- package/lib/plugins/omni-channel-settings/index.d.ts +9 -0
- package/lib/plugins/omni-channel-settings/index.e2e-spec.d.ts +1 -0
- package/lib/plugins/omni-channel-settings/index.e2e-spec.js +30 -0
- package/lib/plugins/omni-channel-settings/index.e2e-spec.js.map +1 -0
- package/lib/plugins/omni-channel-settings/index.js +21 -0
- package/lib/plugins/omni-channel-settings/index.js.map +1 -0
- package/lib/plugins/opportunity-splits/index.d.ts +9 -0
- package/lib/plugins/opportunity-splits/index.e2e-spec.d.ts +1 -0
- package/lib/plugins/opportunity-splits/index.e2e-spec.js +46 -0
- package/lib/plugins/opportunity-splits/index.e2e-spec.js.map +1 -0
- package/lib/plugins/opportunity-splits/index.js +32 -0
- package/lib/plugins/opportunity-splits/index.js.map +1 -0
- package/lib/plugins/opportunity-splits/pages/layout-selection.d.ts +8 -0
- package/lib/plugins/opportunity-splits/pages/layout-selection.js +15 -0
- package/lib/plugins/opportunity-splits/pages/layout-selection.js.map +1 -0
- package/lib/plugins/opportunity-splits/pages/overview.d.ts +10 -0
- package/lib/plugins/opportunity-splits/pages/overview.js +33 -0
- package/lib/plugins/opportunity-splits/pages/overview.js.map +1 -0
- package/lib/plugins/opportunity-splits/pages/setup.d.ts +8 -0
- package/lib/plugins/opportunity-splits/pages/setup.js +17 -0
- package/lib/plugins/opportunity-splits/pages/setup.js.map +1 -0
- package/lib/plugins/permission-sets/index.d.ts +10 -0
- package/lib/plugins/permission-sets/index.e2e-spec.d.ts +1 -0
- package/lib/plugins/permission-sets/index.e2e-spec.js +47 -0
- package/lib/plugins/permission-sets/index.e2e-spec.js.map +1 -0
- package/lib/plugins/permission-sets/index.js +22 -0
- package/lib/plugins/permission-sets/index.js.map +1 -0
- package/lib/plugins/permission-sets/service-presence-status/index.d.ts +10 -0
- package/lib/plugins/permission-sets/service-presence-status/index.js +67 -0
- package/lib/plugins/permission-sets/service-presence-status/index.js.map +1 -0
- package/lib/plugins/picklists/field-dependencies/index.d.ts +11 -0
- package/lib/plugins/picklists/field-dependencies/index.js +56 -0
- package/lib/plugins/picklists/field-dependencies/index.js.map +1 -0
- package/lib/plugins/picklists/field-dependencies/index.test.d.ts +1 -0
- package/lib/plugins/picklists/field-dependencies/index.test.js +64 -0
- package/lib/plugins/picklists/field-dependencies/index.test.js.map +1 -0
- package/lib/plugins/picklists/field-dependencies/pages.d.ts +14 -0
- package/lib/plugins/picklists/field-dependencies/pages.js +49 -0
- package/lib/plugins/picklists/field-dependencies/pages.js.map +1 -0
- package/lib/plugins/picklists/index.d.ts +23 -0
- package/lib/plugins/picklists/index.e2e-spec.d.ts +1 -0
- package/lib/plugins/picklists/index.e2e-spec.js +100 -0
- package/lib/plugins/picklists/index.e2e-spec.js.map +1 -0
- package/lib/plugins/picklists/index.js +153 -0
- package/lib/plugins/picklists/index.js.map +1 -0
- package/lib/plugins/picklists/pages.d.ts +41 -0
- package/lib/plugins/picklists/pages.js +166 -0
- package/lib/plugins/picklists/pages.js.map +1 -0
- package/lib/plugins/picklists/standard-value-set.d.ts +1 -0
- package/lib/plugins/picklists/standard-value-set.js +80 -0
- package/lib/plugins/picklists/standard-value-set.js.map +1 -0
- package/lib/plugins/record-types/index.d.ts +13 -0
- package/lib/plugins/record-types/index.e2e-spec.d.ts +1 -0
- package/lib/plugins/record-types/index.e2e-spec.js +73 -0
- package/lib/plugins/record-types/index.e2e-spec.js.map +1 -0
- package/lib/plugins/record-types/index.js +70 -0
- package/lib/plugins/record-types/index.js.map +1 -0
- package/lib/plugins/record-types/pages.d.ts +15 -0
- package/lib/plugins/record-types/pages.js +56 -0
- package/lib/plugins/record-types/pages.js.map +1 -0
- package/lib/plugins/relate-contact-to-multiple-accounts/index.d.ts +11 -0
- package/lib/plugins/relate-contact-to-multiple-accounts/index.e2e-spec.d.ts +1 -0
- package/lib/plugins/relate-contact-to-multiple-accounts/index.e2e-spec.js +29 -0
- package/lib/plugins/relate-contact-to-multiple-accounts/index.e2e-spec.js.map +1 -0
- package/lib/plugins/relate-contact-to-multiple-accounts/index.js +62 -0
- package/lib/plugins/relate-contact-to-multiple-accounts/index.js.map +1 -0
- package/lib/plugins/reports-and-dashboards/folder-sharing/index.d.ts +8 -0
- package/lib/plugins/reports-and-dashboards/folder-sharing/index.e2e-spec.d.ts +1 -0
- package/lib/plugins/reports-and-dashboards/folder-sharing/index.e2e-spec.js +3 -0
- package/lib/plugins/reports-and-dashboards/folder-sharing/index.e2e-spec.js.map +1 -0
- package/lib/plugins/reports-and-dashboards/folder-sharing/index.js +55 -0
- package/lib/plugins/reports-and-dashboards/folder-sharing/index.js.map +1 -0
- package/lib/plugins/reports-and-dashboards/index.d.ts +11 -0
- package/lib/plugins/reports-and-dashboards/index.e2e-spec.d.ts +1 -0
- package/lib/plugins/reports-and-dashboards/index.e2e-spec.js +3 -0
- package/lib/plugins/reports-and-dashboards/index.e2e-spec.js.map +1 -0
- package/lib/plugins/reports-and-dashboards/index.js +29 -0
- package/lib/plugins/reports-and-dashboards/index.js.map +1 -0
- package/lib/plugins/salesforce-cpq-config/formConfig.d.ts +17 -0
- package/lib/plugins/salesforce-cpq-config/formConfig.js +649 -0
- package/lib/plugins/salesforce-cpq-config/formConfig.js.map +1 -0
- package/lib/plugins/salesforce-cpq-config/index.d.ts +7 -0
- package/lib/plugins/salesforce-cpq-config/index.e2e-spec.d.ts +1 -0
- package/lib/plugins/salesforce-cpq-config/index.e2e-spec.js +37 -0
- package/lib/plugins/salesforce-cpq-config/index.e2e-spec.js.map +1 -0
- package/lib/plugins/salesforce-cpq-config/index.js +214 -0
- package/lib/plugins/salesforce-cpq-config/index.js.map +1 -0
- package/lib/plugins/salesforce-to-salesforce/index.d.ts +9 -0
- package/lib/plugins/salesforce-to-salesforce/index.e2e-spec.d.ts +1 -0
- package/lib/plugins/salesforce-to-salesforce/index.e2e-spec.js +35 -0
- package/lib/plugins/salesforce-to-salesforce/index.e2e-spec.js.map +1 -0
- package/lib/plugins/salesforce-to-salesforce/index.js +36 -0
- package/lib/plugins/salesforce-to-salesforce/index.js.map +1 -0
- package/lib/plugins/security/authentication-configuration/index.d.ts +11 -0
- package/lib/plugins/security/authentication-configuration/index.e2e-spec.d.ts +1 -0
- package/lib/plugins/security/authentication-configuration/index.e2e-spec.js +101 -0
- package/lib/plugins/security/authentication-configuration/index.e2e-spec.js.map +1 -0
- package/lib/plugins/security/authentication-configuration/index.js +67 -0
- package/lib/plugins/security/authentication-configuration/index.js.map +1 -0
- package/lib/plugins/security/certificate-and-key-management/index.d.ts +23 -0
- package/lib/plugins/security/certificate-and-key-management/index.e2e-spec.d.ts +1 -0
- package/lib/plugins/security/certificate-and-key-management/index.e2e-spec.js +63 -0
- package/lib/plugins/security/certificate-and-key-management/index.e2e-spec.js.map +1 -0
- package/lib/plugins/security/certificate-and-key-management/index.js +154 -0
- package/lib/plugins/security/certificate-and-key-management/index.js.map +1 -0
- package/lib/plugins/security/certificate-and-key-management/index.test.d.ts +1 -0
- package/lib/plugins/security/certificate-and-key-management/index.test.js +61 -0
- package/lib/plugins/security/certificate-and-key-management/index.test.js.map +1 -0
- package/lib/plugins/security/index.d.ts +13 -0
- package/lib/plugins/security/index.js +42 -0
- package/lib/plugins/security/index.js.map +1 -0
- package/lib/plugins/service-channels/capacity/index.d.ts +18 -0
- package/lib/plugins/service-channels/capacity/index.js +162 -0
- package/lib/plugins/service-channels/capacity/index.js.map +1 -0
- package/lib/plugins/service-channels/index.d.ts +12 -0
- package/lib/plugins/service-channels/index.e2e-spec.d.ts +1 -0
- package/lib/plugins/service-channels/index.e2e-spec.js +61 -0
- package/lib/plugins/service-channels/index.e2e-spec.js.map +1 -0
- package/lib/plugins/service-channels/index.js +38 -0
- package/lib/plugins/service-channels/index.js.map +1 -0
- package/lib/plugins/slack/index.d.ts +9 -0
- package/lib/plugins/slack/index.e2e-spec.d.ts +1 -0
- package/lib/plugins/slack/index.e2e-spec.js +47 -0
- package/lib/plugins/slack/index.e2e-spec.js.map +1 -0
- package/lib/plugins/slack/index.js +46 -0
- package/lib/plugins/slack/index.js.map +1 -0
- package/lib/plugins/user-access-policies/index.d.ts +19 -0
- package/lib/plugins/user-access-policies/index.e2e-spec.d.ts +1 -0
- package/lib/plugins/user-access-policies/index.e2e-spec.js +63 -0
- package/lib/plugins/user-access-policies/index.e2e-spec.js.map +1 -0
- package/lib/plugins/user-access-policies/index.js +107 -0
- package/lib/plugins/user-access-policies/index.js.map +1 -0
- package/lib/plugins/user-access-policies/page.d.ts +29 -0
- package/lib/plugins/user-access-policies/page.js +115 -0
- package/lib/plugins/user-access-policies/page.js.map +1 -0
- package/lib/plugins/utils.d.ts +3 -0
- package/lib/plugins/utils.js +47 -0
- package/lib/plugins/utils.js.map +1 -0
- package/oclif.manifest.json +153 -0
- package/package.json +2 -2
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
const FRONT_DOOR_PATH = 'secur/frontdoor.jsp';
|
|
2
|
+
const POST_LOGIN_PATH = 'setup/forcecomHomepage.apexp';
|
|
3
|
+
const ERROR_DIV_SELECTOR = '#error';
|
|
4
|
+
export class LoginPage {
|
|
5
|
+
page;
|
|
6
|
+
constructor(page) {
|
|
7
|
+
this.page = page;
|
|
8
|
+
}
|
|
9
|
+
async login(org) {
|
|
10
|
+
try {
|
|
11
|
+
await org.refreshAuth();
|
|
12
|
+
}
|
|
13
|
+
catch (_) {
|
|
14
|
+
throw new Error('login failed');
|
|
15
|
+
}
|
|
16
|
+
const conn = org.getConnection();
|
|
17
|
+
const response = await this.page.goto(`${conn.instanceUrl.replace(/\/$/, '')}/${FRONT_DOOR_PATH}?sid=${conn.accessToken}&retURL=${encodeURIComponent(POST_LOGIN_PATH)}`, {
|
|
18
|
+
waitUntil: 'load',
|
|
19
|
+
});
|
|
20
|
+
const url = new URL(response.url());
|
|
21
|
+
if (url.searchParams.has('startURL')) {
|
|
22
|
+
// when query param startURL exists, the login failed
|
|
23
|
+
// e.g. /?ec=302&startURL=https...
|
|
24
|
+
await this.throwPageErrors();
|
|
25
|
+
}
|
|
26
|
+
return this;
|
|
27
|
+
}
|
|
28
|
+
async throwPageErrors() {
|
|
29
|
+
const errorLocator = this.page.locator(ERROR_DIV_SELECTOR);
|
|
30
|
+
const errorCount = await errorLocator.count();
|
|
31
|
+
if (errorCount > 0) {
|
|
32
|
+
const errorMessage = (await errorLocator.first().innerText())?.trim();
|
|
33
|
+
if (errorMessage) {
|
|
34
|
+
throw new Error(errorMessage);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/pages/login.ts"],"names":[],"mappings":"AAGA,MAAM,eAAe,GAAG,qBAAqB,CAAC;AAC9C,MAAM,eAAe,GAAG,8BAA8B,CAAC;AAEvD,MAAM,kBAAkB,GAAG,QAAQ,CAAC;AAEpC,MAAM,OAAO,SAAS;IACZ,IAAI,CAAO;IAEnB,YAAY,IAAU;QACpB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAQ;QAClB,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;QAC1B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;QAClC,CAAC;QACD,MAAM,IAAI,GAAG,GAAG,CAAC,aAAa,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CACnC,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,eAAe,QACvD,IAAI,CAAC,WACP,WAAW,kBAAkB,CAAC,eAAe,CAAC,EAAE,EAChD;YACE,SAAS,EAAE,MAAM;SAClB,CACF,CAAC;QACF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;QACpC,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YACrC,qDAAqD;YACrD,kCAAkC;YAClC,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC/B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QAC3D,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,CAAC;QAE9C,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACnB,MAAM,YAAY,GAAG,CAAC,MAAM,YAAY,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;YACtE,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
|
package/lib/plugin.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Org } from '@salesforce/core';
|
|
2
|
+
import { Browserforce } from './browserforce.js';
|
|
3
|
+
export declare abstract class BrowserforcePlugin {
|
|
4
|
+
protected browserforce: Browserforce;
|
|
5
|
+
protected org: Org;
|
|
6
|
+
constructor(browserforce: Browserforce);
|
|
7
|
+
abstract retrieve(definition?: unknown): Promise<unknown>;
|
|
8
|
+
/**
|
|
9
|
+
* deep diff
|
|
10
|
+
* @param state
|
|
11
|
+
* @param definition
|
|
12
|
+
* @returns undefined when there is no diff
|
|
13
|
+
*/
|
|
14
|
+
diff(state: unknown, definition: unknown): unknown;
|
|
15
|
+
abstract apply(plan: unknown): Promise<unknown>;
|
|
16
|
+
run(definition: unknown): Promise<unknown>;
|
|
17
|
+
}
|
package/lib/plugin.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { deepDiff } from './plugins/utils.js';
|
|
2
|
+
export class BrowserforcePlugin {
|
|
3
|
+
browserforce;
|
|
4
|
+
org;
|
|
5
|
+
constructor(browserforce) {
|
|
6
|
+
this.browserforce = browserforce;
|
|
7
|
+
this.org = browserforce?.org;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* deep diff
|
|
11
|
+
* @param state
|
|
12
|
+
* @param definition
|
|
13
|
+
* @returns undefined when there is no diff
|
|
14
|
+
*/
|
|
15
|
+
diff(state, definition) {
|
|
16
|
+
return deepDiff(state, definition);
|
|
17
|
+
}
|
|
18
|
+
async run(definition) {
|
|
19
|
+
const state = await this.retrieve(definition);
|
|
20
|
+
const diff = this.diff(state, definition);
|
|
21
|
+
if (diff !== undefined) {
|
|
22
|
+
const result = await this.apply(diff);
|
|
23
|
+
return result;
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
message: 'no action necessary',
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,MAAM,OAAgB,kBAAkB;IAC5B,YAAY,CAAe;IAC3B,GAAG,CAAM;IAEnB,YAAmB,YAA0B;QAC3C,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,GAAG,GAAG,YAAY,EAAE,GAAG,CAAC;IAC/B,CAAC;IAED;;;;;OAKG;IACI,IAAI,CAAC,KAAc,EAAE,UAAmB;QAC7C,OAAO,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IACrC,CAAC;IAEM,KAAK,CAAC,GAAG,CAAC,UAAmB;QAClC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAC1C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACtC,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,OAAO;YACL,OAAO,EAAE,qBAAqB;SAC/B,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { BrowserforcePlugin } from '../../plugin.js';
|
|
2
|
+
type Config = {
|
|
3
|
+
allowUsersToRelateMultipleContactsToTasksAndEvents: boolean;
|
|
4
|
+
};
|
|
5
|
+
export declare class ActivitySettings extends BrowserforcePlugin {
|
|
6
|
+
retrieve(): Promise<Config>;
|
|
7
|
+
apply(config: Config): Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import assert from 'assert';
|
|
2
|
+
import { ActivitySettings } from './index.js';
|
|
3
|
+
describe(ActivitySettings.name, function () {
|
|
4
|
+
let plugin;
|
|
5
|
+
before(() => {
|
|
6
|
+
plugin = new ActivitySettings(global.bf);
|
|
7
|
+
});
|
|
8
|
+
describe('allowUsersToRelateMultipleContactsToTasksAndEvents', () => {
|
|
9
|
+
const configEnabled = {
|
|
10
|
+
allowUsersToRelateMultipleContactsToTasksAndEvents: true,
|
|
11
|
+
};
|
|
12
|
+
const configDisabled = {
|
|
13
|
+
allowUsersToRelateMultipleContactsToTasksAndEvents: false,
|
|
14
|
+
};
|
|
15
|
+
it('should enable', async () => {
|
|
16
|
+
await plugin.run(configEnabled);
|
|
17
|
+
});
|
|
18
|
+
it('should be enabled', async () => {
|
|
19
|
+
const res = await plugin.retrieve();
|
|
20
|
+
assert.deepStrictEqual(res, configEnabled);
|
|
21
|
+
});
|
|
22
|
+
it('should fail to disable', async () => {
|
|
23
|
+
let err;
|
|
24
|
+
try {
|
|
25
|
+
await plugin.apply(configDisabled);
|
|
26
|
+
}
|
|
27
|
+
catch (e) {
|
|
28
|
+
err = e;
|
|
29
|
+
}
|
|
30
|
+
assert.throws(() => {
|
|
31
|
+
throw err;
|
|
32
|
+
}, /can only be disabled/);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=index.e2e-spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.e2e-spec.js","sourceRoot":"","sources":["../../../src/plugins/activity-settings/index.e2e-spec.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,QAAQ,CAAC,gBAAgB,CAAC,IAAI,EAAE;IAC9B,IAAI,MAAwB,CAAC;IAC7B,MAAM,CAAC,GAAG,EAAE;QACV,MAAM,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAClE,MAAM,aAAa,GAAG;YACpB,kDAAkD,EAAE,IAAI;SACzD,CAAC;QACF,MAAM,cAAc,GAAG;YACrB,kDAAkD,EAAE,KAAK;SAC1D,CAAC;QAEF,EAAE,CAAC,eAAe,EAAE,KAAK,IAAI,EAAE;YAC7B,MAAM,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;YACjC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpC,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;YACtC,IAAI,GAAG,CAAC;YACR,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YACrC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,GAAG,GAAG,CAAC,CAAC;YACV,CAAC;YACD,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE;gBACjB,MAAM,GAAG,CAAC;YACZ,CAAC,EAAE,sBAAsB,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { BrowserforcePlugin } from '../../plugin.js';
|
|
2
|
+
const BASE_PATH = 'setup/activitiesSetupPage.apexp';
|
|
3
|
+
const MANY_WHO_PREF_INPUT_SELECTOR = 'input[id="thePage:theForm:theBlock:manyWhoPref"]';
|
|
4
|
+
const SUBMIT_BUTTON_SELECTOR = 'input[id="thePage:theForm:theBlock:buttons:submit"]';
|
|
5
|
+
export class ActivitySettings extends BrowserforcePlugin {
|
|
6
|
+
async retrieve() {
|
|
7
|
+
const page = await this.browserforce.openPage(BASE_PATH);
|
|
8
|
+
const response = {
|
|
9
|
+
allowUsersToRelateMultipleContactsToTasksAndEvents: await page
|
|
10
|
+
.locator(MANY_WHO_PREF_INPUT_SELECTOR)
|
|
11
|
+
.isChecked(),
|
|
12
|
+
};
|
|
13
|
+
await page.close();
|
|
14
|
+
return response;
|
|
15
|
+
}
|
|
16
|
+
async apply(config) {
|
|
17
|
+
if (config.allowUsersToRelateMultipleContactsToTasksAndEvents === false) {
|
|
18
|
+
throw new Error('`allowUsersToRelateMultipleContactsToTasksAndEvents` can only be disabled with help of the salesforce.com Support team');
|
|
19
|
+
}
|
|
20
|
+
const page = await this.browserforce.openPage(BASE_PATH);
|
|
21
|
+
await page.locator(MANY_WHO_PREF_INPUT_SELECTOR).waitFor();
|
|
22
|
+
await page
|
|
23
|
+
.locator(MANY_WHO_PREF_INPUT_SELECTOR)
|
|
24
|
+
.evaluate((e, v) => {
|
|
25
|
+
e.checked = v;
|
|
26
|
+
}, config.allowUsersToRelateMultipleContactsToTasksAndEvents);
|
|
27
|
+
await Promise.all([
|
|
28
|
+
page.waitForLoadState('load'),
|
|
29
|
+
page.locator(SUBMIT_BUTTON_SELECTOR).click(),
|
|
30
|
+
]);
|
|
31
|
+
await page.close();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/activity-settings/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,MAAM,SAAS,GAAG,iCAAiC,CAAC;AAEpD,MAAM,4BAA4B,GAChC,kDAAkD,CAAC;AACrD,MAAM,sBAAsB,GAC1B,qDAAqD,CAAC;AAMxD,MAAM,OAAO,gBAAiB,SAAQ,kBAAkB;IAC/C,KAAK,CAAC,QAAQ;QACnB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG;YACf,kDAAkD,EAAE,MAAM,IAAI;iBAC3D,OAAO,CAAC,4BAA4B,CAAC;iBACrC,SAAS,EAAE;SACf,CAAC;QACF,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEM,KAAK,CAAC,KAAK,CAAC,MAAc;QAC/B,IAAI,MAAM,CAAC,kDAAkD,KAAK,KAAK,EAAE,CAAC;YACxE,MAAM,IAAI,KAAK,CACb,wHAAwH,CACzH,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACzD,MAAM,IAAI,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC,OAAO,EAAE,CAAC;QAE3D,MAAM,IAAI;aACP,OAAO,CAAC,4BAA4B,CAAC;aACrC,QAAQ,CAAC,CAAC,CAAmB,EAAE,CAAU,EAAE,EAAE;YAC5C,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC;QAChB,CAAC,EAAE,MAAM,CAAC,kDAAkD,CAAC,CAAC;QAEhE,MAAM,OAAO,CAAC,GAAG,CAAC;YAChB,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;YAC7B,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,KAAK,EAAE;SAC7C,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import assert from 'assert';
|
|
2
|
+
import { CompanyInformation } from './index.js';
|
|
3
|
+
describe(CompanyInformation.name, function () {
|
|
4
|
+
let plugin;
|
|
5
|
+
before(() => {
|
|
6
|
+
plugin = new CompanyInformation(global.bf);
|
|
7
|
+
});
|
|
8
|
+
const configZAR = {
|
|
9
|
+
defaultCurrencyIsoCode: 'English (South Africa) - ZAR',
|
|
10
|
+
};
|
|
11
|
+
const configIRE = {
|
|
12
|
+
defaultCurrencyIsoCode: 'English (Ireland) - EUR',
|
|
13
|
+
};
|
|
14
|
+
it('should set the currency to "English (South Africa) - ZAR" for next steps', async () => {
|
|
15
|
+
await plugin.run(configZAR);
|
|
16
|
+
});
|
|
17
|
+
it('should change currency to "English (Ireland) - EUR"', async () => {
|
|
18
|
+
await plugin.run(configIRE);
|
|
19
|
+
});
|
|
20
|
+
it('should respond to no action necessary for currency change', async () => {
|
|
21
|
+
const res = await plugin.run(configIRE);
|
|
22
|
+
assert.deepStrictEqual(res, { message: 'no action necessary' });
|
|
23
|
+
});
|
|
24
|
+
it('should error on invalid input for invalid currency', async () => {
|
|
25
|
+
let err;
|
|
26
|
+
try {
|
|
27
|
+
await plugin.apply({ defaultCurrencyIsoCode: 'Invalid Currency' });
|
|
28
|
+
}
|
|
29
|
+
catch (e) {
|
|
30
|
+
err = e;
|
|
31
|
+
}
|
|
32
|
+
assert.throws(() => {
|
|
33
|
+
throw err;
|
|
34
|
+
}, /Invalid currency provided/);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
//# sourceMappingURL=index.e2e-spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.e2e-spec.js","sourceRoot":"","sources":["../../../src/plugins/company-information/index.e2e-spec.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAU,MAAM,YAAY,CAAC;AAExD,QAAQ,CAAC,kBAAkB,CAAC,IAAI,EAAE;IAChC,IAAI,MAA0B,CAAC;IAC/B,MAAM,CAAC,GAAG,EAAE;QACV,MAAM,GAAG,IAAI,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAW;QACxB,sBAAsB,EAAE,8BAA8B;KACvD,CAAC;IACF,MAAM,SAAS,GAAW;QACxB,sBAAsB,EAAE,yBAAyB;KAClD,CAAC;IAEF,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;QACxF,MAAM,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,IAAI,GAAG,CAAC;QACR,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,CAAC,CAAC;QACrE,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,GAAG,GAAG,CAAC,CAAC;QACV,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE;YACjB,MAAM,GAAG,CAAC;QACZ,CAAC,EAAE,2BAA2B,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { BrowserforcePlugin } from '../../plugin.js';
|
|
2
|
+
const getUrl = (orgId) => `/${orgId}/e`;
|
|
3
|
+
const CURRENCY_DROPDOWN_SELECTOR = '#DefaultCurrencyIsoCode';
|
|
4
|
+
const SAVE_BUTTON_SELECTOR = 'input[class="btn"][type="submit"][name="save"]';
|
|
5
|
+
export class CompanyInformation extends BrowserforcePlugin {
|
|
6
|
+
async retrieve() {
|
|
7
|
+
const page = await this.browserforce.openPage(getUrl(this.org.getOrgId()));
|
|
8
|
+
await page.locator(CURRENCY_DROPDOWN_SELECTOR).waitFor();
|
|
9
|
+
const response = {
|
|
10
|
+
defaultCurrencyIsoCode: '',
|
|
11
|
+
};
|
|
12
|
+
const selectedOption = await page
|
|
13
|
+
.locator(`${CURRENCY_DROPDOWN_SELECTOR} > option[selected]`)
|
|
14
|
+
.first()
|
|
15
|
+
.textContent();
|
|
16
|
+
if (selectedOption) {
|
|
17
|
+
response.defaultCurrencyIsoCode = selectedOption;
|
|
18
|
+
}
|
|
19
|
+
await page.close();
|
|
20
|
+
return response;
|
|
21
|
+
}
|
|
22
|
+
async apply(config) {
|
|
23
|
+
if (config.defaultCurrencyIsoCode !== undefined) {
|
|
24
|
+
const page = await this.browserforce.openPage(getUrl(this.org.getOrgId()));
|
|
25
|
+
// wait for selectors
|
|
26
|
+
await page.locator(CURRENCY_DROPDOWN_SELECTOR).waitFor();
|
|
27
|
+
await page.locator(SAVE_BUTTON_SELECTOR).waitFor();
|
|
28
|
+
// apply changes
|
|
29
|
+
const optionLocator = page.locator(`${CURRENCY_DROPDOWN_SELECTOR} > option`);
|
|
30
|
+
const optionCount = await optionLocator.count();
|
|
31
|
+
const optionList = [];
|
|
32
|
+
for (let i = 0; i < optionCount; i++) {
|
|
33
|
+
const option = optionLocator.nth(i);
|
|
34
|
+
const value = await option.getAttribute('value');
|
|
35
|
+
const textContent = await option.textContent();
|
|
36
|
+
if (value && textContent) {
|
|
37
|
+
optionList.push({ value, textContent });
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
const toBeSelectedOption = optionList.find((option) => option.textContent === config.defaultCurrencyIsoCode);
|
|
41
|
+
if (!toBeSelectedOption) {
|
|
42
|
+
throw new Error(`Invalid currency provided. '${config.defaultCurrencyIsoCode}' is not a valid option available for currencies. Please use the exact name as it appears in the list.`);
|
|
43
|
+
}
|
|
44
|
+
await page
|
|
45
|
+
.locator(CURRENCY_DROPDOWN_SELECTOR)
|
|
46
|
+
.selectOption(toBeSelectedOption.value);
|
|
47
|
+
// auto accept the dialog when it appears
|
|
48
|
+
page.on('dialog', (dialog) => {
|
|
49
|
+
dialog.accept();
|
|
50
|
+
});
|
|
51
|
+
// save
|
|
52
|
+
await Promise.all([
|
|
53
|
+
page.waitForLoadState('load'),
|
|
54
|
+
page.locator(SAVE_BUTTON_SELECTOR).click(),
|
|
55
|
+
]);
|
|
56
|
+
await page.close();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/company-information/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { BrowserforcePlugin } from '../../../plugin.js';
|
|
2
|
+
export type Config = AvailableCustomObjectConfig[];
|
|
3
|
+
type AvailableCustomObjectConfig = {
|
|
4
|
+
name: string;
|
|
5
|
+
namespacePrefix?: string;
|
|
6
|
+
available: boolean;
|
|
7
|
+
_id?: string;
|
|
8
|
+
};
|
|
9
|
+
export declare class CustomerPortalAvailableCustomObjects extends BrowserforcePlugin {
|
|
10
|
+
retrieve(definition: Config): Promise<Config>;
|
|
11
|
+
diff(state?: Config, definition?: Config): Config | undefined;
|
|
12
|
+
apply(plan: Config): Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { BrowserforcePlugin } from '../../../plugin.js';
|
|
2
|
+
import { semanticallyCleanObject } from '../../utils.js';
|
|
3
|
+
const SAVE_BUTTON_SELECTOR = 'input[name="save"]';
|
|
4
|
+
const CUSTOM_OBJECT_AVAILABLE_FOR_CUSTOMER_PORTAL_SELECTOR = '#options_9';
|
|
5
|
+
export class CustomerPortalAvailableCustomObjects extends BrowserforcePlugin {
|
|
6
|
+
async retrieve(definition) {
|
|
7
|
+
const response = [];
|
|
8
|
+
if (definition) {
|
|
9
|
+
const availableCustomObjectList = definition
|
|
10
|
+
.map((customObject) => {
|
|
11
|
+
return `'${customObject.name}'`;
|
|
12
|
+
})
|
|
13
|
+
.join(',');
|
|
14
|
+
const customObjects = await this.org
|
|
15
|
+
.getConnection()
|
|
16
|
+
.tooling.query(`SELECT Id, DeveloperName, NamespacePrefix FROM CustomObject WHERE DeveloperName IN (${availableCustomObjectList}) ORDER BY CreatedDate DESC`, { scanAll: false });
|
|
17
|
+
// Note: Unfortunately scanAll=false has no impact and returns deleted CustomObjects.
|
|
18
|
+
// Workaround: Order by CreatedDate DESC to get the latest CustomObject first.
|
|
19
|
+
for (const record of customObjects?.records) {
|
|
20
|
+
if (record.NamespacePrefix === null) {
|
|
21
|
+
record.NamespacePrefix = undefined;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const page = await this.browserforce.openPage('');
|
|
25
|
+
// new URLs for LEX: https://help.salesforce.com/articleView?id=FAQ-for-the-New-URL-Format-for-Lightning-Experience-and-the-Salesforce-Mobile-App&type=1
|
|
26
|
+
const isLEX = page.url().includes('/one/one.app') ||
|
|
27
|
+
page.url().includes('/lightning/');
|
|
28
|
+
const getObjectPageUrl = function (customObject, isLexUi = true) {
|
|
29
|
+
const classicUiPath = `${customObject._id}/e`;
|
|
30
|
+
if (isLexUi) {
|
|
31
|
+
return `lightning/setup/ObjectManager/${customObject._id}/edit?nodeId=ObjectManager&address=${encodeURIComponent(`/${classicUiPath}`)}`;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
return classicUiPath;
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
for (const availableCustomObject of definition) {
|
|
38
|
+
const customObject = customObjects.records.find((co) => {
|
|
39
|
+
return (co.DeveloperName === availableCustomObject.name &&
|
|
40
|
+
co.NamespacePrefix === availableCustomObject.namespacePrefix);
|
|
41
|
+
});
|
|
42
|
+
if (!customObject) {
|
|
43
|
+
throw new Error(`Could not find CustomObject: {DeveloperName: ${availableCustomObject.name}, NamespacePrefix: ${availableCustomObject.namespacePrefix}`);
|
|
44
|
+
}
|
|
45
|
+
const result = {
|
|
46
|
+
_id: customObject.Id,
|
|
47
|
+
name: customObject.DeveloperName,
|
|
48
|
+
namespacePrefix: customObject.NamespacePrefix,
|
|
49
|
+
};
|
|
50
|
+
const pageUrl = getObjectPageUrl(result, isLEX);
|
|
51
|
+
const editPage = await this.browserforce.openPage(pageUrl);
|
|
52
|
+
const frameOrPage = await this.browserforce.waitForSelectorInFrameOrPage(editPage, CUSTOM_OBJECT_AVAILABLE_FOR_CUSTOMER_PORTAL_SELECTOR);
|
|
53
|
+
response.push({
|
|
54
|
+
...result,
|
|
55
|
+
available: await frameOrPage
|
|
56
|
+
.locator(CUSTOM_OBJECT_AVAILABLE_FOR_CUSTOMER_PORTAL_SELECTOR)
|
|
57
|
+
.evaluate((el) => el.checked),
|
|
58
|
+
});
|
|
59
|
+
await editPage.close();
|
|
60
|
+
}
|
|
61
|
+
await page.close();
|
|
62
|
+
}
|
|
63
|
+
return response;
|
|
64
|
+
}
|
|
65
|
+
diff(state, definition) {
|
|
66
|
+
const response = [];
|
|
67
|
+
if (state && definition) {
|
|
68
|
+
for (const availableCustomObject of definition) {
|
|
69
|
+
const oldCustomObject = state.find((customObject) => {
|
|
70
|
+
return (customObject.name === availableCustomObject.name &&
|
|
71
|
+
customObject.namespacePrefix ===
|
|
72
|
+
availableCustomObject.namespacePrefix);
|
|
73
|
+
});
|
|
74
|
+
if (!oldCustomObject) {
|
|
75
|
+
throw new Error(`Could not find CustomObject "${availableCustomObject.name}"`);
|
|
76
|
+
}
|
|
77
|
+
// copy id of existing object to new object to be retained and used
|
|
78
|
+
availableCustomObject._id = oldCustomObject._id;
|
|
79
|
+
const diff = semanticallyCleanObject(super.diff(oldCustomObject, availableCustomObject), '_id');
|
|
80
|
+
if (diff?.available !== undefined) {
|
|
81
|
+
response.push(diff);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return response.length ? response : undefined;
|
|
86
|
+
}
|
|
87
|
+
async apply(plan) {
|
|
88
|
+
if (plan && plan.length) {
|
|
89
|
+
const page = await this.browserforce.openPage('');
|
|
90
|
+
// new URLs for LEX: https://help.salesforce.com/articleView?id=FAQ-for-the-New-URL-Format-for-Lightning-Experience-and-the-Salesforce-Mobile-App&type=1
|
|
91
|
+
const isLEX = page.url().includes('/one/one.app') ||
|
|
92
|
+
page.url().includes('/lightning/');
|
|
93
|
+
const getObjectPageUrl = function (customObject, isLexUi = true) {
|
|
94
|
+
const classicUiPath = `${customObject._id}/e?options_9=${customObject.available ? 1 : 0}&retURL=/${customObject._id}`;
|
|
95
|
+
if (isLexUi) {
|
|
96
|
+
return `lightning/setup/ObjectManager/${customObject._id}/edit?nodeId=ObjectManager&address=${encodeURIComponent(`/${classicUiPath}`)}`;
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
return classicUiPath;
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
for (const customObject of plan) {
|
|
103
|
+
const pageUrl = getObjectPageUrl(customObject, isLEX);
|
|
104
|
+
const editPage = await this.browserforce.openPage(pageUrl);
|
|
105
|
+
const frameOrPage = await this.browserforce.waitForSelectorInFrameOrPage(editPage, SAVE_BUTTON_SELECTOR);
|
|
106
|
+
await frameOrPage.locator(SAVE_BUTTON_SELECTOR).first().click();
|
|
107
|
+
await editPage.getByRole('heading', { name: 'Details' }).waitFor();
|
|
108
|
+
await editPage.close();
|
|
109
|
+
}
|
|
110
|
+
await page.close();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/customer-portal/available-custom-objects/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import assert from 'assert';
|
|
2
|
+
import { CustomerPortalAvailableCustomObjects } from './index.js';
|
|
3
|
+
const tests = [
|
|
4
|
+
{
|
|
5
|
+
description: 'should only return necessary fields',
|
|
6
|
+
source: [
|
|
7
|
+
{
|
|
8
|
+
_id: 'p1',
|
|
9
|
+
name: 'Dummy',
|
|
10
|
+
available: false,
|
|
11
|
+
},
|
|
12
|
+
],
|
|
13
|
+
target: [
|
|
14
|
+
{
|
|
15
|
+
name: 'Dummy',
|
|
16
|
+
available: true,
|
|
17
|
+
},
|
|
18
|
+
],
|
|
19
|
+
expected: [
|
|
20
|
+
{
|
|
21
|
+
_id: 'p1',
|
|
22
|
+
name: 'Dummy',
|
|
23
|
+
available: true,
|
|
24
|
+
},
|
|
25
|
+
],
|
|
26
|
+
},
|
|
27
|
+
];
|
|
28
|
+
describe('CustomerPortalAvailableCustomObjects', () => {
|
|
29
|
+
describe('diff()', () => {
|
|
30
|
+
const p = new CustomerPortalAvailableCustomObjects(global.bf);
|
|
31
|
+
for (const t of tests) {
|
|
32
|
+
it(t.description, () => {
|
|
33
|
+
const actual = p.diff(t.source, t.target);
|
|
34
|
+
assert.deepStrictEqual(actual, t.expected);
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
//# sourceMappingURL=index.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../../src/plugins/customer-portal/available-custom-objects/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAe,oCAAoC,EAAE,MAAM,YAAY,CAAC;AAQ/E,MAAM,KAAK,GAAQ;IACjB;QACE,WAAW,EAAE,qCAAqC;QAClD,MAAM,EAAE;YACN;gBACE,GAAG,EAAE,IAAI;gBACT,IAAI,EAAE,OAAO;gBACb,SAAS,EAAE,KAAK;aACjB;SACF;QACD,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,OAAO;gBACb,SAAS,EAAE,IAAI;aAChB;SACF;QACD,QAAQ,EAAE;YACR;gBACE,GAAG,EAAE,IAAI;gBACT,IAAI,EAAE,OAAO;gBACb,SAAS,EAAE,IAAI;aAChB;SACQ;KACZ;CACF,CAAC;AAEF,QAAQ,CAAC,sCAAsC,EAAE,GAAG,EAAE;IACpD,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;QACtB,MAAM,CAAC,GAAG,IAAI,oCAAoC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC9D,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,EAAE;gBACrB,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;gBAC1C,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;YAC7C,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { BrowserforcePlugin } from '../../../plugin.js';
|
|
2
|
+
const BASE_PATH = '_ui/core/portal/CustomerSuccessPortalSetup/e';
|
|
3
|
+
const SAVE_BUTTON = 'input[name="save"]';
|
|
4
|
+
const ENABLE_CHECKBOX = 'input[type="checkbox"][id="penabled"]';
|
|
5
|
+
export class CustomerPortalEnable extends BrowserforcePlugin {
|
|
6
|
+
async retrieve() {
|
|
7
|
+
const conn = await this.browserforce.org.getConnection();
|
|
8
|
+
const orgSettings = await conn.metadata.read('OrgSettings', 'Org');
|
|
9
|
+
return orgSettings.enableCustomerSuccessPortal ?? false;
|
|
10
|
+
}
|
|
11
|
+
async apply(plan) {
|
|
12
|
+
if (plan === false) {
|
|
13
|
+
throw new Error('`enabled` cannot be disabled once enabled');
|
|
14
|
+
}
|
|
15
|
+
const page = await this.browserforce.openPage(BASE_PATH);
|
|
16
|
+
await page
|
|
17
|
+
.locator(ENABLE_CHECKBOX)
|
|
18
|
+
.evaluate((checkbox) => {
|
|
19
|
+
checkbox.checked = true;
|
|
20
|
+
});
|
|
21
|
+
await page.locator(SAVE_BUTTON).first().click();
|
|
22
|
+
await page.waitForLoadState('load');
|
|
23
|
+
await page.close();
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/customer-portal/enabled/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,SAAS,GAAG,8CAA8C,CAAC;AAEjE,MAAM,WAAW,GAAG,oBAAoB,CAAC;AACzC,MAAM,eAAe,GAAG,uCAAuC,CAAC;AAIhE,MAAM,OAAO,oBAAqB,SAAQ,kBAAkB;IACnD,KAAK,CAAC,QAAQ;QACnB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QACzD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;QACnE,OAAO,WAAW,CAAC,2BAA2B,IAAI,KAAK,CAAC;IAC1D,CAAC;IAEM,KAAK,CAAC,KAAK,CAAC,IAAY;QAC7B,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACzD,MAAM,IAAI;aACP,OAAO,CAAC,eAAe,CAAC;aACxB,QAAQ,CAAC,CAAC,QAA0B,EAAE,EAAE;YACvC,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;QAC1B,CAAC,CAAC,CAAC;QACL,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC;QAChD,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import assert from 'assert';
|
|
2
|
+
import { CustomerPortalEnable as CustomerPortalEnabled } from './index.js';
|
|
3
|
+
const tests = [
|
|
4
|
+
{
|
|
5
|
+
description: 'should ignore a non-existent target flag',
|
|
6
|
+
source: true,
|
|
7
|
+
target: undefined,
|
|
8
|
+
expected: undefined,
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
description: 'should ignore a matching target flag',
|
|
12
|
+
source: true,
|
|
13
|
+
target: true,
|
|
14
|
+
expected: undefined,
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
description: 'should detect a changed flag',
|
|
18
|
+
source: false,
|
|
19
|
+
target: true,
|
|
20
|
+
expected: true,
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
describe('CustomerPortalEnabled', () => {
|
|
24
|
+
describe('diff()', () => {
|
|
25
|
+
const p = new CustomerPortalEnabled(global.bf);
|
|
26
|
+
for (const t of tests) {
|
|
27
|
+
it(t.description, () => {
|
|
28
|
+
const actual = p.diff(t.source, t.target);
|
|
29
|
+
assert.deepStrictEqual(actual, t.expected);
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=index.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../../src/plugins/customer-portal/enabled/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,oBAAoB,IAAI,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAS3E,MAAM,KAAK,GAAQ;IACjB;QACE,WAAW,EAAE,0CAA0C;QACvD,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,SAAS;QACjB,QAAQ,EAAE,SAAS;KACpB;IACD;QACE,WAAW,EAAE,sCAAsC;QACnD,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,SAAS;KACpB;IACD;QACE,WAAW,EAAE,8BAA8B;QAC3C,MAAM,EAAE,KAAK;QACb,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,IAAI;KACf;CACF,CAAC;AAEF,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;QACtB,MAAM,CAAC,GAAG,IAAI,qBAAqB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC/C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,EAAE;gBACrB,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;gBAC1C,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;YAC7C,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { BrowserforcePlugin } from '../../plugin.js';
|
|
2
|
+
import { Config as CustomerPortalAvailableCustomObjectsConfig } from './available-custom-objects/index.js';
|
|
3
|
+
import { Config as CustomerPortalEnableConfig } from './enabled/index.js';
|
|
4
|
+
import { Config as CustomerPortalSetupConfig } from './portals/index.js';
|
|
5
|
+
type Config = {
|
|
6
|
+
enabled?: CustomerPortalEnableConfig;
|
|
7
|
+
portals?: CustomerPortalSetupConfig;
|
|
8
|
+
availableCustomObjects?: CustomerPortalAvailableCustomObjectsConfig;
|
|
9
|
+
};
|
|
10
|
+
export declare class CustomerPortal extends BrowserforcePlugin {
|
|
11
|
+
retrieve(definition: Config): Promise<Config>;
|
|
12
|
+
diff(state: Config, definition: Config): Config | undefined;
|
|
13
|
+
apply(config: Config): Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|