@salesforce/afv-skills 1.7.5 → 1.9.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 (513) hide show
  1. package/package.json +1 -1
  2. package/skills/activating-datacloud/CREDITS.md +5 -0
  3. package/skills/activating-datacloud/README.md +39 -0
  4. package/skills/activating-datacloud/SKILL.md +118 -0
  5. package/skills/analyzing-omnistudio-dependencies/CREDITS.md +5 -0
  6. package/skills/analyzing-omnistudio-dependencies/SKILL.md +477 -0
  7. package/skills/analyzing-omnistudio-dependencies/references/dependency-patterns.md +508 -0
  8. package/skills/analyzing-omnistudio-dependencies/references/namespace-guide.md +300 -0
  9. package/skills/building-omnistudio-callable-apex/CREDITS.md +9 -0
  10. package/skills/building-omnistudio-callable-apex/README.md +80 -0
  11. package/skills/building-omnistudio-callable-apex/SKILL.md +276 -0
  12. package/skills/building-omnistudio-callable-apex/assets/pattern_callable_openinterface.cls +40 -0
  13. package/skills/building-omnistudio-callable-apex/assets/pattern_callable_vanilla.cls +32 -0
  14. package/skills/building-omnistudio-callable-apex/assets/pattern_migration.cls +54 -0
  15. package/skills/building-omnistudio-callable-apex/assets/pattern_openinterface.cls +45 -0
  16. package/skills/building-omnistudio-callable-apex/assets/pattern_test_class.cls +65 -0
  17. package/skills/building-omnistudio-callable-apex/examples/Test_QuoteByProductCallable/IndustriesCallableException.cls +7 -0
  18. package/skills/building-omnistudio-callable-apex/examples/Test_QuoteByProductCallable/Industries_QuoteByProductCallable.cls +115 -0
  19. package/skills/building-omnistudio-callable-apex/examples/Test_QuoteByProductCallable/Industries_QuoteByProductCallableTest.cls +189 -0
  20. package/skills/building-omnistudio-callable-apex/examples/Test_QuoteByProductCallable/TRANSCRIPT.md +115 -0
  21. package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/IndustriesCallableException.cls +7 -0
  22. package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/MyCustomCallable.cls +74 -0
  23. package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/MyCustomCallableTest.cls +146 -0
  24. package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/MyCustomRemoteClass.cls +16 -0
  25. package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/TRANSCRIPT.md +120 -0
  26. package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/IndustriesCallableException.cls +7 -0
  27. package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/MyCustomCallable.cls +73 -0
  28. package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/MyCustomCallableTest.cls +128 -0
  29. package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/MyCustomVlocityOpenInterface2.cls +23 -0
  30. package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/TRANSCRIPT.md +75 -0
  31. package/skills/building-omnistudio-datamapper/CREDITS.md +5 -0
  32. package/skills/building-omnistudio-datamapper/SKILL.md +270 -0
  33. package/skills/building-omnistudio-datamapper/assets/completion-summary-template.md +28 -0
  34. package/skills/building-omnistudio-datamapper/assets/omni-data-transform-extract.json +6 -0
  35. package/skills/building-omnistudio-datamapper/assets/omni-data-transform-item.json +12 -0
  36. package/skills/building-omnistudio-datamapper/assets/omni-data-transform-load.json +6 -0
  37. package/skills/building-omnistudio-datamapper/assets/omni-data-transform-transform.json +6 -0
  38. package/skills/building-omnistudio-datamapper/references/best-practices.md +277 -0
  39. package/skills/building-omnistudio-datamapper/references/naming-conventions.md +145 -0
  40. package/skills/building-omnistudio-flexcard/CREDITS.md +5 -0
  41. package/skills/building-omnistudio-flexcard/SKILL.md +325 -0
  42. package/skills/building-omnistudio-flexcard/assets/omni-ui-card.json +10 -0
  43. package/skills/building-omnistudio-flexcard/references/best-practices.md +291 -0
  44. package/skills/building-omnistudio-flexcard/references/data-binding-guide.md +311 -0
  45. package/skills/building-omnistudio-flexcard/references/scoring-rubric.md +66 -0
  46. package/skills/building-omnistudio-flexcard/scripts/flexcard-commands.sh +24 -0
  47. package/skills/building-omnistudio-integration-procedure/CREDITS.md +5 -0
  48. package/skills/building-omnistudio-integration-procedure/SKILL.md +275 -0
  49. package/skills/building-omnistudio-integration-procedure/assets/omni-process-element-dr-extract.json +10 -0
  50. package/skills/building-omnistudio-integration-procedure/assets/omni-process-element-set-values.json +10 -0
  51. package/skills/building-omnistudio-integration-procedure/assets/omni-process-ip.json +12 -0
  52. package/skills/building-omnistudio-integration-procedure/assets/scoring-report-format.txt +14 -0
  53. package/skills/building-omnistudio-integration-procedure/references/best-practices.md +388 -0
  54. package/skills/building-omnistudio-integration-procedure/references/element-types.md +588 -0
  55. package/skills/building-omnistudio-integration-procedure/scripts/cli-commands.sh +18 -0
  56. package/skills/building-omnistudio-omniscript/CREDITS.md +5 -0
  57. package/skills/building-omnistudio-omniscript/SKILL.md +367 -0
  58. package/skills/building-omnistudio-omniscript/assets/omni-process-element-step.json +10 -0
  59. package/skills/building-omnistudio-omniscript/assets/omni-process-element-text-block.json +11 -0
  60. package/skills/building-omnistudio-omniscript/assets/omni-process-omniscript.json +12 -0
  61. package/skills/building-omnistudio-omniscript/references/best-practices.md +480 -0
  62. package/skills/building-omnistudio-omniscript/references/element-types.md +1172 -0
  63. package/skills/building-omnistudio-omniscript/scripts/check-duplicate-omniscript.sh +13 -0
  64. package/skills/building-omnistudio-omniscript/scripts/cli-reference.sh +21 -0
  65. package/skills/building-omnistudio-omniscript/scripts/deploy-omniscript.sh +29 -0
  66. package/skills/building-sf-integrations/CREDITS.md +5 -0
  67. package/skills/building-sf-integrations/README.md +95 -0
  68. package/skills/building-sf-integrations/SKILL.md +192 -0
  69. package/skills/building-sf-integrations/assets/callouts/callout-retry-handler.cls +167 -0
  70. package/skills/building-sf-integrations/assets/callouts/http-response-handler.cls +257 -0
  71. package/skills/building-sf-integrations/assets/callouts/rest-queueable-callout.cls +262 -0
  72. package/skills/building-sf-integrations/assets/callouts/rest-sync-callout.cls +211 -0
  73. package/skills/building-sf-integrations/assets/cdc/cdc-handler.cls +246 -0
  74. package/skills/building-sf-integrations/assets/cdc/cdc-subscriber-trigger.trigger +139 -0
  75. package/skills/building-sf-integrations/assets/endpoint-security/example.cspTrustedSite-meta.xml +58 -0
  76. package/skills/building-sf-integrations/assets/endpoint-security/example.remoteSite-meta.xml +39 -0
  77. package/skills/building-sf-integrations/assets/external-credentials/jwt-external-credential.externalCredential-meta.xml +90 -0
  78. package/skills/building-sf-integrations/assets/external-credentials/oauth-external-credential.externalCredential-meta.xml +87 -0
  79. package/skills/building-sf-integrations/assets/external-services/external-service-operations.md +221 -0
  80. package/skills/building-sf-integrations/assets/external-services/openapi-registration.externalServiceRegistration-meta.xml +193 -0
  81. package/skills/building-sf-integrations/assets/named-credentials/certificate-auth.namedCredential-meta.xml +62 -0
  82. package/skills/building-sf-integrations/assets/named-credentials/custom-auth.namedCredential-meta.xml +71 -0
  83. package/skills/building-sf-integrations/assets/named-credentials/oauth-client-credentials.namedCredential-meta.xml +51 -0
  84. package/skills/building-sf-integrations/assets/named-credentials/oauth-jwt-bearer.namedCredential-meta.xml +67 -0
  85. package/skills/building-sf-integrations/assets/platform-events/event-publisher.cls +191 -0
  86. package/skills/building-sf-integrations/assets/platform-events/event-subscriber-action.cls +295 -0
  87. package/skills/building-sf-integrations/assets/platform-events/event-subscriber-trigger.trigger +108 -0
  88. package/skills/building-sf-integrations/assets/platform-events/platform-event-definition.object-meta.xml +124 -0
  89. package/skills/building-sf-integrations/assets/soap/soap-callout-service.cls +186 -0
  90. package/skills/building-sf-integrations/assets/soap/wsdl2apex-guide.md +213 -0
  91. package/skills/building-sf-integrations/hooks/scripts/suggest_credential_setup.py +271 -0
  92. package/skills/building-sf-integrations/hooks/scripts/validate_integration.py +363 -0
  93. package/skills/building-sf-integrations/references/callout-patterns.md +719 -0
  94. package/skills/building-sf-integrations/references/cdc-guide.md +288 -0
  95. package/skills/building-sf-integrations/references/cli-reference.md +94 -0
  96. package/skills/building-sf-integrations/references/event-driven-architecture-guide.md +266 -0
  97. package/skills/building-sf-integrations/references/event-patterns.md +838 -0
  98. package/skills/building-sf-integrations/references/external-services-guide.md +303 -0
  99. package/skills/building-sf-integrations/references/messaging-api-v2.md +609 -0
  100. package/skills/building-sf-integrations/references/named-credentials-automation.md +201 -0
  101. package/skills/building-sf-integrations/references/named-credentials-guide.md +173 -0
  102. package/skills/building-sf-integrations/references/platform-events-guide.md +288 -0
  103. package/skills/building-sf-integrations/references/rest-callout-patterns.md +288 -0
  104. package/skills/building-sf-integrations/references/scoring-rubric.md +59 -0
  105. package/skills/building-sf-integrations/references/security-best-practices.md +248 -0
  106. package/skills/building-sf-integrations/scripts/README.md +100 -0
  107. package/skills/building-sf-integrations/scripts/configure-named-credential.sh +236 -0
  108. package/skills/building-sf-integrations/scripts/set-api-credential.sh +146 -0
  109. package/skills/building-sf-integrations/scripts/templates/setup-credentials-with-csp.sh +158 -0
  110. package/skills/building-ui-bundle-frontend/SKILL.md +2 -0
  111. package/skills/configuring-connected-apps/CREDITS.md +3 -0
  112. package/skills/configuring-connected-apps/README.md +99 -0
  113. package/skills/configuring-connected-apps/SKILL.md +224 -0
  114. package/skills/configuring-connected-apps/assets/connected-app-basic.xml +29 -0
  115. package/skills/configuring-connected-apps/assets/connected-app-canvas.xml +62 -0
  116. package/skills/configuring-connected-apps/assets/connected-app-jwt.xml +49 -0
  117. package/skills/configuring-connected-apps/assets/connected-app-oauth.xml +65 -0
  118. package/skills/configuring-connected-apps/assets/eca-global-oauth.xml +36 -0
  119. package/skills/configuring-connected-apps/assets/eca-oauth-settings.xml +36 -0
  120. package/skills/configuring-connected-apps/assets/eca-policies.xml +36 -0
  121. package/skills/configuring-connected-apps/assets/external-client-app.xml +35 -0
  122. package/skills/configuring-connected-apps/references/example-usage.md +256 -0
  123. package/skills/configuring-connected-apps/references/migration-guide.md +328 -0
  124. package/skills/configuring-connected-apps/references/oauth-flows-reference.md +660 -0
  125. package/skills/configuring-connected-apps/references/security-checklist.md +209 -0
  126. package/skills/configuring-connected-apps/references/testing-validation-guide.md +275 -0
  127. package/skills/connecting-datacloud/CREDITS.md +5 -0
  128. package/skills/connecting-datacloud/README.md +59 -0
  129. package/skills/connecting-datacloud/SKILL.md +155 -0
  130. package/skills/connecting-datacloud/examples/connections/heroku-postgres.json +15 -0
  131. package/skills/connecting-datacloud/examples/connections/ingest-api-connection.json +5 -0
  132. package/skills/connecting-datacloud/examples/connections/ingest-api-schema.json +31 -0
  133. package/skills/connecting-datacloud/examples/connections/redshift.json +16 -0
  134. package/skills/connecting-datacloud/examples/connections/sharepoint-unstructured.json +20 -0
  135. package/skills/connecting-datacloud/examples/connections/snowflake-connection.json +42 -0
  136. package/skills/debugging-apex-logs/CREDITS.md +22 -0
  137. package/skills/debugging-apex-logs/README.md +74 -0
  138. package/skills/debugging-apex-logs/SKILL.md +172 -0
  139. package/skills/debugging-apex-logs/assets/benchmarking-template.cls +327 -0
  140. package/skills/debugging-apex-logs/assets/cpu-heap-optimization.cls +307 -0
  141. package/skills/debugging-apex-logs/assets/dml-in-loop-fix.cls +219 -0
  142. package/skills/debugging-apex-logs/assets/null-pointer-fix.cls +252 -0
  143. package/skills/debugging-apex-logs/assets/soql-in-loop-fix.cls +157 -0
  144. package/skills/debugging-apex-logs/references/analysis-playbook.md +53 -0
  145. package/skills/debugging-apex-logs/references/benchmarking-guide.md +287 -0
  146. package/skills/debugging-apex-logs/references/cli-commands.md +368 -0
  147. package/skills/debugging-apex-logs/references/common-issues.md +68 -0
  148. package/skills/debugging-apex-logs/references/debug-log-reference.md +328 -0
  149. package/skills/debugging-apex-logs/references/log-analysis-tools.md +248 -0
  150. package/skills/debugging-apex-logs/references/scoring-rubric.md +21 -0
  151. package/skills/deploying-metadata/CREDITS.md +25 -0
  152. package/skills/deploying-metadata/README.md +104 -0
  153. package/skills/deploying-metadata/SKILL.md +214 -0
  154. package/skills/deploying-metadata/assets/destructiveChanges.xml +143 -0
  155. package/skills/deploying-metadata/assets/package.xml +121 -0
  156. package/skills/deploying-metadata/references/agent-deployment-guide.md +628 -0
  157. package/skills/deploying-metadata/references/deploy.sh +73 -0
  158. package/skills/deploying-metadata/references/deployment-report-template.md +89 -0
  159. package/skills/deploying-metadata/references/deployment-workflows.md +395 -0
  160. package/skills/deploying-metadata/references/orchestration.md +183 -0
  161. package/skills/deploying-metadata/references/trigger-deployment-safety.md +376 -0
  162. package/skills/deploying-omnistudio-datapacks/CREDITS.md +5 -0
  163. package/skills/deploying-omnistudio-datapacks/README.md +88 -0
  164. package/skills/deploying-omnistudio-datapacks/SKILL.md +174 -0
  165. package/skills/deploying-omnistudio-datapacks/examples/business-internet-plus-bundle/TRANSCRIPT.md +124 -0
  166. package/skills/deploying-omnistudio-datapacks/examples/business-internet-plus-bundle/deploy-business-internet-plus-bundle.yaml +11 -0
  167. package/skills/deploying-omnistudio-datapacks/examples/business-internet-plus-bundle-deploy/TRANSCRIPT.md +142 -0
  168. package/skills/deploying-omnistudio-datapacks/examples/business-internet-plus-bundle-deploy/deploy-business-internet-plus-bundle.yaml +10 -0
  169. package/skills/deploying-omnistudio-datapacks/references/job-file-template.md +42 -0
  170. package/skills/deploying-omnistudio-datapacks/references/troubleshooting-matrix.md +24 -0
  171. package/skills/deploying-ui-bundle/SKILL.md +2 -0
  172. package/skills/developing-agentforce/SKILL.md +1 -1
  173. package/skills/developing-agentforce/assets/metadata/http-callout-flow.flow-meta.xml +1 -1
  174. package/skills/developing-agentforce/references/actions-reference.md +8 -8
  175. package/skills/fetching-salesforce-docs/README.md +66 -0
  176. package/skills/fetching-salesforce-docs/SKILL.md +209 -0
  177. package/skills/fetching-salesforce-docs/requirements.txt +2 -0
  178. package/skills/fetching-salesforce-docs/scripts/extract_help_salesforce.py +497 -0
  179. package/skills/fetching-salesforce-docs/scripts/extract_salesforce_doc.py +357 -0
  180. package/skills/fetching-salesforce-docs/scripts/runtime_bootstrap.py +58 -0
  181. package/skills/generating-apex/CREDITS.md +1 -26
  182. package/skills/generating-apex/SKILL.md +4 -2
  183. package/skills/generating-apex-test/CREDITS.md +2 -27
  184. package/skills/generating-apex-test/SKILL.md +3 -1
  185. package/skills/generating-custom-application/SKILL.md +2 -0
  186. package/skills/generating-custom-field/SKILL.md +3 -1
  187. package/skills/generating-custom-lightning-type/SKILL.md +2 -0
  188. package/skills/generating-custom-object/SKILL.md +3 -1
  189. package/skills/generating-custom-tab/SKILL.md +3 -1
  190. package/skills/generating-flexipage/SKILL.md +2 -0
  191. package/skills/generating-flow/SKILL.md +2 -0
  192. package/skills/generating-lightning-app/SKILL.md +1 -1
  193. package/skills/generating-list-view/SKILL.md +2 -0
  194. package/skills/generating-lwc-components/CREDITS.md +5 -0
  195. package/skills/generating-lwc-components/README.md +126 -0
  196. package/skills/generating-lwc-components/SKILL.md +191 -0
  197. package/skills/generating-lwc-components/assets/apex-controller/LwcController.cls +327 -0
  198. package/skills/generating-lwc-components/assets/basic-component/basicComponent.css +72 -0
  199. package/skills/generating-lwc-components/assets/basic-component/basicComponent.html +111 -0
  200. package/skills/generating-lwc-components/assets/basic-component/basicComponent.js +163 -0
  201. package/skills/generating-lwc-components/assets/basic-component/basicComponent.js-meta.xml +137 -0
  202. package/skills/generating-lwc-components/assets/datatable-component/datatableComponent.html +111 -0
  203. package/skills/generating-lwc-components/assets/datatable-component/datatableComponent.js +367 -0
  204. package/skills/generating-lwc-components/assets/flow-screen-component/flowScreenComponent.css +63 -0
  205. package/skills/generating-lwc-components/assets/flow-screen-component/flowScreenComponent.html +154 -0
  206. package/skills/generating-lwc-components/assets/flow-screen-component/flowScreenComponent.js +348 -0
  207. package/skills/generating-lwc-components/assets/flow-screen-component/flowScreenComponent.js-meta.xml +87 -0
  208. package/skills/generating-lwc-components/assets/form-component/formComponent.html +165 -0
  209. package/skills/generating-lwc-components/assets/form-component/formComponent.js +275 -0
  210. package/skills/generating-lwc-components/assets/graphql-component/graphqlComponent.html +100 -0
  211. package/skills/generating-lwc-components/assets/graphql-component/graphqlComponent.js +336 -0
  212. package/skills/generating-lwc-components/assets/jest-test/componentName.test.js.example +371 -0
  213. package/skills/generating-lwc-components/assets/message-channel/RecordSelected.messageChannel-meta.xml +71 -0
  214. package/skills/generating-lwc-components/assets/message-channel/lmsPublisher.js +103 -0
  215. package/skills/generating-lwc-components/assets/message-channel/lmsSubscriber.js +181 -0
  216. package/skills/generating-lwc-components/assets/modal-component/modalComponent.html +85 -0
  217. package/skills/generating-lwc-components/assets/modal-component/modalComponent.js +199 -0
  218. package/skills/generating-lwc-components/assets/record-picker/recordPicker.html +55 -0
  219. package/skills/generating-lwc-components/assets/record-picker/recordPicker.js +199 -0
  220. package/skills/generating-lwc-components/assets/state-store/store.js +282 -0
  221. package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.css +65 -0
  222. package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.html +95 -0
  223. package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.js-meta.xml +75 -0
  224. package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.test.ts.example +301 -0
  225. package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.ts +295 -0
  226. package/skills/generating-lwc-components/assets/workspace-api/workspaceComponent.html +71 -0
  227. package/skills/generating-lwc-components/assets/workspace-api/workspaceComponent.js +316 -0
  228. package/skills/generating-lwc-components/hooks/scripts/lwc-lsp-validate.py +295 -0
  229. package/skills/generating-lwc-components/hooks/scripts/post-tool-validate.py +347 -0
  230. package/skills/generating-lwc-components/hooks/scripts/slds_data/deprecated_patterns.json +74 -0
  231. package/skills/generating-lwc-components/hooks/scripts/slds_data/styling_hooks.json +111 -0
  232. package/skills/generating-lwc-components/hooks/scripts/slds_data/valid_slds_classes.json +127 -0
  233. package/skills/generating-lwc-components/hooks/scripts/slds_linter_wrapper.py +294 -0
  234. package/skills/generating-lwc-components/hooks/scripts/slds_rules/__init__.py +22 -0
  235. package/skills/generating-lwc-components/hooks/scripts/template_validator.py +332 -0
  236. package/skills/generating-lwc-components/hooks/scripts/validate_slds.py +595 -0
  237. package/skills/generating-lwc-components/references/accessibility-guide.md +843 -0
  238. package/skills/generating-lwc-components/references/advanced-features.md +108 -0
  239. package/skills/generating-lwc-components/references/async-notification-patterns.md +661 -0
  240. package/skills/generating-lwc-components/references/cli-commands.md +545 -0
  241. package/skills/generating-lwc-components/references/component-patterns.md +1476 -0
  242. package/skills/generating-lwc-components/references/flow-integration-guide.md +675 -0
  243. package/skills/generating-lwc-components/references/jest-testing.md +1011 -0
  244. package/skills/generating-lwc-components/references/lms-guide.md +860 -0
  245. package/skills/generating-lwc-components/references/lwc-best-practices.md +1310 -0
  246. package/skills/generating-lwc-components/references/performance-guide.md +861 -0
  247. package/skills/generating-lwc-components/references/scoring-and-testing.md +116 -0
  248. package/skills/generating-lwc-components/references/slds-blueprints.json +14389 -0
  249. package/skills/generating-lwc-components/references/slds-design-guide.md +166 -0
  250. package/skills/generating-lwc-components/references/state-management.md +642 -0
  251. package/skills/generating-lwc-components/references/template-anti-patterns.md +948 -0
  252. package/skills/generating-lwc-components/references/triangle-pattern.md +365 -0
  253. package/skills/generating-lwc-components/scripts/local-dev-preview.sh +34 -0
  254. package/skills/generating-mermaid-diagrams/CREDITS.md +46 -0
  255. package/skills/generating-mermaid-diagrams/README.md +114 -0
  256. package/skills/generating-mermaid-diagrams/SKILL.md +218 -0
  257. package/skills/generating-mermaid-diagrams/assets/agentforce/agent-flow.md +313 -0
  258. package/skills/generating-mermaid-diagrams/assets/architecture/system-landscape.md +351 -0
  259. package/skills/generating-mermaid-diagrams/assets/datamodel/b2b-commerce-erd.md +317 -0
  260. package/skills/generating-mermaid-diagrams/assets/datamodel/campaigns-erd.md +195 -0
  261. package/skills/generating-mermaid-diagrams/assets/datamodel/consent-erd.md +262 -0
  262. package/skills/generating-mermaid-diagrams/assets/datamodel/files-erd.md +266 -0
  263. package/skills/generating-mermaid-diagrams/assets/datamodel/forecasting-erd.md +261 -0
  264. package/skills/generating-mermaid-diagrams/assets/datamodel/fsl-erd.md +332 -0
  265. package/skills/generating-mermaid-diagrams/assets/datamodel/party-model-erd.md +237 -0
  266. package/skills/generating-mermaid-diagrams/assets/datamodel/quote-order-erd.md +277 -0
  267. package/skills/generating-mermaid-diagrams/assets/datamodel/revenue-cloud-erd.md +343 -0
  268. package/skills/generating-mermaid-diagrams/assets/datamodel/sales-cloud-erd.md +192 -0
  269. package/skills/generating-mermaid-diagrams/assets/datamodel/salesforce-erd.md +209 -0
  270. package/skills/generating-mermaid-diagrams/assets/datamodel/scheduler-erd.md +276 -0
  271. package/skills/generating-mermaid-diagrams/assets/datamodel/service-cloud-erd.md +217 -0
  272. package/skills/generating-mermaid-diagrams/assets/datamodel/territory-management-erd.md +241 -0
  273. package/skills/generating-mermaid-diagrams/assets/integration/api-sequence.md +387 -0
  274. package/skills/generating-mermaid-diagrams/assets/oauth/authorization-code-pkce.md +197 -0
  275. package/skills/generating-mermaid-diagrams/assets/oauth/authorization-code.md +152 -0
  276. package/skills/generating-mermaid-diagrams/assets/oauth/client-credentials.md +233 -0
  277. package/skills/generating-mermaid-diagrams/assets/oauth/device-authorization.md +295 -0
  278. package/skills/generating-mermaid-diagrams/assets/oauth/jwt-bearer.md +256 -0
  279. package/skills/generating-mermaid-diagrams/assets/oauth/refresh-token.md +281 -0
  280. package/skills/generating-mermaid-diagrams/assets/oauth/user-agent-social-sign-on.md +281 -0
  281. package/skills/generating-mermaid-diagrams/assets/role-hierarchy/user-hierarchy.md +322 -0
  282. package/skills/generating-mermaid-diagrams/references/color-palette.md +464 -0
  283. package/skills/generating-mermaid-diagrams/references/diagram-conventions.md +313 -0
  284. package/skills/generating-mermaid-diagrams/references/erd-conventions.md +320 -0
  285. package/skills/generating-mermaid-diagrams/references/mermaid-reference.md +434 -0
  286. package/skills/generating-mermaid-diagrams/references/mermaid-styling.md +81 -0
  287. package/skills/generating-mermaid-diagrams/references/preview-guide.md +49 -0
  288. package/skills/generating-mermaid-diagrams/references/usage-examples.md +340 -0
  289. package/skills/generating-mermaid-diagrams/scripts/README.md +160 -0
  290. package/skills/generating-mermaid-diagrams/scripts/mermaid_preview.py +654 -0
  291. package/skills/generating-mermaid-diagrams/scripts/query-org-metadata.py +293 -0
  292. package/skills/generating-ui-bundle-features/SKILL.md +2 -0
  293. package/skills/generating-ui-bundle-metadata/SKILL.md +2 -0
  294. package/skills/generating-ui-bundle-site/SKILL.md +2 -0
  295. package/skills/generating-validation-rule/SKILL.md +2 -0
  296. package/skills/generating-visual-diagrams/CREDITS.md +80 -0
  297. package/skills/generating-visual-diagrams/README.md +83 -0
  298. package/skills/generating-visual-diagrams/SKILL.md +208 -0
  299. package/skills/generating-visual-diagrams/assets/architecture/integration-flow.md +55 -0
  300. package/skills/generating-visual-diagrams/assets/erd/core-objects.md +131 -0
  301. package/skills/generating-visual-diagrams/assets/erd/custom-objects.md +60 -0
  302. package/skills/generating-visual-diagrams/assets/lwc/dashboard-card.md +45 -0
  303. package/skills/generating-visual-diagrams/assets/lwc/data-table.md +57 -0
  304. package/skills/generating-visual-diagrams/assets/lwc/record-form.md +60 -0
  305. package/skills/generating-visual-diagrams/assets/review/apex-review.md +57 -0
  306. package/skills/generating-visual-diagrams/assets/review/lwc-review.md +48 -0
  307. package/skills/generating-visual-diagrams/references/architect-aesthetic-guide.md +257 -0
  308. package/skills/generating-visual-diagrams/references/examples-index.md +35 -0
  309. package/skills/generating-visual-diagrams/references/gemini-cli-setup.md +65 -0
  310. package/skills/generating-visual-diagrams/references/interview-questions.md +529 -0
  311. package/skills/generating-visual-diagrams/references/iteration-workflow.md +173 -0
  312. package/skills/generating-visual-diagrams/scripts/check-prerequisites.sh +101 -0
  313. package/skills/generating-visual-diagrams/scripts/generate_image.py +243 -0
  314. package/skills/handling-sf-data/CREDITS.md +5 -0
  315. package/skills/handling-sf-data/README.md +112 -0
  316. package/skills/handling-sf-data/SKILL.md +235 -0
  317. package/skills/handling-sf-data/assets/bulk/bulk-insert-10000.apex +293 -0
  318. package/skills/handling-sf-data/assets/bulk/bulk-insert-200.apex +208 -0
  319. package/skills/handling-sf-data/assets/bulk/bulk-insert-500.apex +219 -0
  320. package/skills/handling-sf-data/assets/bulk/bulk-upsert-external-id.apex +324 -0
  321. package/skills/handling-sf-data/assets/cleanup/delete-by-created-date.apex +319 -0
  322. package/skills/handling-sf-data/assets/cleanup/delete-by-name.apex +240 -0
  323. package/skills/handling-sf-data/assets/cleanup/delete-test-data.apex +311 -0
  324. package/skills/handling-sf-data/assets/cleanup/rollback-transaction.apex +266 -0
  325. package/skills/handling-sf-data/assets/csv/account-import.csv +11 -0
  326. package/skills/handling-sf-data/assets/csv/contact-import.csv +11 -0
  327. package/skills/handling-sf-data/assets/csv/custom-object-import.csv +11 -0
  328. package/skills/handling-sf-data/assets/csv/opportunity-import.csv +11 -0
  329. package/skills/handling-sf-data/assets/factories/account-factory.apex +165 -0
  330. package/skills/handling-sf-data/assets/factories/case-factory.apex +237 -0
  331. package/skills/handling-sf-data/assets/factories/contact-factory.apex +168 -0
  332. package/skills/handling-sf-data/assets/factories/custom-object-factory.apex +260 -0
  333. package/skills/handling-sf-data/assets/factories/event-factory.apex +275 -0
  334. package/skills/handling-sf-data/assets/factories/hierarchy-factory.apex +372 -0
  335. package/skills/handling-sf-data/assets/factories/lead-factory.apex +190 -0
  336. package/skills/handling-sf-data/assets/factories/opportunity-factory.apex +206 -0
  337. package/skills/handling-sf-data/assets/factories/task-factory.apex +246 -0
  338. package/skills/handling-sf-data/assets/factories/user-factory.apex +278 -0
  339. package/skills/handling-sf-data/assets/json/account-contact-tree.json +130 -0
  340. package/skills/handling-sf-data/assets/json/account-opportunity-tree.json +110 -0
  341. package/skills/handling-sf-data/assets/json/full-hierarchy-tree.json +188 -0
  342. package/skills/handling-sf-data/assets/soql/aggregate.soql +226 -0
  343. package/skills/handling-sf-data/assets/soql/child-to-parent.soql +162 -0
  344. package/skills/handling-sf-data/assets/soql/parent-to-child.soql +153 -0
  345. package/skills/handling-sf-data/assets/soql/polymorphic.soql +198 -0
  346. package/skills/handling-sf-data/assets/soql/subquery.soql +287 -0
  347. package/skills/handling-sf-data/references/anonymous-apex-guide.md +98 -0
  348. package/skills/handling-sf-data/references/bulk-operations-guide.md +94 -0
  349. package/skills/handling-sf-data/references/bulk-testing-example.md +194 -0
  350. package/skills/handling-sf-data/references/cleanup-rollback-example.md +322 -0
  351. package/skills/handling-sf-data/references/cleanup-rollback-guide.md +84 -0
  352. package/skills/handling-sf-data/references/crud-workflow-example.md +183 -0
  353. package/skills/handling-sf-data/references/governor-limits-reference.md +74 -0
  354. package/skills/handling-sf-data/references/orchestration.md +174 -0
  355. package/skills/handling-sf-data/references/relationship-query-examples.md +249 -0
  356. package/skills/handling-sf-data/references/sf-cli-data-commands.md +158 -0
  357. package/skills/handling-sf-data/references/soql-relationship-guide.md +84 -0
  358. package/skills/handling-sf-data/references/test-data-best-practices.md +104 -0
  359. package/skills/handling-sf-data/references/test-data-factory-usage.md +290 -0
  360. package/skills/handling-sf-data/references/test-data-patterns.md +98 -0
  361. package/skills/handling-sf-data/scripts/soql_validator.py +292 -0
  362. package/skills/handling-sf-data/scripts/validate_data_operation.py +379 -0
  363. package/skills/harmonizing-datacloud/CREDITS.md +3 -0
  364. package/skills/harmonizing-datacloud/README.md +31 -0
  365. package/skills/harmonizing-datacloud/SKILL.md +117 -0
  366. package/skills/implementing-ui-bundle-agentforce-conversation-client/SKILL.md +1 -1
  367. package/skills/implementing-ui-bundle-file-upload/SKILL.md +2 -0
  368. package/skills/modeling-omnistudio-epc-catalog/CREDITS.md +14 -0
  369. package/skills/modeling-omnistudio-epc-catalog/README.md +89 -0
  370. package/skills/modeling-omnistudio-epc-catalog/SKILL.md +395 -0
  371. package/skills/modeling-omnistudio-epc-catalog/assets/attribute-assignment-template.json +402 -0
  372. package/skills/modeling-omnistudio-epc-catalog/assets/compiled-attribute-overrides-template.json +43 -0
  373. package/skills/modeling-omnistudio-epc-catalog/assets/completion-block-template.txt +8 -0
  374. package/skills/modeling-omnistudio-epc-catalog/assets/decomposition-relationships-template.json +233 -0
  375. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_AttributeAssignments.json +514 -0
  376. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_CompiledAttributeOverrides.json +21 -0
  377. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_DataPack.json +649 -0
  378. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_DecompositionRelationships.json +200 -0
  379. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_ObjectFieldAttributes.json +138 -0
  380. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_OrchestrationScenarios.json +54 -0
  381. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_OverrideDefinitions.json +266 -0
  382. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_ParentKeys.json +23 -0
  383. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_PriceListEntries.json +54 -0
  384. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_PricebookEntries.json +35 -0
  385. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_ProductChildItems.json +34 -0
  386. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_RuleAssignments.json +21 -0
  387. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_AttributeAssignments.json +410 -0
  388. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_DataPack.json +535 -0
  389. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_DecompositionRelationships.json +35 -0
  390. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_ObjectFieldAttributes.json +138 -0
  391. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_OrchestrationScenarios.json +28 -0
  392. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_ParentKeys.json +23 -0
  393. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_PriceListEntries.json +220 -0
  394. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_PricebookEntries.json +35 -0
  395. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_ProductChildItems.json +414 -0
  396. package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_AttributeAssignments.json +382 -0
  397. package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_DataPack.json +565 -0
  398. package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_DecompositionRelationships.json +35 -0
  399. package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_ObjectFieldAttributes.json +104 -0
  400. package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_OrchestrationScenarios.json +28 -0
  401. package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_ParentKeys.json +13 -0
  402. package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_PriceListEntries.json +106 -0
  403. package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_PricebookEntries.json +35 -0
  404. package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_ProductChildItems.json +72 -0
  405. package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_AttributeAssignments.json +142 -0
  406. package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_DataPack.json +377 -0
  407. package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_DecompositionRelationships.json +35 -0
  408. package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_ObjectFieldAttributes.json +36 -0
  409. package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_ParentKeys.json +8 -0
  410. package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_PriceListEntries.json +54 -0
  411. package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_PricebookEntries.json +35 -0
  412. package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_ProductChildItems.json +34 -0
  413. package/skills/modeling-omnistudio-epc-catalog/assets/object-field-attributes-template.json +138 -0
  414. package/skills/modeling-omnistudio-epc-catalog/assets/orchestration-scenarios-template.json +54 -0
  415. package/skills/modeling-omnistudio-epc-catalog/assets/override-definitions-template.json +134 -0
  416. package/skills/modeling-omnistudio-epc-catalog/assets/parent-keys-template.json +29 -0
  417. package/skills/modeling-omnistudio-epc-catalog/assets/price-list-entries-template.json +158 -0
  418. package/skills/modeling-omnistudio-epc-catalog/assets/pricebook-entries-template.json +35 -0
  419. package/skills/modeling-omnistudio-epc-catalog/assets/product-child-item-template.json +338 -0
  420. package/skills/modeling-omnistudio-epc-catalog/assets/product2-offer-template.json +527 -0
  421. package/skills/modeling-omnistudio-epc-catalog/examples/.gitkeep +1 -0
  422. package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_AttributeAssignments.json +95 -0
  423. package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_CompiledAttributeOverrides.json +1 -0
  424. package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_DataPack.json +214 -0
  425. package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_DecompositionRelationships.json +28 -0
  426. package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_ObjectFieldAttributes.json +98 -0
  427. package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_OrchestrationScenarios.json +22 -0
  428. package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_OverrideDefinitions.json +1 -0
  429. package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_ParentKeys.json +13 -0
  430. package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_PriceListEntries.json +35 -0
  431. package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_PricebookEntries.json +28 -0
  432. package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_ProductChildItems.json +110 -0
  433. package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/TRANSCRIPT.md +58 -0
  434. package/skills/modeling-omnistudio-epc-catalog/references/epc-field-guide.md +90 -0
  435. package/skills/modeling-omnistudio-epc-catalog/references/naming-conventions.md +80 -0
  436. package/skills/modeling-omnistudio-epc-catalog/references/scoring-model.md +57 -0
  437. package/skills/modeling-omnistudio-epc-catalog/scripts/cli-validation-commands.sh +19 -0
  438. package/skills/modeling-omnistudio-epc-catalog/scripts/sample-invocations.sh +18 -0
  439. package/skills/observing-agentforce/SKILL.md +1 -1
  440. package/skills/orchestrating-datacloud/CREDITS.md +15 -0
  441. package/skills/orchestrating-datacloud/README.md +129 -0
  442. package/skills/orchestrating-datacloud/SKILL.md +236 -0
  443. package/skills/orchestrating-datacloud/UPSTREAM.md +45 -0
  444. package/skills/orchestrating-datacloud/assets/definitions/activation-target.template.json +5 -0
  445. package/skills/orchestrating-datacloud/assets/definitions/activation.template.json +7 -0
  446. package/skills/orchestrating-datacloud/assets/definitions/calculated-insight.template.json +7 -0
  447. package/skills/orchestrating-datacloud/assets/definitions/data-action-target.template.json +5 -0
  448. package/skills/orchestrating-datacloud/assets/definitions/data-action.template.json +5 -0
  449. package/skills/orchestrating-datacloud/assets/definitions/data-graph.template.json +21 -0
  450. package/skills/orchestrating-datacloud/assets/definitions/data-stream.template.json +55 -0
  451. package/skills/orchestrating-datacloud/assets/definitions/dmo.template.json +17 -0
  452. package/skills/orchestrating-datacloud/assets/definitions/identity-resolution.template.json +30 -0
  453. package/skills/orchestrating-datacloud/assets/definitions/mapping.template.json +14 -0
  454. package/skills/orchestrating-datacloud/assets/definitions/relationship.template.json +12 -0
  455. package/skills/orchestrating-datacloud/assets/definitions/search-index.template.json +9 -0
  456. package/skills/orchestrating-datacloud/assets/definitions/segment.template.json +16 -0
  457. package/skills/orchestrating-datacloud/references/feature-readiness.md +157 -0
  458. package/skills/orchestrating-datacloud/references/plugin-setup.md +140 -0
  459. package/skills/orchestrating-datacloud/scripts/bootstrap-plugin.sh +53 -0
  460. package/skills/orchestrating-datacloud/scripts/diagnose-org.mjs +511 -0
  461. package/skills/orchestrating-datacloud/scripts/generate-manifest.mjs +68 -0
  462. package/skills/orchestrating-datacloud/scripts/verify-plugin.sh +58 -0
  463. package/skills/preparing-datacloud/CREDITS.md +7 -0
  464. package/skills/preparing-datacloud/README.md +51 -0
  465. package/skills/preparing-datacloud/SKILL.md +191 -0
  466. package/skills/preparing-datacloud/examples/ingestion-api/.env.example +8 -0
  467. package/skills/preparing-datacloud/examples/ingestion-api/README.md +48 -0
  468. package/skills/preparing-datacloud/examples/ingestion-api/send-data.py +144 -0
  469. package/skills/querying-soql/CREDITS.md +21 -0
  470. package/skills/querying-soql/README.md +41 -0
  471. package/skills/querying-soql/SKILL.md +143 -0
  472. package/skills/querying-soql/assets/aggregate-queries.soql +242 -0
  473. package/skills/querying-soql/assets/basic-queries.soql +188 -0
  474. package/skills/querying-soql/assets/bulkified-query-pattern.cls +280 -0
  475. package/skills/querying-soql/assets/optimization-patterns.soql +259 -0
  476. package/skills/querying-soql/assets/relationship-queries.soql +203 -0
  477. package/skills/querying-soql/assets/selector-class.cls +219 -0
  478. package/skills/querying-soql/references/anti-patterns.md +348 -0
  479. package/skills/querying-soql/references/cli-commands.md +358 -0
  480. package/skills/querying-soql/references/field-coverage-rules.md +514 -0
  481. package/skills/querying-soql/references/query-optimization.md +142 -0
  482. package/skills/querying-soql/references/selector-patterns.md +479 -0
  483. package/skills/querying-soql/references/soql-reference.md +227 -0
  484. package/skills/querying-soql/references/soql-syntax-reference.md +208 -0
  485. package/skills/querying-soql/scripts/post-tool-validate.py +322 -0
  486. package/skills/retrieving-datacloud/CREDITS.md +7 -0
  487. package/skills/retrieving-datacloud/README.md +44 -0
  488. package/skills/retrieving-datacloud/SKILL.md +120 -0
  489. package/skills/retrieving-datacloud/examples/search-indexes/hybrid-structured.json +44 -0
  490. package/skills/retrieving-datacloud/examples/search-indexes/vector-knowledge.json +43 -0
  491. package/skills/running-apex-tests/CREDITS.md +22 -0
  492. package/skills/running-apex-tests/README.md +94 -0
  493. package/skills/running-apex-tests/SKILL.md +158 -0
  494. package/skills/running-apex-tests/assets/basic-test.cls +169 -0
  495. package/skills/running-apex-tests/assets/bulk-test.cls +255 -0
  496. package/skills/running-apex-tests/assets/dml-mock.cls +339 -0
  497. package/skills/running-apex-tests/assets/mock-callout-test.cls +353 -0
  498. package/skills/running-apex-tests/assets/stub-provider-example.cls +364 -0
  499. package/skills/running-apex-tests/assets/test-data-factory.cls +328 -0
  500. package/skills/running-apex-tests/hooks/scripts/parse-test-results.py +364 -0
  501. package/skills/running-apex-tests/references/cli-commands.md +289 -0
  502. package/skills/running-apex-tests/references/mocking-patterns.md +500 -0
  503. package/skills/running-apex-tests/references/performance-optimization.md +283 -0
  504. package/skills/running-apex-tests/references/test-fix-loop.md +49 -0
  505. package/skills/running-apex-tests/references/test-patterns.md +154 -0
  506. package/skills/running-apex-tests/references/testing-best-practices.md +509 -0
  507. package/skills/segmenting-datacloud/CREDITS.md +3 -0
  508. package/skills/segmenting-datacloud/README.md +36 -0
  509. package/skills/segmenting-datacloud/SKILL.md +115 -0
  510. package/skills/switching-org/SKILL.md +1 -1
  511. package/skills/testing-agentforce/SKILL.md +1 -1
  512. package/skills/uplifting-components-to-slds2/SKILL.md +3 -1
  513. package/skills/using-ui-bundle-salesforce-data/SKILL.md +2 -0
@@ -0,0 +1,1011 @@
1
+ <!-- Parent: generating-lwc-components/SKILL.md -->
2
+ # Advanced Jest Testing for LWC
3
+
4
+ Comprehensive guide to testing Lightning Web Components using Jest, based on [James Simone's advanced testing patterns](https://www.jamessimone.net/blog/joys-of-apex/advanced-lwc-jest-testing/).
5
+
6
+ ---
7
+
8
+ ## Table of Contents
9
+
10
+ 1. [Setup](#setup)
11
+ 2. [Core Testing Patterns](#core-testing-patterns)
12
+ 3. [Render Cycle Management](#render-cycle-management)
13
+ 4. [Mocking Strategies](#mocking-strategies)
14
+ 5. [Testing Wire Services](#testing-wire-services)
15
+ 6. [Testing Events](#testing-events)
16
+ 7. [Testing Navigation](#testing-navigation)
17
+ 8. [Testing LMS](#testing-lms)
18
+ 9. [Testing GraphQL](#testing-graphql)
19
+ 10. [Polyfills and Utilities](#polyfills-and-utilities)
20
+ 11. [Best Practices](#best-practices)
21
+
22
+ ---
23
+
24
+ ## Setup
25
+
26
+ ### Install Dependencies
27
+
28
+ ```bash
29
+ # Install Jest and LWC testing tools
30
+ npm install --save-dev @salesforce/sfdx-lwc-jest jest
31
+
32
+ # Install additional utilities
33
+ npm install --save-dev @testing-library/jest-dom
34
+ ```
35
+
36
+ ### Jest Configuration
37
+
38
+ **File**: `jest.config.js`
39
+
40
+ ```javascript
41
+ const { jestConfig } = require('@salesforce/sfdx-lwc-jest/config');
42
+
43
+ module.exports = {
44
+ ...jestConfig,
45
+ roots: ['<rootDir>/force-app'],
46
+ moduleNameMapper: {
47
+ '^@salesforce/apex$': '<rootDir>/force-app/test/jest-mocks/apex',
48
+ '^@salesforce/schema$': '<rootDir>/force-app/test/jest-mocks/schema',
49
+ '^lightning/navigation$': '<rootDir>/force-app/test/jest-mocks/lightning/navigation',
50
+ '^lightning/messageService$': '<rootDir>/force-app/test/jest-mocks/lightning/messageService'
51
+ },
52
+ setupFilesAfterEnv: ['<rootDir>/jest.setup.js'],
53
+ testPathIgnorePatterns: [
54
+ '<rootDir>/node_modules/',
55
+ '<rootDir>/.sfdx/',
56
+ '<rootDir>/.agents/',
57
+ '<rootDir>/.cursor/',
58
+ '<rootDir>/.claude/',
59
+ '<rootDir>/.pi/'
60
+ ],
61
+ coverageThreshold: {
62
+ global: {
63
+ branches: 80,
64
+ functions: 80,
65
+ lines: 80,
66
+ statements: 80
67
+ }
68
+ }
69
+ };
70
+ ```
71
+
72
+ `roots: ['<rootDir>/force-app']` keeps Jest focused on real Salesforce source. The ignore list adds defense-in-depth for agent/tool folders that may contain copied examples or generated artifacts.
73
+
74
+ Example test assets in `generating-lwc-components/assets/` ship with a `.example` suffix. Copy them into `force-app/main/default/lwc/<component>/__tests__/` and rename them to `*.test.js` or `*.test.ts` before running Jest.
75
+
76
+ ### Setup File
77
+
78
+ **File**: `jest.setup.js`
79
+
80
+ ```javascript
81
+ // ResizeObserver polyfill
82
+ if (!window.ResizeObserver) {
83
+ window.ResizeObserver = class ResizeObserver {
84
+ constructor(callback) {
85
+ this.callback = callback;
86
+ }
87
+ observe() {}
88
+ unobserve() {}
89
+ disconnect() {}
90
+ };
91
+ }
92
+
93
+ // IntersectionObserver polyfill
94
+ if (!window.IntersectionObserver) {
95
+ window.IntersectionObserver = class IntersectionObserver {
96
+ constructor(callback) {
97
+ this.callback = callback;
98
+ }
99
+ observe() {}
100
+ unobserve() {}
101
+ disconnect() {}
102
+ };
103
+ }
104
+
105
+ // Custom matchers
106
+ expect.extend({
107
+ toHaveClass(element, className) {
108
+ const pass = element.classList.contains(className);
109
+ return {
110
+ pass,
111
+ message: () => pass
112
+ ? `Expected element NOT to have class "${className}"`
113
+ : `Expected element to have class "${className}"`
114
+ };
115
+ }
116
+ });
117
+ ```
118
+
119
+ ---
120
+
121
+ ## Core Testing Patterns
122
+
123
+ ### Basic Test Structure
124
+
125
+ ```javascript
126
+ import { createElement } from 'lwc';
127
+ import MyComponent from 'c/myComponent';
128
+
129
+ describe('c-my-component', () => {
130
+ afterEach(() => {
131
+ // Clean up DOM
132
+ while (document.body.firstChild) {
133
+ document.body.removeChild(document.body.firstChild);
134
+ }
135
+ // Clear all mocks
136
+ jest.clearAllMocks();
137
+ });
138
+
139
+ it('renders correctly', () => {
140
+ const element = createElement('c-my-component', {
141
+ is: MyComponent
142
+ });
143
+ document.body.appendChild(element);
144
+
145
+ expect(element.shadowRoot.querySelector('h1')).not.toBeNull();
146
+ });
147
+ });
148
+ ```
149
+
150
+ ### DOM Cleanup Pattern
151
+
152
+ ```javascript
153
+ describe('c-my-component', () => {
154
+ let element;
155
+
156
+ beforeEach(() => {
157
+ element = createElement('c-my-component', { is: MyComponent });
158
+ document.body.appendChild(element);
159
+ });
160
+
161
+ afterEach(() => {
162
+ // CRITICAL: Prevent state bleed between tests
163
+ while (document.body.firstChild) {
164
+ document.body.removeChild(document.body.firstChild);
165
+ }
166
+ jest.clearAllMocks();
167
+ });
168
+
169
+ it('test case 1', () => {
170
+ // Element is fresh for each test
171
+ });
172
+
173
+ it('test case 2', () => {
174
+ // Element is fresh for each test
175
+ });
176
+ });
177
+ ```
178
+
179
+ ---
180
+
181
+ ## Render Cycle Management
182
+
183
+ ### Render Cycle Helper
184
+
185
+ Based on [James Simone's pattern](https://www.jamessimone.net/blog/joys-of-apex/advanced-lwc-jest-testing/).
186
+
187
+ ```javascript
188
+ // testUtils.js
189
+ export const runRenderingLifecycle = async (reasons = ['render']) => {
190
+ while (reasons.length > 0) {
191
+ await Promise.resolve(reasons.pop());
192
+ }
193
+ };
194
+
195
+ // Alias for brevity
196
+ export const flushPromises = () => runRenderingLifecycle();
197
+ ```
198
+
199
+ ### Usage in Tests
200
+
201
+ ```javascript
202
+ import { runRenderingLifecycle, flushPromises } from './testUtils';
203
+
204
+ it('updates after property change', async () => {
205
+ const element = createElement('c-example', { is: Example });
206
+ document.body.appendChild(element);
207
+
208
+ // Change property
209
+ element.greeting = 'new value';
210
+
211
+ // Wait for render cycle
212
+ await runRenderingLifecycle(['property change', 'render']);
213
+
214
+ // Assert
215
+ const div = element.shadowRoot.querySelector('div');
216
+ expect(div.textContent).toBe('new value');
217
+ });
218
+
219
+ it('handles async operation', async () => {
220
+ const element = createElement('c-example', { is: Example });
221
+ document.body.appendChild(element);
222
+
223
+ // Trigger async action
224
+ const button = element.shadowRoot.querySelector('button');
225
+ button.click();
226
+
227
+ // Flush all promises
228
+ await flushPromises();
229
+
230
+ // Assert
231
+ expect(element.shadowRoot.querySelector('.result')).not.toBeNull();
232
+ });
233
+ ```
234
+
235
+ ---
236
+
237
+ ## Mocking Strategies
238
+
239
+ ### Mock Apex Imports
240
+
241
+ ```javascript
242
+ // __mocks__/apex.js
243
+ export default function createApexTestWireAdapter() {
244
+ return jest.fn();
245
+ }
246
+
247
+ // Component test
248
+ import getAccounts from '@salesforce/apex/AccountController.getAccounts';
249
+
250
+ jest.mock(
251
+ '@salesforce/apex/AccountController.getAccounts',
252
+ () => ({ default: jest.fn() }),
253
+ { virtual: true }
254
+ );
255
+
256
+ describe('c-account-list', () => {
257
+ it('displays accounts', async () => {
258
+ const MOCK_DATA = [
259
+ { Id: '001xxx', Name: 'Acme' }
260
+ ];
261
+
262
+ getAccounts.mockResolvedValue(MOCK_DATA);
263
+
264
+ const element = createElement('c-account-list', {
265
+ is: AccountList
266
+ });
267
+ document.body.appendChild(element);
268
+
269
+ await flushPromises();
270
+
271
+ const items = element.shadowRoot.querySelectorAll('.account-item');
272
+ expect(items.length).toBe(1);
273
+ });
274
+ });
275
+ ```
276
+
277
+ ### Mock Schema Imports
278
+
279
+ ```javascript
280
+ // __mocks__/schema.js
281
+ export default {
282
+ 'Account.Name': 'Name',
283
+ 'Account.Industry': 'Industry',
284
+ 'Contact.FirstName': 'FirstName'
285
+ };
286
+
287
+ // Component test
288
+ jest.mock('@salesforce/schema/Account.Name', () => 'Name', { virtual: true });
289
+ jest.mock('@salesforce/schema/Account.Industry', () => 'Industry', { virtual: true });
290
+ ```
291
+
292
+ ### Mock Platform Events
293
+
294
+ ```javascript
295
+ // Mock ShowToastEvent
296
+ import { ShowToastEvent } from 'lightning/platformShowToastEvent';
297
+
298
+ jest.mock('lightning/platformShowToastEvent', () => ({
299
+ ShowToastEvent: jest.fn()
300
+ }), { virtual: true });
301
+
302
+ it('shows toast on success', () => {
303
+ const element = createElement('c-example', { is: Example });
304
+ document.body.appendChild(element);
305
+
306
+ const handler = jest.fn();
307
+ element.addEventListener('showtoast', handler);
308
+
309
+ // Trigger action
310
+ const button = element.shadowRoot.querySelector('button');
311
+ button.click();
312
+
313
+ // Assert toast was dispatched
314
+ expect(handler).toHaveBeenCalled();
315
+ expect(handler.mock.calls[0][0].detail.title).toBe('Success');
316
+ });
317
+ ```
318
+
319
+ ---
320
+
321
+ ## Testing Wire Services
322
+
323
+ ### Test Wire Adapter
324
+
325
+ ```javascript
326
+ import { createElement } from 'lwc';
327
+ import AccountCard from 'c/accountCard';
328
+ import { getRecord } from 'lightning/uiRecordApi';
329
+
330
+ // Emit data from wire
331
+ const mockGetRecord = require('lightning/uiRecordApi');
332
+
333
+ describe('c-account-card', () => {
334
+ afterEach(() => {
335
+ while (document.body.firstChild) {
336
+ document.body.removeChild(document.body.firstChild);
337
+ }
338
+ jest.clearAllMocks();
339
+ });
340
+
341
+ it('displays account data', async () => {
342
+ const element = createElement('c-account-card', {
343
+ is: AccountCard
344
+ });
345
+ element.recordId = '001xxx000003DGQ';
346
+ document.body.appendChild(element);
347
+
348
+ // Emit mock data to wire
349
+ mockGetRecord.emit({
350
+ Id: '001xxx000003DGQ',
351
+ fields: {
352
+ Name: { value: 'Acme Corp' },
353
+ Industry: { value: 'Technology' }
354
+ }
355
+ });
356
+
357
+ await flushPromises();
358
+
359
+ const name = element.shadowRoot.querySelector('.account-name');
360
+ expect(name.textContent).toBe('Acme Corp');
361
+ });
362
+
363
+ it('displays error', async () => {
364
+ const element = createElement('c-account-card', {
365
+ is: AccountCard
366
+ });
367
+ element.recordId = '001xxx000003DGQ';
368
+ document.body.appendChild(element);
369
+
370
+ // Emit error to wire
371
+ mockGetRecord.error();
372
+
373
+ await flushPromises();
374
+
375
+ const error = element.shadowRoot.querySelector('.error-message');
376
+ expect(error).not.toBeNull();
377
+ });
378
+ });
379
+ ```
380
+
381
+ ### Test Imperative Apex
382
+
383
+ ```javascript
384
+ import getAccounts from '@salesforce/apex/AccountController.getAccounts';
385
+
386
+ jest.mock(
387
+ '@salesforce/apex/AccountController.getAccounts',
388
+ () => ({ default: jest.fn() }),
389
+ { virtual: true }
390
+ );
391
+
392
+ it('loads accounts imperatively', async () => {
393
+ const MOCK_ACCOUNTS = [
394
+ { Id: '001xxx', Name: 'Acme' }
395
+ ];
396
+
397
+ getAccounts.mockResolvedValue(MOCK_ACCOUNTS);
398
+
399
+ const element = createElement('c-account-search', {
400
+ is: AccountSearch
401
+ });
402
+ document.body.appendChild(element);
403
+
404
+ // Trigger search
405
+ const input = element.shadowRoot.querySelector('input');
406
+ input.value = 'Acme';
407
+ input.dispatchEvent(new Event('change'));
408
+
409
+ await flushPromises();
410
+
411
+ expect(getAccounts).toHaveBeenCalledWith({ searchTerm: 'Acme' });
412
+
413
+ const results = element.shadowRoot.querySelectorAll('.account-item');
414
+ expect(results.length).toBe(1);
415
+ });
416
+
417
+ it('handles apex error', async () => {
418
+ getAccounts.mockRejectedValue(new Error('Network error'));
419
+
420
+ const element = createElement('c-account-search', {
421
+ is: AccountSearch
422
+ });
423
+ document.body.appendChild(element);
424
+
425
+ const input = element.shadowRoot.querySelector('input');
426
+ input.value = 'Test';
427
+ input.dispatchEvent(new Event('change'));
428
+
429
+ await flushPromises();
430
+
431
+ const errorMsg = element.shadowRoot.querySelector('.error');
432
+ expect(errorMsg.textContent).toContain('Network error');
433
+ });
434
+ ```
435
+
436
+ ---
437
+
438
+ ## Testing Events
439
+
440
+ ### Test Custom Events
441
+
442
+ ```javascript
443
+ it('dispatches custom event', () => {
444
+ const element = createElement('c-event-emitter', {
445
+ is: EventEmitter
446
+ });
447
+ document.body.appendChild(element);
448
+
449
+ const handler = jest.fn();
450
+ element.addEventListener('itemselected', handler);
451
+
452
+ // Trigger event
453
+ const button = element.shadowRoot.querySelector('button');
454
+ button.click();
455
+
456
+ // Assert
457
+ expect(handler).toHaveBeenCalled();
458
+ expect(handler.mock.calls[0][0].detail.id).toBe('001xxx');
459
+ });
460
+ ```
461
+
462
+ ### Test Event Bubbling
463
+
464
+ ```javascript
465
+ it('bubbles event to parent', () => {
466
+ const parent = createElement('c-parent', { is: Parent });
467
+ document.body.appendChild(parent);
468
+
469
+ const handler = jest.fn();
470
+ parent.addEventListener('itemselected', handler);
471
+
472
+ // Get child component
473
+ const child = parent.shadowRoot.querySelector('c-child');
474
+ const button = child.shadowRoot.querySelector('button');
475
+ button.click();
476
+
477
+ expect(handler).toHaveBeenCalled();
478
+ });
479
+ ```
480
+
481
+ ### Test Event Composition
482
+
483
+ ```javascript
484
+ it('composes event across shadow DOM', () => {
485
+ const element = createElement('c-composer', {
486
+ is: Composer
487
+ });
488
+ document.body.appendChild(element);
489
+
490
+ const handler = jest.fn();
491
+ document.addEventListener('customevent', handler);
492
+
493
+ // Trigger composed event
494
+ const button = element.shadowRoot.querySelector('button');
495
+ button.click();
496
+
497
+ expect(handler).toHaveBeenCalled();
498
+ });
499
+ ```
500
+
501
+ ---
502
+
503
+ ## Testing Navigation
504
+
505
+ ### Mock Navigation Mixin
506
+
507
+ ```javascript
508
+ // __mocks__/lightning/navigation.js
509
+ export const NavigationMixin = (Base) => {
510
+ return class extends Base {
511
+ [NavigationMixin.Navigate](pageReference, replace) {
512
+ this._navigate = { pageReference, replace };
513
+ }
514
+ };
515
+ };
516
+
517
+ NavigationMixin.Navigate = Symbol('Navigate');
518
+
519
+ // Component test
520
+ import { NavigationMixin } from 'lightning/navigation';
521
+
522
+ it('navigates to record page', async () => {
523
+ const element = createElement('c-navigator', {
524
+ is: Navigator
525
+ });
526
+ document.body.appendChild(element);
527
+
528
+ const button = element.shadowRoot.querySelector('button');
529
+ button.click();
530
+
531
+ await flushPromises();
532
+
533
+ expect(element._navigate.pageReference.type).toBe('standard__recordPage');
534
+ expect(element._navigate.pageReference.attributes.recordId).toBe('001xxx');
535
+ });
536
+ ```
537
+
538
+ ---
539
+
540
+ ## Testing LMS
541
+
542
+ ### Mock Message Service
543
+
544
+ ```javascript
545
+ // __mocks__/lightning/messageService.js
546
+ export const publish = jest.fn();
547
+ export const subscribe = jest.fn();
548
+ export const unsubscribe = jest.fn();
549
+ export const MessageContext = Symbol('MessageContext');
550
+ export const APPLICATION_SCOPE = Symbol('APPLICATION_SCOPE');
551
+ ```
552
+
553
+ ### Test Publisher
554
+
555
+ ```javascript
556
+ import { publish, MessageContext } from 'lightning/messageService';
557
+ import ACCOUNT_CHANNEL from '@salesforce/messageChannel/AccountSelected__c';
558
+
559
+ jest.mock('lightning/messageService');
560
+
561
+ it('publishes message on selection', () => {
562
+ const element = createElement('c-publisher', {
563
+ is: Publisher
564
+ });
565
+ document.body.appendChild(element);
566
+
567
+ const button = element.shadowRoot.querySelector('button');
568
+ button.click();
569
+
570
+ expect(publish).toHaveBeenCalledWith(
571
+ expect.anything(),
572
+ ACCOUNT_CHANNEL,
573
+ expect.objectContaining({ accountId: '001xxx' })
574
+ );
575
+ });
576
+ ```
577
+
578
+ ### Test Subscriber
579
+
580
+ ```javascript
581
+ import { subscribe, unsubscribe } from 'lightning/messageService';
582
+
583
+ jest.mock('lightning/messageService');
584
+
585
+ it('subscribes on connected', () => {
586
+ const element = createElement('c-subscriber', {
587
+ is: Subscriber
588
+ });
589
+ document.body.appendChild(element);
590
+
591
+ expect(subscribe).toHaveBeenCalled();
592
+ });
593
+
594
+ it('unsubscribes on disconnected', () => {
595
+ const element = createElement('c-subscriber', {
596
+ is: Subscriber
597
+ });
598
+ document.body.appendChild(element);
599
+ document.body.removeChild(element);
600
+
601
+ expect(unsubscribe).toHaveBeenCalled();
602
+ });
603
+
604
+ it('handles incoming message', async () => {
605
+ let messageHandler;
606
+ subscribe.mockImplementation((context, channel, handler) => {
607
+ messageHandler = handler;
608
+ return { subscription: 'mock' };
609
+ });
610
+
611
+ const element = createElement('c-subscriber', {
612
+ is: Subscriber
613
+ });
614
+ document.body.appendChild(element);
615
+
616
+ // Simulate message
617
+ messageHandler({ accountId: '001xxx', accountName: 'Acme' });
618
+
619
+ await flushPromises();
620
+
621
+ const name = element.shadowRoot.querySelector('.account-name');
622
+ expect(name.textContent).toBe('Acme');
623
+ });
624
+ ```
625
+
626
+ ---
627
+
628
+ ## Testing GraphQL
629
+
630
+ ### Mock GraphQL Adapter
631
+
632
+ ```javascript
633
+ import { graphql } from 'lightning/graphql';
634
+
635
+ // Mock graphql wire adapter
636
+ jest.mock('lightning/graphql', () => ({
637
+ gql: jest.fn(query => query),
638
+ graphql: jest.fn()
639
+ }), { virtual: true });
640
+
641
+ it('displays graphql query results', async () => {
642
+ const element = createElement('c-graphql-component', {
643
+ is: GraphqlComponent
644
+ });
645
+ document.body.appendChild(element);
646
+
647
+ // Emit mock data
648
+ const mockData = {
649
+ uiapi: {
650
+ query: {
651
+ Contact: {
652
+ edges: [
653
+ { node: { Id: '003xxx', Name: { value: 'John Doe' } } }
654
+ ]
655
+ }
656
+ }
657
+ }
658
+ };
659
+
660
+ graphql.emit({ data: mockData });
661
+
662
+ await flushPromises();
663
+
664
+ const contacts = element.shadowRoot.querySelectorAll('.contact-item');
665
+ expect(contacts.length).toBe(1);
666
+ });
667
+ ```
668
+
669
+ ---
670
+
671
+ ## Polyfills and Utilities
672
+
673
+ ### ResizeObserver Polyfill
674
+
675
+ ```javascript
676
+ if (!window.ResizeObserver) {
677
+ window.ResizeObserver = class ResizeObserver {
678
+ constructor(callback) {
679
+ this.callback = callback;
680
+ }
681
+ observe() {}
682
+ unobserve() {}
683
+ disconnect() {}
684
+ };
685
+ }
686
+ ```
687
+
688
+ ### Proxy Unboxing (LWS Compatibility)
689
+
690
+ ```javascript
691
+ // Lightning Web Security proxifies objects
692
+ // Unbox them for deep equality assertions
693
+
694
+ it('compares complex objects', () => {
695
+ const element = createElement('c-example', { is: Example });
696
+ document.body.appendChild(element);
697
+
698
+ // Unbox proxied data
699
+ const unboxedData = JSON.parse(JSON.stringify(element.data));
700
+
701
+ expect(unboxedData).toEqual({
702
+ accounts: [
703
+ { Id: '001xxx', Name: 'Acme' }
704
+ ]
705
+ });
706
+ });
707
+ ```
708
+
709
+ ### Test Utilities Module
710
+
711
+ ```javascript
712
+ // testUtils.js
713
+ export const runRenderingLifecycle = async (reasons = ['render']) => {
714
+ while (reasons.length > 0) {
715
+ await Promise.resolve(reasons.pop());
716
+ }
717
+ };
718
+
719
+ export const flushPromises = () => runRenderingLifecycle();
720
+
721
+ export const queryAll = (element, selector) => {
722
+ return Array.from(element.shadowRoot.querySelectorAll(selector));
723
+ };
724
+
725
+ export const query = (element, selector) => {
726
+ return element.shadowRoot.querySelector(selector);
727
+ };
728
+
729
+ export const waitFor = async (condition, timeout = 3000) => {
730
+ const start = Date.now();
731
+ while (!condition()) {
732
+ if (Date.now() - start > timeout) {
733
+ throw new Error('waitFor timeout');
734
+ }
735
+ await flushPromises();
736
+ }
737
+ };
738
+
739
+ // Usage
740
+ import { query, queryAll, waitFor } from './testUtils';
741
+
742
+ it('uses test utils', async () => {
743
+ const element = createElement('c-example', { is: Example });
744
+ document.body.appendChild(element);
745
+
746
+ const button = query(element, 'button');
747
+ button.click();
748
+
749
+ await waitFor(() => query(element, '.result') !== null);
750
+
751
+ const items = queryAll(element, '.item');
752
+ expect(items.length).toBeGreaterThan(0);
753
+ });
754
+ ```
755
+
756
+ ---
757
+
758
+ ## Best Practices
759
+
760
+ ### 1. Always Clean Up DOM
761
+
762
+ ```javascript
763
+ afterEach(() => {
764
+ while (document.body.firstChild) {
765
+ document.body.removeChild(document.body.firstChild);
766
+ }
767
+ jest.clearAllMocks();
768
+ });
769
+ ```
770
+
771
+ ### 2. Use Descriptive Test Names
772
+
773
+ ```javascript
774
+ // BAD
775
+ it('works', () => { /* ... */ });
776
+
777
+ // GOOD
778
+ it('displays error message when apex call fails', () => { /* ... */ });
779
+ ```
780
+
781
+ ### 3. Test User Interactions
782
+
783
+ ```javascript
784
+ it('filters list when search input changes', async () => {
785
+ const element = createElement('c-searchable-list', {
786
+ is: SearchableList
787
+ });
788
+ document.body.appendChild(element);
789
+
790
+ const input = element.shadowRoot.querySelector('input');
791
+ input.value = 'test';
792
+ input.dispatchEvent(new Event('input'));
793
+
794
+ await flushPromises();
795
+
796
+ const items = element.shadowRoot.querySelectorAll('.list-item');
797
+ expect(items.length).toBeLessThan(10); // Filtered results
798
+ });
799
+ ```
800
+
801
+ ### 4. Test Error States
802
+
803
+ ```javascript
804
+ it('displays error when wire service fails', async () => {
805
+ mockGetRecord.error({ message: 'Network error' });
806
+
807
+ const element = createElement('c-example', { is: Example });
808
+ document.body.appendChild(element);
809
+
810
+ await flushPromises();
811
+
812
+ const error = element.shadowRoot.querySelector('.error-message');
813
+ expect(error.textContent).toContain('Network error');
814
+ });
815
+ ```
816
+
817
+ ### 5. Test Loading States
818
+
819
+ ```javascript
820
+ it('shows spinner during data load', async () => {
821
+ const element = createElement('c-async-component', {
822
+ is: AsyncComponent
823
+ });
824
+ document.body.appendChild(element);
825
+
826
+ // Before data loads
827
+ let spinner = element.shadowRoot.querySelector('lightning-spinner');
828
+ expect(spinner).not.toBeNull();
829
+
830
+ // Emit data
831
+ mockGetData.emit([{ Id: '001xxx' }]);
832
+ await flushPromises();
833
+
834
+ // After data loads
835
+ spinner = element.shadowRoot.querySelector('lightning-spinner');
836
+ expect(spinner).toBeNull();
837
+ });
838
+ ```
839
+
840
+ ### 6. Test Accessibility
841
+
842
+ ```javascript
843
+ it('has proper ARIA labels', () => {
844
+ const element = createElement('c-accessible', {
845
+ is: Accessible
846
+ });
847
+ document.body.appendChild(element);
848
+
849
+ const button = element.shadowRoot.querySelector('button');
850
+ expect(button.getAttribute('aria-label')).toBe('Delete record');
851
+ });
852
+
853
+ it('manages focus correctly', async () => {
854
+ const element = createElement('c-modal', { is: Modal });
855
+ document.body.appendChild(element);
856
+
857
+ element.openModal();
858
+ await flushPromises();
859
+
860
+ const firstFocusable = element.shadowRoot.querySelector('.focusable');
861
+ expect(document.activeElement).toBe(firstFocusable);
862
+ });
863
+ ```
864
+
865
+ ### 7. Organize Tests by Feature
866
+
867
+ ```javascript
868
+ describe('c-account-list', () => {
869
+ describe('data loading', () => {
870
+ it('displays accounts when data loads successfully');
871
+ it('shows error when data load fails');
872
+ it('shows spinner during loading');
873
+ });
874
+
875
+ describe('filtering', () => {
876
+ it('filters by search term');
877
+ it('filters by industry');
878
+ it('clears filters');
879
+ });
880
+
881
+ describe('selection', () => {
882
+ it('selects account on click');
883
+ it('dispatches selection event');
884
+ it('highlights selected account');
885
+ });
886
+ });
887
+ ```
888
+
889
+ ---
890
+
891
+ ## Complete Test Example
892
+
893
+ ```javascript
894
+ import { createElement } from 'lwc';
895
+ import AccountList from 'c/accountList';
896
+ import getAccounts from '@salesforce/apex/AccountController.getAccounts';
897
+ import { publish } from 'lightning/messageService';
898
+ import ACCOUNT_SELECTED from '@salesforce/messageChannel/AccountSelected__c';
899
+
900
+ // Mocks
901
+ jest.mock('@salesforce/apex/AccountController.getAccounts', () => ({
902
+ default: jest.fn()
903
+ }), { virtual: true });
904
+
905
+ jest.mock('lightning/messageService');
906
+
907
+ const MOCK_ACCOUNTS = [
908
+ { Id: '001xxx001', Name: 'Acme Corp', Industry: 'Technology' },
909
+ { Id: '001xxx002', Name: 'Global Inc', Industry: 'Finance' }
910
+ ];
911
+
912
+ const flushPromises = () => new Promise(resolve => setImmediate(resolve));
913
+
914
+ describe('c-account-list', () => {
915
+ afterEach(() => {
916
+ while (document.body.firstChild) {
917
+ document.body.removeChild(document.body.firstChild);
918
+ }
919
+ jest.clearAllMocks();
920
+ });
921
+
922
+ describe('data loading', () => {
923
+ it('displays accounts when loaded successfully', async () => {
924
+ getAccounts.mockResolvedValue(MOCK_ACCOUNTS);
925
+
926
+ const element = createElement('c-account-list', {
927
+ is: AccountList
928
+ });
929
+ document.body.appendChild(element);
930
+
931
+ await flushPromises();
932
+
933
+ const items = element.shadowRoot.querySelectorAll('.account-item');
934
+ expect(items.length).toBe(2);
935
+ expect(items[0].textContent).toContain('Acme Corp');
936
+ });
937
+
938
+ it('displays error when fetch fails', async () => {
939
+ getAccounts.mockRejectedValue(new Error('Network error'));
940
+
941
+ const element = createElement('c-account-list', {
942
+ is: AccountList
943
+ });
944
+ document.body.appendChild(element);
945
+
946
+ await flushPromises();
947
+
948
+ const error = element.shadowRoot.querySelector('.error-message');
949
+ expect(error).not.toBeNull();
950
+ expect(error.textContent).toContain('Network error');
951
+ });
952
+ });
953
+
954
+ describe('selection', () => {
955
+ it('publishes message when account selected', async () => {
956
+ getAccounts.mockResolvedValue(MOCK_ACCOUNTS);
957
+
958
+ const element = createElement('c-account-list', {
959
+ is: AccountList
960
+ });
961
+ document.body.appendChild(element);
962
+
963
+ await flushPromises();
964
+
965
+ const firstAccount = element.shadowRoot.querySelector('.account-item');
966
+ firstAccount.click();
967
+
968
+ expect(publish).toHaveBeenCalledWith(
969
+ expect.anything(),
970
+ ACCOUNT_SELECTED,
971
+ expect.objectContaining({
972
+ accountId: '001xxx001',
973
+ accountName: 'Acme Corp'
974
+ })
975
+ );
976
+ });
977
+ });
978
+
979
+ describe('filtering', () => {
980
+ it('filters accounts by search term', async () => {
981
+ getAccounts.mockResolvedValue(MOCK_ACCOUNTS);
982
+
983
+ const element = createElement('c-account-list', {
984
+ is: AccountList
985
+ });
986
+ document.body.appendChild(element);
987
+
988
+ await flushPromises();
989
+
990
+ const searchInput = element.shadowRoot.querySelector('input');
991
+ searchInput.value = 'Acme';
992
+ searchInput.dispatchEvent(new Event('input'));
993
+
994
+ await flushPromises();
995
+
996
+ const visibleItems = element.shadowRoot.querySelectorAll('.account-item:not(.hidden)');
997
+ expect(visibleItems.length).toBe(1);
998
+ expect(visibleItems[0].textContent).toContain('Acme Corp');
999
+ });
1000
+ });
1001
+ });
1002
+ ```
1003
+
1004
+ ---
1005
+
1006
+ ## Related Resources
1007
+
1008
+ - [component-patterns.md](component-patterns.md) - Component implementation patterns
1009
+ - [lms-guide.md](lms-guide.md) - Lightning Message Service
1010
+ - [James Simone - Advanced LWC Jest Testing](https://www.jamessimone.net/blog/joys-of-apex/advanced-lwc-jest-testing/)
1011
+ - [LWC Recipes](https://github.com/trailheadapps/lwc-recipes) - See component-level `__tests__` folders for Jest examples