@salesforce/templates 66.11.1 → 66.12.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 (378) hide show
  1. package/lib/generators/projectGenerator.js +4 -1
  2. package/lib/generators/projectGenerator.js.map +1 -1
  3. package/lib/templates/project/angularextapp/.forceignore +15 -0
  4. package/lib/templates/project/angularextapp/.husky/pre-commit +4 -0
  5. package/lib/templates/project/angularextapp/.prettierignore +11 -0
  6. package/lib/templates/project/angularextapp/.prettierrc +17 -0
  7. package/lib/templates/project/angularextapp/CHANGELOG.md +4086 -0
  8. package/lib/templates/project/angularextapp/README.md +77 -0
  9. package/lib/templates/project/angularextapp/_p_/_m_/_d_/_s_/angularextapp1/angularextapp1.digitalExperience-meta.xml +11 -0
  10. package/lib/templates/project/angularextapp/_p_/_m_/_d_/_s_/angularextapp1/sfdc_cms__site/angularextapp1/_meta.json +5 -0
  11. package/lib/templates/project/angularextapp/_p_/_m_/_d_/_s_/angularextapp1/sfdc_cms__site/angularextapp1/content.json +10 -0
  12. package/lib/templates/project/angularextapp/_p_/_m_/_dc_/angularextapp1.digitalExperienceConfig-meta.xml +8 -0
  13. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/.forceignore +15 -0
  14. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/.postcssrc.json +5 -0
  15. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/.prettierignore +8 -0
  16. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/.prettierrc +12 -0
  17. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/CHANGELOG.md +4 -0
  18. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/README.md +85 -0
  19. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/angular.json +101 -0
  20. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/angularextapp.uibundle-meta.xml +8 -0
  21. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/e2e/app.spec.ts +15 -0
  22. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/esbuild/api-version.mjs +17 -0
  23. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/eslint.config.js +60 -0
  24. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/middleware/html.mjs +3 -0
  25. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/middleware/proxy.mjs +12 -0
  26. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/package-lock.json +13600 -0
  27. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/package.json +56 -0
  28. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/playwright.config.ts +25 -0
  29. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/public/favicon.ico +0 -0
  30. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/scripts/rewrite-e2e-assets.mjs +30 -0
  31. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/api/account/account-search.service.ts +196 -0
  32. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/api/account/distinctAccountIndustries.ts +26 -0
  33. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/api/account/distinctAccountTypes.ts +26 -0
  34. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/api/account/getAccountDetail.ts +128 -0
  35. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/api/account/searchAccounts.ts +58 -0
  36. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/api/data-client.service.spec.ts +184 -0
  37. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/api/data-client.service.ts +74 -0
  38. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/api/user-profile.service.ts +126 -0
  39. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/app.config.ts +22 -0
  40. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/app.html +1 -0
  41. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/app.routes.ts +77 -0
  42. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/app.spec.ts +18 -0
  43. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/app.ts +15 -0
  44. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/layout/app-layout/app-layout.html +53 -0
  45. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/layout/app-layout/app-layout.spec.ts +89 -0
  46. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/layout/app-layout/app-layout.ts +81 -0
  47. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/_field-size.scss +42 -0
  48. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/alert/alert.html +31 -0
  49. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/alert/alert.ts +53 -0
  50. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/button/button.html +18 -0
  51. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/button/button.scss +112 -0
  52. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/button/button.ts +57 -0
  53. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/card/card.scss +34 -0
  54. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/card/card.ts +110 -0
  55. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/collapsible/collapsible.html +10 -0
  56. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/collapsible/collapsible.ts +26 -0
  57. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-picker/date-picker.html +25 -0
  58. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-picker/date-picker.scss +36 -0
  59. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-picker/date-picker.ts +41 -0
  60. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-range-picker/date-range-picker.html +34 -0
  61. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-range-picker/date-range-picker.scss +33 -0
  62. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-range-picker/date-range-picker.ts +66 -0
  63. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/dialog/dialog.html +37 -0
  64. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/dialog/dialog.ts +55 -0
  65. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/field/field.html +21 -0
  66. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/field/field.ts +36 -0
  67. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/field-size.ts +8 -0
  68. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/input/input.html +19 -0
  69. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/input/input.scss +35 -0
  70. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/input/input.ts +36 -0
  71. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/label/label.html +3 -0
  72. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/label/label.ts +17 -0
  73. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/paginator/paginator.html +10 -0
  74. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/paginator/paginator.ts +37 -0
  75. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/popover/popover.html +41 -0
  76. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/popover/popover.ts +40 -0
  77. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/select/select.html +24 -0
  78. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/select/select.scss +35 -0
  79. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/select/select.ts +72 -0
  80. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/separator/separator.html +1 -0
  81. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/separator/separator.scss +23 -0
  82. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/separator/separator.ts +56 -0
  83. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/skeleton/skeleton.html +1 -0
  84. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/skeleton/skeleton.scss +28 -0
  85. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/skeleton/skeleton.ts +24 -0
  86. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/components/ui/spinner/spinner.ts +35 -0
  87. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/auth/auth.guard.ts +50 -0
  88. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/auth/auth.service.ts +126 -0
  89. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/auth-form/auth-form.html +34 -0
  90. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/auth-form/auth-form.ts +94 -0
  91. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/auth-layout/auth-layout.html +2 -0
  92. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/auth-layout/auth-layout.ts +30 -0
  93. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/card-layout/card-layout.html +16 -0
  94. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/card-layout/card-layout.ts +40 -0
  95. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/config/authentication.config.ts +75 -0
  96. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/footer-link/footer-link.html +9 -0
  97. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/footer-link/footer-link.ts +26 -0
  98. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/menu/auth-menu/auth-menu.html +26 -0
  99. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/menu/auth-menu/auth-menu.ts +46 -0
  100. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/reactive-form-page.base.ts +50 -0
  101. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/session/session.html +55 -0
  102. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/session/session.ts +205 -0
  103. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/status-alert/status-alert.html +5 -0
  104. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/status-alert/status-alert.ts +52 -0
  105. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/submit-button/submit-button.html +5 -0
  106. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/submit-button/submit-button.scss +17 -0
  107. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/submit-button/submit-button.ts +35 -0
  108. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/utils/auth-helpers.ts +68 -0
  109. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/utils/auth-validators.ts +72 -0
  110. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/utils/helpers.ts +85 -0
  111. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/utils/session-time-servlet.ts +130 -0
  112. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/utils/session-timeout.config.ts +83 -0
  113. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/authentication/utils/session-timeout.service.ts +201 -0
  114. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/breadcrumb/breadcrumb.html +54 -0
  115. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/breadcrumb/breadcrumb.ts +40 -0
  116. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/active-filters.html +23 -0
  117. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/active-filters.ts +78 -0
  118. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/date-filter.html +18 -0
  119. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/date-filter.ts +137 -0
  120. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/date-range-filter.html +11 -0
  121. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/date-range-filter.ts +69 -0
  122. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/filter-field-wrapper.html +11 -0
  123. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/filter-field-wrapper.ts +36 -0
  124. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/multi-select-filter.html +10 -0
  125. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/multi-select-filter.ts +58 -0
  126. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/numeric-range-filter.html +22 -0
  127. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/numeric-range-filter.ts +146 -0
  128. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/search-filter.html +8 -0
  129. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/search-filter.ts +82 -0
  130. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/select-filter.html +12 -0
  131. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/select-filter.ts +65 -0
  132. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/text-filter.html +12 -0
  133. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/text-filter.ts +90 -0
  134. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/object-search-state.service.ts +232 -0
  135. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/pagination/pagination.html +8 -0
  136. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/pagination/pagination.ts +61 -0
  137. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/search-bar/search-bar.html +59 -0
  138. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/search-bar/search-bar.ts +108 -0
  139. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/sort-control/sort-control.html +50 -0
  140. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/sort-control/sort-control.ts +72 -0
  141. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/debounce.ts +31 -0
  142. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/field-utils.ts +54 -0
  143. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/filter-utils.ts +354 -0
  144. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/index.ts +12 -0
  145. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/sort-utils.ts +46 -0
  146. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/account-detail/account-detail-page.html +164 -0
  147. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/account-detail/account-detail-page.scss +7 -0
  148. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/account-detail/account-detail-page.ts +196 -0
  149. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/account-search/account-search-page.html +111 -0
  150. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/account-search/account-search-page.ts +217 -0
  151. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/change-password/change-password-page.html +68 -0
  152. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/change-password/change-password-page.ts +82 -0
  153. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/forgot-password/forgot-password-page.html +35 -0
  154. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/forgot-password/forgot-password-page.ts +87 -0
  155. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/home/home-page.html +18 -0
  156. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/home/home-page.ts +47 -0
  157. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/home/home.html +6 -0
  158. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/home/home.spec.ts +23 -0
  159. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/home/home.ts +13 -0
  160. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/login/login-page.html +47 -0
  161. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/login/login-page.ts +89 -0
  162. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/not-found/not-found.html +12 -0
  163. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/not-found/not-found.spec.ts +33 -0
  164. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/not-found/not-found.ts +15 -0
  165. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/profile/profile-page.html +116 -0
  166. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/profile/profile-page.ts +194 -0
  167. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/register/register-page.html +80 -0
  168. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/register/register-page.ts +93 -0
  169. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/reset-password/reset-password-page.html +60 -0
  170. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/pages/reset-password/reset-password-page.ts +96 -0
  171. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/app/utils/async-data.ts +99 -0
  172. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/index.html +14 -0
  173. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/main.ts +5 -0
  174. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/styles.scss +170 -0
  175. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/theme.scss +39 -0
  176. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/src/types/sf-globals.d.ts +9 -0
  177. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/tsconfig.app.json +11 -0
  178. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/tsconfig.json +33 -0
  179. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/tsconfig.spec.json +10 -0
  180. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/ui-bundle.json +7 -0
  181. package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleAuthUtils.cls +68 -0
  182. package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleAuthUtils.cls-meta.xml +5 -0
  183. package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleChangePassword.cls +77 -0
  184. package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleChangePassword.cls-meta.xml +5 -0
  185. package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleForgotPassword.cls +71 -0
  186. package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleForgotPassword.cls-meta.xml +5 -0
  187. package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleLogin.cls +105 -0
  188. package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleLogin.cls-meta.xml +5 -0
  189. package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleRegistration.cls +162 -0
  190. package/lib/templates/project/angularextapp/_p_/_m_/classes/UIBundleRegistration.cls-meta.xml +5 -0
  191. package/lib/templates/project/angularextapp/_p_/_m_/networks/angularextapp.network-meta.xml +60 -0
  192. package/lib/templates/project/angularextapp/_p_/_m_/package.xml +24 -0
  193. package/lib/templates/project/angularextapp/_p_/_m_/permissionsets/angularextapp_Guest_User_Api_Access.permissionset-meta.xml +9 -0
  194. package/lib/templates/project/angularextapp/_p_/_m_/sites/angularextapp.site-meta.xml +31 -0
  195. package/lib/templates/project/angularextapp/config/project-scratch-def.json +13 -0
  196. package/lib/templates/project/angularextapp/eslint.config.js +7 -0
  197. package/lib/templates/project/angularextapp/jest.config.js +6 -0
  198. package/lib/templates/project/angularextapp/package.json +46 -0
  199. package/lib/templates/project/angularextapp/scripts/apex/hello.apex +10 -0
  200. package/lib/templates/project/angularextapp/scripts/gitignore-templates.json +4 -0
  201. package/lib/templates/project/angularextapp/scripts/graphql-search.sh +191 -0
  202. package/lib/templates/project/angularextapp/scripts/org-setup-config-schema.mjs +103 -0
  203. package/lib/templates/project/angularextapp/scripts/org-setup-dev.mjs +87 -0
  204. package/lib/templates/project/angularextapp/scripts/org-setup-utils.mjs +369 -0
  205. package/lib/templates/project/angularextapp/scripts/org-setup-xml.mjs +182 -0
  206. package/lib/templates/project/angularextapp/scripts/org-setup.config.json +9 -0
  207. package/lib/templates/project/angularextapp/scripts/org-setup.mjs +1702 -0
  208. package/lib/templates/project/angularextapp/scripts/sf-project-setup.mjs +103 -0
  209. package/lib/templates/project/angularextapp/scripts/soql/account.soql +6 -0
  210. package/lib/templates/project/angularextapp/scripts/validate-org-setup-config.mjs +38 -0
  211. package/lib/templates/project/angularextapp/sfdx-project.json +12 -0
  212. package/lib/templates/project/angularintapp/.forceignore +15 -0
  213. package/lib/templates/project/angularintapp/.husky/pre-commit +4 -0
  214. package/lib/templates/project/angularintapp/.prettierignore +11 -0
  215. package/lib/templates/project/angularintapp/.prettierrc +17 -0
  216. package/lib/templates/project/angularintapp/CHANGELOG.md +4086 -0
  217. package/lib/templates/project/angularintapp/README.md +77 -0
  218. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/.forceignore +15 -0
  219. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/.postcssrc.json +5 -0
  220. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/.prettierignore +8 -0
  221. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/.prettierrc +12 -0
  222. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/CHANGELOG.md +4 -0
  223. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/README.md +85 -0
  224. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/angular.json +101 -0
  225. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/angularintapp.uibundle-meta.xml +8 -0
  226. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/e2e/app.spec.ts +15 -0
  227. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/esbuild/api-version.mjs +17 -0
  228. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/eslint.config.js +60 -0
  229. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/middleware/html.mjs +3 -0
  230. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/middleware/proxy.mjs +12 -0
  231. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/package-lock.json +13619 -0
  232. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/package.json +57 -0
  233. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/playwright.config.ts +25 -0
  234. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/public/favicon.ico +0 -0
  235. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/scripts/rewrite-e2e-assets.mjs +30 -0
  236. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/api/account/account-search.service.ts +196 -0
  237. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/api/account/distinctAccountIndustries.ts +26 -0
  238. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/api/account/distinctAccountTypes.ts +26 -0
  239. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/api/account/getAccountDetail.ts +128 -0
  240. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/api/account/searchAccounts.ts +58 -0
  241. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/api/data-client.service.spec.ts +184 -0
  242. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/api/data-client.service.ts +74 -0
  243. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/app.config.ts +22 -0
  244. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/app.html +1 -0
  245. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/app.routes.ts +31 -0
  246. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/app.spec.ts +18 -0
  247. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/app.ts +15 -0
  248. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/layout/app-layout/app-layout.html +52 -0
  249. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/layout/app-layout/app-layout.spec.ts +90 -0
  250. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/layout/app-layout/app-layout.ts +67 -0
  251. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/_field-size.scss +42 -0
  252. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/alert/alert.html +31 -0
  253. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/alert/alert.ts +53 -0
  254. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/button/button.html +18 -0
  255. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/button/button.scss +112 -0
  256. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/button/button.ts +57 -0
  257. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/card/card.scss +34 -0
  258. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/card/card.ts +110 -0
  259. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/collapsible/collapsible.html +10 -0
  260. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/collapsible/collapsible.ts +26 -0
  261. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-picker/date-picker.html +25 -0
  262. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-picker/date-picker.scss +36 -0
  263. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-picker/date-picker.ts +41 -0
  264. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-range-picker/date-range-picker.html +34 -0
  265. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-range-picker/date-range-picker.scss +33 -0
  266. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/date-range-picker/date-range-picker.ts +66 -0
  267. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/dialog/dialog.html +37 -0
  268. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/dialog/dialog.ts +55 -0
  269. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/field/field.html +21 -0
  270. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/field/field.ts +36 -0
  271. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/field-size.ts +8 -0
  272. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/input/input.html +19 -0
  273. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/input/input.scss +35 -0
  274. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/input/input.ts +36 -0
  275. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/label/label.html +3 -0
  276. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/label/label.ts +17 -0
  277. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/paginator/paginator.html +10 -0
  278. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/paginator/paginator.ts +37 -0
  279. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/popover/popover.html +41 -0
  280. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/popover/popover.ts +40 -0
  281. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/select/select.html +24 -0
  282. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/select/select.scss +35 -0
  283. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/select/select.ts +72 -0
  284. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/separator/separator.html +1 -0
  285. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/separator/separator.scss +23 -0
  286. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/separator/separator.ts +56 -0
  287. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/skeleton/skeleton.html +1 -0
  288. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/skeleton/skeleton.scss +28 -0
  289. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/skeleton/skeleton.ts +24 -0
  290. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/components/ui/spinner/spinner.ts +35 -0
  291. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/agentforce/agentforce-embed.service.ts +177 -0
  292. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/agentforce/conversation.html +3 -0
  293. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/agentforce/conversation.ts +119 -0
  294. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/breadcrumb/breadcrumb.html +54 -0
  295. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/breadcrumb/breadcrumb.ts +40 -0
  296. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/active-filters.html +23 -0
  297. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/active-filters.ts +78 -0
  298. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/date-filter.html +18 -0
  299. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/date-filter.ts +137 -0
  300. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/date-range-filter.html +11 -0
  301. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/date-range-filter.ts +69 -0
  302. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/filter-field-wrapper.html +11 -0
  303. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/filter-field-wrapper.ts +36 -0
  304. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/multi-select-filter.html +10 -0
  305. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/multi-select-filter.ts +58 -0
  306. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/numeric-range-filter.html +22 -0
  307. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/numeric-range-filter.ts +146 -0
  308. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/search-filter.html +8 -0
  309. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/search-filter.ts +82 -0
  310. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/select-filter.html +12 -0
  311. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/select-filter.ts +65 -0
  312. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/text-filter.html +12 -0
  313. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/filters/text-filter.ts +90 -0
  314. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/object-search-state.service.ts +232 -0
  315. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/pagination/pagination.html +8 -0
  316. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/pagination/pagination.ts +61 -0
  317. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/search-bar/search-bar.html +59 -0
  318. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/search-bar/search-bar.ts +108 -0
  319. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/sort-control/sort-control.html +50 -0
  320. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/sort-control/sort-control.ts +72 -0
  321. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/debounce.ts +31 -0
  322. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/field-utils.ts +54 -0
  323. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/filter-utils.ts +354 -0
  324. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/index.ts +12 -0
  325. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/object-search/utils/sort-utils.ts +46 -0
  326. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/account-detail/account-detail-page.html +164 -0
  327. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/account-detail/account-detail-page.scss +7 -0
  328. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/account-detail/account-detail-page.ts +196 -0
  329. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/account-search/account-search-page.html +111 -0
  330. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/account-search/account-search-page.ts +217 -0
  331. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/home/home-page.html +18 -0
  332. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/home/home-page.ts +47 -0
  333. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/home/home.html +6 -0
  334. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/home/home.spec.ts +23 -0
  335. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/home/home.ts +13 -0
  336. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/not-found/not-found.html +12 -0
  337. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/not-found/not-found.spec.ts +33 -0
  338. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/pages/not-found/not-found.ts +15 -0
  339. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/types/conversation.ts +55 -0
  340. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/types/globals.d.ts +13 -0
  341. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/utils/async-data.ts +99 -0
  342. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/index.html +14 -0
  343. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/index.ts +15 -0
  344. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/main.ts +5 -0
  345. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/styles.scss +170 -0
  346. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/theme.scss +39 -0
  347. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/types/sf-globals.d.ts +9 -0
  348. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/tsconfig.app.json +11 -0
  349. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/tsconfig.json +33 -0
  350. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/tsconfig.spec.json +10 -0
  351. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/ui-bundle.json +7 -0
  352. package/lib/templates/project/angularintapp/_p_/_m_/applications/angularintapp.app-meta.xml +17 -0
  353. package/lib/templates/project/angularintapp/_p_/_m_/permissionsets/angularintapp_Access.permissionset-meta.xml +13 -0
  354. package/lib/templates/project/angularintapp/config/project-scratch-def.json +13 -0
  355. package/lib/templates/project/angularintapp/eslint.config.js +7 -0
  356. package/lib/templates/project/angularintapp/jest.config.js +6 -0
  357. package/lib/templates/project/angularintapp/package.json +46 -0
  358. package/lib/templates/project/angularintapp/scripts/apex/hello.apex +10 -0
  359. package/lib/templates/project/angularintapp/scripts/gitignore-templates.json +4 -0
  360. package/lib/templates/project/angularintapp/scripts/graphql-search.sh +191 -0
  361. package/lib/templates/project/angularintapp/scripts/org-setup-config-schema.mjs +103 -0
  362. package/lib/templates/project/angularintapp/scripts/org-setup-dev.mjs +87 -0
  363. package/lib/templates/project/angularintapp/scripts/org-setup-utils.mjs +369 -0
  364. package/lib/templates/project/angularintapp/scripts/org-setup-xml.mjs +182 -0
  365. package/lib/templates/project/angularintapp/scripts/org-setup.config.json +9 -0
  366. package/lib/templates/project/angularintapp/scripts/org-setup.mjs +1702 -0
  367. package/lib/templates/project/angularintapp/scripts/sf-project-setup.mjs +103 -0
  368. package/lib/templates/project/angularintapp/scripts/soql/account.soql +6 -0
  369. package/lib/templates/project/angularintapp/scripts/validate-org-setup-config.mjs +38 -0
  370. package/lib/templates/project/angularintapp/sfdx-project.json +12 -0
  371. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/package-lock.json +589 -561
  372. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/package-lock.json +589 -561
  373. package/lib/templates/uiBundles/angularbasic/package-lock.json +147 -168
  374. package/lib/templates/uiBundles/reactbasic/package-lock.json +589 -561
  375. package/lib/utils/types.d.ts +1 -1
  376. package/lib/utils/uiBundleTemplateUtils.js +10 -0
  377. package/lib/utils/uiBundleTemplateUtils.js.map +1 -1
  378. package/package.json +4 -2
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Copyright (c) 2026, Salesforce, Inc.,
3
+ * All rights reserved.
4
+ * For full license text, see the LICENSE.txt file
5
+ */
6
+ import { AUTH_REDIRECT_PARAM } from "../config/authentication.config";
7
+
8
+ /**
9
+ * Extracts the startUrl from the current query params, defaulting to '/'.
10
+ *
11
+ * SECURITY NOTE: This function strictly validates the URL to prevent Open
12
+ * Redirect vulnerabilities. It allows only relative paths.
13
+ *
14
+ * Direct port of the React `getStartUrl`. The React version takes a
15
+ * `URLSearchParams`; Angular's `ParamMap` exposes the same `get(key)` contract,
16
+ * so this accepts a minimal `{ get(name): string | null }` shape and works with
17
+ * both an `ActivatedRoute` `ParamMap` and a `URLSearchParams`.
18
+ *
19
+ * @param params - The query-param map (e.g. ActivatedRoute.snapshot.queryParamMap).
20
+ * @returns The start URL for post-authentication redirect.
21
+ */
22
+ export function getStartUrl(params: { get(name: string): string | null }): string {
23
+ const url = params.get(AUTH_REDIRECT_PARAM);
24
+ if (url && isValidRedirect(url)) {
25
+ return url;
26
+ }
27
+ return "/";
28
+ }
29
+
30
+ /**
31
+ * Security: Validates that the redirect URL is a relative path to prevent Open
32
+ * Redirect vulnerabilities.
33
+ *
34
+ * Security Checks:
35
+ * 1. Rejects protocol-relative URLs (//)
36
+ * 2. Rejects backslash usage which some browsers treat as slashes (/\)
37
+ * 3. Rejects control characters
38
+ *
39
+ * Ported from the React `isValidRedirect`, with one intentional hardening: the
40
+ * character-range ceiling is tightened from the React source's U+00FF to the
41
+ * printable-ASCII bound U+007E (~) so DEL / C1 controls / NBSP are rejected in
42
+ * line with check #3. Do not relax any of these checks without security review.
43
+ */
44
+ export function isValidRedirect(url: string): boolean {
45
+ // Basic structure check
46
+ if (!url.startsWith("/") || url.startsWith("//")) return false;
47
+ // Security: Reject backslashes to prevent /\example.com bypasses
48
+ if (url.includes("\\")) return false;
49
+ // Robustness: Ensure it doesn't contain whitespace/control characters.
50
+ // Allowed range is the printable-ASCII band U+0021 (!) through U+007E (~).
51
+ // This deliberately tightens the React reference's U+00FF ceiling, which
52
+ // admitted U+007F (DEL), the C1 control block (U+0080-U+009F, incl. NEL),
53
+ // and U+00A0 (NBSP) - all of which contradict the "reject control
54
+ // characters" contract and are open-redirect / request-splitting vectors.
55
+ if (/[^!-~]/.test(url)) return false;
56
+ return true;
57
+ }
58
+
59
+ /**
60
+ * Shared response type for authentication endpoints (login/register). Success
61
+ * responses contain `success: true` and `redirectUrl`. Error responses contain
62
+ * an `errors` array.
63
+ */
64
+ export interface AuthResponse {
65
+ success?: boolean;
66
+ redirectUrl?: string | null;
67
+ errors?: string[];
68
+ }
@@ -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 { AbstractControl, ValidationErrors, ValidatorFn } from "@angular/forms";
7
+
8
+ /**
9
+ * Angular Reactive Forms validators that mirror the React feature's zod schemas
10
+ * (`authHelpers.ts`). The React port dropped zod in favour of native Angular
11
+ * validators; these reproduce the same rules and messages so the UX is
12
+ * identical. Each validator returns `{ <key>: message }` on failure and `null`
13
+ * on success; templates read the first message via `control.errors`.
14
+ */
15
+
16
+ /** Mirrors zod `emailSchema`: trimmed, valid email. */
17
+ export const emailValidator: ValidatorFn = (control: AbstractControl): ValidationErrors | null => {
18
+ const value = (control.value ?? "").toString().trim();
19
+ if (value === "") {
20
+ return { email: "Please enter a valid email address" };
21
+ }
22
+ // Same intent as zod's email check: a single @ with non-empty local/domain
23
+ // parts and a dotted domain. Kept deliberately permissive, like zod.
24
+ const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
25
+ return emailPattern.test(value) ? null : { email: "Please enter a valid email address" };
26
+ };
27
+
28
+ /** Mirrors zod `passwordSchema`: minimum 8 characters. */
29
+ export const passwordMinValidator: ValidatorFn = (
30
+ control: AbstractControl,
31
+ ): ValidationErrors | null => {
32
+ const value = (control.value ?? "").toString();
33
+ return value.length >= 8 ? null : { password: "Password must be at least 8 characters" };
34
+ };
35
+
36
+ /** A required-with-custom-message validator (mirrors zod `min(1, message)`). */
37
+ export function requiredWithMessage(message: string): ValidatorFn {
38
+ return (control: AbstractControl): ValidationErrors | null => {
39
+ const value = (control.value ?? "").toString().trim();
40
+ return value.length >= 1 ? null : { required: message };
41
+ };
42
+ }
43
+
44
+ /**
45
+ * Cross-field validator mirroring the `newPasswordSchema` refine: the
46
+ * `confirmPassword` control must equal the `newPassword` control. Attach to the
47
+ * FormGroup; sets `{ passwordMismatch: '...' }` on the confirm control (matching
48
+ * the zod `path: ['confirmPassword']`) so the error renders under that field.
49
+ */
50
+ export function passwordsMatchValidator(
51
+ passwordKey = "newPassword",
52
+ confirmKey = "confirmPassword",
53
+ ): ValidatorFn {
54
+ return (group: AbstractControl): ValidationErrors | null => {
55
+ const password = group.get(passwordKey);
56
+ const confirm = group.get(confirmKey);
57
+ if (!password || !confirm) {
58
+ return null;
59
+ }
60
+ if (confirm.value !== password.value) {
61
+ const existing = confirm.errors ?? {};
62
+ confirm.setErrors({ ...existing, passwordMismatch: "Passwords do not match" });
63
+ return { passwordMismatch: "Passwords do not match" };
64
+ }
65
+ // Clear only our own error, preserving any other errors on the control.
66
+ if (confirm.errors) {
67
+ const { passwordMismatch: _removed, ...rest } = confirm.errors;
68
+ confirm.setErrors(Object.keys(rest).length ? rest : null);
69
+ }
70
+ return null;
71
+ };
72
+ }
@@ -0,0 +1,85 @@
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
+ * Error thrown when the API returns a non-OK response with structured error
9
+ * messages. The `errors` array contains user-facing messages that are safe to
10
+ * display — backend Apex classes guarantee that system exceptions are never
11
+ * exposed. Direct port of the React `ApiError`.
12
+ */
13
+ export class ApiError extends Error {
14
+ readonly errors: string[];
15
+ constructor(errors: string[]) {
16
+ super(errors[0]);
17
+ this.name = "ApiError";
18
+ this.errors = errors;
19
+ }
20
+ }
21
+
22
+ /**
23
+ * Helper to parse the fetch Response. Handles the distinction between success
24
+ * (JSON) and failure (throwing Error). Ported from the React `handleApiResponse`.
25
+ */
26
+ export async function handleApiResponse<T = unknown>(response: Response): Promise<T> {
27
+ // Robustness: Handle 204 No Content gracefully
28
+ if (response.status === 204) {
29
+ return {} as T;
30
+ }
31
+
32
+ let data: { errors?: string[] } | null = null;
33
+
34
+ const contentType = response.headers.get("content-type");
35
+ if (contentType?.includes("application/json")) {
36
+ data = (await response.json()) as { errors?: string[] };
37
+ } else {
38
+ // If Salesforce returns HTML (e.g. standard error page), consume the text
39
+ // to avoid parsing errors.
40
+ await response.text();
41
+ }
42
+
43
+ if (!response.ok) {
44
+ console.error("API request failed", data);
45
+ if (data?.errors?.length) {
46
+ throw new ApiError(data.errors);
47
+ }
48
+ throw new Error("An unexpected error occurred");
49
+ }
50
+
51
+ return data as T;
52
+ }
53
+
54
+ /** UI API Record response structure. */
55
+ export type RecordResponse = {
56
+ fields: Record<string, { value: string }>;
57
+ };
58
+
59
+ /**
60
+ * GraphQL can return a complex nested structure. This helper flattens it to a
61
+ * simple object for easier form binding. Ported from the React
62
+ * `flattenGraphQLRecord`.
63
+ *
64
+ * @param data - Extracted payload from the GraphQL response.
65
+ * @param fallbackError - Fallback error message if data is null/undefined or not an object.
66
+ * @throws {Error} If data is not valid.
67
+ * @returns Flattened object with values mapped directly to the fields.
68
+ */
69
+ export function flattenGraphQLRecord<T>(
70
+ data: unknown,
71
+ fallbackError = "An unknown error occurred",
72
+ ): T {
73
+ if (!data || typeof data !== "object") {
74
+ throw new Error(fallbackError);
75
+ }
76
+
77
+ return Object.fromEntries(
78
+ Object.entries(data as Record<string, unknown>).map(([key, field]) => [
79
+ key,
80
+ field !== null && typeof field === "object" && "value" in field
81
+ ? (field as { value: unknown }).value
82
+ : (field ?? null),
83
+ ]),
84
+ ) as T;
85
+ }
@@ -0,0 +1,130 @@
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
+ * SessionTimeServlet API helpers — direct (pure-TS) port of the React
9
+ * `sessionTimeService.ts`. Handles communication with the session validation
10
+ * endpoint, strips the CSRF prefix, and subtracts the latency buffer. Returns
11
+ * `undefined` on any failure so the session-timeout feature never crashes the
12
+ * running application.
13
+ */
14
+
15
+ import { SESSION_CONFIG } from "./session-timeout.config";
16
+
17
+ /** Response from SessionTimeServlet API. */
18
+ export interface SessionResponse {
19
+ /** Session phase. */
20
+ sp: number;
21
+ /** Seconds remaining in session. */
22
+ sr: number;
23
+ }
24
+
25
+ /**
26
+ * Parse the servlet response text into a SessionResponse object. Handles the
27
+ * CSRF protection prefix.
28
+ *
29
+ * @param text - Raw response text from servlet.
30
+ * @returns Parsed session response, or undefined if parsing fails.
31
+ */
32
+ export function parseResponseResult(text: string): SessionResponse | undefined {
33
+ let cleanedText = text;
34
+
35
+ // Strip CSRF protection prefix if present.
36
+ if (cleanedText.startsWith(SESSION_CONFIG.CSRF_TOKEN)) {
37
+ cleanedText = cleanedText.substring(SESSION_CONFIG.CSRF_TOKEN.length);
38
+ }
39
+
40
+ // Trim whitespace.
41
+ cleanedText = cleanedText.trim();
42
+
43
+ try {
44
+ const parsed = JSON.parse(cleanedText) as SessionResponse;
45
+
46
+ // Validate response structure.
47
+ if (typeof parsed.sp !== "number" || typeof parsed.sr !== "number") {
48
+ throw new Error("Invalid response structure: missing sp or sr properties");
49
+ }
50
+
51
+ return parsed;
52
+ } catch (error) {
53
+ console.error("[sessionTimeService] Failed to parse response:", error, "Text:", cleanedText);
54
+ return undefined;
55
+ }
56
+ }
57
+
58
+ /**
59
+ * Call SessionTimeServlet API. Internal function used by both poll and extend.
60
+ * Returns undefined on any failure.
61
+ *
62
+ * @param basePath - Community base path (e.g., "/sfsites/c/").
63
+ * @param extend - Whether to extend the session (updateTimedOutSession param).
64
+ */
65
+ async function callSessionTimeServlet(
66
+ basePath: string,
67
+ extend = false,
68
+ ): Promise<SessionResponse | undefined> {
69
+ // Build URL with cache-busting timestamp.
70
+ const timestamp = Date.now();
71
+ let url = `${basePath}${SESSION_CONFIG.SERVLET_URL}?buster=${timestamp}`;
72
+
73
+ if (extend) {
74
+ url += "&updateTimedOutSession=true";
75
+ }
76
+
77
+ try {
78
+ const response = await fetch(url, {
79
+ method: "GET",
80
+ credentials: "same-origin",
81
+ cache: "no-cache",
82
+ headers: {
83
+ "X-Requested-With": "XMLHttpRequest",
84
+ },
85
+ });
86
+
87
+ if (!response.ok) {
88
+ console.error(`[sessionTimeService] HTTP ${response.status}: ${response.statusText}`);
89
+ return undefined;
90
+ }
91
+
92
+ const contentType = response.headers.get("content-type");
93
+ if (contentType && !contentType.includes("text") && !contentType.includes("json")) {
94
+ console.error(`[sessionTimeService] Unexpected content type: ${contentType}`);
95
+ return undefined;
96
+ }
97
+
98
+ const text = await response.text();
99
+ const parsed = parseResponseResult(text);
100
+ if (!parsed) {
101
+ return undefined;
102
+ }
103
+
104
+ return {
105
+ sp: parsed.sp,
106
+ sr: Math.max(0, parsed.sr - SESSION_CONFIG.LATENCY_BUFFER_SECONDS),
107
+ };
108
+ } catch (error) {
109
+ console.error("[sessionTimeService] API call failed:", error);
110
+ return undefined;
111
+ }
112
+ }
113
+
114
+ /**
115
+ * Poll SessionTimeServlet to check remaining session time. Called periodically
116
+ * to monitor session status.
117
+ */
118
+ export async function pollSessionTimeServlet(
119
+ basePath: string,
120
+ ): Promise<SessionResponse | undefined> {
121
+ return callSessionTimeServlet(basePath, false);
122
+ }
123
+
124
+ /**
125
+ * Extend the current session time. Called when the user clicks "Continue" in the
126
+ * warning modal.
127
+ */
128
+ export async function extendSessionTime(basePath: string): Promise<SessionResponse | undefined> {
129
+ return callSessionTimeServlet(basePath, true);
130
+ }
@@ -0,0 +1,83 @@
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
+ * Configuration constants for session timeout monitoring. Direct port of the
9
+ * React `sessionTimeoutConfig.ts` — values are byte-for-byte identical so the
10
+ * polling cadence, retry backoff, and warning window match exactly.
11
+ */
12
+
13
+ // ---------------------------------------------------------------------------
14
+ // Retry Configuration
15
+ // ---------------------------------------------------------------------------
16
+
17
+ /** Initial delay for first retry attempt (2 seconds). */
18
+ export const INITIAL_RETRY_DELAY = 2000;
19
+
20
+ /** Maximum number of retry attempts before giving up. */
21
+ export const MAX_RETRY_ATTEMPTS = 10;
22
+
23
+ /** Maximum retry delay (30 minutes). */
24
+ export const MAX_RETRY_DELAY = 30 * 60 * 1000;
25
+
26
+ // ---------------------------------------------------------------------------
27
+ // Session Storage Keys
28
+ // ---------------------------------------------------------------------------
29
+
30
+ /** sessionStorage keys used by the session validator. */
31
+ export const STORAGE_KEYS = {
32
+ /** Flag to show session expired message on login page. */
33
+ SHOW_SESSION_MESSAGE: "lwrSessionValidator.showSessionMessage",
34
+ } as const;
35
+
36
+ // ---------------------------------------------------------------------------
37
+ // Servlet Configuration
38
+ // ---------------------------------------------------------------------------
39
+
40
+ /** SessionTimeServlet configuration. */
41
+ export const SESSION_CONFIG = {
42
+ /** Relative URL to SessionTimeServlet. */
43
+ SERVLET_URL: "/sfsites/c/_nc_external/system/security/session/SessionTimeServlet",
44
+
45
+ /** Latency buffer to subtract from server response (seconds). */
46
+ LATENCY_BUFFER_SECONDS: 3,
47
+
48
+ /** CSRF protection prefix in servlet responses. */
49
+ CSRF_TOKEN: "while(1);\n",
50
+ } as const;
51
+
52
+ // ---------------------------------------------------------------------------
53
+ // UI Labels
54
+ // ---------------------------------------------------------------------------
55
+
56
+ /** UI labels for session timeout components. */
57
+ export const LABELS = {
58
+ /** Title for session warning modal. */
59
+ sessionWarningTitle: "Session Timeout Warning",
60
+
61
+ /** Message text in session warning modal. */
62
+ sessionWarningMessage:
63
+ "For security, we log you out if you’re inactive for too long. To continue working, click Continue before the time expires.",
64
+
65
+ /** Text for "Continue" button. */
66
+ continueButton: "Continue",
67
+
68
+ /** Text for "Log Out" button. */
69
+ logoutButton: "Log Out",
70
+
71
+ /** Message shown on login page after session expires. */
72
+ invalidSessionMessage: "Your session has expired. Please log in again.",
73
+
74
+ /** Accessibility label for close button. */
75
+ closeLabel: "Close",
76
+ } as const;
77
+
78
+ // ---------------------------------------------------------------------------
79
+ // Session Timeout Configuration
80
+ // ---------------------------------------------------------------------------
81
+
82
+ /** Session warning time in seconds (30 seconds). */
83
+ export const SESSION_WARNING_TIME = 30;
@@ -0,0 +1,201 @@
1
+ /**
2
+ * Copyright (c) 2026, Salesforce, Inc.,
3
+ * All rights reserved.
4
+ * For full license text, see the LICENSE.txt file
5
+ */
6
+ import { Injectable, signal } from "@angular/core";
7
+ import {
8
+ extendSessionTime,
9
+ pollSessionTimeServlet,
10
+ type SessionResponse,
11
+ } from "./session-time-servlet";
12
+ import {
13
+ INITIAL_RETRY_DELAY,
14
+ MAX_RETRY_ATTEMPTS,
15
+ MAX_RETRY_DELAY,
16
+ SESSION_WARNING_TIME,
17
+ } from "./session-timeout.config";
18
+
19
+ /**
20
+ * Session-timeout monitoring service — the Angular port of the React
21
+ * `useSessionTimeout` hook (plus the inlined `useRetryWithBackoff`). Polls
22
+ * SessionTimeServlet at calculated intervals, shows the warning window when the
23
+ * session nears expiry, and retries failed polls with exponential backoff.
24
+ *
25
+ * State is exposed as signals; the owning `SessionTimeoutValidatorComponent`
26
+ * reacts to them and performs navigation/logout (this service, like the React
27
+ * hook, never navigates — it only tracks time and schedules checks).
28
+ *
29
+ * NOT `providedIn: 'root'`: it is provided by the validator component so its
30
+ * timers are torn down with that component (mirrors the hook's unmount cleanup).
31
+ */
32
+ @Injectable()
33
+ export class SessionTimeoutService {
34
+ // -- Public session state (signals) --------------------------------------
35
+ /** Seconds remaining in the current session (null until first response). */
36
+ readonly timeLeftInSession = signal<number | null>(null);
37
+ /** Whether the warning modal should be displayed. */
38
+ readonly showWarningModal = signal<boolean>(false);
39
+ /** Whether a poll is currently in flight. */
40
+ readonly isPolling = signal<boolean>(false);
41
+
42
+ // -- Retry (exponential backoff) state ------------------------------------
43
+ private retryAttempts = 0;
44
+ private currentRetryDelay = INITIAL_RETRY_DELAY;
45
+
46
+ // -- Timer / guard bookkeeping --------------------------------------------
47
+ private basePath = "";
48
+ private pollTimeoutId: ReturnType<typeof setTimeout> | null = null;
49
+ private retryTimeoutId: ReturnType<typeof setTimeout> | null = null;
50
+ private isPollingGuard = false;
51
+
52
+ private get maxRetriesReached(): boolean {
53
+ return this.retryAttempts >= MAX_RETRY_ATTEMPTS;
54
+ }
55
+
56
+ private resetRetry(): void {
57
+ this.retryAttempts = 0;
58
+ this.currentRetryDelay = INITIAL_RETRY_DELAY;
59
+ }
60
+
61
+ private clearPollTimeout(): void {
62
+ if (this.pollTimeoutId) {
63
+ clearTimeout(this.pollTimeoutId);
64
+ this.pollTimeoutId = null;
65
+ }
66
+ }
67
+
68
+ private clearRetryTimeout(): void {
69
+ if (this.retryTimeoutId) {
70
+ clearTimeout(this.retryTimeoutId);
71
+ this.retryTimeoutId = null;
72
+ }
73
+ }
74
+
75
+ /**
76
+ * Schedule the next session check, clearing any pending poll/retry to prevent
77
+ * concurrent polling. Mirrors the hook's `scheduleCheck`.
78
+ */
79
+ private scheduleCheck(delay: number): void {
80
+ this.clearPollTimeout();
81
+ this.clearRetryTimeout();
82
+ this.pollTimeoutId = setTimeout(() => {
83
+ void this.checkSession();
84
+ }, delay);
85
+ }
86
+
87
+ /**
88
+ * Handle a failed poll/extend with exponential backoff. Mirrors the hook's
89
+ * `handleRetryWithBackoff` + `useRetryWithBackoff.scheduleRetry`.
90
+ */
91
+ private handleRetryWithBackoff(retryAction: () => void): void {
92
+ if (this.maxRetriesReached) {
93
+ console.error("[SessionTimeout] Max retry attempts reached. Stopping polling.");
94
+ this.isPolling.set(false);
95
+ this.isPollingGuard = false;
96
+ return;
97
+ }
98
+
99
+ if (this.isPollingGuard) {
100
+ console.warn("[SessionTimeout] Poll already in progress, skipping retry scheduling");
101
+ return;
102
+ }
103
+
104
+ this.clearRetryTimeout();
105
+
106
+ const delay = this.currentRetryDelay;
107
+ console.warn(
108
+ `[SessionTimeout] Scheduling retry attempt ${this.retryAttempts + 1}/${MAX_RETRY_ATTEMPTS} in ${delay}ms`,
109
+ );
110
+
111
+ this.retryTimeoutId = setTimeout(() => {
112
+ this.retryTimeoutId = null;
113
+ retryAction();
114
+ }, delay);
115
+
116
+ this.retryAttempts += 1;
117
+ // Double the delay for the next retry, capped at maxDelay.
118
+ this.currentRetryDelay = Math.min(this.currentRetryDelay * 2, MAX_RETRY_DELAY);
119
+ }
120
+
121
+ /**
122
+ * Process a session response and schedule the next check. Mirrors the hook's
123
+ * `processTimeoutResponse`. When `sr <= 0` the component's effect performs
124
+ * logout; when within the warning window the modal is shown and a check is
125
+ * scheduled for expiry; otherwise a check is scheduled for when the warning
126
+ * should appear.
127
+ */
128
+ private processTimeoutResponse(secondsRemaining: number): void {
129
+ this.timeLeftInSession.set(secondsRemaining);
130
+
131
+ if (secondsRemaining <= 0) {
132
+ this.showWarningModal.set(false);
133
+ // logout() is triggered by the component reacting to timeLeftInSession.
134
+ return;
135
+ }
136
+
137
+ const shouldShowWarning = secondsRemaining <= SESSION_WARNING_TIME;
138
+
139
+ if (shouldShowWarning) {
140
+ this.showWarningModal.set(true);
141
+ this.scheduleCheck(secondsRemaining * 1000);
142
+ } else {
143
+ const timeUntilWarning = (secondsRemaining - SESSION_WARNING_TIME) * 1000;
144
+ this.showWarningModal.set(false);
145
+ this.scheduleCheck(timeUntilWarning);
146
+ }
147
+ }
148
+
149
+ /** Check session status via the servlet. Mirrors the hook's `checkSession`. */
150
+ async checkSession(): Promise<void> {
151
+ if (this.isPollingGuard) {
152
+ return;
153
+ }
154
+
155
+ this.isPollingGuard = true;
156
+ this.isPolling.set(true);
157
+
158
+ const response = await pollSessionTimeServlet(this.basePath);
159
+ this.isPollingGuard = false;
160
+ this.isPolling.set(false);
161
+
162
+ this.applyResponse(response, () => void this.checkSession());
163
+ }
164
+
165
+ /** Extend the session (user clicked "Continue"). Mirrors `extendSession`. */
166
+ async extendSession(): Promise<void> {
167
+ const response = await extendSessionTime(this.basePath);
168
+ this.applyResponse(response, () => void this.extendSession());
169
+ }
170
+
171
+ private applyResponse(response: SessionResponse | undefined, retryAction: () => void): void {
172
+ if (response) {
173
+ this.resetRetry();
174
+ this.processTimeoutResponse(response.sr);
175
+ } else {
176
+ this.handleRetryWithBackoff(retryAction);
177
+ }
178
+ }
179
+
180
+ /**
181
+ * Begin monitoring. Skips guests (mirrors the hook's guest short-circuit) and
182
+ * kicks off the first check.
183
+ */
184
+ start(basePath: string, isGuest: boolean): void {
185
+ this.basePath = basePath;
186
+ if (isGuest) {
187
+ return;
188
+ }
189
+ void this.checkSession();
190
+ }
191
+
192
+ /** Stop monitoring and reset state. Mirrors the hook's `logout` cleanup. */
193
+ stop(): void {
194
+ this.clearPollTimeout();
195
+ this.clearRetryTimeout();
196
+ this.showWarningModal.set(false);
197
+ this.timeLeftInSession.set(null);
198
+ this.isPolling.set(false);
199
+ this.isPollingGuard = false;
200
+ }
201
+ }
@@ -0,0 +1,54 @@
1
+ <nav aria-label="Breadcrumb" class="mb-3">
2
+ <ol
3
+ class="text-muted-foreground flex flex-wrap items-center gap-1.5 text-sm break-words sm:gap-2.5"
4
+ >
5
+ @if (includeHome()) {
6
+ <li class="inline-flex items-center gap-1.5">
7
+ <a [routerLink]="'/'" class="hover:text-foreground transition-colors">{{ homeLabel() }}</a>
8
+ </li>
9
+ <li aria-hidden="true" class="[&>svg]:size-3.5">
10
+ <svg
11
+ xmlns="http://www.w3.org/2000/svg"
12
+ viewBox="0 0 24 24"
13
+ fill="none"
14
+ stroke="currentColor"
15
+ stroke-width="2"
16
+ stroke-linecap="round"
17
+ stroke-linejoin="round"
18
+ >
19
+ <polyline points="9 18 15 12 9 6" />
20
+ </svg>
21
+ </li>
22
+ } @if (isDetailView()) {
23
+ <li class="inline-flex items-center gap-1.5">
24
+ <a [routerLink]="listPath()" class="hover:text-foreground transition-colors"
25
+ >{{ listLabel() }}</a
26
+ >
27
+ </li>
28
+ <li aria-hidden="true" class="[&>svg]:size-3.5">
29
+ <svg
30
+ xmlns="http://www.w3.org/2000/svg"
31
+ viewBox="0 0 24 24"
32
+ fill="none"
33
+ stroke="currentColor"
34
+ stroke-width="2"
35
+ stroke-linecap="round"
36
+ stroke-linejoin="round"
37
+ >
38
+ <polyline points="9 18 15 12 9 6" />
39
+ </svg>
40
+ </li>
41
+ <li class="inline-flex items-center gap-1.5">
42
+ @if (loading() && !recordName()) {
43
+ <app-skeleton class="h-4 w-32" />
44
+ } @else {
45
+ <span class="text-foreground font-normal" aria-current="page">{{ recordName() }}</span>
46
+ }
47
+ </li>
48
+ } @else {
49
+ <li class="inline-flex items-center gap-1.5">
50
+ <span class="text-foreground font-normal" aria-current="page">{{ listLabel() }}</span>
51
+ </li>
52
+ }
53
+ </ol>
54
+ </nav>