@salesforce/ui-bundle-template-feature-angular-authentication 12.5.4

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 (295) hide show
  1. package/LICENSE.txt +82 -0
  2. package/README.md +130 -0
  3. package/dist/.forceignore +15 -0
  4. package/dist/.husky/pre-commit +4 -0
  5. package/dist/.prettierignore +11 -0
  6. package/dist/.prettierrc +17 -0
  7. package/dist/CHANGELOG.md +5238 -0
  8. package/dist/README.md +77 -0
  9. package/dist/config/project-scratch-def.json +13 -0
  10. package/dist/eslint.config.js +7 -0
  11. package/dist/force-app/main/default/classes/UIBundleAuthUtils.cls +68 -0
  12. package/dist/force-app/main/default/classes/UIBundleAuthUtils.cls-meta.xml +5 -0
  13. package/dist/force-app/main/default/classes/UIBundleChangePassword.cls +77 -0
  14. package/dist/force-app/main/default/classes/UIBundleChangePassword.cls-meta.xml +5 -0
  15. package/dist/force-app/main/default/classes/UIBundleForgotPassword.cls +71 -0
  16. package/dist/force-app/main/default/classes/UIBundleForgotPassword.cls-meta.xml +5 -0
  17. package/dist/force-app/main/default/classes/UIBundleLogin.cls +105 -0
  18. package/dist/force-app/main/default/classes/UIBundleLogin.cls-meta.xml +5 -0
  19. package/dist/force-app/main/default/classes/UIBundleRegistration.cls +162 -0
  20. package/dist/force-app/main/default/classes/UIBundleRegistration.cls-meta.xml +5 -0
  21. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/.forceignore +15 -0
  22. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/.graphqlrc.yml +2 -0
  23. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/.postcssrc.json +5 -0
  24. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/.prettierignore +8 -0
  25. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/.prettierrc +12 -0
  26. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/CHANGELOG.md +4 -0
  27. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/README.md +85 -0
  28. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/angular.json +98 -0
  29. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/codegen.yml +95 -0
  30. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/components.json +6 -0
  31. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/e2e/app.spec.ts +15 -0
  32. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/esbuild/api-version.mjs +17 -0
  33. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/esbuild/graphql-codegen.mjs +13 -0
  34. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/eslint-plugin-angular-graphql.js +148 -0
  35. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/eslint.config.js +76 -0
  36. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/feature-angular-authentication.uibundle-meta.xml +7 -0
  37. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/middleware/html.mjs +3 -0
  38. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/middleware/proxy.mjs +12 -0
  39. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/package.json +69 -0
  40. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/playwright.config.ts +25 -0
  41. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/public/favicon.ico +0 -0
  42. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/scripts/get-graphql-schema.mjs +69 -0
  43. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/scripts/rewrite-e2e-assets.mjs +30 -0
  44. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/api/data-client.service.spec.ts +184 -0
  45. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/api/data-client.service.ts +74 -0
  46. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/api/user-profile.service.ts +126 -0
  47. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/app.config.ts +20 -0
  48. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/app.html +1 -0
  49. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/app.routes.ts +66 -0
  50. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/app.spec.ts +18 -0
  51. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/app.ts +15 -0
  52. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/components/layout/app-layout/app-layout.html +51 -0
  53. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/components/layout/app-layout/app-layout.spec.ts +63 -0
  54. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/components/layout/app-layout/app-layout.ts +27 -0
  55. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/components/ui/alert/alert.html +27 -0
  56. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/components/ui/alert/alert.ts +41 -0
  57. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/components/ui/button/button.html +27 -0
  58. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/components/ui/button/button.ts +66 -0
  59. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/components/ui/card/card.ts +100 -0
  60. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/components/ui/collapsible/collapsible.html +38 -0
  61. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/components/ui/collapsible/collapsible.ts +21 -0
  62. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/components/ui/date-picker/date-picker.html +20 -0
  63. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/components/ui/date-picker/date-picker.ts +49 -0
  64. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/components/ui/date-range-picker/date-range-picker.html +20 -0
  65. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/components/ui/date-range-picker/date-range-picker.ts +69 -0
  66. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/components/ui/dialog/dialog.html +20 -0
  67. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/components/ui/dialog/dialog.ts +40 -0
  68. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/components/ui/dropdown-menu/dropdown-menu.html +20 -0
  69. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/components/ui/dropdown-menu/dropdown-menu.ts +100 -0
  70. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/components/ui/field/field.html +15 -0
  71. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/components/ui/field/field.ts +28 -0
  72. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/components/ui/field-appearance.ts +8 -0
  73. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/components/ui/field-size.ts +8 -0
  74. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/components/ui/icon/icon.ts +68 -0
  75. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/components/ui/input/input.html +34 -0
  76. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/components/ui/input/input.ts +79 -0
  77. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/components/ui/label/label.ts +21 -0
  78. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/components/ui/paginator/paginator.html +74 -0
  79. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/components/ui/paginator/paginator.ts +93 -0
  80. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/components/ui/paginator/types.ts +13 -0
  81. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/components/ui/popover/popover.html +13 -0
  82. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/components/ui/popover/popover.ts +37 -0
  83. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/components/ui/select/select.html +36 -0
  84. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/components/ui/select/select.ts +63 -0
  85. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/components/ui/separator/separator.ts +31 -0
  86. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/components/ui/skeleton/skeleton.ts +20 -0
  87. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/components/ui/spinner/spinner.ts +28 -0
  88. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/features/authentication/auth/auth.guard.ts +50 -0
  89. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/features/authentication/auth/auth.service.ts +158 -0
  90. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/features/authentication/auth-form/auth-form.html +33 -0
  91. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/features/authentication/auth-form/auth-form.ts +94 -0
  92. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/features/authentication/auth-layout/auth-layout.html +2 -0
  93. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/features/authentication/auth-layout/auth-layout.ts +30 -0
  94. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/features/authentication/card-layout/card-layout.html +16 -0
  95. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/features/authentication/card-layout/card-layout.ts +40 -0
  96. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/features/authentication/config/authentication.config.ts +75 -0
  97. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/features/authentication/footer-link/footer-link.html +9 -0
  98. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/features/authentication/footer-link/footer-link.ts +26 -0
  99. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/features/authentication/menu/auth-menu/auth-menu.html +36 -0
  100. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/features/authentication/menu/auth-menu/auth-menu.ts +34 -0
  101. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/features/authentication/reactive-form-page.base.ts +50 -0
  102. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/features/authentication/session/session.html +55 -0
  103. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/features/authentication/session/session.ts +205 -0
  104. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/features/authentication/status-alert/status-alert.html +5 -0
  105. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/features/authentication/status-alert/status-alert.ts +52 -0
  106. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/features/authentication/submit-button/submit-button.html +9 -0
  107. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/features/authentication/submit-button/submit-button.ts +23 -0
  108. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/features/authentication/utils/auth-helpers.ts +68 -0
  109. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/features/authentication/utils/auth-validators.ts +72 -0
  110. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/features/authentication/utils/helpers.ts +85 -0
  111. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/features/authentication/utils/session-time-servlet.ts +130 -0
  112. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/features/authentication/utils/session-timeout.config.ts +83 -0
  113. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/features/authentication/utils/session-timeout.service.ts +201 -0
  114. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/pages/change-password/change-password-page.html +68 -0
  115. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/pages/change-password/change-password-page.ts +82 -0
  116. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/pages/forgot-password/forgot-password-page.html +35 -0
  117. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/pages/forgot-password/forgot-password-page.ts +87 -0
  118. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/pages/home/home.html +6 -0
  119. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/pages/home/home.spec.ts +23 -0
  120. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/pages/home/home.ts +13 -0
  121. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/pages/login/login-page.html +47 -0
  122. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/pages/login/login-page.ts +89 -0
  123. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/pages/not-found/not-found.html +12 -0
  124. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/pages/not-found/not-found.spec.ts +33 -0
  125. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/pages/not-found/not-found.ts +15 -0
  126. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/pages/profile/profile-page.html +116 -0
  127. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/pages/profile/profile-page.ts +194 -0
  128. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/pages/register/register-page.html +80 -0
  129. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/pages/register/register-page.ts +93 -0
  130. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/pages/reset-password/reset-password-page.html +60 -0
  131. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/pages/reset-password/reset-password-page.ts +96 -0
  132. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/alert/hlm-alert-action.ts +14 -0
  133. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/alert/hlm-alert-description.ts +17 -0
  134. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/alert/hlm-alert-title.ts +17 -0
  135. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/alert/hlm-alert.ts +35 -0
  136. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/alert/index.ts +16 -0
  137. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/button/hlm-button.token.ts +22 -0
  138. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/button/hlm-button.ts +72 -0
  139. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/button/index.ts +6 -0
  140. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/calendar/hlm-calendar-multi.ts +195 -0
  141. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/calendar/hlm-calendar-range.ts +194 -0
  142. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/calendar/hlm-calendar.ts +189 -0
  143. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/calendar/hlm-month-year-calendar.ts +119 -0
  144. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/calendar/index.ts +16 -0
  145. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/card/hlm-card-action.ts +12 -0
  146. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/card/hlm-card-avatar.ts +14 -0
  147. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/card/hlm-card-content.ts +12 -0
  148. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/card/hlm-card-description.ts +12 -0
  149. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/card/hlm-card-footer.ts +12 -0
  150. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/card/hlm-card-header.ts +15 -0
  151. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/card/hlm-card-title.ts +12 -0
  152. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/card/hlm-card.token.ts +19 -0
  153. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/card/hlm-card.ts +22 -0
  154. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/card/index.ts +28 -0
  155. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/collapsible/hlm-collapsible-content.ts +14 -0
  156. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/collapsible/hlm-collapsible-trigger.ts +9 -0
  157. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/collapsible/hlm-collapsible.ts +15 -0
  158. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/collapsible/index.ts +13 -0
  159. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/date-picker/hlm-date-multi-input.ts +104 -0
  160. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/date-picker/hlm-date-picker-anchor.ts +23 -0
  161. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/date-picker/hlm-date-picker-input.ts +118 -0
  162. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/date-picker/hlm-date-picker-multi.token.ts +109 -0
  163. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/date-picker/hlm-date-picker-multi.ts +220 -0
  164. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/date-picker/hlm-date-picker-trigger.ts +104 -0
  165. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/date-picker/hlm-date-picker.token.ts +69 -0
  166. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/date-picker/hlm-date-picker.ts +203 -0
  167. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/date-picker/hlm-date-range-input.ts +120 -0
  168. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/date-picker/hlm-date-range-picker.token.ts +86 -0
  169. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/date-picker/hlm-date-range-picker.ts +252 -0
  170. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/date-picker/hlm-month-year-input.ts +105 -0
  171. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/date-picker/hlm-month-year-picker.token.ts +89 -0
  172. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/date-picker/hlm-month-year-picker.ts +196 -0
  173. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/date-picker/index.ts +38 -0
  174. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/dialog/hlm-dialog-close.ts +9 -0
  175. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/dialog/hlm-dialog-content.ts +74 -0
  176. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/dialog/hlm-dialog-description.ts +17 -0
  177. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/dialog/hlm-dialog-footer.ts +15 -0
  178. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/dialog/hlm-dialog-header.ts +12 -0
  179. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/dialog/hlm-dialog-overlay.ts +27 -0
  180. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/dialog/hlm-dialog-portal.ts +8 -0
  181. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/dialog/hlm-dialog-title.ts +14 -0
  182. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/dialog/hlm-dialog-trigger.ts +14 -0
  183. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/dialog/hlm-dialog.service.ts +46 -0
  184. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/dialog/hlm-dialog.ts +24 -0
  185. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/dialog/index.ts +35 -0
  186. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/dropdown-menu/hlm-dropdown-menu-checkbox-indicator.ts +21 -0
  187. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/dropdown-menu/hlm-dropdown-menu-checkbox.ts +54 -0
  188. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/dropdown-menu/hlm-dropdown-menu-focus-on-hover.ts +35 -0
  189. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/dropdown-menu/hlm-dropdown-menu-group.ts +14 -0
  190. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/dropdown-menu/hlm-dropdown-menu-item-sub-indicator.ts +19 -0
  191. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/dropdown-menu/hlm-dropdown-menu-item.ts +42 -0
  192. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/dropdown-menu/hlm-dropdown-menu-label.ts +20 -0
  193. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/dropdown-menu/hlm-dropdown-menu-radio-indicator.ts +21 -0
  194. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/dropdown-menu/hlm-dropdown-menu-radio.ts +49 -0
  195. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/dropdown-menu/hlm-dropdown-menu-separator.ts +12 -0
  196. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/dropdown-menu/hlm-dropdown-menu-shortcut.ts +15 -0
  197. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/dropdown-menu/hlm-dropdown-menu-sub-trigger.ts +52 -0
  198. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/dropdown-menu/hlm-dropdown-menu-sub.ts +53 -0
  199. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/dropdown-menu/hlm-dropdown-menu-token.ts +26 -0
  200. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/dropdown-menu/hlm-dropdown-menu-trigger.ts +46 -0
  201. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/dropdown-menu/hlm-dropdown-menu.ts +57 -0
  202. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/dropdown-menu/index.ts +49 -0
  203. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/field/hlm-field-content.ts +12 -0
  204. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/field/hlm-field-description.ts +53 -0
  205. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/field/hlm-field-error.ts +100 -0
  206. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/field/hlm-field-group.ts +15 -0
  207. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/field/hlm-field-label.ts +17 -0
  208. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/field/hlm-field-legend.ts +19 -0
  209. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/field/hlm-field-separator.ts +24 -0
  210. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/field/hlm-field-set.ts +15 -0
  211. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/field/hlm-field-title.ts +15 -0
  212. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/field/hlm-field.ts +47 -0
  213. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/field/index.ts +34 -0
  214. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/input/hlm-input.ts +21 -0
  215. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/input/index.ts +5 -0
  216. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/input-group/hlm-input-group-addon.ts +40 -0
  217. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/input-group/hlm-input-group-button.ts +47 -0
  218. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/input-group/hlm-input-group-input.ts +17 -0
  219. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/input-group/hlm-input-group-text.ts +14 -0
  220. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/input-group/hlm-input-group.ts +18 -0
  221. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/input-group/index.ts +19 -0
  222. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/label/hlm-label.ts +17 -0
  223. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/label/index.ts +5 -0
  224. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/label/label.html +11 -0
  225. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/pagination/hlm-numbered-pagination-query-params.ts +191 -0
  226. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/pagination/hlm-numbered-pagination.ts +290 -0
  227. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/pagination/hlm-pagination-content.ts +12 -0
  228. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/pagination/hlm-pagination-ellipsis.ts +27 -0
  229. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/pagination/hlm-pagination-item.ts +7 -0
  230. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/pagination/hlm-pagination-link.ts +51 -0
  231. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/pagination/hlm-pagination-next.ts +65 -0
  232. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/pagination/hlm-pagination-previous.ts +65 -0
  233. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/pagination/hlm-pagination.ts +19 -0
  234. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/pagination/index.ts +31 -0
  235. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/popover/hlm-popover-content.ts +25 -0
  236. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/popover/hlm-popover-description.ts +12 -0
  237. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/popover/hlm-popover-header.ts +12 -0
  238. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/popover/hlm-popover-portal.ts +8 -0
  239. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/popover/hlm-popover-title.ts +12 -0
  240. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/popover/hlm-popover-trigger.ts +14 -0
  241. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/popover/hlm-popover.ts +23 -0
  242. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/popover/index.ts +25 -0
  243. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/select/hlm-select-content.ts +44 -0
  244. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/select/hlm-select-group.ts +14 -0
  245. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/select/hlm-select-item.ts +36 -0
  246. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/select/hlm-select-label.ts +14 -0
  247. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/select/hlm-select-multiple.ts +37 -0
  248. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/select/hlm-select-placeholder.ts +17 -0
  249. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/select/hlm-select-portal.ts +8 -0
  250. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/select/hlm-select-scroll-down.ts +22 -0
  251. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/select/hlm-select-scroll-up.ts +22 -0
  252. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/select/hlm-select-separator.ts +14 -0
  253. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/select/hlm-select-trigger.ts +59 -0
  254. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/select/hlm-select-value-template.ts +5 -0
  255. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/select/hlm-select-value.ts +18 -0
  256. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/select/hlm-select-values-content.ts +9 -0
  257. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/select/hlm-select-values.ts +5 -0
  258. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/select/hlm-select.ts +37 -0
  259. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/select/index.ts +52 -0
  260. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/separator/hlm-separator.ts +19 -0
  261. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/separator/index.ts +5 -0
  262. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/skeleton/hlm-skeleton.ts +14 -0
  263. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/skeleton/index.ts +5 -0
  264. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/spinner/hlm-spinner.ts +26 -0
  265. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/spinner/index.ts +5 -0
  266. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/utils/hlm.ts +313 -0
  267. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/utils/index.ts +2 -0
  268. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/shared/utils/provide-spartan-hlm.ts +34 -0
  269. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/app/utils/async-data.ts +99 -0
  270. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/index.html +13 -0
  271. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/main.ts +5 -0
  272. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/styles.css +139 -0
  273. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/src/types/sf-globals.d.ts +9 -0
  274. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/tsconfig.app.json +11 -0
  275. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/tsconfig.json +36 -0
  276. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/tsconfig.spec.json +10 -0
  277. package/dist/force-app/main/default/uiBundles/feature-angular-authentication/ui-bundle.json +7 -0
  278. package/dist/jest.config.js +6 -0
  279. package/dist/package-lock.json +12554 -0
  280. package/dist/package.json +46 -0
  281. package/dist/scripts/apex/hello.apex +10 -0
  282. package/dist/scripts/gitignore-templates.json +4 -0
  283. package/dist/scripts/graphql-search.sh +191 -0
  284. package/dist/scripts/org-setup-config-schema.mjs +132 -0
  285. package/dist/scripts/org-setup-dev.mjs +114 -0
  286. package/dist/scripts/org-setup-url.mjs +108 -0
  287. package/dist/scripts/org-setup-utils.mjs +569 -0
  288. package/dist/scripts/org-setup-xml.mjs +278 -0
  289. package/dist/scripts/org-setup.config.json +5 -0
  290. package/dist/scripts/org-setup.mjs +2537 -0
  291. package/dist/scripts/sf-project-setup.mjs +103 -0
  292. package/dist/scripts/soql/account.soql +6 -0
  293. package/dist/scripts/validate-org-setup-config.mjs +38 -0
  294. package/dist/sfdx-project.json +12 -0
  295. package/package.json +45 -0
@@ -0,0 +1,85 @@
1
+ # Base Angular App
2
+
3
+ Base Angular App is a template application that demonstrates how to build an Angular UI Bundle on the Salesforce platform with the Angular CLI, TypeScript, Tailwind, Spartan NG (shadcn/ui for Angular), and the Salesforce UI Bundle SDK. It provides a minimal shell (home, 404), routing with standalone components and signals, so feature apps can extend it via the patches pipeline.
4
+
5
+ This UI Bundle lives inside an SFDX project. The project root is the directory that contains `force-app/` and `sfdx-project.json`. Run the commands in the sections below from the paths indicated.
6
+
7
+ ## Table of contents
8
+
9
+ - [Run (development)](#run-development)
10
+ - [Build](#build)
11
+ - [Deploy](#deploy)
12
+ - [Test](#test)
13
+ - [Lint](#lint)
14
+
15
+ ## Run (development)
16
+
17
+ From the UI Bundle directory (`force-app/main/default/uiBundles/base-angular-app`):
18
+
19
+ ```bash
20
+ npm install
21
+ npm run dev
22
+ ```
23
+
24
+ This starts the Salesforce Angular dev server (`sf-angular-serve`).
25
+
26
+ ## Build
27
+
28
+ From the UI Bundle directory:
29
+
30
+ ```bash
31
+ npm install
32
+ npm run build
33
+ ```
34
+
35
+ The production build is written to `dist/` inside the UI Bundle folder. Use `npm run watch` to rebuild on change in development mode. Deploy using the steps in [Deploy](#deploy).
36
+
37
+ ## Deploy
38
+
39
+ From the **SFDX project root** (the directory that contains `force-app/`):
40
+
41
+ 1. Build the UI Bundle:
42
+
43
+ ```bash
44
+ cd force-app/main/default/uiBundles/base-angular-app && npm install && npm run build && cd -
45
+ ```
46
+
47
+ 2. Deploy the UI Bundle only:
48
+
49
+ ```bash
50
+ sf project deploy start --source-dir force-app/main/default/ui-bundles --target-org <alias>
51
+ ```
52
+
53
+ Or deploy all metadata:
54
+
55
+ ```bash
56
+ sf project deploy start --source-dir force-app --target-org <alias>
57
+ ```
58
+
59
+ Replace `<alias>` with your target org alias.
60
+
61
+ ## Test
62
+
63
+ From the UI Bundle directory:
64
+
65
+ ```bash
66
+ npm install
67
+ npm run test
68
+ ```
69
+
70
+ This runs the unit test suite via `ng test`. For end-to-end tests:
71
+
72
+ ```bash
73
+ npm run build:e2e
74
+ npm run e2e
75
+ ```
76
+
77
+ This builds with E2E asset rewrites and runs Playwright against the static build. Ensure Chromium is installed (`npx playwright install chromium` if needed).
78
+
79
+ ## Lint
80
+
81
+ From the UI Bundle directory:
82
+
83
+ ```bash
84
+ npm run lint
85
+ ```
@@ -0,0 +1,98 @@
1
+ {
2
+ "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
3
+ "version": 1,
4
+ "cli": {
5
+ "packageManager": "npm",
6
+ "analytics": false,
7
+ "cache": {
8
+ "enabled": false
9
+ }
10
+ },
11
+ "newProjectRoot": "projects",
12
+ "projects": {
13
+ "feature-angular-authentication": {
14
+ "projectType": "application",
15
+ "schematics": {
16
+ "@schematics/angular:component": {
17
+ "style": "css"
18
+ }
19
+ },
20
+ "root": "",
21
+ "sourceRoot": "src",
22
+ "prefix": "app",
23
+ "architect": {
24
+ "build": {
25
+ "builder": "@angular-builders/custom-esbuild:application",
26
+ "options": {
27
+ "outputPath": {
28
+ "base": "dist",
29
+ "browser": ""
30
+ },
31
+ "deployUrl": "./",
32
+ "browser": "src/main.ts",
33
+ "tsConfig": "tsconfig.app.json",
34
+ "assets": [
35
+ {
36
+ "glob": "**/*",
37
+ "input": "public"
38
+ }
39
+ ],
40
+ "styles": ["src/styles.css"],
41
+ "plugins": []
42
+ },
43
+ "configurations": {
44
+ "production": {
45
+ "plugins": ["./esbuild/api-version.mjs"],
46
+ "budgets": [
47
+ {
48
+ "type": "anyComponentStyle",
49
+ "maximumWarning": "4kB",
50
+ "maximumError": "8kB"
51
+ }
52
+ ],
53
+ "outputHashing": "all",
54
+ "optimization": {
55
+ "scripts": true,
56
+ "styles": {
57
+ "minify": true,
58
+ "inlineCritical": false
59
+ }
60
+ }
61
+ },
62
+ "development": {
63
+ "plugins": ["./esbuild/graphql-codegen.mjs"],
64
+ "optimization": false,
65
+ "extractLicenses": false,
66
+ "sourceMap": true
67
+ }
68
+ },
69
+ "defaultConfiguration": "production"
70
+ },
71
+ "serve": {
72
+ "builder": "@angular-builders/custom-esbuild:dev-server",
73
+ "options": {
74
+ "middlewares": ["./middleware/html.mjs", "./middleware/proxy.mjs"]
75
+ },
76
+ "configurations": {
77
+ "production": {
78
+ "buildTarget": "feature-angular-authentication:build:production"
79
+ },
80
+ "development": {
81
+ "buildTarget": "feature-angular-authentication:build:development"
82
+ }
83
+ },
84
+ "defaultConfiguration": "development"
85
+ },
86
+ "test": {
87
+ "builder": "@angular/build:unit-test"
88
+ },
89
+ "lint": {
90
+ "builder": "@angular-eslint/builder:lint",
91
+ "options": {
92
+ "lintFilePatterns": ["src/**/*.ts", "src/**/*.html", "src/**/*.graphql"]
93
+ }
94
+ }
95
+ }
96
+ }
97
+ }
98
+ }
@@ -0,0 +1,95 @@
1
+ schema: '../../../../../schema.graphql'
2
+ documents: 'src/**/*.{graphql,ts}'
3
+ generates:
4
+ src/app/api/graphql-operations-types.ts:
5
+ plugins:
6
+ - 'graphql-codegen-typescript-operation-types'
7
+ - 'typescript-operations'
8
+ config:
9
+ onlyOperationTypes: true
10
+ skipTypename: true
11
+ preResolveTypes: true
12
+ scalars:
13
+ # String-serialized scalars
14
+ JSON:
15
+ input: 'string'
16
+ output: 'string'
17
+ Date:
18
+ input: 'string'
19
+ output: 'string'
20
+ DateTime:
21
+ input: 'string'
22
+ output: 'string'
23
+ Time:
24
+ input: 'string'
25
+ output: 'string'
26
+ Email:
27
+ input: 'string'
28
+ output: 'string'
29
+ Url:
30
+ input: 'string'
31
+ output: 'string'
32
+ PhoneNumber:
33
+ input: 'string'
34
+ output: 'string'
35
+ Picklist:
36
+ input: 'string'
37
+ output: 'string'
38
+ MultiPicklist:
39
+ input: 'string'
40
+ output: 'string'
41
+ TextArea:
42
+ input: 'string'
43
+ output: 'string'
44
+ LongTextArea:
45
+ input: 'string'
46
+ output: 'string'
47
+ RichTextArea:
48
+ input: 'string'
49
+ output: 'string'
50
+ EncryptedString:
51
+ input: 'string'
52
+ output: 'string'
53
+ Base64:
54
+ input: 'string'
55
+ output: 'string'
56
+ IdOrRef:
57
+ input: 'string'
58
+ output: 'string'
59
+ # BigDecimal-serialized scalars (accepts number or string, returns number)
60
+ Currency:
61
+ input: 'number | string'
62
+ output: 'number'
63
+ BigDecimal:
64
+ input: 'number | string'
65
+ output: 'number'
66
+ Double:
67
+ input: 'number | string'
68
+ output: 'number'
69
+ Percent:
70
+ input: 'number | string'
71
+ output: 'number'
72
+ Longitude:
73
+ input: 'number | string'
74
+ output: 'number'
75
+ Latitude:
76
+ input: 'number | string'
77
+ output: 'number'
78
+ # Integer-like scalars
79
+ Long:
80
+ input: 'number'
81
+ output: 'number'
82
+ BigInteger:
83
+ input: 'number'
84
+ output: 'number'
85
+ Short:
86
+ input: 'number'
87
+ output: 'number'
88
+ Byte:
89
+ input: 'number'
90
+ output: 'number'
91
+ Char:
92
+ input: 'number'
93
+ output: 'number'
94
+ overwrite: true
95
+ ignoreNoDocuments: true
@@ -0,0 +1,6 @@
1
+ {
2
+ "$schema": "node_modules/@spartan-ng/cli/src/generators/ui/schema.json",
3
+ "componentsPath": "src/app/shared",
4
+ "importAlias": "@spartan-ng/styles",
5
+ "style": "nova"
6
+ }
@@ -0,0 +1,15 @@
1
+ import { test, expect } from '@playwright/test';
2
+
3
+ test.describe('base-angular-app', () => {
4
+ test('home page loads and shows welcome content', async ({ page }) => {
5
+ await page.goto('/');
6
+ await expect(page.getByRole('heading', { name: 'Home' })).toBeVisible();
7
+ await expect(page.getByText('Welcome to your Angular application.')).toBeVisible();
8
+ });
9
+
10
+ test('not found route shows 404', async ({ page }) => {
11
+ await page.goto('/non-existent-route');
12
+ await expect(page.getByRole('heading', { name: '404' })).toBeVisible();
13
+ await expect(page.getByText('Page not found')).toBeVisible();
14
+ });
15
+ });
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Build-time substitution of `__SF_API_VERSION__` (production + main app code in dev).
3
+ *
4
+ * Resolves the connected org's API version (from `sf` CLI session) once at
5
+ * builder startup and injects it via esbuild's `define`. Falls back to "65.0"
6
+ * if no session is available — matches @salesforce/platform-sdk's default.
7
+ *
8
+ * In `ng serve`, this plugin runs on the application esbuild pass but does NOT
9
+ * reach Vite's optimizeDeps prebundle of node_modules. `scripts/dev.mjs` covers
10
+ * that gap by passing the same value via `ng serve --define`.
11
+ *
12
+ * Referenced from angular.json: architect.build.options.plugins[].
13
+ */
14
+ import { createApiVersionPlugin } from '@salesforce/angular-plugin-ui-bundle';
15
+
16
+ const { plugin } = await createApiVersionPlugin();
17
+ export default plugin;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * GraphQL Codegen esbuild plugin — runs codegen on build start.
3
+ *
4
+ * Resolves GraphQL operations into typed TypeScript at build time using the
5
+ * project's `codegen.yml` configuration. Re-runs on every rebuild during
6
+ * `ng serve` so generated types stay in sync with schema/document changes.
7
+ *
8
+ * Referenced from angular.json: architect.build.options.plugins[].
9
+ */
10
+ import { createGraphQLCodegenPlugin } from '@salesforce/angular-plugin-ui-bundle';
11
+
12
+ const plugin = createGraphQLCodegenPlugin();
13
+ export default plugin;
@@ -0,0 +1,148 @@
1
+ /**
2
+ * eslint-plugin-angular-graphql.js
3
+ *
4
+ * Custom ESLint plugin with composite processor that enables BOTH:
5
+ * - Angular inline template linting (processInlineTemplates)
6
+ * - GraphQL tagged template literal linting (@graphql-eslint processor)
7
+ *
8
+ * ESLint only allows one processor per file type. This plugin calls both
9
+ * processors under the hood, returning the source code only once to avoid
10
+ * duplicate TypeScript lint messages.
11
+ *
12
+ * Usage:
13
+ * import { createPlugin } from './eslint-plugin-angular-graphql.js';
14
+ * const plugin = createPlugin({ schemaPath: '/absolute/path/to/schema.graphql' });
15
+ *
16
+ * Safety assumptions (verified against source):
17
+ * - Neither processor clones source messages in postprocess (object identity dedup works)
18
+ * - gql tags do not appear inside inline template strings (autofix ranges non-overlapping)
19
+ * - Both processors store internal state keyed by filePath (or derived from it)
20
+ */
21
+ import { existsSync } from 'node:fs';
22
+ import angular from 'angular-eslint';
23
+ import graphqlPlugin from '@graphql-eslint/eslint-plugin';
24
+
25
+ const angularProcessor = angular.processInlineTemplates;
26
+ const graphqlProcessor = graphqlPlugin.processor;
27
+
28
+ // Track block counts per file for postprocess message routing
29
+ const blockCountsMap = new Map();
30
+
31
+ const compositeProcessor = {
32
+ meta: {
33
+ name: 'angular-graphql/composite',
34
+ version: '1.0.0',
35
+ },
36
+ supportsAutofix: true,
37
+
38
+ preprocess(code, filePath) {
39
+ // Call both preprocessors — this populates their internal state maps
40
+ // Angular returns: [source, ...htmlBlocks] (source FIRST)
41
+ const angularResult = angularProcessor.preprocess(code, filePath);
42
+ // GraphQL returns: [...gqlBlocks, source] (source LAST)
43
+ const graphqlResult = graphqlProcessor.preprocess(code, filePath);
44
+
45
+ // Extract blocks (excluding source) from each
46
+ const htmlBlocks = angularResult.length > 1 ? angularResult.slice(1) : [];
47
+ const gqlBlocks = graphqlResult.length > 1 ? graphqlResult.slice(0, -1) : [];
48
+
49
+ // Store counts for postprocess routing
50
+ blockCountsMap.set(filePath, {
51
+ gqlCount: gqlBlocks.length,
52
+ htmlCount: htmlBlocks.length,
53
+ });
54
+
55
+ // Return unified: [gqlBlocks..., htmlBlocks..., source]
56
+ // Source appears exactly ONCE at the end
57
+ return [...gqlBlocks, ...htmlBlocks, code];
58
+ },
59
+
60
+ postprocess(messages, filePath) {
61
+ const { gqlCount, htmlCount } = blockCountsMap.get(filePath) || { gqlCount: 0, htmlCount: 0 };
62
+ blockCountsMap.delete(filePath);
63
+
64
+ const sourceIndex = gqlCount + htmlCount;
65
+ const sourceMessages = messages[sourceIndex] || [];
66
+
67
+ // Short-circuit: neither processor extracted blocks
68
+ if (gqlCount === 0 && htmlCount === 0) {
69
+ return sourceMessages;
70
+ }
71
+
72
+ // Short-circuit: only Angular had blocks
73
+ if (gqlCount === 0) {
74
+ const angularMessages = [sourceMessages, ...messages.slice(0, htmlCount)];
75
+ return angularProcessor.postprocess(angularMessages, filePath);
76
+ }
77
+
78
+ // Short-circuit: only GraphQL had blocks
79
+ if (htmlCount === 0) {
80
+ const gqlMessages = [...messages.slice(0, gqlCount), sourceMessages];
81
+ return graphqlProcessor.postprocess(gqlMessages, filePath);
82
+ }
83
+
84
+ // Both had blocks — route to each postprocess and merge
85
+ // GraphQL expects: [gqlBlock0Msgs, ..., gqlBlockNMsgs, sourceMessages]
86
+ const gqlInput = [...messages.slice(0, gqlCount), sourceMessages];
87
+ const gqlResult = graphqlProcessor.postprocess(gqlInput, filePath);
88
+
89
+ // Angular expects: [sourceMessages, htmlBlock0Msgs, ..., htmlBlockMMsgs]
90
+ const angularInput = [sourceMessages, ...messages.slice(gqlCount, gqlCount + htmlCount)];
91
+ const angularResult = angularProcessor.postprocess(angularInput, filePath);
92
+
93
+ // Deduplicate source messages (both postprocessors pass them through by reference)
94
+ const sourceSet = new Set(sourceMessages);
95
+ const gqlOnly = gqlResult.filter((m) => !sourceSet.has(m));
96
+
97
+ // angularResult = [...sourceMessages, ...adjustedHtmlMessages]
98
+ // gqlOnly = [...adjustedGqlMessages] (source messages filtered out)
99
+ return [...angularResult, ...gqlOnly].sort((a, b) => a.line - b.line || a.column - b.column);
100
+ },
101
+ };
102
+
103
+ /**
104
+ * Factory: pass schemaPath, get back a plugin with configs ready to spread.
105
+ * - If schema exists → composite processor (Angular + GraphQL) + GraphQL rules
106
+ * - If no schema → Angular-only inline template processor, no GraphQL rules
107
+ */
108
+ export function createPlugin({ schemaPath } = {}) {
109
+ const schemaExists = !!(schemaPath && existsSync(schemaPath));
110
+
111
+ const configs = [
112
+ {
113
+ files: ['**/*.ts'],
114
+ processor: schemaExists ? compositeProcessor : angularProcessor,
115
+ },
116
+ ...(schemaExists
117
+ ? [
118
+ {
119
+ files: ['**/*.graphql'],
120
+ languageOptions: {
121
+ parser: graphqlPlugin.parser,
122
+ parserOptions: {
123
+ graphQLConfig: {
124
+ schema: schemaPath,
125
+ documents: 'src/**/*.ts',
126
+ },
127
+ },
128
+ },
129
+ plugins: {
130
+ '@graphql-eslint': graphqlPlugin,
131
+ },
132
+ rules: {
133
+ '@graphql-eslint/no-anonymous-operations': 'error',
134
+ '@graphql-eslint/no-duplicate-fields': 'error',
135
+ '@graphql-eslint/known-fragment-names': 'error',
136
+ '@graphql-eslint/no-undefined-variables': 'error',
137
+ '@graphql-eslint/no-unused-variables': 'error',
138
+ },
139
+ },
140
+ ]
141
+ : []),
142
+ ];
143
+
144
+ return {
145
+ meta: { name: 'eslint-plugin-angular-graphql', version: '1.0.0' },
146
+ configs,
147
+ };
148
+ }
@@ -0,0 +1,76 @@
1
+ import { dirname, resolve } from 'node:path';
2
+ import { fileURLToPath } from 'node:url';
3
+ import js from '@eslint/js';
4
+ import angular from 'angular-eslint';
5
+ import tseslint from 'typescript-eslint';
6
+ import { createPlugin } from './eslint-plugin-angular-graphql.js';
7
+
8
+ const __dirname = dirname(fileURLToPath(import.meta.url));
9
+ const schemaPath = resolve(__dirname, '../../../../../schema.graphql');
10
+ const angularGraphqlPlugin = createPlugin({ schemaPath });
11
+
12
+ export default tseslint.config(
13
+ // Global ignores
14
+ {
15
+ ignores: [
16
+ 'dist/**/*',
17
+ '.angular/**/*',
18
+ 'coverage/**/*',
19
+ 'node_modules/**/*',
20
+ // Vendored Spartan primitives use upstream hlm*/brn* selectors and are
21
+ // not authored here, so they can't satisfy the app-prefix/a11y rules.
22
+ '**/shared/**',
23
+ ],
24
+ },
25
+ // TypeScript files
26
+ {
27
+ files: ['**/*.ts'],
28
+ extends: [
29
+ js.configs.recommended,
30
+ ...tseslint.configs.recommended,
31
+ ...angular.configs.tsRecommended,
32
+ ],
33
+ rules: {
34
+ '@angular-eslint/directive-selector': [
35
+ 'error',
36
+ {
37
+ type: 'attribute',
38
+ prefix: 'app',
39
+ style: 'camelCase',
40
+ },
41
+ ],
42
+ '@angular-eslint/component-selector': [
43
+ 'error',
44
+ {
45
+ type: 'element',
46
+ prefix: 'app',
47
+ style: 'kebab-case',
48
+ },
49
+ ],
50
+ // The UI wrapper components (app-button, app-card, …) intentionally
51
+ // alias an input to `class` so callers can write `class="…"` on the host
52
+ // and have it forward to the inner Material element. Allow that one name.
53
+ '@angular-eslint/no-input-rename': ['error', { allowedNames: ['class'] }],
54
+ '@typescript-eslint/no-unused-vars': [
55
+ 'error',
56
+ {
57
+ argsIgnorePattern: '^_',
58
+ varsIgnorePattern: '^_',
59
+ caughtErrorsIgnorePattern: '^_',
60
+ ignoreRestSiblings: true,
61
+ },
62
+ ],
63
+ '@typescript-eslint/no-explicit-any': 'off',
64
+ '@typescript-eslint/explicit-function-return-type': 'off',
65
+ '@typescript-eslint/explicit-module-boundary-types': 'off',
66
+ },
67
+ },
68
+ // Template files
69
+ {
70
+ files: ['**/*.html'],
71
+ extends: [...angular.configs.templateRecommended, ...angular.configs.templateAccessibility],
72
+ rules: {},
73
+ },
74
+ // Inline template processor + GraphQL rules (plugin handles schema detection)
75
+ ...angularGraphqlPlugin.configs,
76
+ );
@@ -0,0 +1,7 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <UIBundle xmlns="http://soap.sforce.com/2006/04/metadata">
3
+ <masterLabel>feature-angular-authentication</masterLabel>
4
+ <description>A Salesforce UI Bundle.</description>
5
+ <isActive>true</isActive>
6
+ <version>1</version>
7
+ </UIBundle>
@@ -0,0 +1,3 @@
1
+ import { createHtmlMiddleware } from '@salesforce/angular-plugin-ui-bundle';
2
+
3
+ export default await createHtmlMiddleware();
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Proxy middleware for Angular CLI dev server.
3
+ *
4
+ * Forwards `/services/*` and other manifest-routed paths to the connected
5
+ * Salesforce org with authentication. Watches `ui-bundle.json` for changes
6
+ * and recreates the proxy handler automatically (manual browser refresh needed).
7
+ *
8
+ * Referenced from angular.json: architect.serve.options.middlewares[].
9
+ */
10
+ import { createProxyMiddleware } from '@salesforce/angular-plugin-ui-bundle';
11
+
12
+ export default await createProxyMiddleware();
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "base-angular-app",
3
+ "version": "1.0.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "engines": {
7
+ "node": ">=22"
8
+ },
9
+ "scripts": {
10
+ "dev": "sf-angular-serve",
11
+ "dev:design": "sf-angular-serve --design",
12
+ "build": "ng lint && ng build",
13
+ "watch": "ng build --watch --configuration development",
14
+ "test": "ng test",
15
+ "lint": "ng lint",
16
+ "build:e2e": "ng lint && ng build && node scripts/rewrite-e2e-assets.mjs",
17
+ "e2e": "playwright test",
18
+ "graphql:schema": "node scripts/get-graphql-schema.mjs",
19
+ "graphql:codegen": "graphql-codegen"
20
+ },
21
+ "dependencies": {
22
+ "@angular/cdk": "^21.2.0",
23
+ "@angular/common": "^21.2.0",
24
+ "@angular/compiler": "^21.2.0",
25
+ "@angular/core": "^21.2.0",
26
+ "@angular/forms": "^21.2.0",
27
+ "@angular/platform-browser": "^21.2.0",
28
+ "@angular/router": "^21.2.0",
29
+ "@ng-icons/core": "^32.2.0",
30
+ "@ng-icons/lucide": "^32.2.0",
31
+ "@salesforce/angular-plugin-ui-bundle": "^12.5.4",
32
+ "@salesforce/platform-sdk": "^12.5.4",
33
+ "@spartan-ng/brain": "^1.3.1",
34
+ "class-variance-authority": "^0.7.1",
35
+ "clsx": "^2.1.1",
36
+ "rxjs": "~7.8.0",
37
+ "tailwind-merge": "^3.5.0",
38
+ "tslib": "^2.3.0"
39
+ },
40
+ "devDependencies": {
41
+ "@angular-builders/custom-esbuild": "^21.0.0",
42
+ "@angular-eslint/builder": "^21.0.0",
43
+ "@angular/build": "^21.2.11",
44
+ "@angular/cli": "^21.2.11",
45
+ "@angular/compiler-cli": "^21.2.0",
46
+ "@eslint/js": "^9.0.0",
47
+ "@graphql-codegen/cli": "^6.1.0",
48
+ "@graphql-codegen/typescript-operations": "^5.0.6",
49
+ "@graphql-eslint/eslint-plugin": "^4.1.0",
50
+ "@playwright/test": "^1.49.0",
51
+ "@spartan-ng/cli": "^1.3.1",
52
+ "@tailwindcss/postcss": "^4.0.0",
53
+ "angular-eslint": "^21.0.0",
54
+ "eslint": "^9.0.0",
55
+ "graphql": "^16.11.0",
56
+ "graphql-codegen-typescript-operation-types": "^2.0.2",
57
+ "jsdom": "^28.0.0",
58
+ "postcss": "^8.5.0",
59
+ "serve": "^14.2.5",
60
+ "tailwindcss": "^4.0.0",
61
+ "typescript": "~5.9.2",
62
+ "typescript-eslint": "^8.0.0",
63
+ "vitest": "^4.1.0",
64
+ "@salesforce/graphiti": "^12.5.4"
65
+ },
66
+ "overrides": {
67
+ "undici": "^7.28.0"
68
+ }
69
+ }
@@ -0,0 +1,25 @@
1
+ import { defineConfig, devices } from '@playwright/test';
2
+
3
+ const E2E_PORT = 5176;
4
+
5
+ export default defineConfig({
6
+ testDir: './e2e',
7
+ fullyParallel: true,
8
+ forbidOnly: !!process.env.CI,
9
+ retries: process.env.CI ? 2 : 0,
10
+ workers: process.env.CI ? 1 : undefined,
11
+ reporter: 'html',
12
+ use: {
13
+ baseURL: `http://localhost:${E2E_PORT}`,
14
+ trace: 'on-first-retry',
15
+ },
16
+ projects: [{ name: 'chromium', use: { ...devices['Desktop Chrome'] } }],
17
+ webServer: {
18
+ // Serve built dist/ with a static server so e2e works in CI without an SF org
19
+ // (ng serve runs the SF plugin/proxy middleware and can fail without an org).
20
+ command: `npx serve dist -l ${E2E_PORT}`,
21
+ url: `http://localhost:${E2E_PORT}`,
22
+ reuseExistingServer: !process.env.CI,
23
+ timeout: process.env.CI ? 120_000 : 60_000,
24
+ },
25
+ });