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.
Files changed (264) hide show
  1. package/README.md +54 -16
  2. package/lib/browserforce-command.d.ts +15 -0
  3. package/lib/browserforce-command.js +61 -0
  4. package/lib/browserforce-command.js.map +1 -0
  5. package/lib/browserforce.d.ts +29 -0
  6. package/lib/browserforce.js +194 -0
  7. package/lib/browserforce.js.map +1 -0
  8. package/lib/commands/browserforce/apply.d.ts +10 -0
  9. package/lib/commands/browserforce/apply.js +54 -0
  10. package/lib/commands/browserforce/apply.js.map +1 -0
  11. package/lib/commands/browserforce/plan.d.ts +10 -0
  12. package/lib/commands/browserforce/plan.js +56 -0
  13. package/lib/commands/browserforce/plan.js.map +1 -0
  14. package/lib/config-parser.d.ts +16 -0
  15. package/lib/config-parser.js +24 -0
  16. package/lib/config-parser.js.map +1 -0
  17. package/lib/index.d.ts +1 -0
  18. package/lib/index.js +2 -0
  19. package/lib/index.js.map +1 -0
  20. package/lib/jsforce-utils.d.ts +5 -0
  21. package/lib/jsforce-utils.js +14 -0
  22. package/lib/jsforce-utils.js.map +1 -0
  23. package/lib/pages/login.d.ts +8 -0
  24. package/lib/pages/login.js +39 -0
  25. package/lib/pages/login.js.map +1 -0
  26. package/lib/plugin.d.ts +17 -0
  27. package/lib/plugin.js +30 -0
  28. package/lib/plugin.js.map +1 -0
  29. package/lib/plugins/activity-settings/index.d.ts +9 -0
  30. package/lib/plugins/activity-settings/index.e2e-spec.d.ts +1 -0
  31. package/lib/plugins/activity-settings/index.e2e-spec.js +36 -0
  32. package/lib/plugins/activity-settings/index.e2e-spec.js.map +1 -0
  33. package/lib/plugins/activity-settings/index.js +34 -0
  34. package/lib/plugins/activity-settings/index.js.map +1 -0
  35. package/lib/plugins/company-information/index.d.ts +8 -0
  36. package/lib/plugins/company-information/index.e2e-spec.d.ts +1 -0
  37. package/lib/plugins/company-information/index.e2e-spec.js +37 -0
  38. package/lib/plugins/company-information/index.e2e-spec.js.map +1 -0
  39. package/lib/plugins/company-information/index.js +60 -0
  40. package/lib/plugins/company-information/index.js.map +1 -0
  41. package/lib/plugins/customer-portal/available-custom-objects/index.d.ts +14 -0
  42. package/lib/plugins/customer-portal/available-custom-objects/index.js +114 -0
  43. package/lib/plugins/customer-portal/available-custom-objects/index.js.map +1 -0
  44. package/lib/plugins/customer-portal/available-custom-objects/index.test.d.ts +1 -0
  45. package/lib/plugins/customer-portal/available-custom-objects/index.test.js +39 -0
  46. package/lib/plugins/customer-portal/available-custom-objects/index.test.js.map +1 -0
  47. package/lib/plugins/customer-portal/enabled/index.d.ts +6 -0
  48. package/lib/plugins/customer-portal/enabled/index.js +26 -0
  49. package/lib/plugins/customer-portal/enabled/index.js.map +1 -0
  50. package/lib/plugins/customer-portal/enabled/index.test.d.ts +1 -0
  51. package/lib/plugins/customer-portal/enabled/index.test.js +34 -0
  52. package/lib/plugins/customer-portal/enabled/index.test.js.map +1 -0
  53. package/lib/plugins/customer-portal/index.d.ts +15 -0
  54. package/lib/plugins/customer-portal/index.e2e-spec.d.ts +1 -0
  55. package/lib/plugins/customer-portal/index.e2e-spec.js +202 -0
  56. package/lib/plugins/customer-portal/index.e2e-spec.js.map +1 -0
  57. package/lib/plugins/customer-portal/index.js +59 -0
  58. package/lib/plugins/customer-portal/index.js.map +1 -0
  59. package/lib/plugins/customer-portal/index.test.d.ts +1 -0
  60. package/lib/plugins/customer-portal/index.test.js +84 -0
  61. package/lib/plugins/customer-portal/index.test.js.map +1 -0
  62. package/lib/plugins/customer-portal/portals/index.d.ts +25 -0
  63. package/lib/plugins/customer-portal/portals/index.js +216 -0
  64. package/lib/plugins/customer-portal/portals/index.js.map +1 -0
  65. package/lib/plugins/customer-portal/portals/index.test.d.ts +1 -0
  66. package/lib/plugins/customer-portal/portals/index.test.js +140 -0
  67. package/lib/plugins/customer-portal/portals/index.test.js.map +1 -0
  68. package/lib/plugins/density-settings/index.d.ts +10 -0
  69. package/lib/plugins/density-settings/index.e2e-spec.d.ts +1 -0
  70. package/lib/plugins/density-settings/index.e2e-spec.js +39 -0
  71. package/lib/plugins/density-settings/index.e2e-spec.js.map +1 -0
  72. package/lib/plugins/density-settings/index.js +54 -0
  73. package/lib/plugins/density-settings/index.js.map +1 -0
  74. package/lib/plugins/deprecated.d.ts +4 -0
  75. package/lib/plugins/deprecated.js +28 -0
  76. package/lib/plugins/deprecated.js.map +1 -0
  77. package/lib/plugins/email-deliverability/index.d.ts +9 -0
  78. package/lib/plugins/email-deliverability/index.e2e-spec.d.ts +1 -0
  79. package/lib/plugins/email-deliverability/index.e2e-spec.js +55 -0
  80. package/lib/plugins/email-deliverability/index.e2e-spec.js.map +1 -0
  81. package/lib/plugins/email-deliverability/index.js +42 -0
  82. package/lib/plugins/email-deliverability/index.js.map +1 -0
  83. package/lib/plugins/high-velocity-sales-settings/index.d.ts +10 -0
  84. package/lib/plugins/high-velocity-sales-settings/index.e2e-spec.d.ts +1 -0
  85. package/lib/plugins/high-velocity-sales-settings/index.e2e-spec.js +29 -0
  86. package/lib/plugins/high-velocity-sales-settings/index.e2e-spec.js.map +1 -0
  87. package/lib/plugins/high-velocity-sales-settings/index.js +42 -0
  88. package/lib/plugins/high-velocity-sales-settings/index.js.map +1 -0
  89. package/lib/plugins/high-velocity-sales-settings/page.d.ts +7 -0
  90. package/lib/plugins/high-velocity-sales-settings/page.js +28 -0
  91. package/lib/plugins/high-velocity-sales-settings/page.js.map +1 -0
  92. package/lib/plugins/history-tracking/index.d.ts +17 -0
  93. package/lib/plugins/history-tracking/index.e2e-spec.d.ts +1 -0
  94. package/lib/plugins/history-tracking/index.e2e-spec.js +106 -0
  95. package/lib/plugins/history-tracking/index.e2e-spec.js.map +1 -0
  96. package/lib/plugins/history-tracking/index.js +176 -0
  97. package/lib/plugins/history-tracking/index.js.map +1 -0
  98. package/lib/plugins/home-page-layouts/index.d.ts +14 -0
  99. package/lib/plugins/home-page-layouts/index.e2e-spec.d.ts +1 -0
  100. package/lib/plugins/home-page-layouts/index.e2e-spec.js +47 -0
  101. package/lib/plugins/home-page-layouts/index.e2e-spec.js.map +1 -0
  102. package/lib/plugins/home-page-layouts/index.js +94 -0
  103. package/lib/plugins/home-page-layouts/index.js.map +1 -0
  104. package/lib/plugins/home-page-layouts/index.test.d.ts +1 -0
  105. package/lib/plugins/home-page-layouts/index.test.js +104 -0
  106. package/lib/plugins/home-page-layouts/index.test.js.map +1 -0
  107. package/lib/plugins/index.d.ts +24 -0
  108. package/lib/plugins/index.js +25 -0
  109. package/lib/plugins/index.js.map +1 -0
  110. package/lib/plugins/lightning-experience-settings/index.d.ts +18 -0
  111. package/lib/plugins/lightning-experience-settings/index.e2e-spec.d.ts +1 -0
  112. package/lib/plugins/lightning-experience-settings/index.e2e-spec.js +40 -0
  113. package/lib/plugins/lightning-experience-settings/index.e2e-spec.js.map +1 -0
  114. package/lib/plugins/lightning-experience-settings/index.js +101 -0
  115. package/lib/plugins/lightning-experience-settings/index.js.map +1 -0
  116. package/lib/plugins/linkedin-sales-navigator-settings/index.d.ts +8 -0
  117. package/lib/plugins/linkedin-sales-navigator-settings/index.e2e-spec.d.ts +1 -0
  118. package/lib/plugins/linkedin-sales-navigator-settings/index.e2e-spec.js +29 -0
  119. package/lib/plugins/linkedin-sales-navigator-settings/index.e2e-spec.js.map +1 -0
  120. package/lib/plugins/linkedin-sales-navigator-settings/index.js +15 -0
  121. package/lib/plugins/linkedin-sales-navigator-settings/index.js.map +1 -0
  122. package/lib/plugins/linkedin-sales-navigator-settings/page.d.ts +10 -0
  123. package/lib/plugins/linkedin-sales-navigator-settings/page.js +42 -0
  124. package/lib/plugins/linkedin-sales-navigator-settings/page.js.map +1 -0
  125. package/lib/plugins/omni-channel-settings/index.d.ts +9 -0
  126. package/lib/plugins/omni-channel-settings/index.e2e-spec.d.ts +1 -0
  127. package/lib/plugins/omni-channel-settings/index.e2e-spec.js +30 -0
  128. package/lib/plugins/omni-channel-settings/index.e2e-spec.js.map +1 -0
  129. package/lib/plugins/omni-channel-settings/index.js +21 -0
  130. package/lib/plugins/omni-channel-settings/index.js.map +1 -0
  131. package/lib/plugins/opportunity-splits/index.d.ts +9 -0
  132. package/lib/plugins/opportunity-splits/index.e2e-spec.d.ts +1 -0
  133. package/lib/plugins/opportunity-splits/index.e2e-spec.js +46 -0
  134. package/lib/plugins/opportunity-splits/index.e2e-spec.js.map +1 -0
  135. package/lib/plugins/opportunity-splits/index.js +32 -0
  136. package/lib/plugins/opportunity-splits/index.js.map +1 -0
  137. package/lib/plugins/opportunity-splits/pages/layout-selection.d.ts +8 -0
  138. package/lib/plugins/opportunity-splits/pages/layout-selection.js +15 -0
  139. package/lib/plugins/opportunity-splits/pages/layout-selection.js.map +1 -0
  140. package/lib/plugins/opportunity-splits/pages/overview.d.ts +10 -0
  141. package/lib/plugins/opportunity-splits/pages/overview.js +33 -0
  142. package/lib/plugins/opportunity-splits/pages/overview.js.map +1 -0
  143. package/lib/plugins/opportunity-splits/pages/setup.d.ts +8 -0
  144. package/lib/plugins/opportunity-splits/pages/setup.js +17 -0
  145. package/lib/plugins/opportunity-splits/pages/setup.js.map +1 -0
  146. package/lib/plugins/permission-sets/index.d.ts +10 -0
  147. package/lib/plugins/permission-sets/index.e2e-spec.d.ts +1 -0
  148. package/lib/plugins/permission-sets/index.e2e-spec.js +47 -0
  149. package/lib/plugins/permission-sets/index.e2e-spec.js.map +1 -0
  150. package/lib/plugins/permission-sets/index.js +22 -0
  151. package/lib/plugins/permission-sets/index.js.map +1 -0
  152. package/lib/plugins/permission-sets/service-presence-status/index.d.ts +10 -0
  153. package/lib/plugins/permission-sets/service-presence-status/index.js +67 -0
  154. package/lib/plugins/permission-sets/service-presence-status/index.js.map +1 -0
  155. package/lib/plugins/picklists/field-dependencies/index.d.ts +11 -0
  156. package/lib/plugins/picklists/field-dependencies/index.js +56 -0
  157. package/lib/plugins/picklists/field-dependencies/index.js.map +1 -0
  158. package/lib/plugins/picklists/field-dependencies/index.test.d.ts +1 -0
  159. package/lib/plugins/picklists/field-dependencies/index.test.js +64 -0
  160. package/lib/plugins/picklists/field-dependencies/index.test.js.map +1 -0
  161. package/lib/plugins/picklists/field-dependencies/pages.d.ts +14 -0
  162. package/lib/plugins/picklists/field-dependencies/pages.js +49 -0
  163. package/lib/plugins/picklists/field-dependencies/pages.js.map +1 -0
  164. package/lib/plugins/picklists/index.d.ts +23 -0
  165. package/lib/plugins/picklists/index.e2e-spec.d.ts +1 -0
  166. package/lib/plugins/picklists/index.e2e-spec.js +100 -0
  167. package/lib/plugins/picklists/index.e2e-spec.js.map +1 -0
  168. package/lib/plugins/picklists/index.js +153 -0
  169. package/lib/plugins/picklists/index.js.map +1 -0
  170. package/lib/plugins/picklists/pages.d.ts +41 -0
  171. package/lib/plugins/picklists/pages.js +166 -0
  172. package/lib/plugins/picklists/pages.js.map +1 -0
  173. package/lib/plugins/picklists/standard-value-set.d.ts +1 -0
  174. package/lib/plugins/picklists/standard-value-set.js +80 -0
  175. package/lib/plugins/picklists/standard-value-set.js.map +1 -0
  176. package/lib/plugins/record-types/index.d.ts +13 -0
  177. package/lib/plugins/record-types/index.e2e-spec.d.ts +1 -0
  178. package/lib/plugins/record-types/index.e2e-spec.js +73 -0
  179. package/lib/plugins/record-types/index.e2e-spec.js.map +1 -0
  180. package/lib/plugins/record-types/index.js +70 -0
  181. package/lib/plugins/record-types/index.js.map +1 -0
  182. package/lib/plugins/record-types/pages.d.ts +15 -0
  183. package/lib/plugins/record-types/pages.js +56 -0
  184. package/lib/plugins/record-types/pages.js.map +1 -0
  185. package/lib/plugins/relate-contact-to-multiple-accounts/index.d.ts +11 -0
  186. package/lib/plugins/relate-contact-to-multiple-accounts/index.e2e-spec.d.ts +1 -0
  187. package/lib/plugins/relate-contact-to-multiple-accounts/index.e2e-spec.js +29 -0
  188. package/lib/plugins/relate-contact-to-multiple-accounts/index.e2e-spec.js.map +1 -0
  189. package/lib/plugins/relate-contact-to-multiple-accounts/index.js +62 -0
  190. package/lib/plugins/relate-contact-to-multiple-accounts/index.js.map +1 -0
  191. package/lib/plugins/reports-and-dashboards/folder-sharing/index.d.ts +8 -0
  192. package/lib/plugins/reports-and-dashboards/folder-sharing/index.e2e-spec.d.ts +1 -0
  193. package/lib/plugins/reports-and-dashboards/folder-sharing/index.e2e-spec.js +3 -0
  194. package/lib/plugins/reports-and-dashboards/folder-sharing/index.e2e-spec.js.map +1 -0
  195. package/lib/plugins/reports-and-dashboards/folder-sharing/index.js +55 -0
  196. package/lib/plugins/reports-and-dashboards/folder-sharing/index.js.map +1 -0
  197. package/lib/plugins/reports-and-dashboards/index.d.ts +11 -0
  198. package/lib/plugins/reports-and-dashboards/index.e2e-spec.d.ts +1 -0
  199. package/lib/plugins/reports-and-dashboards/index.e2e-spec.js +3 -0
  200. package/lib/plugins/reports-and-dashboards/index.e2e-spec.js.map +1 -0
  201. package/lib/plugins/reports-and-dashboards/index.js +29 -0
  202. package/lib/plugins/reports-and-dashboards/index.js.map +1 -0
  203. package/lib/plugins/salesforce-cpq-config/formConfig.d.ts +17 -0
  204. package/lib/plugins/salesforce-cpq-config/formConfig.js +649 -0
  205. package/lib/plugins/salesforce-cpq-config/formConfig.js.map +1 -0
  206. package/lib/plugins/salesforce-cpq-config/index.d.ts +7 -0
  207. package/lib/plugins/salesforce-cpq-config/index.e2e-spec.d.ts +1 -0
  208. package/lib/plugins/salesforce-cpq-config/index.e2e-spec.js +37 -0
  209. package/lib/plugins/salesforce-cpq-config/index.e2e-spec.js.map +1 -0
  210. package/lib/plugins/salesforce-cpq-config/index.js +214 -0
  211. package/lib/plugins/salesforce-cpq-config/index.js.map +1 -0
  212. package/lib/plugins/salesforce-to-salesforce/index.d.ts +9 -0
  213. package/lib/plugins/salesforce-to-salesforce/index.e2e-spec.d.ts +1 -0
  214. package/lib/plugins/salesforce-to-salesforce/index.e2e-spec.js +35 -0
  215. package/lib/plugins/salesforce-to-salesforce/index.e2e-spec.js.map +1 -0
  216. package/lib/plugins/salesforce-to-salesforce/index.js +36 -0
  217. package/lib/plugins/salesforce-to-salesforce/index.js.map +1 -0
  218. package/lib/plugins/security/authentication-configuration/index.d.ts +11 -0
  219. package/lib/plugins/security/authentication-configuration/index.e2e-spec.d.ts +1 -0
  220. package/lib/plugins/security/authentication-configuration/index.e2e-spec.js +101 -0
  221. package/lib/plugins/security/authentication-configuration/index.e2e-spec.js.map +1 -0
  222. package/lib/plugins/security/authentication-configuration/index.js +67 -0
  223. package/lib/plugins/security/authentication-configuration/index.js.map +1 -0
  224. package/lib/plugins/security/certificate-and-key-management/index.d.ts +23 -0
  225. package/lib/plugins/security/certificate-and-key-management/index.e2e-spec.d.ts +1 -0
  226. package/lib/plugins/security/certificate-and-key-management/index.e2e-spec.js +63 -0
  227. package/lib/plugins/security/certificate-and-key-management/index.e2e-spec.js.map +1 -0
  228. package/lib/plugins/security/certificate-and-key-management/index.js +154 -0
  229. package/lib/plugins/security/certificate-and-key-management/index.js.map +1 -0
  230. package/lib/plugins/security/certificate-and-key-management/index.test.d.ts +1 -0
  231. package/lib/plugins/security/certificate-and-key-management/index.test.js +61 -0
  232. package/lib/plugins/security/certificate-and-key-management/index.test.js.map +1 -0
  233. package/lib/plugins/security/index.d.ts +13 -0
  234. package/lib/plugins/security/index.js +42 -0
  235. package/lib/plugins/security/index.js.map +1 -0
  236. package/lib/plugins/service-channels/capacity/index.d.ts +18 -0
  237. package/lib/plugins/service-channels/capacity/index.js +162 -0
  238. package/lib/plugins/service-channels/capacity/index.js.map +1 -0
  239. package/lib/plugins/service-channels/index.d.ts +12 -0
  240. package/lib/plugins/service-channels/index.e2e-spec.d.ts +1 -0
  241. package/lib/plugins/service-channels/index.e2e-spec.js +61 -0
  242. package/lib/plugins/service-channels/index.e2e-spec.js.map +1 -0
  243. package/lib/plugins/service-channels/index.js +38 -0
  244. package/lib/plugins/service-channels/index.js.map +1 -0
  245. package/lib/plugins/slack/index.d.ts +9 -0
  246. package/lib/plugins/slack/index.e2e-spec.d.ts +1 -0
  247. package/lib/plugins/slack/index.e2e-spec.js +47 -0
  248. package/lib/plugins/slack/index.e2e-spec.js.map +1 -0
  249. package/lib/plugins/slack/index.js +46 -0
  250. package/lib/plugins/slack/index.js.map +1 -0
  251. package/lib/plugins/user-access-policies/index.d.ts +19 -0
  252. package/lib/plugins/user-access-policies/index.e2e-spec.d.ts +1 -0
  253. package/lib/plugins/user-access-policies/index.e2e-spec.js +63 -0
  254. package/lib/plugins/user-access-policies/index.e2e-spec.js.map +1 -0
  255. package/lib/plugins/user-access-policies/index.js +107 -0
  256. package/lib/plugins/user-access-policies/index.js.map +1 -0
  257. package/lib/plugins/user-access-policies/page.d.ts +29 -0
  258. package/lib/plugins/user-access-policies/page.js +115 -0
  259. package/lib/plugins/user-access-policies/page.js.map +1 -0
  260. package/lib/plugins/utils.d.ts +3 -0
  261. package/lib/plugins/utils.js +47 -0
  262. package/lib/plugins/utils.js.map +1 -0
  263. package/oclif.manifest.json +153 -0
  264. package/package.json +2 -2
@@ -0,0 +1,63 @@
1
+ import { Org } from '@salesforce/core';
2
+ import assert from 'assert';
3
+ import { spawnSync } from 'node:child_process';
4
+ import { join, resolve } from 'node:path';
5
+ import { fileURLToPath } from 'node:url';
6
+ import { CertificateAndKeyManagement } from './index.js';
7
+ describe(CertificateAndKeyManagement.name, function () {
8
+ let pluginCertificateManagement;
9
+ before(() => {
10
+ pluginCertificateManagement = new CertificateAndKeyManagement(global.bf);
11
+ });
12
+ const configGeneratedCert = {
13
+ certificates: [
14
+ {
15
+ name: 'identity_provider',
16
+ label: 'identity_provider',
17
+ },
18
+ ],
19
+ };
20
+ const configImportFromKeystore = {
21
+ importFromKeystore: [
22
+ {
23
+ filePath: './src/plugins/security/certificate-and-key-management/Dummy.jks',
24
+ name: 'Dummy',
25
+ },
26
+ ],
27
+ };
28
+ it('should enable Identity Provider as a prerequisite', async () => {
29
+ // https://salesforce.stackexchange.com/questions/61618/import-keystore-in-certificate-and-key-management
30
+ const __dirname = fileURLToPath(new URL('.', import.meta.url));
31
+ const dir = resolve(join(__dirname, 'sfdx-source', 'identity-provider'));
32
+ const sourceDeployCmd = spawnSync('sf', [
33
+ 'project',
34
+ 'deploy',
35
+ 'start',
36
+ '-d',
37
+ dir,
38
+ '--json',
39
+ ]);
40
+ assert.deepStrictEqual(sourceDeployCmd.status, 0, sourceDeployCmd.output.toString());
41
+ });
42
+ it('should create a self-signed certificate', async () => {
43
+ await pluginCertificateManagement.apply(configGeneratedCert);
44
+ });
45
+ it('should not do anything if self-signed certificate is already available', async () => {
46
+ // explictly pass definition to retrieve
47
+ const res = await pluginCertificateManagement.run(configGeneratedCert);
48
+ assert.deepStrictEqual(res, { message: 'no action necessary' });
49
+ });
50
+ it('should import a cert from a keystore', async () => {
51
+ await pluginCertificateManagement.run(configImportFromKeystore);
52
+ });
53
+ it('should not do anything if cert is already available in keystore', async () => {
54
+ const res = await pluginCertificateManagement.run(configImportFromKeystore);
55
+ assert.deepStrictEqual(res, { message: 'no action necessary' });
56
+ });
57
+ it('should delete certificates using Metadata API', async () => {
58
+ const org = await Org.create({});
59
+ const conn = org.getConnection();
60
+ await conn.metadata.delete('Certificate', ['identity_provider', 'Dummy']);
61
+ });
62
+ });
63
+ //# sourceMappingURL=index.e2e-spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.e2e-spec.js","sourceRoot":"","sources":["../../../../src/plugins/security/certificate-and-key-management/index.e2e-spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,154 @@
1
+ import { existsSync } from 'fs';
2
+ import * as path from 'path';
3
+ import * as queryString from 'querystring';
4
+ import { BrowserforcePlugin } from '../../../plugin.js';
5
+ const CERT_PREFIX_PATH = '0P1';
6
+ const KEYSTORE_IMPORT_PATH = '_ui/security/certificate/KeyStoreImportUi/e';
7
+ const FILE_UPLOAD_SELECTOR = 'input[type="file"]';
8
+ const KEYSTORE_PASSWORD_SELECTOR = 'input#Password';
9
+ const SAVE_BUTTON_SELECTOR = 'input[name="save"]';
10
+ export class CertificateAndKeyManagement extends BrowserforcePlugin {
11
+ async retrieve(definition) {
12
+ const response = {
13
+ certificates: [],
14
+ importFromKeystore: [],
15
+ };
16
+ let existingCertificates = [];
17
+ if (definition?.certificates?.length ||
18
+ definition?.importFromKeystore?.length) {
19
+ existingCertificates =
20
+ // Note: Unfortunately scanAll=false has no impact and returns deleted records.
21
+ // Workaround: Order by CreatedDate DESC to get the latest record first.
22
+ (await this.org
23
+ .getConnection()
24
+ .tooling.query(`SELECT Id, DeveloperName, MasterLabel, OptionsIsPrivateKeyExportable, KeySize FROM Certificate ORDER BY CreatedDate DESC`, { scanAll: false }))?.records;
25
+ }
26
+ if (definition?.certificates?.length) {
27
+ for (const cert of definition.certificates) {
28
+ const existingCert = existingCertificates.find((co) => co.DeveloperName === cert.name);
29
+ if (existingCert) {
30
+ response.certificates.push({
31
+ _id: existingCert.Id,
32
+ name: existingCert.DeveloperName,
33
+ label: existingCert.MasterLabel,
34
+ exportable: existingCert.OptionsIsPrivateKeyExportable,
35
+ keySize: existingCert.KeySize,
36
+ });
37
+ }
38
+ }
39
+ }
40
+ if (definition?.importFromKeystore?.length) {
41
+ for (const cert of definition.importFromKeystore) {
42
+ const existingCert = existingCertificates.find((co) => co.DeveloperName === cert.name);
43
+ if (existingCert) {
44
+ response.importFromKeystore.push({
45
+ name: existingCert.DeveloperName,
46
+ });
47
+ }
48
+ }
49
+ }
50
+ return response;
51
+ }
52
+ diff(state, definition) {
53
+ const response = {};
54
+ if (state && definition && state.certificates && definition.certificates) {
55
+ for (const cert of definition.certificates) {
56
+ const existingCert = state.certificates.find((c) => c.name === cert.name);
57
+ if (existingCert) {
58
+ // copy id from state to definition to be retained and used
59
+ cert._id = existingCert._id;
60
+ }
61
+ const certDiff = super.diff(existingCert, cert);
62
+ if (certDiff !== undefined) {
63
+ if (!response.certificates) {
64
+ response.certificates = [];
65
+ }
66
+ response.certificates.push(certDiff);
67
+ }
68
+ }
69
+ }
70
+ if (definition?.importFromKeystore?.length) {
71
+ const importFromKeystore = definition?.importFromKeystore?.filter((cert) => !state?.importFromKeystore?.find((c) => c.name === cert.name));
72
+ if (importFromKeystore.length) {
73
+ response.importFromKeystore = importFromKeystore;
74
+ }
75
+ }
76
+ return Object.keys(response).length ? response : undefined;
77
+ }
78
+ async apply(plan) {
79
+ if (plan.certificates) {
80
+ for (const certificate of plan.certificates) {
81
+ if (certificate._id) {
82
+ // update
83
+ }
84
+ else {
85
+ // create new
86
+ const urlAttributes = {
87
+ DeveloperName: certificate.name,
88
+ MasterLabel: certificate.label,
89
+ };
90
+ if (certificate.keySize) {
91
+ urlAttributes['keySize'] = certificate.keySize;
92
+ }
93
+ if (certificate.exportable !== undefined) {
94
+ urlAttributes['exp'] = certificate.exportable ? 1 : 0;
95
+ }
96
+ const page = await this.browserforce.openPage(`${CERT_PREFIX_PATH}/e?${queryString.stringify(urlAttributes)}`);
97
+ await page.locator(SAVE_BUTTON_SELECTOR).first().waitFor();
98
+ await page.locator(SAVE_BUTTON_SELECTOR).first().click();
99
+ await page.waitForLoadState('load');
100
+ await page.close();
101
+ }
102
+ }
103
+ }
104
+ if (plan.importFromKeystore) {
105
+ for (const certificate of plan.importFromKeystore) {
106
+ const page = await this.browserforce.openPage(`${KEYSTORE_IMPORT_PATH}`);
107
+ await page.locator(FILE_UPLOAD_SELECTOR).waitFor();
108
+ // TODO: make relative to this.command.flags.definitionfile
109
+ if (!certificate.filePath) {
110
+ throw new Error(`To import a certificate, the filePath is mandatory.`);
111
+ }
112
+ const filePath = path.resolve(certificate.filePath);
113
+ if (!existsSync(filePath)) {
114
+ throw new Error(`file does not exist: ${filePath}`);
115
+ }
116
+ await page.locator(FILE_UPLOAD_SELECTOR).setInputFiles(filePath);
117
+ if (certificate.password) {
118
+ await page.locator(KEYSTORE_PASSWORD_SELECTOR).waitFor();
119
+ await page
120
+ .locator(KEYSTORE_PASSWORD_SELECTOR)
121
+ .fill(certificate.password);
122
+ }
123
+ await page.locator(SAVE_BUTTON_SELECTOR).first().waitFor();
124
+ await page.locator(SAVE_BUTTON_SELECTOR).first().click();
125
+ await page.waitForLoadState('load');
126
+ try {
127
+ await this.browserforce.throwPageErrors(page);
128
+ }
129
+ catch (e) {
130
+ if (e instanceof Error && e.message === 'Data Not Available') {
131
+ throw new Error('Failed to import certificate from Keystore. Please enable Identity Provider first. https://salesforce.stackexchange.com/questions/61618/import-keystore-in-certificate-and-key-management');
132
+ }
133
+ throw e;
134
+ }
135
+ if (certificate.name) {
136
+ // rename cert as it has the wrong name
137
+ // JKS aliases are case-insensitive (and so lowercase)
138
+ const certsResponse = await this.org
139
+ .getConnection()
140
+ .tooling.query(`SELECT Id FROM Certificate WHERE DeveloperName = '${certificate.name.toLowerCase()}'`);
141
+ const importedCert = certsResponse.records[0];
142
+ const certPage = await this.browserforce.openPage(`${importedCert.Id}/e?MasterLabel=${certificate.name}&DeveloperName=${certificate.name}`);
143
+ await certPage.locator(SAVE_BUTTON_SELECTOR).first().waitFor();
144
+ await certPage.locator(SAVE_BUTTON_SELECTOR).first().click();
145
+ await certPage.waitForLoadState('load');
146
+ await this.browserforce.throwPageErrors(certPage);
147
+ await certPage.close();
148
+ }
149
+ await page.close();
150
+ }
151
+ }
152
+ }
153
+ }
154
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/security/certificate-and-key-management/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import assert from 'assert';
2
+ import { CertificateAndKeyManagement } from './index.js';
3
+ const tests = [
4
+ {
5
+ description: 'should not do anything if keystore already exists',
6
+ source: {
7
+ importFromKeystore: [
8
+ {
9
+ name: 'Dummy',
10
+ },
11
+ ],
12
+ },
13
+ target: {
14
+ importFromKeystore: [
15
+ {
16
+ name: 'Dummy',
17
+ filePath: 'foo.jks',
18
+ },
19
+ ],
20
+ },
21
+ expected: undefined,
22
+ },
23
+ {
24
+ description: 'should try to import keystore',
25
+ source: {
26
+ importFromKeystore: [
27
+ {
28
+ name: 'Foo',
29
+ },
30
+ ],
31
+ },
32
+ target: {
33
+ importFromKeystore: [
34
+ {
35
+ name: 'Dummy',
36
+ filePath: 'foo.jks',
37
+ },
38
+ ],
39
+ },
40
+ expected: {
41
+ importFromKeystore: [
42
+ {
43
+ name: 'Dummy',
44
+ filePath: 'foo.jks',
45
+ },
46
+ ],
47
+ },
48
+ },
49
+ ];
50
+ describe('CertificateAndKeyManagement', () => {
51
+ describe('diff()', () => {
52
+ const p = new CertificateAndKeyManagement(global.bf);
53
+ for (const t of tests) {
54
+ it(t.description, () => {
55
+ const actual = p.diff(t.source, t.target);
56
+ assert.deepStrictEqual(actual, t.expected);
57
+ });
58
+ }
59
+ });
60
+ });
61
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../../src/plugins/security/certificate-and-key-management/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,2BAA2B,EAAU,MAAM,YAAY,CAAC;AASjE,MAAM,KAAK,GAAQ;IACjB;QACE,WAAW,EAAE,mDAAmD;QAChE,MAAM,EAAE;YACN,kBAAkB,EAAE;gBAClB;oBACE,IAAI,EAAE,OAAO;iBACd;aACF;SACF;QACD,MAAM,EAAE;YACN,kBAAkB,EAAE;gBAClB;oBACE,IAAI,EAAE,OAAO;oBACb,QAAQ,EAAE,SAAS;iBACpB;aACF;SACF;QACD,QAAQ,EAAE,SAAS;KACpB;IACD;QACE,WAAW,EAAE,+BAA+B;QAC5C,MAAM,EAAE;YACN,kBAAkB,EAAE;gBAClB;oBACE,IAAI,EAAE,KAAK;iBACZ;aACF;SACF;QACD,MAAM,EAAE;YACN,kBAAkB,EAAE;gBAClB;oBACE,IAAI,EAAE,OAAO;oBACb,QAAQ,EAAE,SAAS;iBACpB;aACF;SACF;QACD,QAAQ,EAAE;YACR,kBAAkB,EAAE;gBAClB;oBACE,IAAI,EAAE,OAAO;oBACb,QAAQ,EAAE,SAAS;iBACpB;aACF;SACF;KACF;CACF,CAAC;AAEF,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;QACtB,MAAM,CAAC,GAAG,IAAI,2BAA2B,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACrD,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,13 @@
1
+ import { BrowserforcePlugin } from '../../plugin.js';
2
+ import { Config as AuthenticationConfigurationConfig } from './authentication-configuration/index.js';
3
+ import { Config as CertificateAndKeyManagementConfig } from './certificate-and-key-management/index.js';
4
+ type Config = {
5
+ certificateAndKeyManagement?: CertificateAndKeyManagementConfig;
6
+ authenticationConfiguration?: AuthenticationConfigurationConfig;
7
+ };
8
+ export declare class Security extends BrowserforcePlugin {
9
+ retrieve(definition?: Config): Promise<Config>;
10
+ diff(state: Config, definition: Config): Config | undefined;
11
+ apply(plan: Config): Promise<void>;
12
+ }
13
+ export {};
@@ -0,0 +1,42 @@
1
+ import { BrowserforcePlugin } from '../../plugin.js';
2
+ import { AuthenticationConfiguration, } from './authentication-configuration/index.js';
3
+ import { CertificateAndKeyManagement, } from './certificate-and-key-management/index.js';
4
+ export class Security extends BrowserforcePlugin {
5
+ async retrieve(definition) {
6
+ const response = {};
7
+ if (definition) {
8
+ if (definition.certificateAndKeyManagement) {
9
+ const pluginCKM = new CertificateAndKeyManagement(this.browserforce);
10
+ response.certificateAndKeyManagement = await pluginCKM.retrieve(definition.certificateAndKeyManagement);
11
+ }
12
+ if (definition.authenticationConfiguration) {
13
+ response.authenticationConfiguration =
14
+ await new AuthenticationConfiguration(this.browserforce).retrieve(definition.authenticationConfiguration);
15
+ }
16
+ }
17
+ return response;
18
+ }
19
+ diff(state, definition) {
20
+ const certificateAndKeyManagement = new CertificateAndKeyManagement(this.browserforce).diff(state.certificateAndKeyManagement, definition.certificateAndKeyManagement);
21
+ const authenticationConfiguration = new AuthenticationConfiguration(this.browserforce).diff(state.authenticationConfiguration, definition.authenticationConfiguration);
22
+ const response = {};
23
+ if (certificateAndKeyManagement !== undefined) {
24
+ response.certificateAndKeyManagement = certificateAndKeyManagement;
25
+ }
26
+ if (authenticationConfiguration !== undefined) {
27
+ response.authenticationConfiguration = authenticationConfiguration;
28
+ }
29
+ return Object.keys(response).length ? response : undefined;
30
+ }
31
+ async apply(plan) {
32
+ if (plan.certificateAndKeyManagement) {
33
+ const pluginCKM = new CertificateAndKeyManagement(this.browserforce);
34
+ await pluginCKM.apply(plan.certificateAndKeyManagement);
35
+ }
36
+ if (plan.authenticationConfiguration) {
37
+ const pluginAuthConfig = new AuthenticationConfiguration(this.browserforce);
38
+ await pluginAuthConfig.apply(plan.authenticationConfiguration);
39
+ }
40
+ }
41
+ }
42
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/security/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EACL,2BAA2B,GAE5B,MAAM,yCAAyC,CAAC;AACjD,OAAO,EACL,2BAA2B,GAE5B,MAAM,2CAA2C,CAAC;AAOnD,MAAM,OAAO,QAAS,SAAQ,kBAAkB;IACvC,KAAK,CAAC,QAAQ,CAAC,UAAmB;QACvC,MAAM,QAAQ,GAAW,EAAE,CAAC;QAC5B,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,UAAU,CAAC,2BAA2B,EAAE,CAAC;gBAC3C,MAAM,SAAS,GAAG,IAAI,2BAA2B,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBACrE,QAAQ,CAAC,2BAA2B,GAAG,MAAM,SAAS,CAAC,QAAQ,CAC7D,UAAU,CAAC,2BAA2B,CACvC,CAAC;YACJ,CAAC;YACD,IAAI,UAAU,CAAC,2BAA2B,EAAE,CAAC;gBAC3C,QAAQ,CAAC,2BAA2B;oBAClC,MAAM,IAAI,2BAA2B,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,QAAQ,CAC/D,UAAU,CAAC,2BAA2B,CACvC,CAAC;YACN,CAAC;QACH,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEM,IAAI,CAAC,KAAa,EAAE,UAAkB;QAC3C,MAAM,2BAA2B,GAAG,IAAI,2BAA2B,CACjE,IAAI,CAAC,YAAY,CAClB,CAAC,IAAI,CACJ,KAAK,CAAC,2BAA2B,EACjC,UAAU,CAAC,2BAA2B,CACvC,CAAC;QACF,MAAM,2BAA2B,GAAG,IAAI,2BAA2B,CACjE,IAAI,CAAC,YAAY,CAClB,CAAC,IAAI,CACJ,KAAK,CAAC,2BAA2B,EACjC,UAAU,CAAC,2BAA2B,CACU,CAAC;QACnD,MAAM,QAAQ,GAAW,EAAE,CAAC;QAC5B,IAAI,2BAA2B,KAAK,SAAS,EAAE,CAAC;YAC9C,QAAQ,CAAC,2BAA2B,GAAG,2BAA2B,CAAC;QACrE,CAAC;QACD,IAAI,2BAA2B,KAAK,SAAS,EAAE,CAAC;YAC9C,QAAQ,CAAC,2BAA2B,GAAG,2BAA2B,CAAC;QACrE,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7D,CAAC;IAEM,KAAK,CAAC,KAAK,CAAC,IAAY;QAC7B,IAAI,IAAI,CAAC,2BAA2B,EAAE,CAAC;YACrC,MAAM,SAAS,GAAG,IAAI,2BAA2B,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACrE,MAAM,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,IAAI,CAAC,2BAA2B,EAAE,CAAC;YACrC,MAAM,gBAAgB,GAAG,IAAI,2BAA2B,CACtD,IAAI,CAAC,YAAY,CAClB,CAAC;YACF,MAAM,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,18 @@
1
+ import { BrowserforcePlugin } from '../../../plugin.js';
2
+ type ServiceChannel = {
3
+ serviceChannelDeveloperName: string;
4
+ capacity: CapacityConfig;
5
+ };
6
+ export type CapacityConfig = {
7
+ capacityModel?: string;
8
+ statusField?: string;
9
+ valuesForInProgress?: string[];
10
+ checkAgentCapacityOnReopenedWorkItems?: boolean;
11
+ checkAgentCapacityOnReassignedWorkItems?: boolean;
12
+ };
13
+ export declare class Capacity extends BrowserforcePlugin {
14
+ retrieve(definition: ServiceChannel): Promise<CapacityConfig>;
15
+ diff(state?: CapacityConfig, definition?: CapacityConfig): CapacityConfig | undefined;
16
+ apply(config: ServiceChannel): Promise<void>;
17
+ }
18
+ export {};
@@ -0,0 +1,162 @@
1
+ import { BrowserforcePlugin } from '../../../plugin.js';
2
+ const ADD_BUTTON_SELECTOR = 'a[id$=":duelingListBox:backingList_add"]';
3
+ const CAPACITY_MODEL_SELECTOR = 'select[id$=":capacityModelSection:editCapacityModel"]';
4
+ const OWNER_CHANGE_CAPACITY_SELECTOR = 'input[name*=":ownerChangeCapacityCheck"]';
5
+ const REMOVE_BUTTON_SELECTOR = 'a[id$=":duelingListBox:backingList_remove"]';
6
+ const SAVE_BUTTON_SELECTOR = 'input[id$=":save"]';
7
+ const STATUS_FIELD_SELECTOR = 'select[id$=":statusFieldSection:editCapacityModel"]';
8
+ const STATUS_CHANGE_CAPACITY_SELECTOR = 'input[name*=":statusChangeCapacityCheck"]';
9
+ const VALUES_COMPLETED_SELECTOR = 'select[id$=":statusFieldValues:duelingListBox:backingList_a"]';
10
+ const VALUES_IN_PROGRESS_SELECTOR = 'select[id$=":statusFieldValues:duelingListBox:backingList_s"]';
11
+ export class Capacity extends BrowserforcePlugin {
12
+ async retrieve(definition) {
13
+ // Query for the service channel
14
+ const serviceChannelDeveloperName = definition.serviceChannelDeveloperName;
15
+ const serviceChannel = await this.org
16
+ .getConnection()
17
+ .singleRecordQuery(`SELECT Id FROM ServiceChannel WHERE DeveloperName='${serviceChannelDeveloperName}'`);
18
+ // Open the service channel setup page
19
+ const page = await this.browserforce.openPage(`${serviceChannel.Id}/e`);
20
+ // Retrieve the service channel config
21
+ const capacityModelCount = await page
22
+ .locator(CAPACITY_MODEL_SELECTOR)
23
+ .count();
24
+ if (capacityModelCount === 0) {
25
+ await page.close();
26
+ return {};
27
+ }
28
+ const capacityModel = (await page
29
+ .locator(`${CAPACITY_MODEL_SELECTOR} > option[selected]`)
30
+ .evaluate((el) => el.value)) ?? '';
31
+ if (capacityModel === 'StatusBased') {
32
+ const statusField = (await page
33
+ .locator(`${STATUS_FIELD_SELECTOR} > option[selected]`)
34
+ .evaluate((el) => el.value)) ?? '';
35
+ const valuesForInProgress = await page
36
+ .locator(`${VALUES_IN_PROGRESS_SELECTOR} > option:not(:disabled)`)
37
+ .evaluateAll((options) => {
38
+ return options.map((option) => option.title);
39
+ });
40
+ const checkAgentCapacityOnReopenedWorkItems = await page
41
+ .locator(STATUS_CHANGE_CAPACITY_SELECTOR)
42
+ .evaluate((el) => el.getAttribute('checked') === 'checked' ? true : false);
43
+ const checkAgentCapacityOnReassignedWorkItems = await page
44
+ .locator(OWNER_CHANGE_CAPACITY_SELECTOR)
45
+ .evaluate((el) => el.getAttribute('checked') === 'checked' ? true : false);
46
+ await page.close();
47
+ return {
48
+ capacityModel,
49
+ statusField,
50
+ valuesForInProgress,
51
+ checkAgentCapacityOnReopenedWorkItems,
52
+ checkAgentCapacityOnReassignedWorkItems,
53
+ };
54
+ }
55
+ await page.close();
56
+ return { capacityModel };
57
+ }
58
+ diff(state, definition) {
59
+ const response = {};
60
+ if (state && definition) {
61
+ if (definition.capacityModel === 'Tab-based') {
62
+ if (definition.capacityModel !== state.capacityModel) {
63
+ response.capacityModel = definition.capacityModel;
64
+ return response;
65
+ }
66
+ return undefined;
67
+ }
68
+ if (definition.capacityModel !== state.capacityModel) {
69
+ response.capacityModel = definition.capacityModel;
70
+ }
71
+ if (definition.statusField !== state.statusField) {
72
+ response.statusField = definition.statusField;
73
+ }
74
+ if (JSON.stringify(definition.valuesForInProgress) !==
75
+ JSON.stringify(state.valuesForInProgress)) {
76
+ response.valuesForInProgress = definition.valuesForInProgress;
77
+ }
78
+ if (definition.checkAgentCapacityOnReassignedWorkItems !==
79
+ state.checkAgentCapacityOnReassignedWorkItems) {
80
+ response.checkAgentCapacityOnReassignedWorkItems =
81
+ definition.checkAgentCapacityOnReassignedWorkItems;
82
+ }
83
+ if (definition.checkAgentCapacityOnReopenedWorkItems !==
84
+ state.checkAgentCapacityOnReopenedWorkItems) {
85
+ response.checkAgentCapacityOnReopenedWorkItems =
86
+ definition.checkAgentCapacityOnReopenedWorkItems;
87
+ }
88
+ }
89
+ return Object.keys(response).length ? response : undefined;
90
+ }
91
+ async apply(config) {
92
+ const conn = this.org.getConnection();
93
+ // Query for the service channel
94
+ const serviceChannelDeveloperName = config.serviceChannelDeveloperName;
95
+ const serviceChannel = await conn.singleRecordQuery(`SELECT Id FROM ServiceChannel WHERE DeveloperName='${serviceChannelDeveloperName}'`);
96
+ // Open the service channel setup page
97
+ const page = await this.browserforce.openPage(`${serviceChannel.Id}/e`);
98
+ // Update the service channel config
99
+ const configCapacity = config.capacity;
100
+ if (configCapacity?.capacityModel) {
101
+ await page
102
+ .locator(CAPACITY_MODEL_SELECTOR)
103
+ .selectOption(configCapacity.capacityModel);
104
+ }
105
+ if (configCapacity?.statusField) {
106
+ await page
107
+ .locator(STATUS_FIELD_SELECTOR)
108
+ .selectOption(configCapacity.statusField);
109
+ }
110
+ await page.waitForLoadState('networkidle');
111
+ if (configCapacity?.valuesForInProgress) {
112
+ const completedOptions = await page
113
+ .locator(`${VALUES_COMPLETED_SELECTOR} > option:not(:disabled)`)
114
+ .evaluateAll((options) => {
115
+ return options.map((option) => option.title);
116
+ });
117
+ const inProgressOptions = await page
118
+ .locator(`${VALUES_IN_PROGRESS_SELECTOR} > option:not(:disabled)`)
119
+ .evaluateAll((options) => {
120
+ return options.map((option) => option.title);
121
+ });
122
+ for (const optionTitle of completedOptions) {
123
+ if (configCapacity.valuesForInProgress.includes(optionTitle)) {
124
+ await page
125
+ .getByRole('option', { name: optionTitle, exact: true })
126
+ .click();
127
+ await page.locator(ADD_BUTTON_SELECTOR).click();
128
+ await page.waitForLoadState('domcontentloaded');
129
+ }
130
+ }
131
+ for (const optionTitle of inProgressOptions) {
132
+ if (!configCapacity.valuesForInProgress.includes(optionTitle)) {
133
+ await page
134
+ .getByRole('option', { name: optionTitle, exact: true })
135
+ .click();
136
+ await page.locator(REMOVE_BUTTON_SELECTOR).click();
137
+ await page.waitForLoadState('domcontentloaded');
138
+ }
139
+ }
140
+ }
141
+ if (configCapacity?.checkAgentCapacityOnReassignedWorkItems !== undefined) {
142
+ await page
143
+ .locator(STATUS_CHANGE_CAPACITY_SELECTOR)
144
+ .evaluate((e, v) => {
145
+ e.checked = v;
146
+ }, configCapacity.checkAgentCapacityOnReassignedWorkItems);
147
+ }
148
+ if (configCapacity?.checkAgentCapacityOnReopenedWorkItems !== undefined) {
149
+ await page
150
+ .locator(OWNER_CHANGE_CAPACITY_SELECTOR)
151
+ .evaluate((e, v) => {
152
+ e.checked = v;
153
+ }, configCapacity.checkAgentCapacityOnReopenedWorkItems);
154
+ }
155
+ // Save the settings and wait for page refresh
156
+ await page.locator(SAVE_BUTTON_SELECTOR).first().click();
157
+ await page.waitForLoadState('load');
158
+ // Close the page
159
+ await page.close();
160
+ }
161
+ }
162
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/service-channels/capacity/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { BrowserforcePlugin } from '../../plugin.js';
2
+ import { CapacityConfig } from './capacity/index.js';
3
+ type ServiceChannel = {
4
+ serviceChannelDeveloperName: string;
5
+ capacity: CapacityConfig;
6
+ };
7
+ export declare class ServiceChannels extends BrowserforcePlugin {
8
+ retrieve(definition?: ServiceChannel[]): Promise<ServiceChannel[]>;
9
+ diff(state: ServiceChannel[], definition: ServiceChannel[]): ServiceChannel[] | undefined;
10
+ apply(plan: ServiceChannel[]): Promise<void>;
11
+ }
12
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,61 @@
1
+ import assert from 'assert';
2
+ import * as child from 'child_process';
3
+ import { fileURLToPath } from 'node:url';
4
+ import * as path from 'path';
5
+ import { ServiceChannels } from './index.js';
6
+ import { OmniChannelSettings } from '../omni-channel-settings/index.js';
7
+ const __dirname = fileURLToPath(new URL('.', import.meta.url));
8
+ describe(ServiceChannels.name, function () {
9
+ this.timeout('10m');
10
+ let plugin;
11
+ before(() => {
12
+ plugin = new ServiceChannels(global.bf);
13
+ });
14
+ const configureServiceChannels = [
15
+ {
16
+ serviceChannelDeveloperName: 'CaseTest',
17
+ capacity: {
18
+ capacityModel: 'StatusBased',
19
+ statusField: 'Case.Type',
20
+ valuesForInProgress: ['Electrical', 'Mechanical'],
21
+ checkAgentCapacityOnReopenedWorkItems: true,
22
+ checkAgentCapacityOnReassignedWorkItems: true,
23
+ },
24
+ },
25
+ {
26
+ serviceChannelDeveloperName: 'LeadTest',
27
+ capacity: {
28
+ capacityModel: 'StatusBased',
29
+ statusField: 'Lead.Industry',
30
+ valuesForInProgress: ['Agriculture', 'Chemicals'],
31
+ checkAgentCapacityOnReopenedWorkItems: true,
32
+ checkAgentCapacityOnReassignedWorkItems: true,
33
+ },
34
+ },
35
+ ];
36
+ it('should disable status based capacity model', async () => {
37
+ const omnniChannelPlugin = new OmniChannelSettings(global.bf);
38
+ await omnniChannelPlugin.run({ enableStatusBasedCapacityModel: false });
39
+ });
40
+ it('should create service channel as a prerequisite', () => {
41
+ const sourceDeployCmd = child.spawnSync('sf', [
42
+ 'project',
43
+ 'deploy',
44
+ 'start',
45
+ '-d',
46
+ path.join(__dirname, 'sfdx-source'),
47
+ '--json',
48
+ ]);
49
+ assert.deepStrictEqual(sourceDeployCmd.status, 0, sourceDeployCmd.output.toString());
50
+ });
51
+ it('should enable status based capacity model as a prerequisite', async () => {
52
+ const omnniChannelPlugin = new OmniChannelSettings(global.bf);
53
+ await omnniChannelPlugin.run({ enableStatusBasedCapacityModel: true });
54
+ });
55
+ it('should configure status based capacity model for service channels', async () => {
56
+ await plugin.run(configureServiceChannels);
57
+ const res = await plugin.retrieve(configureServiceChannels);
58
+ assert.deepStrictEqual(res, configureServiceChannels);
59
+ });
60
+ });
61
+ //# sourceMappingURL=index.e2e-spec.js.map