sf-browserforce 1.0.0

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 (285) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +266 -0
  3. package/bin/run +9 -0
  4. package/bin/run.cmd +3 -0
  5. package/lib/browserforce-command.d.ts +27 -0
  6. package/lib/browserforce-command.js +162 -0
  7. package/lib/browserforce-command.js.map +1 -0
  8. package/lib/browserforce.d.ts +27 -0
  9. package/lib/browserforce.js +163 -0
  10. package/lib/browserforce.js.map +1 -0
  11. package/lib/commands/browserforce/apply.d.ts +10 -0
  12. package/lib/commands/browserforce/apply.js +83 -0
  13. package/lib/commands/browserforce/apply.js.map +1 -0
  14. package/lib/commands/browserforce/playwright.d.ts +9 -0
  15. package/lib/commands/browserforce/playwright.js +53 -0
  16. package/lib/commands/browserforce/playwright.js.map +1 -0
  17. package/lib/config-parser.d.ts +16 -0
  18. package/lib/config-parser.js +24 -0
  19. package/lib/config-parser.js.map +1 -0
  20. package/lib/index.d.ts +1 -0
  21. package/lib/index.js +2 -0
  22. package/lib/index.js.map +1 -0
  23. package/lib/jsforce-utils.d.ts +5 -0
  24. package/lib/jsforce-utils.js +14 -0
  25. package/lib/jsforce-utils.js.map +1 -0
  26. package/lib/pages/login.d.ts +7 -0
  27. package/lib/pages/login.js +17 -0
  28. package/lib/pages/login.js.map +1 -0
  29. package/lib/plugin.d.ts +15 -0
  30. package/lib/plugin.js +28 -0
  31. package/lib/plugin.js.map +1 -0
  32. package/lib/plugins/activity-settings/index.d.ts +9 -0
  33. package/lib/plugins/activity-settings/index.e2e-spec.d.ts +1 -0
  34. package/lib/plugins/activity-settings/index.e2e-spec.js +36 -0
  35. package/lib/plugins/activity-settings/index.e2e-spec.js.map +1 -0
  36. package/lib/plugins/activity-settings/index.js +102 -0
  37. package/lib/plugins/activity-settings/index.js.map +1 -0
  38. package/lib/plugins/auth-providers/index.d.ts +13 -0
  39. package/lib/plugins/auth-providers/index.e2e-spec.d.ts +1 -0
  40. package/lib/plugins/auth-providers/index.e2e-spec.js +78 -0
  41. package/lib/plugins/auth-providers/index.e2e-spec.js.map +1 -0
  42. package/lib/plugins/auth-providers/index.js +135 -0
  43. package/lib/plugins/auth-providers/index.js.map +1 -0
  44. package/lib/plugins/company-information/index.d.ts +8 -0
  45. package/lib/plugins/company-information/index.e2e-spec.d.ts +1 -0
  46. package/lib/plugins/company-information/index.e2e-spec.js +37 -0
  47. package/lib/plugins/company-information/index.e2e-spec.js.map +1 -0
  48. package/lib/plugins/company-information/index.js +114 -0
  49. package/lib/plugins/company-information/index.js.map +1 -0
  50. package/lib/plugins/customer-portal/available-custom-objects/index.d.ts +14 -0
  51. package/lib/plugins/customer-portal/available-custom-objects/index.js +203 -0
  52. package/lib/plugins/customer-portal/available-custom-objects/index.js.map +1 -0
  53. package/lib/plugins/customer-portal/available-custom-objects/index.test.d.ts +1 -0
  54. package/lib/plugins/customer-portal/available-custom-objects/index.test.js +39 -0
  55. package/lib/plugins/customer-portal/available-custom-objects/index.test.js.map +1 -0
  56. package/lib/plugins/customer-portal/enabled/index.d.ts +6 -0
  57. package/lib/plugins/customer-portal/enabled/index.js +89 -0
  58. package/lib/plugins/customer-portal/enabled/index.js.map +1 -0
  59. package/lib/plugins/customer-portal/enabled/index.test.d.ts +1 -0
  60. package/lib/plugins/customer-portal/enabled/index.test.js +34 -0
  61. package/lib/plugins/customer-portal/enabled/index.test.js.map +1 -0
  62. package/lib/plugins/customer-portal/index.d.ts +15 -0
  63. package/lib/plugins/customer-portal/index.e2e-spec.d.ts +1 -0
  64. package/lib/plugins/customer-portal/index.e2e-spec.js +188 -0
  65. package/lib/plugins/customer-portal/index.e2e-spec.js.map +1 -0
  66. package/lib/plugins/customer-portal/index.js +58 -0
  67. package/lib/plugins/customer-portal/index.js.map +1 -0
  68. package/lib/plugins/customer-portal/index.test.d.ts +1 -0
  69. package/lib/plugins/customer-portal/index.test.js +84 -0
  70. package/lib/plugins/customer-portal/index.test.js.map +1 -0
  71. package/lib/plugins/customer-portal/portals/index.d.ts +25 -0
  72. package/lib/plugins/customer-portal/portals/index.js +254 -0
  73. package/lib/plugins/customer-portal/portals/index.js.map +1 -0
  74. package/lib/plugins/customer-portal/portals/index.test.d.ts +1 -0
  75. package/lib/plugins/customer-portal/portals/index.test.js +140 -0
  76. package/lib/plugins/customer-portal/portals/index.test.js.map +1 -0
  77. package/lib/plugins/density-settings/index.d.ts +10 -0
  78. package/lib/plugins/density-settings/index.e2e-spec.d.ts +1 -0
  79. package/lib/plugins/density-settings/index.e2e-spec.js +39 -0
  80. package/lib/plugins/density-settings/index.e2e-spec.js.map +1 -0
  81. package/lib/plugins/density-settings/index.js +101 -0
  82. package/lib/plugins/density-settings/index.js.map +1 -0
  83. package/lib/plugins/deprecated.d.ts +4 -0
  84. package/lib/plugins/deprecated.js +28 -0
  85. package/lib/plugins/deprecated.js.map +1 -0
  86. package/lib/plugins/email-deliverability/index.d.ts +9 -0
  87. package/lib/plugins/email-deliverability/index.e2e-spec.d.ts +1 -0
  88. package/lib/plugins/email-deliverability/index.e2e-spec.js +55 -0
  89. package/lib/plugins/email-deliverability/index.e2e-spec.js.map +1 -0
  90. package/lib/plugins/email-deliverability/index.js +109 -0
  91. package/lib/plugins/email-deliverability/index.js.map +1 -0
  92. package/lib/plugins/high-velocity-sales-settings/index.d.ts +10 -0
  93. package/lib/plugins/high-velocity-sales-settings/index.e2e-spec.d.ts +1 -0
  94. package/lib/plugins/high-velocity-sales-settings/index.e2e-spec.js +29 -0
  95. package/lib/plugins/high-velocity-sales-settings/index.e2e-spec.js.map +1 -0
  96. package/lib/plugins/high-velocity-sales-settings/index.js +105 -0
  97. package/lib/plugins/high-velocity-sales-settings/index.js.map +1 -0
  98. package/lib/plugins/high-velocity-sales-settings/page.d.ts +8 -0
  99. package/lib/plugins/high-velocity-sales-settings/page.js +27 -0
  100. package/lib/plugins/high-velocity-sales-settings/page.js.map +1 -0
  101. package/lib/plugins/history-tracking/index.d.ts +19 -0
  102. package/lib/plugins/history-tracking/index.e2e-spec.d.ts +1 -0
  103. package/lib/plugins/history-tracking/index.e2e-spec.js +128 -0
  104. package/lib/plugins/history-tracking/index.e2e-spec.js.map +1 -0
  105. package/lib/plugins/history-tracking/index.js +272 -0
  106. package/lib/plugins/history-tracking/index.js.map +1 -0
  107. package/lib/plugins/home-page-layouts/index.d.ts +14 -0
  108. package/lib/plugins/home-page-layouts/index.e2e-spec.d.ts +1 -0
  109. package/lib/plugins/home-page-layouts/index.e2e-spec.js +47 -0
  110. package/lib/plugins/home-page-layouts/index.e2e-spec.js.map +1 -0
  111. package/lib/plugins/home-page-layouts/index.js +145 -0
  112. package/lib/plugins/home-page-layouts/index.js.map +1 -0
  113. package/lib/plugins/home-page-layouts/index.test.d.ts +1 -0
  114. package/lib/plugins/home-page-layouts/index.test.js +104 -0
  115. package/lib/plugins/home-page-layouts/index.test.js.map +1 -0
  116. package/lib/plugins/index.d.ts +28 -0
  117. package/lib/plugins/index.js +29 -0
  118. package/lib/plugins/index.js.map +1 -0
  119. package/lib/plugins/lightning-experience-settings/index.d.ts +17 -0
  120. package/lib/plugins/lightning-experience-settings/index.e2e-spec.d.ts +1 -0
  121. package/lib/plugins/lightning-experience-settings/index.e2e-spec.js +48 -0
  122. package/lib/plugins/lightning-experience-settings/index.e2e-spec.js.map +1 -0
  123. package/lib/plugins/lightning-experience-settings/index.js +149 -0
  124. package/lib/plugins/lightning-experience-settings/index.js.map +1 -0
  125. package/lib/plugins/linkedin-sales-navigator-settings/index.d.ts +8 -0
  126. package/lib/plugins/linkedin-sales-navigator-settings/index.e2e-spec.d.ts +1 -0
  127. package/lib/plugins/linkedin-sales-navigator-settings/index.e2e-spec.js +29 -0
  128. package/lib/plugins/linkedin-sales-navigator-settings/index.e2e-spec.js.map +1 -0
  129. package/lib/plugins/linkedin-sales-navigator-settings/index.js +93 -0
  130. package/lib/plugins/linkedin-sales-navigator-settings/index.js.map +1 -0
  131. package/lib/plugins/linkedin-sales-navigator-settings/page.d.ts +9 -0
  132. package/lib/plugins/linkedin-sales-navigator-settings/page.js +35 -0
  133. package/lib/plugins/linkedin-sales-navigator-settings/page.js.map +1 -0
  134. package/lib/plugins/login-as-user/index.d.ts +9 -0
  135. package/lib/plugins/login-as-user/index.js +104 -0
  136. package/lib/plugins/login-as-user/index.js.map +1 -0
  137. package/lib/plugins/logout-login-as-user/index.d.ts +6 -0
  138. package/lib/plugins/logout-login-as-user/index.js +76 -0
  139. package/lib/plugins/logout-login-as-user/index.js.map +1 -0
  140. package/lib/plugins/omni-channel-settings/index.d.ts +9 -0
  141. package/lib/plugins/omni-channel-settings/index.e2e-spec.d.ts +1 -0
  142. package/lib/plugins/omni-channel-settings/index.e2e-spec.js +30 -0
  143. package/lib/plugins/omni-channel-settings/index.e2e-spec.js.map +1 -0
  144. package/lib/plugins/omni-channel-settings/index.js +97 -0
  145. package/lib/plugins/omni-channel-settings/index.js.map +1 -0
  146. package/lib/plugins/opportunity-splits/index.d.ts +9 -0
  147. package/lib/plugins/opportunity-splits/index.e2e-spec.d.ts +1 -0
  148. package/lib/plugins/opportunity-splits/index.e2e-spec.js +46 -0
  149. package/lib/plugins/opportunity-splits/index.e2e-spec.js.map +1 -0
  150. package/lib/plugins/opportunity-splits/index.js +117 -0
  151. package/lib/plugins/opportunity-splits/index.js.map +1 -0
  152. package/lib/plugins/opportunity-splits/pages/layout-selection.d.ts +8 -0
  153. package/lib/plugins/opportunity-splits/pages/layout-selection.js +15 -0
  154. package/lib/plugins/opportunity-splits/pages/layout-selection.js.map +1 -0
  155. package/lib/plugins/opportunity-splits/pages/overview.d.ts +11 -0
  156. package/lib/plugins/opportunity-splits/pages/overview.js +32 -0
  157. package/lib/plugins/opportunity-splits/pages/overview.js.map +1 -0
  158. package/lib/plugins/opportunity-splits/pages/setup.d.ts +9 -0
  159. package/lib/plugins/opportunity-splits/pages/setup.js +17 -0
  160. package/lib/plugins/opportunity-splits/pages/setup.js.map +1 -0
  161. package/lib/plugins/permission-sets/index.d.ts +10 -0
  162. package/lib/plugins/permission-sets/index.e2e-spec.d.ts +1 -0
  163. package/lib/plugins/permission-sets/index.e2e-spec.js +47 -0
  164. package/lib/plugins/permission-sets/index.e2e-spec.js.map +1 -0
  165. package/lib/plugins/permission-sets/index.js +22 -0
  166. package/lib/plugins/permission-sets/index.js.map +1 -0
  167. package/lib/plugins/permission-sets/service-presence-status/index.d.ts +10 -0
  168. package/lib/plugins/permission-sets/service-presence-status/index.js +124 -0
  169. package/lib/plugins/permission-sets/service-presence-status/index.js.map +1 -0
  170. package/lib/plugins/picklists/field-dependencies/index.d.ts +11 -0
  171. package/lib/plugins/picklists/field-dependencies/index.js +133 -0
  172. package/lib/plugins/picklists/field-dependencies/index.js.map +1 -0
  173. package/lib/plugins/picklists/field-dependencies/index.test.d.ts +1 -0
  174. package/lib/plugins/picklists/field-dependencies/index.test.js +64 -0
  175. package/lib/plugins/picklists/field-dependencies/index.test.js.map +1 -0
  176. package/lib/plugins/picklists/field-dependencies/pages.d.ts +15 -0
  177. package/lib/plugins/picklists/field-dependencies/pages.js +50 -0
  178. package/lib/plugins/picklists/field-dependencies/pages.js.map +1 -0
  179. package/lib/plugins/picklists/index.d.ts +23 -0
  180. package/lib/plugins/picklists/index.e2e-spec.d.ts +1 -0
  181. package/lib/plugins/picklists/index.e2e-spec.js +128 -0
  182. package/lib/plugins/picklists/index.e2e-spec.js.map +1 -0
  183. package/lib/plugins/picklists/index.js +229 -0
  184. package/lib/plugins/picklists/index.js.map +1 -0
  185. package/lib/plugins/picklists/pages.d.ts +45 -0
  186. package/lib/plugins/picklists/pages.js +185 -0
  187. package/lib/plugins/picklists/pages.js.map +1 -0
  188. package/lib/plugins/picklists/standard-value-set.d.ts +1 -0
  189. package/lib/plugins/picklists/standard-value-set.js +80 -0
  190. package/lib/plugins/picklists/standard-value-set.js.map +1 -0
  191. package/lib/plugins/record-types/index.d.ts +14 -0
  192. package/lib/plugins/record-types/index.e2e-spec.d.ts +1 -0
  193. package/lib/plugins/record-types/index.e2e-spec.js +76 -0
  194. package/lib/plugins/record-types/index.e2e-spec.js.map +1 -0
  195. package/lib/plugins/record-types/index.js +133 -0
  196. package/lib/plugins/record-types/index.js.map +1 -0
  197. package/lib/plugins/record-types/pages.d.ts +14 -0
  198. package/lib/plugins/record-types/pages.js +50 -0
  199. package/lib/plugins/record-types/pages.js.map +1 -0
  200. package/lib/plugins/relate-contact-to-multiple-accounts/index.d.ts +11 -0
  201. package/lib/plugins/relate-contact-to-multiple-accounts/index.e2e-spec.d.ts +1 -0
  202. package/lib/plugins/relate-contact-to-multiple-accounts/index.e2e-spec.js +30 -0
  203. package/lib/plugins/relate-contact-to-multiple-accounts/index.e2e-spec.js.map +1 -0
  204. package/lib/plugins/relate-contact-to-multiple-accounts/index.js +120 -0
  205. package/lib/plugins/relate-contact-to-multiple-accounts/index.js.map +1 -0
  206. package/lib/plugins/reports-and-dashboards/folder-sharing/index.d.ts +8 -0
  207. package/lib/plugins/reports-and-dashboards/folder-sharing/index.e2e-spec.d.ts +1 -0
  208. package/lib/plugins/reports-and-dashboards/folder-sharing/index.e2e-spec.js +3 -0
  209. package/lib/plugins/reports-and-dashboards/folder-sharing/index.e2e-spec.js.map +1 -0
  210. package/lib/plugins/reports-and-dashboards/folder-sharing/index.js +116 -0
  211. package/lib/plugins/reports-and-dashboards/folder-sharing/index.js.map +1 -0
  212. package/lib/plugins/reports-and-dashboards/index.d.ts +11 -0
  213. package/lib/plugins/reports-and-dashboards/index.e2e-spec.d.ts +1 -0
  214. package/lib/plugins/reports-and-dashboards/index.e2e-spec.js +3 -0
  215. package/lib/plugins/reports-and-dashboards/index.e2e-spec.js.map +1 -0
  216. package/lib/plugins/reports-and-dashboards/index.js +29 -0
  217. package/lib/plugins/reports-and-dashboards/index.js.map +1 -0
  218. package/lib/plugins/salesforce-cpq-config/formConfig.d.ts +17 -0
  219. package/lib/plugins/salesforce-cpq-config/formConfig.js +649 -0
  220. package/lib/plugins/salesforce-cpq-config/formConfig.js.map +1 -0
  221. package/lib/plugins/salesforce-cpq-config/index.d.ts +7 -0
  222. package/lib/plugins/salesforce-cpq-config/index.e2e-spec.d.ts +1 -0
  223. package/lib/plugins/salesforce-cpq-config/index.e2e-spec.js +37 -0
  224. package/lib/plugins/salesforce-cpq-config/index.e2e-spec.js.map +1 -0
  225. package/lib/plugins/salesforce-cpq-config/index.js +261 -0
  226. package/lib/plugins/salesforce-cpq-config/index.js.map +1 -0
  227. package/lib/plugins/salesforce-to-salesforce/index.d.ts +9 -0
  228. package/lib/plugins/salesforce-to-salesforce/index.e2e-spec.d.ts +1 -0
  229. package/lib/plugins/salesforce-to-salesforce/index.e2e-spec.js +34 -0
  230. package/lib/plugins/salesforce-to-salesforce/index.e2e-spec.js.map +1 -0
  231. package/lib/plugins/salesforce-to-salesforce/index.js +107 -0
  232. package/lib/plugins/salesforce-to-salesforce/index.js.map +1 -0
  233. package/lib/plugins/scheduled-batches/index.d.ts +10 -0
  234. package/lib/plugins/scheduled-batches/index.js +145 -0
  235. package/lib/plugins/scheduled-batches/index.js.map +1 -0
  236. package/lib/plugins/scheduled-batches/page.d.ts +19 -0
  237. package/lib/plugins/scheduled-batches/page.js +39 -0
  238. package/lib/plugins/scheduled-batches/page.js.map +1 -0
  239. package/lib/plugins/security/authentication-configuration/index.d.ts +15 -0
  240. package/lib/plugins/security/authentication-configuration/index.e2e-spec.d.ts +1 -0
  241. package/lib/plugins/security/authentication-configuration/index.e2e-spec.js +129 -0
  242. package/lib/plugins/security/authentication-configuration/index.e2e-spec.js.map +1 -0
  243. package/lib/plugins/security/authentication-configuration/index.js +200 -0
  244. package/lib/plugins/security/authentication-configuration/index.js.map +1 -0
  245. package/lib/plugins/security/certificate-and-key-management/index.d.ts +23 -0
  246. package/lib/plugins/security/certificate-and-key-management/index.e2e-spec.d.ts +1 -0
  247. package/lib/plugins/security/certificate-and-key-management/index.e2e-spec.js +59 -0
  248. package/lib/plugins/security/certificate-and-key-management/index.e2e-spec.js.map +1 -0
  249. package/lib/plugins/security/certificate-and-key-management/index.js +233 -0
  250. package/lib/plugins/security/certificate-and-key-management/index.js.map +1 -0
  251. package/lib/plugins/security/certificate-and-key-management/index.test.d.ts +1 -0
  252. package/lib/plugins/security/certificate-and-key-management/index.test.js +61 -0
  253. package/lib/plugins/security/certificate-and-key-management/index.test.js.map +1 -0
  254. package/lib/plugins/security/index.d.ts +13 -0
  255. package/lib/plugins/security/index.js +41 -0
  256. package/lib/plugins/security/index.js.map +1 -0
  257. package/lib/plugins/service-channels/capacity/index.d.ts +18 -0
  258. package/lib/plugins/service-channels/capacity/index.js +194 -0
  259. package/lib/plugins/service-channels/capacity/index.js.map +1 -0
  260. package/lib/plugins/service-channels/index.d.ts +12 -0
  261. package/lib/plugins/service-channels/index.e2e-spec.d.ts +1 -0
  262. package/lib/plugins/service-channels/index.e2e-spec.js +67 -0
  263. package/lib/plugins/service-channels/index.e2e-spec.js.map +1 -0
  264. package/lib/plugins/service-channels/index.js +37 -0
  265. package/lib/plugins/service-channels/index.js.map +1 -0
  266. package/lib/plugins/slack/index.d.ts +9 -0
  267. package/lib/plugins/slack/index.e2e-spec.d.ts +1 -0
  268. package/lib/plugins/slack/index.e2e-spec.js +47 -0
  269. package/lib/plugins/slack/index.e2e-spec.js.map +1 -0
  270. package/lib/plugins/slack/index.js +111 -0
  271. package/lib/plugins/slack/index.js.map +1 -0
  272. package/lib/plugins/user-access-policies/index.d.ts +19 -0
  273. package/lib/plugins/user-access-policies/index.e2e-spec.d.ts +1 -0
  274. package/lib/plugins/user-access-policies/index.e2e-spec.js +61 -0
  275. package/lib/plugins/user-access-policies/index.e2e-spec.js.map +1 -0
  276. package/lib/plugins/user-access-policies/index.js +176 -0
  277. package/lib/plugins/user-access-policies/index.js.map +1 -0
  278. package/lib/plugins/user-access-policies/page.d.ts +30 -0
  279. package/lib/plugins/user-access-policies/page.js +114 -0
  280. package/lib/plugins/user-access-policies/page.js.map +1 -0
  281. package/lib/plugins/utils.d.ts +13 -0
  282. package/lib/plugins/utils.js +159 -0
  283. package/lib/plugins/utils.js.map +1 -0
  284. package/oclif.manifest.json +177 -0
  285. package/package.json +65 -0
@@ -0,0 +1,128 @@
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 { HistoryTracking } from './index.js';
6
+ const __dirname = fileURLToPath(new URL('.', import.meta.url));
7
+ describe(HistoryTracking.name, function () {
8
+ let plugin;
9
+ before(() => {
10
+ plugin = new HistoryTracking(global.browserforce);
11
+ });
12
+ const enableHistoryTracking = [
13
+ {
14
+ objectApiName: 'Account',
15
+ enableHistoryTracking: true,
16
+ fieldHistoryTracking: [
17
+ {
18
+ fieldApiName: 'PersonBirthdate',
19
+ enableHistoryTracking: true,
20
+ },
21
+ {
22
+ fieldApiName: 'Test__pc',
23
+ enableHistoryTracking: true,
24
+ },
25
+ ],
26
+ },
27
+ {
28
+ objectApiName: 'Opportunity',
29
+ enableHistoryTracking: true,
30
+ fieldHistoryTracking: [
31
+ {
32
+ fieldApiName: 'Type',
33
+ enableHistoryTracking: true,
34
+ },
35
+ ],
36
+ },
37
+ {
38
+ objectApiName: 'Test__c',
39
+ fieldHistoryTracking: [
40
+ {
41
+ fieldApiName: 'Owner',
42
+ enableHistoryTracking: true,
43
+ },
44
+ {
45
+ fieldApiName: 'Test__c',
46
+ enableHistoryTracking: true,
47
+ },
48
+ ],
49
+ },
50
+ {
51
+ objectApiName: 'Task',
52
+ fieldHistoryTracking: [
53
+ {
54
+ fieldApiName: 'Test__c',
55
+ enableHistoryTracking: true,
56
+ },
57
+ ],
58
+ },
59
+ ];
60
+ const disableHistoryTracking = [
61
+ {
62
+ objectApiName: 'Account',
63
+ enableHistoryTracking: true,
64
+ fieldHistoryTracking: [
65
+ {
66
+ fieldApiName: 'PersonBirthdate',
67
+ enableHistoryTracking: false,
68
+ },
69
+ {
70
+ fieldApiName: 'Test__pc',
71
+ enableHistoryTracking: true,
72
+ },
73
+ ],
74
+ },
75
+ {
76
+ objectApiName: 'Opportunity',
77
+ enableHistoryTracking: false,
78
+ },
79
+ {
80
+ objectApiName: 'Test__c',
81
+ fieldHistoryTracking: [
82
+ {
83
+ fieldApiName: 'Owner',
84
+ enableHistoryTracking: true,
85
+ },
86
+ {
87
+ fieldApiName: 'Test__c',
88
+ enableHistoryTracking: false,
89
+ },
90
+ ],
91
+ },
92
+ {
93
+ objectApiName: 'Task',
94
+ fieldHistoryTracking: [
95
+ {
96
+ fieldApiName: 'Test__c',
97
+ enableHistoryTracking: false,
98
+ },
99
+ ],
100
+ },
101
+ ];
102
+ it('should create custom object and fields as a prerequisite', () => {
103
+ const sourceDeployCmd = child.spawnSync('sf', [
104
+ 'project',
105
+ 'deploy',
106
+ 'start',
107
+ '-d',
108
+ path.join(__dirname, 'sfdx-source'),
109
+ '--json',
110
+ ]);
111
+ assert.deepStrictEqual(sourceDeployCmd.status, 0, sourceDeployCmd.output.toString());
112
+ });
113
+ it('should enable history tracking for objects and fields', async () => {
114
+ await plugin.run(enableHistoryTracking);
115
+ const res = await plugin.retrieve(enableHistoryTracking);
116
+ assert.deepStrictEqual(res, enableHistoryTracking);
117
+ });
118
+ it('should disable history tracking for objects and fields', async () => {
119
+ await plugin.run(disableHistoryTracking);
120
+ const res = await plugin.retrieve(disableHistoryTracking);
121
+ assert.deepStrictEqual(res, disableHistoryTracking);
122
+ });
123
+ it('should remove the CustomObject and field', async () => {
124
+ await global.browserforce.connection.metadata.delete('CustomObject', ['Test__c']);
125
+ await global.browserforce.connection.metadata.delete('CustomField', ['Contact.Test__c']);
126
+ });
127
+ });
128
+ //# sourceMappingURL=index.e2e-spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.e2e-spec.js","sourceRoot":"","sources":["../../../src/plugins/history-tracking/index.e2e-spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,272 @@
1
+ var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
2
+ if (value !== null && value !== void 0) {
3
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
4
+ var dispose, inner;
5
+ if (async) {
6
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
7
+ dispose = value[Symbol.asyncDispose];
8
+ }
9
+ if (dispose === void 0) {
10
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
11
+ dispose = value[Symbol.dispose];
12
+ if (async) inner = dispose;
13
+ }
14
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
15
+ if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
16
+ env.stack.push({ value: value, dispose: dispose, async: async });
17
+ }
18
+ else if (async) {
19
+ env.stack.push({ async: true });
20
+ }
21
+ return value;
22
+ };
23
+ var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
24
+ return function (env) {
25
+ function fail(e) {
26
+ env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
27
+ env.hasError = true;
28
+ }
29
+ var r, s = 0;
30
+ function next() {
31
+ while (r = env.stack.pop()) {
32
+ try {
33
+ if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
34
+ if (r.dispose) {
35
+ var result = r.dispose.call(r.value);
36
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
37
+ }
38
+ else s |= 1;
39
+ }
40
+ catch (e) {
41
+ fail(e);
42
+ }
43
+ }
44
+ if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
45
+ if (env.hasError) throw env.error;
46
+ }
47
+ return next();
48
+ };
49
+ })(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
50
+ var e = new Error(message);
51
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
52
+ });
53
+ import { waitForPageErrors } from '../../browserforce.js';
54
+ import { BrowserforcePlugin } from '../../plugin.js';
55
+ const BASE_PATH = `/ui/setup/layout/FieldHistoryTracking?pEntity={APINAME}&retURL=${encodeURIComponent('/setup/forcecomHomepage.apexp')}`;
56
+ const ENABLE_HISTORY_SELECTOR = 'input[type="checkbox"][id="enable"]';
57
+ const ENABLE_FIELD_HISTORY_SELECTOR = 'input[id="{APINAME}_fht"]';
58
+ const SAVE_BUTTON_SELECTOR = 'input[type="submit"][name="save"]';
59
+ const UNSUPPORTED_HISTORY_TRACKING_OBJECTS = new Set(['Task']);
60
+ export class HistoryTracking extends BrowserforcePlugin {
61
+ async retrieve(definition) {
62
+ const historyTrackingConfigs = [];
63
+ // We first need to retrieve the corresponding CustomField.TableOrEnumId for all objects
64
+ // This is in case we have field tracking configured for custom fields
65
+ const tableEnumOrIdByObjectApiName = await this.getTableEnumOrIdByObjectApiName(definition);
66
+ // Now we can iterate over all history tracking configurations in the definition
67
+ for (const historyTrackingConfig of definition) {
68
+ const env_1 = { stack: [], error: void 0, hasError: false };
69
+ try {
70
+ const historyTrackingResult = { ...historyTrackingConfig };
71
+ // Open the object history tracking setup page
72
+ const page = __addDisposableResource(env_1, await this.browserforce.openPage(BASE_PATH.replace('{APINAME}', tableEnumOrIdByObjectApiName.get(historyTrackingConfig.objectApiName))), true);
73
+ // Retrieve the object history tracking
74
+ // If this is a custom object, this checkbox does not exist, so skip
75
+ if (!historyTrackingConfig.objectApiName.includes('__c') &&
76
+ !UNSUPPORTED_HISTORY_TRACKING_OBJECTS.has(historyTrackingConfig.objectApiName)) {
77
+ historyTrackingResult.enableHistoryTracking = await page.locator(ENABLE_HISTORY_SELECTOR).isChecked();
78
+ }
79
+ // If we have no field history tracking, there is nothing more to do
80
+ if (!historyTrackingConfig.fieldHistoryTracking) {
81
+ historyTrackingConfigs.push(historyTrackingResult);
82
+ continue;
83
+ }
84
+ const fieldHistoryTrackingConfigs = [];
85
+ // If the object history tracking is false, then we already know all field history tracking is false
86
+ // Only so long as this is a standard object
87
+ if (!historyTrackingResult.enableHistoryTracking &&
88
+ !historyTrackingConfig.objectApiName.includes('__c') &&
89
+ !UNSUPPORTED_HISTORY_TRACKING_OBJECTS.has(historyTrackingConfig.objectApiName)) {
90
+ for (const fieldHistoryTracking of historyTrackingConfig.fieldHistoryTracking) {
91
+ fieldHistoryTrackingConfigs.push({
92
+ ...fieldHistoryTracking,
93
+ enableHistoryTracking: false,
94
+ });
95
+ }
96
+ historyTrackingResult.fieldHistoryTracking = fieldHistoryTrackingConfigs;
97
+ historyTrackingConfigs.push(historyTrackingResult);
98
+ continue;
99
+ }
100
+ // We need to determine the correct html selector for each field that is configured
101
+ // This is because custom fields are identified using their CustomField.Id value
102
+ const fieldSelectorByFieldApiName = await this.getFieldSelectorByFieldApiName(tableEnumOrIdByObjectApiName.get(historyTrackingConfig.objectApiName), historyTrackingConfig.fieldHistoryTracking);
103
+ // We can now retrieve the field history settings for the fields specified for the object
104
+ for (const fieldHistoryTracking of historyTrackingConfig.fieldHistoryTracking) {
105
+ const fieldHistoryTrackingResult = { ...fieldHistoryTracking };
106
+ const fieldApiName = fieldSelectorByFieldApiName.get(fieldHistoryTracking.fieldApiName);
107
+ fieldHistoryTrackingResult.enableHistoryTracking = await page
108
+ .locator(ENABLE_FIELD_HISTORY_SELECTOR.replace('{APINAME}', fieldApiName))
109
+ .isChecked();
110
+ fieldHistoryTrackingConfigs.push(fieldHistoryTrackingResult);
111
+ }
112
+ historyTrackingResult.fieldHistoryTracking = fieldHistoryTrackingConfigs;
113
+ historyTrackingConfigs.push(historyTrackingResult);
114
+ }
115
+ catch (e_1) {
116
+ env_1.error = e_1;
117
+ env_1.hasError = true;
118
+ }
119
+ finally {
120
+ const result_1 = __disposeResources(env_1);
121
+ if (result_1)
122
+ await result_1;
123
+ }
124
+ }
125
+ return historyTrackingConfigs;
126
+ }
127
+ async apply(plan) {
128
+ // We first need to retrieve the corresponding CustomField.TableOrEnumId for all objects
129
+ // This is in case we are configuring field tracking for custom fields
130
+ const tableEnumOrIdByObjectApiName = await this.getTableEnumOrIdByObjectApiName(plan);
131
+ // Now we can iterate over all history tracking configurations in the plan
132
+ for (const historyTrackingConfig of plan) {
133
+ const env_2 = { stack: [], error: void 0, hasError: false };
134
+ try {
135
+ // Open the object history tracking setup page
136
+ const page = __addDisposableResource(env_2, await this.browserforce.openPage(BASE_PATH.replace('{APINAME}', tableEnumOrIdByObjectApiName.get(historyTrackingConfig.objectApiName))), true);
137
+ // Retrieve the object history tracking
138
+ // If this is a custom object, this checkbox does not exist, so skip
139
+ if (!historyTrackingConfig.objectApiName.includes('__c') &&
140
+ !UNSUPPORTED_HISTORY_TRACKING_OBJECTS.has(historyTrackingConfig.objectApiName)) {
141
+ const historyTrackingEnabled = await page.locator(ENABLE_HISTORY_SELECTOR).isChecked();
142
+ if (historyTrackingConfig.enableHistoryTracking !== historyTrackingEnabled) {
143
+ // Click the checkbox
144
+ await page.locator(ENABLE_HISTORY_SELECTOR).click();
145
+ }
146
+ }
147
+ if (historyTrackingConfig.fieldHistoryTracking) {
148
+ // We need to determine the correct html selector for each field that is configured
149
+ // This is because custom fields are identified using their CustomField.Id value
150
+ const fieldSelectorByFieldApiName = await this.getFieldSelectorByFieldApiName(tableEnumOrIdByObjectApiName.get(historyTrackingConfig.objectApiName), historyTrackingConfig.fieldHistoryTracking);
151
+ // We can now retrieve the field history settings for the fields specified for the object
152
+ for (const fieldHistoryTracking of historyTrackingConfig.fieldHistoryTracking) {
153
+ const fieldApiName = fieldSelectorByFieldApiName.get(fieldHistoryTracking.fieldApiName);
154
+ const fieldSelector = ENABLE_FIELD_HISTORY_SELECTOR.replace('{APINAME}', fieldApiName);
155
+ const fieldHistoryTrackingEnabled = await page.locator(fieldSelector).isChecked();
156
+ if (fieldHistoryTracking.enableHistoryTracking !== fieldHistoryTrackingEnabled) {
157
+ // Click the checkbox
158
+ await page.locator(fieldSelector).click();
159
+ }
160
+ }
161
+ }
162
+ // Save the settings
163
+ await page
164
+ .locator(SAVE_BUTTON_SELECTOR)
165
+ .filter({ visible: true }) // there are three save buttons [not visible, top row, bottom row]
166
+ .first()
167
+ .click();
168
+ await Promise.race([
169
+ page.waitForURL((url) => url.pathname.startsWith('/setup/forcecomHomepage.apexp')),
170
+ waitForPageErrors(page),
171
+ ]);
172
+ }
173
+ catch (e_2) {
174
+ env_2.error = e_2;
175
+ env_2.hasError = true;
176
+ }
177
+ finally {
178
+ const result_2 = __disposeResources(env_2);
179
+ if (result_2)
180
+ await result_2;
181
+ }
182
+ }
183
+ }
184
+ async queryCustomFieldsAndPopulateMap(fieldApiNameTuples, tableEnumOrId, suffix, fieldSelectorByFieldApiName) {
185
+ const developerNameConditions = fieldApiNameTuples.map(([apiname, namespace]) => namespace
186
+ ? `(DeveloperName ='${apiname}' AND NamespacePrefix ='${namespace}')`
187
+ : `(DeveloperName = '${apiname}')`);
188
+ const customFieldsQuery = await this.browserforce.connection.tooling.query(`SELECT Id, DeveloperName, NamespacePrefix FROM CustomField WHERE (${developerNameConditions.join(' OR ')}) AND TableEnumOrId = '${tableEnumOrId}' ORDER By CreatedDate ASC`);
189
+ for (const customField of customFieldsQuery.records) {
190
+ const fieldApiName = `${customField.NamespacePrefix ? `${customField.NamespacePrefix}__` : ''}${customField.DeveloperName}${suffix}`;
191
+ fieldSelectorByFieldApiName.set(fieldApiName, customField.Id.substring(0, 15));
192
+ }
193
+ }
194
+ parseNamespacedFieldApiName(fieldApiName, suffix) {
195
+ const fieldNameWithoutSuffix = fieldApiName.replace(suffix, '');
196
+ const parts = fieldNameWithoutSuffix.split('__');
197
+ const namespace = parts.length > 1 ? parts[0] : undefined;
198
+ const apiname = parts.length > 1 ? parts.slice(1).join('__') : parts[0];
199
+ return [apiname, namespace];
200
+ }
201
+ async getFieldSelectorByFieldApiName(tableEnumOrId, fieldHistoryTrackingConfigs) {
202
+ const fieldSelectorByFieldApiName = new Map();
203
+ const customFieldApiNames = [];
204
+ const personAccountFieldApiNames = [];
205
+ const activityFieldApiNames = [];
206
+ for (const fieldHistoryTrackingConfig of fieldHistoryTrackingConfigs) {
207
+ // If this is a person account field, we must do special handling for this
208
+ if (tableEnumOrId === 'Account' && fieldHistoryTrackingConfig.fieldApiName.includes('__pc')) {
209
+ personAccountFieldApiNames.push(this.parseNamespacedFieldApiName(fieldHistoryTrackingConfig.fieldApiName, '__pc'));
210
+ continue;
211
+ }
212
+ // If this is a Task field, we must do special handling for this
213
+ if (tableEnumOrId === 'Task' && fieldHistoryTrackingConfig.fieldApiName.includes('__c')) {
214
+ activityFieldApiNames.push(this.parseNamespacedFieldApiName(fieldHistoryTrackingConfig.fieldApiName, '__c'));
215
+ continue;
216
+ }
217
+ // If this is a custom field, we must query for the Field Id
218
+ if (fieldHistoryTrackingConfig.fieldApiName.includes('__c')) {
219
+ customFieldApiNames.push(this.parseNamespacedFieldApiName(fieldHistoryTrackingConfig.fieldApiName, '__c'));
220
+ continue;
221
+ }
222
+ // Otherwise, if this is a standard field, the Selector is the Field API Name
223
+ fieldSelectorByFieldApiName.set(fieldHistoryTrackingConfig.fieldApiName, fieldHistoryTrackingConfig.fieldApiName);
224
+ }
225
+ if (customFieldApiNames.length === 0 &&
226
+ personAccountFieldApiNames.length === 0 &&
227
+ activityFieldApiNames.length === 0) {
228
+ return fieldSelectorByFieldApiName;
229
+ }
230
+ if (personAccountFieldApiNames.length > 0) {
231
+ // NOTE: Unfortunately this includes deleted records
232
+ // WORKAROUND: ORDER BY CreatedDate
233
+ await this.queryCustomFieldsAndPopulateMap(personAccountFieldApiNames, 'Contact', '__pc', fieldSelectorByFieldApiName);
234
+ }
235
+ if (customFieldApiNames.length > 0) {
236
+ // NOTE: Unfortunately this includes deleted records
237
+ // WORKAROUND: ORDER BY CreatedDate
238
+ await this.queryCustomFieldsAndPopulateMap(customFieldApiNames, tableEnumOrId, '__c', fieldSelectorByFieldApiName);
239
+ }
240
+ if (activityFieldApiNames.length > 0) {
241
+ await this.queryCustomFieldsAndPopulateMap(activityFieldApiNames, 'Activity', '__c', fieldSelectorByFieldApiName);
242
+ }
243
+ return fieldSelectorByFieldApiName;
244
+ }
245
+ async getTableEnumOrIdByObjectApiName(historyTrackingConfigs) {
246
+ const tableEnumOrIdByObjectApiName = new Map();
247
+ const customObjectApiNames = [];
248
+ for (const historyTrackingConfig of historyTrackingConfigs) {
249
+ // If it is a custom object, the CustomField.TableEnumOrId is the Object Id
250
+ if (historyTrackingConfig.objectApiName.includes('__c')) {
251
+ customObjectApiNames.push(this.parseNamespacedFieldApiName(historyTrackingConfig.objectApiName, '__c'));
252
+ continue;
253
+ }
254
+ // Otherwise, if this is a standard object, the CustomField.TableEnumOrId is the Object API Name
255
+ tableEnumOrIdByObjectApiName.set(historyTrackingConfig.objectApiName, historyTrackingConfig.objectApiName);
256
+ }
257
+ if (customObjectApiNames.length === 0) {
258
+ return tableEnumOrIdByObjectApiName;
259
+ }
260
+ // NOTE: Unfortunately this includes deleted records
261
+ // WORKAROUND: ORDER BY CreatedDate
262
+ const customObjectDeveloperNames = customObjectApiNames.map(([apiname, namespace]) => namespace
263
+ ? `(DeveloperName = '${apiname}' AND NamespacePrefix = '${namespace}')`
264
+ : `(DeveloperName = '${apiname}')`);
265
+ const customObjectsQuery = await this.browserforce.connection.tooling.query(`SELECT Id, DeveloperName FROM CustomObject WHERE (${customObjectDeveloperNames.join(' OR ')}) ORDER BY CreatedDate ASC`);
266
+ for (const customObject of customObjectsQuery.records) {
267
+ tableEnumOrIdByObjectApiName.set(`${customObject.DeveloperName}__c`, customObject.Id);
268
+ }
269
+ return tableEnumOrIdByObjectApiName;
270
+ }
271
+ }
272
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/history-tracking/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { BrowserforcePlugin } from '../../plugin.js';
2
+ type Config = {
3
+ homePageLayoutAssignments: HomePageLayoutAssignment[];
4
+ };
5
+ type HomePageLayoutAssignment = {
6
+ profile: string;
7
+ layout: string;
8
+ };
9
+ export declare class HomePageLayouts extends BrowserforcePlugin {
10
+ retrieve(): Promise<Config>;
11
+ diff(source: Config, target: Config): Config | undefined;
12
+ apply(config: Config): Promise<void>;
13
+ }
14
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,47 @@
1
+ import assert from 'assert';
2
+ import { HomePageLayouts } from './index.js';
3
+ describe(HomePageLayouts.name, function () {
4
+ let plugin;
5
+ before(() => {
6
+ plugin = new HomePageLayouts(global.browserforce);
7
+ });
8
+ const configPageDefault = {
9
+ homePageLayoutAssignments: [
10
+ {
11
+ profile: 'Standard User',
12
+ layout: '',
13
+ },
14
+ {
15
+ profile: 'System Administrator',
16
+ layout: '',
17
+ },
18
+ ],
19
+ };
20
+ const configOrgDefault = {
21
+ homePageLayoutAssignments: [
22
+ {
23
+ profile: 'Standard User',
24
+ layout: 'DE Default',
25
+ },
26
+ {
27
+ profile: 'System Administrator',
28
+ layout: 'DE Default',
29
+ },
30
+ ],
31
+ };
32
+ it('should assign some layouts', async () => {
33
+ await plugin.run(configPageDefault);
34
+ });
35
+ it('should be assigned', async () => {
36
+ const res = await plugin.run(configPageDefault);
37
+ assert.deepStrictEqual(res, { message: 'no action necessary' });
38
+ });
39
+ it('should unassign some layouts', async () => {
40
+ await plugin.apply(configOrgDefault);
41
+ });
42
+ it('should be unassigned', async () => {
43
+ const res = await plugin.run(configOrgDefault);
44
+ assert.deepStrictEqual(res, { message: 'no action necessary' });
45
+ });
46
+ });
47
+ //# sourceMappingURL=index.e2e-spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.e2e-spec.js","sourceRoot":"","sources":["../../../src/plugins/home-page-layouts/index.e2e-spec.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,QAAQ,CAAC,eAAe,CAAC,IAAI,EAAE;IAC7B,IAAI,MAAuB,CAAC;IAC5B,MAAM,CAAC,GAAG,EAAE;QACV,MAAM,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,MAAM,iBAAiB,GAAG;QACxB,yBAAyB,EAAE;YACzB;gBACE,OAAO,EAAE,eAAe;gBACxB,MAAM,EAAE,EAAE;aACX;YACD;gBACE,OAAO,EAAE,sBAAsB;gBAC/B,MAAM,EAAE,EAAE;aACX;SACF;KACF,CAAC;IACF,MAAM,gBAAgB,GAAG;QACvB,yBAAyB,EAAE;YACzB;gBACE,OAAO,EAAE,eAAe;gBACxB,MAAM,EAAE,YAAY;aACrB;YACD;gBACE,OAAO,EAAE,sBAAsB;gBAC/B,MAAM,EAAE,YAAY;aACrB;SACF;KACF,CAAC;IACF,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;QAClC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAChD,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,MAAM,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;QACpC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC/C,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,145 @@
1
+ var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
2
+ if (value !== null && value !== void 0) {
3
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
4
+ var dispose, inner;
5
+ if (async) {
6
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
7
+ dispose = value[Symbol.asyncDispose];
8
+ }
9
+ if (dispose === void 0) {
10
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
11
+ dispose = value[Symbol.dispose];
12
+ if (async) inner = dispose;
13
+ }
14
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
15
+ if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
16
+ env.stack.push({ value: value, dispose: dispose, async: async });
17
+ }
18
+ else if (async) {
19
+ env.stack.push({ async: true });
20
+ }
21
+ return value;
22
+ };
23
+ var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
24
+ return function (env) {
25
+ function fail(e) {
26
+ env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
27
+ env.hasError = true;
28
+ }
29
+ var r, s = 0;
30
+ function next() {
31
+ while (r = env.stack.pop()) {
32
+ try {
33
+ if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
34
+ if (r.dispose) {
35
+ var result = r.dispose.call(r.value);
36
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
37
+ }
38
+ else s |= 1;
39
+ }
40
+ catch (e) {
41
+ fail(e);
42
+ }
43
+ }
44
+ if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
45
+ if (env.hasError) throw env.error;
46
+ }
47
+ return next();
48
+ };
49
+ })(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
50
+ var e = new Error(message);
51
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
52
+ });
53
+ import { waitForPageErrors } from '../../browserforce.js';
54
+ import { BrowserforcePlugin } from '../../plugin.js';
55
+ const BASE_PATH = `/setup/ui/assignhomelayoutedit.jsp?retURL=${encodeURIComponent('/setup/forcecomHomepage.apexp')}`;
56
+ const BASE_SELECTOR = 'table.detailList';
57
+ const SAVE_BUTTON_SELECTOR = 'input[name="save"]';
58
+ export class HomePageLayouts extends BrowserforcePlugin {
59
+ async retrieve() {
60
+ const env_1 = { stack: [], error: void 0, hasError: false };
61
+ try {
62
+ const page = __addDisposableResource(env_1, await this.browserforce.openPage(BASE_PATH), true);
63
+ await page.locator(BASE_SELECTOR).waitFor();
64
+ const profiles = (await page.locator('table.detailList tbody tr td label').allTextContents()).map((label) => label.replace(/^\*/, '')); // removing * from assistiveText
65
+ const layouts = (await page.locator('table.detailList tbody tr td select option:checked').allTextContents()).map((layout) => (layout === 'Home Page Default' ? '' : layout)); // value is "default" instead of an id
66
+ const homePageLayoutAssignments = profiles.map((profile, i) => ({
67
+ profile,
68
+ layout: layouts[i],
69
+ }));
70
+ return {
71
+ homePageLayoutAssignments,
72
+ };
73
+ }
74
+ catch (e_1) {
75
+ env_1.error = e_1;
76
+ env_1.hasError = true;
77
+ }
78
+ finally {
79
+ const result_1 = __disposeResources(env_1);
80
+ if (result_1)
81
+ await result_1;
82
+ }
83
+ }
84
+ diff(source, target) {
85
+ target.homePageLayoutAssignments.sort(compareAssignment);
86
+ const profileNames = target.homePageLayoutAssignments.map((assignment) => assignment.profile);
87
+ source.homePageLayoutAssignments = source.homePageLayoutAssignments
88
+ .filter((assignment) => profileNames.includes(assignment.profile))
89
+ .sort(compareAssignment);
90
+ return super.diff(source, target);
91
+ }
92
+ async apply(config) {
93
+ const env_2 = { stack: [], error: void 0, hasError: false };
94
+ try {
95
+ const profilesList = config.homePageLayoutAssignments
96
+ .map((assignment) => {
97
+ return `'${assignment.profile}'`;
98
+ })
99
+ .join(',');
100
+ const layoutsList = config.homePageLayoutAssignments
101
+ .map((assignment) => {
102
+ return `'${assignment.layout}'`;
103
+ })
104
+ .join(',');
105
+ const profiles = await this.browserforce.connection.tooling.query(`SELECT Id, Name FROM Profile WHERE Name IN (${profilesList})`);
106
+ const homePageLayouts = await this.browserforce.connection.tooling.query(`SELECT Id, Name FROM HomePageLayout WHERE Name IN (${layoutsList})`);
107
+ const page = __addDisposableResource(env_2, await this.browserforce.openPage(BASE_PATH), true);
108
+ await page.locator(BASE_SELECTOR).waitFor();
109
+ for (const assignment of config.homePageLayoutAssignments) {
110
+ const homePageLayoutName = assignment.layout;
111
+ const profile = profiles.records.find((p) => p.Name === assignment.profile);
112
+ if (!profile) {
113
+ throw new Error(`could not find profile '${assignment.profile}'`);
114
+ }
115
+ let homePageLayout = homePageLayouts.records.find((l) => l.Name === homePageLayoutName);
116
+ if (homePageLayoutName === '') {
117
+ homePageLayout = { Id: 'default', Name: 'default' };
118
+ }
119
+ if (homePageLayout === undefined) {
120
+ throw new Error(`Could not find home page layout "${homePageLayoutName}" in list of home page layouts: ${homePageLayouts.records.map((l) => l.Name)}`);
121
+ }
122
+ const profileSelector = `select[id='${profile.Id.substring(0, 15)}']`;
123
+ await page.locator(profileSelector).selectOption(homePageLayout.Id.substring(0, 15));
124
+ }
125
+ await page.locator(SAVE_BUTTON_SELECTOR).first().click();
126
+ await Promise.race([
127
+ page.waitForURL((url) => url.pathname === '/setup/forcecomHomepage.apexp'),
128
+ waitForPageErrors(page),
129
+ ]);
130
+ }
131
+ catch (e_2) {
132
+ env_2.error = e_2;
133
+ env_2.hasError = true;
134
+ }
135
+ finally {
136
+ const result_2 = __disposeResources(env_2);
137
+ if (result_2)
138
+ await result_2;
139
+ }
140
+ }
141
+ }
142
+ function compareAssignment(a, b) {
143
+ return `${a.profile}:${a.layout}`.localeCompare(`${b.profile}:${b.layout}`, 'en', { numeric: true });
144
+ }
145
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/home-page-layouts/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};