@salesforce/templates 66.11.1 → 66.13.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 (401) hide show
  1. package/lib/generators/projectGenerator.js +4 -1
  2. package/lib/generators/projectGenerator.js.map +1 -1
  3. package/lib/generators/uiEmbeddingGenerator.d.ts +6 -0
  4. package/lib/generators/{lightningEmbeddingGenerator.js → uiEmbeddingGenerator.js} +12 -12
  5. package/lib/generators/uiEmbeddingGenerator.js.map +1 -0
  6. package/lib/i18n/i18n.d.ts +6 -6
  7. package/lib/i18n/i18n.js +6 -6
  8. package/lib/i18n/i18n.js.map +1 -1
  9. package/lib/index.d.ts +1 -1
  10. package/lib/index.js +1 -1
  11. package/lib/index.js.map +1 -1
  12. package/lib/templates/project/angularextapp/.forceignore +15 -0
  13. package/lib/templates/project/angularextapp/.husky/pre-commit +4 -0
  14. package/lib/templates/project/angularextapp/.prettierignore +11 -0
  15. package/lib/templates/project/angularextapp/.prettierrc +17 -0
  16. package/lib/templates/project/angularextapp/CHANGELOG.md +4086 -0
  17. package/lib/templates/project/angularextapp/README.md +77 -0
  18. package/lib/templates/project/angularextapp/_p_/_m_/_d_/_s_/angularextapp1/angularextapp1.digitalExperience-meta.xml +11 -0
  19. package/lib/templates/project/angularextapp/_p_/_m_/_d_/_s_/angularextapp1/sfdc_cms__site/angularextapp1/_meta.json +5 -0
  20. package/lib/templates/project/angularextapp/_p_/_m_/_d_/_s_/angularextapp1/sfdc_cms__site/angularextapp1/content.json +10 -0
  21. package/lib/templates/project/angularextapp/_p_/_m_/_dc_/angularextapp1.digitalExperienceConfig-meta.xml +8 -0
  22. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/.forceignore +15 -0
  23. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/.postcssrc.json +5 -0
  24. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/.prettierignore +8 -0
  25. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/.prettierrc +12 -0
  26. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/CHANGELOG.md +4 -0
  27. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/README.md +85 -0
  28. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/angular.json +101 -0
  29. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/angularextapp.uibundle-meta.xml +8 -0
  30. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/e2e/app.spec.ts +15 -0
  31. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/esbuild/api-version.mjs +17 -0
  32. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/eslint.config.js +60 -0
  33. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/middleware/html.mjs +3 -0
  34. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/middleware/proxy.mjs +12 -0
  35. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/package-lock.json +13600 -0
  36. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/package.json +56 -0
  37. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/playwright.config.ts +25 -0
  38. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/public/favicon.ico +0 -0
  39. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/scripts/rewrite-e2e-assets.mjs +30 -0
  40. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/api/account/account-search.service.ts +196 -0
  41. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/api/account/distinctAccountIndustries.ts +26 -0
  42. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/api/account/distinctAccountTypes.ts +26 -0
  43. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/api/account/getAccountDetail.ts +128 -0
  44. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/api/account/searchAccounts.ts +58 -0
  45. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/api/data-client.service.spec.ts +184 -0
  46. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/api/data-client.service.ts +74 -0
  47. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/api/user-profile.service.ts +126 -0
  48. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/app.config.ts +22 -0
  49. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/app.html +1 -0
  50. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/app.routes.ts +77 -0
  51. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/app.spec.ts +18 -0
  52. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/app.ts +15 -0
  53. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/layout/app-layout/app-layout.html +53 -0
  54. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/layout/app-layout/app-layout.spec.ts +89 -0
  55. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/layout/app-layout/app-layout.ts +81 -0
  56. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/_field-size.scss +42 -0
  57. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/alert/alert.html +31 -0
  58. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/alert/alert.ts +53 -0
  59. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/button/button.html +18 -0
  60. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/button/button.scss +112 -0
  61. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/button/button.ts +57 -0
  62. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/card/card.scss +34 -0
  63. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/card/card.ts +110 -0
  64. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/collapsible/collapsible.html +10 -0
  65. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/collapsible/collapsible.ts +26 -0
  66. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-picker/date-picker.html +25 -0
  67. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-picker/date-picker.scss +36 -0
  68. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-picker/date-picker.ts +41 -0
  69. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-range-picker/date-range-picker.html +34 -0
  70. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-range-picker/date-range-picker.scss +33 -0
  71. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-range-picker/date-range-picker.ts +66 -0
  72. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/dialog/dialog.html +37 -0
  73. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/dialog/dialog.ts +55 -0
  74. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/field/field.html +21 -0
  75. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/field/field.ts +36 -0
  76. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/field-size.ts +8 -0
  77. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/input/input.html +19 -0
  78. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/input/input.scss +35 -0
  79. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/input/input.ts +36 -0
  80. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/label/label.html +3 -0
  81. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/label/label.ts +17 -0
  82. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/paginator/paginator.html +10 -0
  83. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/paginator/paginator.ts +37 -0
  84. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/popover/popover.html +41 -0
  85. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/popover/popover.ts +40 -0
  86. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/select/select.html +24 -0
  87. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/select/select.scss +35 -0
  88. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/select/select.ts +72 -0
  89. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/separator/separator.html +1 -0
  90. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/separator/separator.scss +23 -0
  91. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/separator/separator.ts +56 -0
  92. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/skeleton/skeleton.html +1 -0
  93. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/skeleton/skeleton.scss +28 -0
  94. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/skeleton/skeleton.ts +24 -0
  95. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/spinner/spinner.ts +35 -0
  96. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/auth/auth.guard.ts +50 -0
  97. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/auth/auth.service.ts +126 -0
  98. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/auth-form/auth-form.html +34 -0
  99. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/auth-form/auth-form.ts +94 -0
  100. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/auth-layout/auth-layout.html +2 -0
  101. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/auth-layout/auth-layout.ts +30 -0
  102. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/card-layout/card-layout.html +16 -0
  103. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/card-layout/card-layout.ts +40 -0
  104. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/config/authentication.config.ts +75 -0
  105. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/footer-link/footer-link.html +9 -0
  106. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/footer-link/footer-link.ts +26 -0
  107. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/menu/auth-menu/auth-menu.html +26 -0
  108. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/menu/auth-menu/auth-menu.ts +46 -0
  109. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/reactive-form-page.base.ts +50 -0
  110. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/session/session.html +55 -0
  111. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/session/session.ts +205 -0
  112. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/status-alert/status-alert.html +5 -0
  113. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/status-alert/status-alert.ts +52 -0
  114. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/submit-button/submit-button.html +5 -0
  115. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/submit-button/submit-button.scss +17 -0
  116. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/submit-button/submit-button.ts +35 -0
  117. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/utils/auth-helpers.ts +68 -0
  118. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/utils/auth-validators.ts +72 -0
  119. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/utils/helpers.ts +85 -0
  120. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/utils/session-time-servlet.ts +130 -0
  121. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/utils/session-timeout.config.ts +83 -0
  122. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/utils/session-timeout.service.ts +201 -0
  123. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/breadcrumb/breadcrumb.html +54 -0
  124. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/breadcrumb/breadcrumb.ts +40 -0
  125. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/active-filters.html +23 -0
  126. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/active-filters.ts +78 -0
  127. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/date-filter.html +18 -0
  128. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/date-filter.ts +137 -0
  129. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/date-range-filter.html +11 -0
  130. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/date-range-filter.ts +69 -0
  131. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/filter-field-wrapper.html +11 -0
  132. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/filter-field-wrapper.ts +36 -0
  133. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/multi-select-filter.html +10 -0
  134. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/multi-select-filter.ts +58 -0
  135. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/numeric-range-filter.html +22 -0
  136. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/numeric-range-filter.ts +146 -0
  137. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/search-filter.html +8 -0
  138. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/search-filter.ts +82 -0
  139. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/select-filter.html +12 -0
  140. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/select-filter.ts +65 -0
  141. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/text-filter.html +12 -0
  142. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/text-filter.ts +90 -0
  143. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/object-search-state.service.ts +232 -0
  144. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/pagination/pagination.html +8 -0
  145. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/pagination/pagination.ts +61 -0
  146. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/search-bar/search-bar.html +59 -0
  147. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/search-bar/search-bar.ts +108 -0
  148. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/sort-control/sort-control.html +50 -0
  149. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/sort-control/sort-control.ts +72 -0
  150. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/debounce.ts +31 -0
  151. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/field-utils.ts +54 -0
  152. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/filter-utils.ts +354 -0
  153. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/index.ts +12 -0
  154. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/sort-utils.ts +46 -0
  155. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/account-detail/account-detail-page.html +164 -0
  156. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/account-detail/account-detail-page.scss +7 -0
  157. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/account-detail/account-detail-page.ts +196 -0
  158. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/account-search/account-search-page.html +111 -0
  159. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/account-search/account-search-page.ts +217 -0
  160. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/change-password/change-password-page.html +68 -0
  161. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/change-password/change-password-page.ts +82 -0
  162. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/forgot-password/forgot-password-page.html +35 -0
  163. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/forgot-password/forgot-password-page.ts +87 -0
  164. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/home/home-page.html +18 -0
  165. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/home/home-page.ts +47 -0
  166. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/home/home.html +6 -0
  167. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/home/home.spec.ts +23 -0
  168. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/home/home.ts +13 -0
  169. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/login/login-page.html +47 -0
  170. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/login/login-page.ts +89 -0
  171. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/not-found/not-found.html +12 -0
  172. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/not-found/not-found.spec.ts +33 -0
  173. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/not-found/not-found.ts +15 -0
  174. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/profile/profile-page.html +116 -0
  175. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/profile/profile-page.ts +194 -0
  176. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/register/register-page.html +80 -0
  177. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/register/register-page.ts +93 -0
  178. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/reset-password/reset-password-page.html +60 -0
  179. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/reset-password/reset-password-page.ts +96 -0
  180. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/utils/async-data.ts +99 -0
  181. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/index.html +14 -0
  182. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/main.ts +5 -0
  183. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/styles.scss +170 -0
  184. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/theme.scss +39 -0
  185. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/types/sf-globals.d.ts +9 -0
  186. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/tsconfig.app.json +11 -0
  187. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/tsconfig.json +33 -0
  188. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/tsconfig.spec.json +10 -0
  189. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/ui-bundle.json +7 -0
  190. package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleAuthUtils.cls +68 -0
  191. package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleAuthUtils.cls-meta.xml +5 -0
  192. package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleChangePassword.cls +77 -0
  193. package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleChangePassword.cls-meta.xml +5 -0
  194. package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleForgotPassword.cls +71 -0
  195. package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleForgotPassword.cls-meta.xml +5 -0
  196. package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleLogin.cls +105 -0
  197. package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleLogin.cls-meta.xml +5 -0
  198. package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleRegistration.cls +162 -0
  199. package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleRegistration.cls-meta.xml +5 -0
  200. package/lib/templates/project/angularextapp/_p_/_m_/networks/angularextapp.network-meta.xml +60 -0
  201. package/lib/templates/project/angularextapp/_p_/_m_/package.xml +24 -0
  202. package/lib/templates/project/angularextapp/_p_/_m_/permissionsets/angularextapp_Guest_User_Api_Access.permissionset-meta.xml +9 -0
  203. package/lib/templates/project/angularextapp/_p_/_m_/sites/angularextapp.site-meta.xml +31 -0
  204. package/lib/templates/project/angularextapp/config/project-scratch-def.json +13 -0
  205. package/lib/templates/project/angularextapp/eslint.config.js +7 -0
  206. package/lib/templates/project/angularextapp/jest.config.js +6 -0
  207. package/lib/templates/project/angularextapp/package.json +46 -0
  208. package/lib/templates/project/angularextapp/scripts/apex/hello.apex +10 -0
  209. package/lib/templates/project/angularextapp/scripts/gitignore-templates.json +4 -0
  210. package/lib/templates/project/angularextapp/scripts/graphql-search.sh +191 -0
  211. package/lib/templates/project/angularextapp/scripts/org-setup-config-schema.mjs +103 -0
  212. package/lib/templates/project/angularextapp/scripts/org-setup-dev.mjs +87 -0
  213. package/lib/templates/project/angularextapp/scripts/org-setup-utils.mjs +369 -0
  214. package/lib/templates/project/angularextapp/scripts/org-setup-xml.mjs +182 -0
  215. package/lib/templates/project/angularextapp/scripts/org-setup.config.json +9 -0
  216. package/lib/templates/project/angularextapp/scripts/org-setup.mjs +1702 -0
  217. package/lib/templates/project/angularextapp/scripts/sf-project-setup.mjs +103 -0
  218. package/lib/templates/project/angularextapp/scripts/soql/account.soql +6 -0
  219. package/lib/templates/project/angularextapp/scripts/validate-org-setup-config.mjs +38 -0
  220. package/lib/templates/project/angularextapp/sfdx-project.json +12 -0
  221. package/lib/templates/project/angularintapp/.forceignore +15 -0
  222. package/lib/templates/project/angularintapp/.husky/pre-commit +4 -0
  223. package/lib/templates/project/angularintapp/.prettierignore +11 -0
  224. package/lib/templates/project/angularintapp/.prettierrc +17 -0
  225. package/lib/templates/project/angularintapp/CHANGELOG.md +4086 -0
  226. package/lib/templates/project/angularintapp/README.md +77 -0
  227. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/.forceignore +15 -0
  228. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/.postcssrc.json +5 -0
  229. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/.prettierignore +8 -0
  230. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/.prettierrc +12 -0
  231. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/CHANGELOG.md +4 -0
  232. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/README.md +85 -0
  233. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/angular.json +101 -0
  234. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/angularintapp.uibundle-meta.xml +8 -0
  235. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/e2e/app.spec.ts +15 -0
  236. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/esbuild/api-version.mjs +17 -0
  237. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/eslint.config.js +60 -0
  238. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/middleware/html.mjs +3 -0
  239. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/middleware/proxy.mjs +12 -0
  240. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/package-lock.json +13619 -0
  241. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/package.json +57 -0
  242. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/playwright.config.ts +25 -0
  243. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/public/favicon.ico +0 -0
  244. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/scripts/rewrite-e2e-assets.mjs +30 -0
  245. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/api/account/account-search.service.ts +196 -0
  246. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/api/account/distinctAccountIndustries.ts +26 -0
  247. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/api/account/distinctAccountTypes.ts +26 -0
  248. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/api/account/getAccountDetail.ts +128 -0
  249. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/api/account/searchAccounts.ts +58 -0
  250. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/api/data-client.service.spec.ts +184 -0
  251. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/api/data-client.service.ts +74 -0
  252. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/app.config.ts +22 -0
  253. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/app.html +1 -0
  254. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/app.routes.ts +31 -0
  255. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/app.spec.ts +18 -0
  256. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/app.ts +15 -0
  257. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/layout/app-layout/app-layout.html +52 -0
  258. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/layout/app-layout/app-layout.spec.ts +90 -0
  259. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/layout/app-layout/app-layout.ts +67 -0
  260. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/_field-size.scss +42 -0
  261. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/alert/alert.html +31 -0
  262. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/alert/alert.ts +53 -0
  263. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/button/button.html +18 -0
  264. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/button/button.scss +112 -0
  265. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/button/button.ts +57 -0
  266. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/card/card.scss +34 -0
  267. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/card/card.ts +110 -0
  268. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/collapsible/collapsible.html +10 -0
  269. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/collapsible/collapsible.ts +26 -0
  270. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-picker/date-picker.html +25 -0
  271. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-picker/date-picker.scss +36 -0
  272. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-picker/date-picker.ts +41 -0
  273. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-range-picker/date-range-picker.html +34 -0
  274. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-range-picker/date-range-picker.scss +33 -0
  275. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-range-picker/date-range-picker.ts +66 -0
  276. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/dialog/dialog.html +37 -0
  277. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/dialog/dialog.ts +55 -0
  278. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/field/field.html +21 -0
  279. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/field/field.ts +36 -0
  280. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/field-size.ts +8 -0
  281. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/input/input.html +19 -0
  282. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/input/input.scss +35 -0
  283. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/input/input.ts +36 -0
  284. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/label/label.html +3 -0
  285. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/label/label.ts +17 -0
  286. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/paginator/paginator.html +10 -0
  287. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/paginator/paginator.ts +37 -0
  288. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/popover/popover.html +41 -0
  289. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/popover/popover.ts +40 -0
  290. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/select/select.html +24 -0
  291. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/select/select.scss +35 -0
  292. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/select/select.ts +72 -0
  293. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/separator/separator.html +1 -0
  294. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/separator/separator.scss +23 -0
  295. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/separator/separator.ts +56 -0
  296. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/skeleton/skeleton.html +1 -0
  297. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/skeleton/skeleton.scss +28 -0
  298. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/skeleton/skeleton.ts +24 -0
  299. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/spinner/spinner.ts +35 -0
  300. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/agentforce/agentforce-embed.service.ts +177 -0
  301. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/agentforce/conversation.html +3 -0
  302. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/agentforce/conversation.ts +119 -0
  303. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/breadcrumb/breadcrumb.html +54 -0
  304. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/breadcrumb/breadcrumb.ts +40 -0
  305. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/active-filters.html +23 -0
  306. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/active-filters.ts +78 -0
  307. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/date-filter.html +18 -0
  308. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/date-filter.ts +137 -0
  309. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/date-range-filter.html +11 -0
  310. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/date-range-filter.ts +69 -0
  311. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/filter-field-wrapper.html +11 -0
  312. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/filter-field-wrapper.ts +36 -0
  313. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/multi-select-filter.html +10 -0
  314. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/multi-select-filter.ts +58 -0
  315. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/numeric-range-filter.html +22 -0
  316. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/numeric-range-filter.ts +146 -0
  317. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/search-filter.html +8 -0
  318. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/search-filter.ts +82 -0
  319. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/select-filter.html +12 -0
  320. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/select-filter.ts +65 -0
  321. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/text-filter.html +12 -0
  322. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/text-filter.ts +90 -0
  323. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/object-search-state.service.ts +232 -0
  324. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/pagination/pagination.html +8 -0
  325. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/pagination/pagination.ts +61 -0
  326. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/search-bar/search-bar.html +59 -0
  327. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/search-bar/search-bar.ts +108 -0
  328. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/sort-control/sort-control.html +50 -0
  329. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/sort-control/sort-control.ts +72 -0
  330. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/debounce.ts +31 -0
  331. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/field-utils.ts +54 -0
  332. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/filter-utils.ts +354 -0
  333. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/index.ts +12 -0
  334. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/sort-utils.ts +46 -0
  335. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/account-detail/account-detail-page.html +164 -0
  336. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/account-detail/account-detail-page.scss +7 -0
  337. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/account-detail/account-detail-page.ts +196 -0
  338. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/account-search/account-search-page.html +111 -0
  339. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/account-search/account-search-page.ts +217 -0
  340. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/home/home-page.html +18 -0
  341. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/home/home-page.ts +47 -0
  342. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/home/home.html +6 -0
  343. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/home/home.spec.ts +23 -0
  344. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/home/home.ts +13 -0
  345. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/not-found/not-found.html +12 -0
  346. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/not-found/not-found.spec.ts +33 -0
  347. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/not-found/not-found.ts +15 -0
  348. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/types/conversation.ts +55 -0
  349. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/types/globals.d.ts +13 -0
  350. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/utils/async-data.ts +99 -0
  351. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/index.html +14 -0
  352. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/index.ts +15 -0
  353. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/main.ts +5 -0
  354. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/styles.scss +170 -0
  355. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/theme.scss +39 -0
  356. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/types/sf-globals.d.ts +9 -0
  357. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/tsconfig.app.json +11 -0
  358. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/tsconfig.json +33 -0
  359. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/tsconfig.spec.json +10 -0
  360. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/ui-bundle.json +7 -0
  361. package/lib/templates/project/angularintapp/_p_/_m_/applications/angularintapp.app-meta.xml +17 -0
  362. package/lib/templates/project/angularintapp/_p_/_m_/permissionsets/angularintapp_Access.permissionset-meta.xml +13 -0
  363. package/lib/templates/project/angularintapp/config/project-scratch-def.json +13 -0
  364. package/lib/templates/project/angularintapp/eslint.config.js +7 -0
  365. package/lib/templates/project/angularintapp/jest.config.js +6 -0
  366. package/lib/templates/project/angularintapp/package.json +46 -0
  367. package/lib/templates/project/angularintapp/scripts/apex/hello.apex +10 -0
  368. package/lib/templates/project/angularintapp/scripts/gitignore-templates.json +4 -0
  369. package/lib/templates/project/angularintapp/scripts/graphql-search.sh +191 -0
  370. package/lib/templates/project/angularintapp/scripts/org-setup-config-schema.mjs +103 -0
  371. package/lib/templates/project/angularintapp/scripts/org-setup-dev.mjs +87 -0
  372. package/lib/templates/project/angularintapp/scripts/org-setup-utils.mjs +369 -0
  373. package/lib/templates/project/angularintapp/scripts/org-setup-xml.mjs +182 -0
  374. package/lib/templates/project/angularintapp/scripts/org-setup.config.json +9 -0
  375. package/lib/templates/project/angularintapp/scripts/org-setup.mjs +1702 -0
  376. package/lib/templates/project/angularintapp/scripts/sf-project-setup.mjs +103 -0
  377. package/lib/templates/project/angularintapp/scripts/soql/account.soql +6 -0
  378. package/lib/templates/project/angularintapp/scripts/validate-org-setup-config.mjs +38 -0
  379. package/lib/templates/project/angularintapp/sfdx-project.json +12 -0
  380. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/package-lock.json +601 -572
  381. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/package-lock.json +601 -572
  382. package/lib/templates/uiBundles/angularbasic/package-lock.json +147 -168
  383. package/lib/templates/uiBundles/reactbasic/package-lock.json +601 -572
  384. package/lib/templates/{lightningembedding → uiembedding}/default/default.html +3 -3
  385. package/lib/templates/{lightningembedding → uiembedding}/default/default.js +1 -1
  386. package/lib/tsconfig.tsbuildinfo +1 -1
  387. package/lib/utils/types.d.ts +5 -5
  388. package/lib/utils/types.js +3 -3
  389. package/lib/utils/types.js.map +1 -1
  390. package/lib/utils/uiBundleTemplateUtils.js +10 -0
  391. package/lib/utils/uiBundleTemplateUtils.js.map +1 -1
  392. package/lib/utils/uiEmbedding.d.ts +12 -0
  393. package/lib/utils/{lightningEmbedding.js → uiEmbedding.js} +7 -7
  394. package/lib/utils/uiEmbedding.js.map +1 -0
  395. package/package.json +4 -2
  396. package/lib/generators/lightningEmbeddingGenerator.d.ts +0 -6
  397. package/lib/generators/lightningEmbeddingGenerator.js.map +0 -1
  398. package/lib/utils/lightningEmbedding.d.ts +0 -12
  399. package/lib/utils/lightningEmbedding.js.map +0 -1
  400. /package/lib/templates/{lightningembedding → uiembedding}/default/default.css +0 -0
  401. /package/lib/templates/{lightningembedding → uiembedding}/default/default.js-meta.xml +0 -0
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Copyright (c) 2026, Salesforce, Inc.,
3
+ * All rights reserved.
4
+ * For full license text, see the LICENSE.txt file
5
+ */
6
+ import {
7
+ ChangeDetectionStrategy,
8
+ Component,
9
+ computed,
10
+ DestroyRef,
11
+ inject,
12
+ input,
13
+ type OnInit,
14
+ signal,
15
+ } from "@angular/core";
16
+ import { takeUntilDestroyed, toObservable } from "@angular/core/rxjs-interop";
17
+ import { debounceTime } from "rxjs/operators";
18
+ import { ButtonComponent } from "../../../components/ui/button/button";
19
+ import { InputComponent } from "../../../components/ui/input/input";
20
+ import { PopoverComponent } from "../../../components/ui/popover/popover";
21
+ import { ObjectSearchStateService } from "../object-search-state.service";
22
+ import type { FilterFieldConfig } from "../utils/filter-utils";
23
+
24
+ /** How long to wait after the last keystroke before writing to state. */
25
+ const SEARCH_DEBOUNCE_MS = 300;
26
+
27
+ /**
28
+ * Search-bar header for an object-search page: a debounced text input bound to
29
+ * the `search` filter, plus an optional filter popover that content-projects
30
+ * the sibling filter components (owned by the filters wave).
31
+ *
32
+ * Mirrors the React `SearchBar`, with the composed additions from the ground-
33
+ * truth example page (filter panel toggle). Filter components are NOT imported
34
+ * here — the hosting page projects them via the `[filters]` slot so the
35
+ * feature can pick which filters it renders.
36
+ *
37
+ * ## Usage
38
+ * ```html
39
+ * <app-search-bar [searchConfig]="searchCfg" [filterConfigs]="filterCfgs">
40
+ * <div filters>
41
+ * <app-text-filter .../>
42
+ * <app-select-filter .../>
43
+ * </div>
44
+ * </app-search-bar>
45
+ * ```
46
+ */
47
+ @Component({
48
+ selector: "app-search-bar",
49
+ changeDetection: ChangeDetectionStrategy.OnPush,
50
+ imports: [ButtonComponent, InputComponent, PopoverComponent],
51
+ templateUrl: "./search-bar.html",
52
+ })
53
+ export class SearchBarComponent implements OnInit {
54
+ /** Config for the multi-field search filter (its label, placeholder, etc.). */
55
+ readonly searchConfig = input.required<FilterFieldConfig>();
56
+ /**
57
+ * Configs for the filters projected into the popover. Not consumed directly
58
+ * here — surfaced so the hosting page and this component agree on which
59
+ * filters exist, and reserved for a future filter-count badge.
60
+ */
61
+ readonly filterConfigs = input<FilterFieldConfig[]>([]);
62
+
63
+ private readonly state = inject(ObjectSearchStateService);
64
+ private readonly destroyRef = inject(DestroyRef);
65
+
66
+ /** Local, debounced mirror of the search filter's `value`. */
67
+ protected readonly term = signal<string>("");
68
+ protected readonly popoverOpen = signal<boolean>(false);
69
+
70
+ /** Count of currently active filters minus the search itself (for the badge). */
71
+ protected readonly nonSearchFilterCount = computed(
72
+ () => this.state.filters().filter((f) => f.type !== "search").length,
73
+ );
74
+
75
+ constructor() {
76
+ // Required inputs are not yet resolved in the constructor, so the search
77
+ // config is read lazily inside the subscription (which emits after init).
78
+ toObservable(this.term)
79
+ .pipe(debounceTime(SEARCH_DEBOUNCE_MS), takeUntilDestroyed(this.destroyRef))
80
+ .subscribe((value) => {
81
+ const cfg = this.searchConfig();
82
+ if (value) {
83
+ this.state.setFilter(cfg.field, {
84
+ field: cfg.field,
85
+ label: cfg.label,
86
+ type: cfg.type,
87
+ value,
88
+ });
89
+ } else {
90
+ this.state.removeFilter(cfg.field);
91
+ }
92
+ });
93
+ }
94
+
95
+ ngOnInit(): void {
96
+ // Seed the local term from any existing search filter (deep-link support).
97
+ // Done here (not the constructor) so the required `searchConfig` input is
98
+ // resolved before it is read.
99
+ const existing = this.state.filterFor(this.searchConfig().field);
100
+ if (existing?.value) {
101
+ this.term.set(existing.value);
102
+ }
103
+ }
104
+
105
+ protected togglePopover(): void {
106
+ this.popoverOpen.set(!this.popoverOpen());
107
+ }
108
+ }
@@ -0,0 +1,50 @@
1
+ <div class="flex items-center gap-2">
2
+ <span class="text-sm text-muted-foreground whitespace-nowrap">{{ label() }}</span>
3
+ <app-select
4
+ class="w-[160px]"
5
+ [options]="options()"
6
+ [value]="selectedValue()"
7
+ (valueChange)="onFieldChange($event)"
8
+ placeholder="Default"
9
+ />
10
+ @if (sort(); as active) {
11
+ <app-button
12
+ appearance="text"
13
+ size="icon-sm"
14
+ [attr.aria-label]="'Sort ' + (active.direction === 'ASC' ? 'descending' : 'ascending')"
15
+ (clicked)="toggleDirection()"
16
+ >
17
+ @if (active.direction === "ASC") {
18
+ <svg
19
+ xmlns="http://www.w3.org/2000/svg"
20
+ class="h-4 w-4"
21
+ viewBox="0 0 24 24"
22
+ fill="none"
23
+ stroke="currentColor"
24
+ stroke-width="2"
25
+ stroke-linecap="round"
26
+ stroke-linejoin="round"
27
+ aria-hidden="true"
28
+ >
29
+ <path d="m5 12 7-7 7 7" />
30
+ <path d="M12 19V5" />
31
+ </svg>
32
+ } @else {
33
+ <svg
34
+ xmlns="http://www.w3.org/2000/svg"
35
+ class="h-4 w-4"
36
+ viewBox="0 0 24 24"
37
+ fill="none"
38
+ stroke="currentColor"
39
+ stroke-width="2"
40
+ stroke-linecap="round"
41
+ stroke-linejoin="round"
42
+ aria-hidden="true"
43
+ >
44
+ <path d="M12 5v14" />
45
+ <path d="m19 12-7 7-7-7" />
46
+ </svg>
47
+ }
48
+ </app-button>
49
+ }
50
+ </div>
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Copyright (c) 2026, Salesforce, Inc.,
3
+ * All rights reserved.
4
+ * For full license text, see the LICENSE.txt file
5
+ */
6
+ import { ChangeDetectionStrategy, Component, computed, inject, input } from "@angular/core";
7
+ import { ButtonComponent } from "../../../components/ui/button/button";
8
+ import {
9
+ SelectComponent,
10
+ type AppSelectOption,
11
+ } from "../../../components/ui/select/select";
12
+ import { ObjectSearchStateService } from "../object-search-state.service";
13
+ import type { SortFieldConfig, SortState } from "../utils/sort-utils";
14
+
15
+ /** Sentinel value used in the select to represent "no sort". */
16
+ const NONE_VALUE = "__none__";
17
+
18
+ /**
19
+ * Sort field + direction toggle. Mirrors the React `SortControl`.
20
+ *
21
+ * Reads `sort()` from the {@link ObjectSearchStateService} and drives changes
22
+ * via `setSort`. Choosing a field applies ASC by default; the direction button
23
+ * flips ASC/DESC and only appears while a sort is active. Selecting `Default`
24
+ * clears the sort (`setSort(null)`).
25
+ */
26
+ @Component({
27
+ selector: "app-sort-control",
28
+ changeDetection: ChangeDetectionStrategy.OnPush,
29
+ imports: [ButtonComponent, SelectComponent],
30
+ templateUrl: "./sort-control.html",
31
+ })
32
+ export class SortControlComponent {
33
+ /** Sortable fields to expose in the select. */
34
+ readonly sortFields = input.required<SortFieldConfig[]>();
35
+ /** Override for the leading label (default `Sort by`). */
36
+ readonly label = input<string>("Sort by");
37
+
38
+ private readonly state = inject(ObjectSearchStateService);
39
+ /** Current sort state from the shared state service. */
40
+ protected readonly sort = this.state.sort;
41
+
42
+ /** Select options — the `Default` sentinel plus one per sortable field. */
43
+ protected readonly options = computed<AppSelectOption[]>(() => [
44
+ { value: NONE_VALUE, label: "Default" },
45
+ ...this.sortFields().map((c) => ({ value: c.field, label: c.label })),
46
+ ]);
47
+
48
+ /** Value shown in the select — either the current field or the sentinel. */
49
+ protected readonly selectedValue = computed(() => this.sort()?.field ?? NONE_VALUE);
50
+
51
+ protected onFieldChange(field: string): void {
52
+ if (field === NONE_VALUE) {
53
+ this.state.setSort(null);
54
+ return;
55
+ }
56
+ const current = this.sort();
57
+ const next: SortState = {
58
+ field,
59
+ direction: current?.direction ?? "ASC",
60
+ };
61
+ this.state.setSort(next);
62
+ }
63
+
64
+ protected toggleDirection(): void {
65
+ const current = this.sort();
66
+ if (!current) return;
67
+ this.state.setSort({
68
+ field: current.field,
69
+ direction: current.direction === "ASC" ? "DESC" : "ASC",
70
+ });
71
+ }
72
+ }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Copyright (c) 2026, Salesforce, Inc.,
3
+ * All rights reserved.
4
+ * For full license text, see the LICENSE.txt file
5
+ */
6
+
7
+ /** Default debounce delay for keystroke-driven filter inputs (search, text, numeric). */
8
+ export const FILTER_DEBOUNCE_MS = 300;
9
+
10
+ /**
11
+ * Creates a debounced version of the provided function.
12
+ *
13
+ * Each call to the returned function resets the internal timer. The wrapped
14
+ * function is only invoked once the timer expires without being reset. This
15
+ * makes it ideal for rate-limiting high-frequency events like input changes.
16
+ *
17
+ * @typeParam T - The function signature to debounce.
18
+ * @param fn - The function to debounce.
19
+ * @param ms - The debounce delay in milliseconds.
20
+ * @returns A new function with the same signature that delays execution.
21
+ */
22
+ export function debounce<T extends (...args: never[]) => void>(
23
+ fn: T,
24
+ ms: number,
25
+ ): (...args: Parameters<T>) => void {
26
+ let timer: ReturnType<typeof setTimeout> | undefined;
27
+ return (...args: Parameters<T>) => {
28
+ clearTimeout(timer);
29
+ timer = setTimeout(() => fn(...args), ms);
30
+ };
31
+ }
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Copyright (c) 2026, Salesforce, Inc.,
3
+ * All rights reserved.
4
+ * For full license text, see the LICENSE.txt file
5
+ */
6
+
7
+ /** A Salesforce GraphQL scalar field: `{ value, displayValue }`. */
8
+ export interface UiField {
9
+ displayValue?: string | null;
10
+ value?: unknown;
11
+ }
12
+
13
+ /**
14
+ * Extracts a human-readable string from a Salesforce GraphQL scalar field,
15
+ * preferring the server-formatted `displayValue` over the raw `value`.
16
+ *
17
+ * @returns The display string, or `null` when the field is empty.
18
+ */
19
+ export function fieldValue(field: UiField | null | undefined): string | null {
20
+ if (field?.displayValue != null) return field.displayValue;
21
+ if (field?.value != null) return String(field.value);
22
+ return null;
23
+ }
24
+
25
+ /**
26
+ * Formats a Salesforce address into display lines (street / city-state-zip /
27
+ * country), omitting empty parts. Returns `null` when nothing is present.
28
+ */
29
+ export function getAddressFieldLines(address: {
30
+ street?: string | null;
31
+ city?: string | null;
32
+ state?: string | null;
33
+ postalCode?: string | null;
34
+ country?: string | null;
35
+ }): string[] | null {
36
+ const cityStateZip = [address.city, address.state].filter(Boolean).join(", ");
37
+ const cityStateZipLine = [cityStateZip, address.postalCode].filter(Boolean).join(" ");
38
+ const lines = [address.street, cityStateZipLine, address.country].filter(Boolean) as string[];
39
+ if (lines.length === 0) return null;
40
+ return lines;
41
+ }
42
+
43
+ /**
44
+ * Formats an ISO datetime string via `Intl`/`toLocaleString`. Returns `null`
45
+ * for empty input so callers can fall back cleanly.
46
+ */
47
+ export function formatDateTimeField(
48
+ value: string | null | undefined,
49
+ locales?: Intl.LocalesArgument,
50
+ options?: Intl.DateTimeFormatOptions,
51
+ ): string | null {
52
+ if (!value) return null;
53
+ return new Date(value).toLocaleString(locales, options);
54
+ }
@@ -0,0 +1,354 @@
1
+ /**
2
+ * Copyright (c) 2026, Salesforce, Inc.,
3
+ * All rights reserved.
4
+ * For full license text, see the LICENSE.txt file
5
+ */
6
+
7
+ /**
8
+ * filter-utils.ts
9
+ *
10
+ * Centralizes filter-related transformations for the object-search feature:
11
+ *
12
+ * 1. **URL serialization** — filter/sort/pagination state <-> URLSearchParams so
13
+ * a search can be bookmarked, shared, and restored on reload. Unlike the
14
+ * React reference, the cursor (`after`) is serialized too, so a deep-linked
15
+ * or refreshed page renders the exact same result page rather than page 1's
16
+ * data under a later page number.
17
+ *
18
+ * 2. **GraphQL query building** — the same state -> the `where` clause shape the
19
+ * GraphQL API expects.
20
+ *
21
+ * Both operate on the shared {@link ActiveFilterValue} type.
22
+ */
23
+
24
+ import type { SortState } from "./sort-utils";
25
+
26
+ export type FilterFieldType =
27
+ | "text"
28
+ | "picklist"
29
+ | "numeric"
30
+ | "boolean"
31
+ | "date"
32
+ | "daterange"
33
+ | "datetime"
34
+ | "datetimerange"
35
+ | "multipicklist"
36
+ | "search";
37
+
38
+ export interface FilterFieldConfig<TFieldName extends string = string> {
39
+ field: TFieldName;
40
+ label: string;
41
+ type: FilterFieldType;
42
+ placeholder?: string;
43
+ /** Required for picklist type. */
44
+ options?: Array<{ value: string; label: string }>;
45
+ helpText?: string;
46
+ /** Required for search type — the fields to match against with `or`. */
47
+ searchFields?: string[];
48
+ /**
49
+ * For date / datetime / range types: cap the picker at today so future
50
+ * dates (which can never match a `CreatedDate` / `LastModifiedDate`) can't
51
+ * be selected.
52
+ */
53
+ disableFuture?: boolean;
54
+ }
55
+
56
+ export interface ActiveFilterValue<TFieldName extends string = string> {
57
+ field: TFieldName;
58
+ label: string;
59
+ type: FilterFieldType;
60
+ value?: string;
61
+ min?: string;
62
+ max?: string;
63
+ }
64
+
65
+ // ---------------------------------------------------------------------------
66
+ // URL Serialization
67
+ // ---------------------------------------------------------------------------
68
+
69
+ /** Namespaces filter params so they don't collide with pagination/flags. */
70
+ const FILTER_PREFIX = "f.";
71
+ /** URL param key for the multi-field search term. */
72
+ const SEARCH_KEY = "q";
73
+ /** URL param key for the currently sorted field name. */
74
+ const SORT_KEY = "sort";
75
+ /** URL param key for the sort direction (ASC or DESC). */
76
+ const DIR_KEY = "dir";
77
+ /** URL param key for the page size preference. */
78
+ const PAGE_SIZE_KEY = "ps";
79
+ /** URL param key for the 1-based page number. */
80
+ const PAGE_KEY = "page";
81
+ /** URL param key for the opaque cursor of the current page's first row. */
82
+ const CURSOR_KEY = "after";
83
+
84
+ /** Snapshot of filter/sort/pagination state used to build a URL query string. */
85
+ export interface SearchParamsState {
86
+ filters: ActiveFilterValue[];
87
+ sort: SortState | null;
88
+ pageSize?: number;
89
+ pageIndex?: number;
90
+ /** Opaque `after` cursor for the current page (undefined on page 1). */
91
+ afterCursor?: string;
92
+ }
93
+
94
+ /** The state recovered from a URL query string on load. */
95
+ export interface ParsedSearchParams {
96
+ filters: ActiveFilterValue[];
97
+ sort: SortState | null;
98
+ pageSize: number | undefined;
99
+ pageIndex: number;
100
+ afterCursor: string | undefined;
101
+ }
102
+
103
+ /**
104
+ * Serializes filter/sort/pagination state into a `Params` object suitable for
105
+ * Angular Router `queryParams`.
106
+ *
107
+ * Encoding:
108
+ * - simple values: `f.<field>=<value>`
109
+ * - range values: `f.<field>.min=<min>` / `f.<field>.max=<max>`
110
+ * - search term: `q=<value>`
111
+ * - sort: `sort=<field>&dir=ASC|DESC`
112
+ * - pagination: `ps=<size>&page=<1-based>&after=<cursor>`
113
+ */
114
+ export function filtersToQueryParams(state: SearchParamsState): Record<string, string> {
115
+ const { filters, sort, pageSize, pageIndex, afterCursor } = state;
116
+ const params: Record<string, string> = {};
117
+
118
+ for (const filter of filters) {
119
+ if (filter.type === "search") {
120
+ if (filter.value) params[SEARCH_KEY] = filter.value;
121
+ continue;
122
+ }
123
+ if (filter.value !== undefined && filter.value !== "") {
124
+ params[`${FILTER_PREFIX}${filter.field}`] = filter.value;
125
+ }
126
+ if (filter.min !== undefined && filter.min !== "") {
127
+ params[`${FILTER_PREFIX}${filter.field}.min`] = filter.min;
128
+ }
129
+ if (filter.max !== undefined && filter.max !== "") {
130
+ params[`${FILTER_PREFIX}${filter.field}.max`] = filter.max;
131
+ }
132
+ }
133
+
134
+ if (sort) {
135
+ params[SORT_KEY] = sort.field;
136
+ params[DIR_KEY] = sort.direction;
137
+ }
138
+
139
+ if (pageSize !== undefined) {
140
+ params[PAGE_SIZE_KEY] = String(pageSize);
141
+ }
142
+
143
+ if (pageIndex !== undefined && pageIndex > 0) {
144
+ params[PAGE_KEY] = String(pageIndex + 1);
145
+ // The cursor is only meaningful past page 1. Persisting it (the fix over
146
+ // the React reference) lets a refreshed/shared deep link fetch the right
147
+ // page instead of page 1's rows under a higher page number.
148
+ if (afterCursor) params[CURSOR_KEY] = afterCursor;
149
+ }
150
+
151
+ return params;
152
+ }
153
+
154
+ /**
155
+ * Deserializes a URL param map back into filter/sort/pagination state.
156
+ *
157
+ * Requires the filter configs so it knows which params to look for and their
158
+ * types. Unknown params are ignored, making this safe against stale or
159
+ * hand-edited URLs.
160
+ */
161
+ export function queryParamsToFilters(
162
+ params: Record<string, string | undefined>,
163
+ configs: FilterFieldConfig[],
164
+ ): ParsedSearchParams {
165
+ const get = (key: string): string | undefined => {
166
+ const v = params[key];
167
+ return v === undefined || v === null ? undefined : String(v);
168
+ };
169
+
170
+ const filters: ActiveFilterValue[] = [];
171
+
172
+ for (const config of configs) {
173
+ const { field, label, type } = config;
174
+
175
+ if (type === "search") {
176
+ const q = get(SEARCH_KEY);
177
+ if (q) filters.push({ field, label, type: "search", value: q });
178
+ continue;
179
+ }
180
+
181
+ const value = get(`${FILTER_PREFIX}${field}`);
182
+ const min = get(`${FILTER_PREFIX}${field}.min`);
183
+ const max = get(`${FILTER_PREFIX}${field}.max`);
184
+
185
+ const hasValue = value !== undefined && value !== "";
186
+ const hasRange = (min !== undefined && min !== "") || (max !== undefined && max !== "");
187
+
188
+ if (hasValue || hasRange) {
189
+ filters.push({ field, label, type, value, min, max });
190
+ }
191
+ }
192
+
193
+ let sort: SortState | null = null;
194
+ const sortField = get(SORT_KEY);
195
+ const sortDir = get(DIR_KEY);
196
+ if (sortField) {
197
+ sort = { field: sortField, direction: sortDir === "DESC" ? "DESC" : "ASC" };
198
+ }
199
+
200
+ const pageSizeRaw = get(PAGE_SIZE_KEY);
201
+ const pageSize = pageSizeRaw ? parseInt(pageSizeRaw, 10) : undefined;
202
+
203
+ const pageRaw = get(PAGE_KEY);
204
+ const page = pageRaw ? parseInt(pageRaw, 10) : 1;
205
+ const pageIndex = !isNaN(page) && page > 1 ? page - 1 : 0;
206
+
207
+ // Cursor only applies past page 1; ignore a stray cursor on page 1.
208
+ const afterCursor = pageIndex > 0 ? get(CURSOR_KEY) : undefined;
209
+
210
+ return {
211
+ filters,
212
+ sort,
213
+ pageSize: pageSize && !isNaN(pageSize) ? pageSize : undefined,
214
+ pageIndex,
215
+ afterCursor,
216
+ };
217
+ }
218
+
219
+ // ---------------------------------------------------------------------------
220
+ // GraphQL Filter Building
221
+ // ---------------------------------------------------------------------------
222
+
223
+ /**
224
+ * Converts active filters into a GraphQL `where` clause. Each filter becomes a
225
+ * clause via {@link buildSingleFilter}; multiple clauses combine under a
226
+ * top-level `and` (intersection semantics).
227
+ *
228
+ * @returns The `where` object, or `undefined` when no filters are active.
229
+ */
230
+ export function buildFilter<TFilter>(
231
+ filters: ActiveFilterValue[],
232
+ configs: FilterFieldConfig[],
233
+ ): TFilter | undefined {
234
+ const configMap = new Map(configs.map((c) => [c.field, c]));
235
+ const clauses: TFilter[] = [];
236
+
237
+ for (const filter of filters) {
238
+ const clause = buildSingleFilter<TFilter>(filter, configMap.get(filter.field));
239
+ if (clause) clauses.push(clause);
240
+ }
241
+
242
+ if (clauses.length === 0) return undefined;
243
+ if (clauses.length === 1) return clauses[0];
244
+ return { and: clauses } as TFilter;
245
+ }
246
+
247
+ /** YYYY-MM-DD -> ISO-8601 midnight UTC (inclusive lower bound). */
248
+ function toStartOfDay(dateStr: string): string {
249
+ return `${dateStr}T00:00:00.000Z`;
250
+ }
251
+
252
+ /** YYYY-MM-DD -> ISO-8601 last millisecond UTC (inclusive upper bound). */
253
+ function toEndOfDay(dateStr: string): string {
254
+ return `${dateStr}T23:59:59.999Z`;
255
+ }
256
+
257
+ /**
258
+ * Converts a single active filter into a GraphQL filter clause.
259
+ *
260
+ * | Type | Operator(s) | Example |
261
+ * |-----------------|----------------|-----------------------------------------------------|
262
+ * | text | like | `{ Name: { like: "%Acme%" } }` |
263
+ * | picklist | eq | `{ Industry: { eq: "Technology" } }` |
264
+ * | multipicklist | eq or in | `{ Type: { in: ["A", "B"] } }` |
265
+ * | numeric | gte / lte | `{ Revenue: { gte: 1000, lte: 5000 } }` |
266
+ * | boolean | eq | `{ IsActive: { eq: true } }` |
267
+ * | date/datetime | dynamic op | `{ CreatedDate: { gte: { value: "..." } } }` |
268
+ * | daterange | gte + lte | combined with `and` when both bounds set |
269
+ * | search | like + or | `{ or: [{ Name: {like} }, { Phone: {like} }] }` |
270
+ *
271
+ * @returns A single clause, or `null` if the filter has no meaningful value.
272
+ */
273
+ function buildSingleFilter<TFilter>(
274
+ filter: ActiveFilterValue,
275
+ config?: FilterFieldConfig,
276
+ ): TFilter | null {
277
+ const { field, type, value, min, max } = filter;
278
+
279
+ switch (type) {
280
+ case "text": {
281
+ if (!value) return null;
282
+ return { [field]: { like: `%${value}%` } } as TFilter;
283
+ }
284
+ case "picklist": {
285
+ if (!value) return null;
286
+ return { [field]: { eq: value } } as TFilter;
287
+ }
288
+ case "numeric": {
289
+ if (!min && !max) return null;
290
+ const ops: Record<string, number> = {};
291
+ if (min) ops["gte"] = Number(min);
292
+ if (max) ops["lte"] = Number(max);
293
+ return { [field]: ops } as TFilter;
294
+ }
295
+ case "boolean": {
296
+ if (value === undefined || value === "") return null;
297
+ return { [field]: { eq: value === "true" } } as TFilter;
298
+ }
299
+ case "multipicklist": {
300
+ if (!value) return null;
301
+ const values = value.split(",");
302
+ if (values.length === 1) {
303
+ return { [field]: { eq: values[0] } } as TFilter;
304
+ }
305
+ return { [field]: { in: values } } as TFilter;
306
+ }
307
+ case "date": {
308
+ if (!min && !max) return null;
309
+ const op = value ?? (min ? "gte" : "lte");
310
+ const dateStr = min ?? max;
311
+ return { [field]: { [op]: { value: dateStr } } } as TFilter;
312
+ }
313
+ case "daterange": {
314
+ if (!min && !max) return null;
315
+ const clauses: TFilter[] = [];
316
+ if (min) clauses.push({ [field]: { gte: { value: min } } } as TFilter);
317
+ if (max) clauses.push({ [field]: { lte: { value: max } } } as TFilter);
318
+ return clauses.length === 1 ? clauses[0] : ({ and: clauses } as TFilter);
319
+ }
320
+ case "datetime": {
321
+ if (!min && !max) return null;
322
+ const op = value ?? (min ? "gte" : "lte");
323
+ const dateStr = (min ?? max)!;
324
+ const isoStr = op === "gte" || op === "gt" ? toStartOfDay(dateStr) : toEndOfDay(dateStr);
325
+ return { [field]: { [op]: { value: isoStr } } } as TFilter;
326
+ }
327
+ case "datetimerange": {
328
+ if (!min && !max) return null;
329
+ const clauses: TFilter[] = [];
330
+ if (min) clauses.push({ [field]: { gte: { value: toStartOfDay(min) } } } as TFilter);
331
+ if (max) clauses.push({ [field]: { lte: { value: toEndOfDay(max) } } } as TFilter);
332
+ return clauses.length === 1 ? clauses[0] : ({ and: clauses } as TFilter);
333
+ }
334
+ case "search": {
335
+ if (!value) return null;
336
+ const searchFields = config?.searchFields ?? [];
337
+ if (searchFields.length === 0) return null;
338
+ // Dot-notation for relationship fields (e.g. "Owner.Name") builds
339
+ // nested objects: { Owner: { Name: { like: "%x%" } } }.
340
+ const clauses = searchFields.map((f) => {
341
+ const parts = f.split(".");
342
+ let clause: Record<string, unknown> = { like: `%${value}%` };
343
+ for (let i = parts.length - 1; i >= 0; i--) {
344
+ clause = { [parts[i]]: clause };
345
+ }
346
+ return clause as TFilter;
347
+ });
348
+ if (clauses.length === 1) return clauses[0];
349
+ return { or: clauses } as TFilter;
350
+ }
351
+ default:
352
+ return null;
353
+ }
354
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Copyright (c) 2026, Salesforce, Inc.,
3
+ * All rights reserved.
4
+ * For full license text, see the LICENSE.txt file
5
+ */
6
+ export * from "./debounce";
7
+ export * from "./field-utils";
8
+ export * from "./sort-utils";
9
+ export * from "./filter-utils";
10
+ // `createAsyncData` now lives in base-angular-app (`app/utils/async-data.ts`)
11
+ // and is consumed via the `utils/__inherit__async-data` stub — not re-exported
12
+ // here, so this feature barrel stays free of base-inherited symbols.