@mouryaamit/nx-polystack 0.0.0-stage → 1.0.1

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 (680) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +77 -2
  3. package/USER-MANUAL.md +1968 -0
  4. package/dist/bin/cli.d.ts +1 -0
  5. package/dist/bin/cli.js +92 -0
  6. package/dist/bin/cli.js.map +1 -0
  7. package/dist/executors.json +32 -0
  8. package/dist/generators.json +47 -0
  9. package/dist/migrations.json +87 -0
  10. package/dist/runtime/env-secret.cjs +736 -0
  11. package/dist/src/cli/args.d.ts +18 -0
  12. package/dist/src/cli/args.js +67 -0
  13. package/dist/src/cli/args.js.map +1 -0
  14. package/dist/src/cli/commands/app.d.ts +3 -0
  15. package/dist/src/cli/commands/app.js +108 -0
  16. package/dist/src/cli/commands/app.js.map +1 -0
  17. package/dist/src/cli/commands/build.d.ts +8 -0
  18. package/dist/src/cli/commands/build.js +132 -0
  19. package/dist/src/cli/commands/build.js.map +1 -0
  20. package/dist/src/cli/commands/csp.d.ts +19 -0
  21. package/dist/src/cli/commands/csp.js +238 -0
  22. package/dist/src/cli/commands/csp.js.map +1 -0
  23. package/dist/src/cli/commands/encryption.d.ts +4 -0
  24. package/dist/src/cli/commands/encryption.js +261 -0
  25. package/dist/src/cli/commands/encryption.js.map +1 -0
  26. package/dist/src/cli/commands/env.d.ts +2 -0
  27. package/dist/src/cli/commands/env.js +74 -0
  28. package/dist/src/cli/commands/env.js.map +1 -0
  29. package/dist/src/cli/commands/hardening.d.ts +2 -0
  30. package/dist/src/cli/commands/hardening.js +176 -0
  31. package/dist/src/cli/commands/hardening.js.map +1 -0
  32. package/dist/src/cli/commands/index.d.ts +3 -0
  33. package/dist/src/cli/commands/index.js +45 -0
  34. package/dist/src/cli/commands/index.js.map +1 -0
  35. package/dist/src/cli/commands/infra.d.ts +25 -0
  36. package/dist/src/cli/commands/infra.js +85 -0
  37. package/dist/src/cli/commands/infra.js.map +1 -0
  38. package/dist/src/cli/commands/internal-migrate.d.ts +3 -0
  39. package/dist/src/cli/commands/internal-migrate.js +65 -0
  40. package/dist/src/cli/commands/internal-migrate.js.map +1 -0
  41. package/dist/src/cli/commands/lib.d.ts +2 -0
  42. package/dist/src/cli/commands/lib.js +70 -0
  43. package/dist/src/cli/commands/lib.js.map +1 -0
  44. package/dist/src/cli/commands/llm.d.ts +2 -0
  45. package/dist/src/cli/commands/llm.js +46 -0
  46. package/dist/src/cli/commands/llm.js.map +1 -0
  47. package/dist/src/cli/commands/migrate.d.ts +2 -0
  48. package/dist/src/cli/commands/migrate.js +230 -0
  49. package/dist/src/cli/commands/migrate.js.map +1 -0
  50. package/dist/src/cli/commands/new.d.ts +6 -0
  51. package/dist/src/cli/commands/new.js +97 -0
  52. package/dist/src/cli/commands/new.js.map +1 -0
  53. package/dist/src/cli/commands/preset.d.ts +2 -0
  54. package/dist/src/cli/commands/preset.js +47 -0
  55. package/dist/src/cli/commands/preset.js.map +1 -0
  56. package/dist/src/cli/commands/release.d.ts +3 -0
  57. package/dist/src/cli/commands/release.js +83 -0
  58. package/dist/src/cli/commands/release.js.map +1 -0
  59. package/dist/src/cli/commands/shared.d.ts +3 -0
  60. package/dist/src/cli/commands/shared.js +55 -0
  61. package/dist/src/cli/commands/shared.js.map +1 -0
  62. package/dist/src/cli/commands/update.d.ts +11 -0
  63. package/dist/src/cli/commands/update.js +120 -0
  64. package/dist/src/cli/commands/update.js.map +1 -0
  65. package/dist/src/cli/context.d.ts +18 -0
  66. package/dist/src/cli/context.js +66 -0
  67. package/dist/src/cli/context.js.map +1 -0
  68. package/dist/src/cli/exec.d.ts +9 -0
  69. package/dist/src/cli/exec.js +34 -0
  70. package/dist/src/cli/exec.js.map +1 -0
  71. package/dist/src/cli/help.d.ts +1 -0
  72. package/dist/src/cli/help.js +291 -0
  73. package/dist/src/cli/help.js.map +1 -0
  74. package/dist/src/cli/install-source.d.ts +16 -0
  75. package/dist/src/cli/install-source.js +49 -0
  76. package/dist/src/cli/install-source.js.map +1 -0
  77. package/dist/src/cli/launcher.d.ts +32 -0
  78. package/dist/src/cli/launcher.js +168 -0
  79. package/dist/src/cli/launcher.js.map +1 -0
  80. package/dist/src/cli/migrations.d.ts +25 -0
  81. package/dist/src/cli/migrations.js +35 -0
  82. package/dist/src/cli/migrations.js.map +1 -0
  83. package/dist/src/cli/run-tree.d.ts +9 -0
  84. package/dist/src/cli/run-tree.js +32 -0
  85. package/dist/src/cli/run-tree.js.map +1 -0
  86. package/dist/src/cli/types.d.ts +18 -0
  87. package/dist/src/cli/types.js +12 -0
  88. package/dist/src/cli/types.js.map +1 -0
  89. package/dist/src/cli/update-plan.d.ts +15 -0
  90. package/dist/src/cli/update-plan.js +40 -0
  91. package/dist/src/cli/update-plan.js.map +1 -0
  92. package/dist/src/cli/versions.d.ts +26 -0
  93. package/dist/src/cli/versions.js +83 -0
  94. package/dist/src/cli/versions.js.map +1 -0
  95. package/dist/src/executors/build/executor.d.ts +19 -0
  96. package/dist/src/executors/build/executor.js +251 -0
  97. package/dist/src/executors/build/executor.js.map +1 -0
  98. package/dist/src/executors/build/schema.d.ts +42 -0
  99. package/dist/src/executors/build/schema.json +104 -0
  100. package/dist/src/executors/capacitor/executor.d.ts +8 -0
  101. package/dist/src/executors/capacitor/executor.js +45 -0
  102. package/dist/src/executors/capacitor/executor.js.map +1 -0
  103. package/dist/src/executors/capacitor/schema.d.ts +10 -0
  104. package/dist/src/executors/capacitor/schema.json +24 -0
  105. package/dist/src/executors/clean/executor.d.ts +19 -0
  106. package/dist/src/executors/clean/executor.js +134 -0
  107. package/dist/src/executors/clean/executor.js.map +1 -0
  108. package/dist/src/executors/clean/schema.d.ts +6 -0
  109. package/dist/src/executors/clean/schema.json +21 -0
  110. package/dist/src/executors/flutter-build/executor.d.ts +8 -0
  111. package/dist/src/executors/flutter-build/executor.js +70 -0
  112. package/dist/src/executors/flutter-build/executor.js.map +1 -0
  113. package/dist/src/executors/flutter-build/schema.d.ts +10 -0
  114. package/dist/src/executors/flutter-build/schema.json +44 -0
  115. package/dist/src/executors/flutter-export/executor.d.ts +8 -0
  116. package/dist/src/executors/flutter-export/executor.js +36 -0
  117. package/dist/src/executors/flutter-export/executor.js.map +1 -0
  118. package/dist/src/executors/flutter-export/schema.d.ts +6 -0
  119. package/dist/src/executors/flutter-export/schema.json +28 -0
  120. package/dist/src/generators/app/files/angular/.eslintrc.json__template__ +28 -0
  121. package/dist/src/generators/app/files/angular/csp-allowlist.json__template__ +1 -0
  122. package/dist/src/generators/app/files/angular/server/README.md__template__ +31 -0
  123. package/dist/src/generators/app/files/angular/src/app/app-routing.module.ts__template__ +10 -0
  124. package/dist/src/generators/app/files/angular/src/app/app.component.html__template__ +4 -0
  125. package/dist/src/generators/app/files/angular/src/app/app.component.scss__template__ +1 -0
  126. package/dist/src/generators/app/files/angular/src/app/app.component.ts__template__ +9 -0
  127. package/dist/src/generators/app/files/angular/src/app/app.module.ts__template__ +13 -0
  128. package/dist/src/generators/app/files/angular/src/index.html__template__ +12 -0
  129. package/dist/src/generators/app/files/angular/src/main.ts__template__ +16 -0
  130. package/dist/src/generators/app/files/angular/src/styles.scss__template__ +1 -0
  131. package/dist/src/generators/app/files/angular/tsconfig.app.json__template__ +10 -0
  132. package/dist/src/generators/app/files/angular/tsconfig.json__template__ +25 -0
  133. package/dist/src/generators/app/files/angular/tsconfig.spec.json__template__ +8 -0
  134. package/dist/src/generators/app/files/flutter/.gitignore__template__ +10 -0
  135. package/dist/src/generators/app/files/flutter/analysis_options.yaml__template__ +8 -0
  136. package/dist/src/generators/app/files/flutter/lib/main.dart__template__ +23 -0
  137. package/dist/src/generators/app/files/flutter/pubspec.yaml__template__ +26 -0
  138. package/dist/src/generators/app/files/flutter/server/nginx.conf__template__ +35 -0
  139. package/dist/src/generators/app/files/ionic/.gitignore__template__ +7 -0
  140. package/dist/src/generators/app/files/ionic/capacitor.config.ts__template__ +19 -0
  141. package/dist/src/generators/app/files/ionic/package.json__template__ +14 -0
  142. package/dist/src/generators/app/files/ionic/src/app/app.component.html__template__ +3 -0
  143. package/dist/src/generators/app/files/ionic/src/app/app.component.scss__template__ +0 -0
  144. package/dist/src/generators/app/files/ionic/src/app/app.module.ts__template__ +16 -0
  145. package/dist/src/generators/app/files/ionic/src/index.html__template__ +17 -0
  146. package/dist/src/generators/app/files/ionic/src/styles.scss__template__ +12 -0
  147. package/dist/src/generators/app/generator.d.ts +15 -0
  148. package/dist/src/generators/app/generator.js +363 -0
  149. package/dist/src/generators/app/generator.js.map +1 -0
  150. package/dist/src/generators/app/schema.d.ts +19 -0
  151. package/dist/src/generators/app/schema.json +77 -0
  152. package/dist/src/generators/env/generator.d.ts +3 -0
  153. package/dist/src/generators/env/generator.js +454 -0
  154. package/dist/src/generators/env/generator.js.map +1 -0
  155. package/dist/src/generators/env/schema.d.ts +18 -0
  156. package/dist/src/generators/env/schema.json +47 -0
  157. package/dist/src/generators/infra/files/ci/commitlint/commitlint.config.js__template__ +6 -0
  158. package/dist/src/generators/infra/files/ci/common/tools/config/allowed-cycles.json__template__ +1 -0
  159. package/dist/src/generators/infra/files/ci/common/tools/scripts/check-cycles.js__template__ +201 -0
  160. package/dist/src/generators/infra/files/ci/github-actions/.github/workflows/ci.yml__template__ +68 -0
  161. package/dist/src/generators/infra/files/ci/github-actions/.github/workflows/pr-title.yml__template__ +36 -0
  162. package/dist/src/generators/infra/files/ci/jenkins/Jenkinsfile__template__ +45 -0
  163. package/dist/src/generators/infra/files/docs/.github/ISSUE_TEMPLATE/bug.yml__template__ +39 -0
  164. package/dist/src/generators/infra/files/docs/.github/ISSUE_TEMPLATE/config.yml__template__ +1 -0
  165. package/dist/src/generators/infra/files/docs/.github/ISSUE_TEMPLATE/feature.yml__template__ +23 -0
  166. package/dist/src/generators/infra/files/docs/.github/PULL_REQUEST_TEMPLATE.md__template__ +23 -0
  167. package/dist/src/generators/infra/files/docs/CODE_OF_CONDUCT.md__template__ +18 -0
  168. package/dist/src/generators/infra/files/docs/CONTRIBUTING.md__template__ +61 -0
  169. package/dist/src/generators/infra/files/docs/SECURITY.md__template__ +25 -0
  170. package/dist/src/generators/infra/files/quality/.husky/pre-push__template__ +2 -0
  171. package/dist/src/generators/infra/files/quality/.secretlintignore__template__ +7 -0
  172. package/dist/src/generators/infra/files/quality/.secretlintrc.json__template__ +7 -0
  173. package/dist/src/generators/infra/files/quality/knip.json__template__ +9 -0
  174. package/dist/src/generators/infra/files/upgrades/.github/workflows/dependency-upgrade.yml__template__ +80 -0
  175. package/dist/src/generators/infra/generator.d.ts +60 -0
  176. package/dist/src/generators/infra/generator.js +356 -0
  177. package/dist/src/generators/infra/generator.js.map +1 -0
  178. package/dist/src/generators/infra/options.d.ts +28 -0
  179. package/dist/src/generators/infra/options.js +80 -0
  180. package/dist/src/generators/infra/options.js.map +1 -0
  181. package/dist/src/generators/infra/schema.d.ts +19 -0
  182. package/dist/src/generators/infra/schema.json +59 -0
  183. package/dist/src/generators/lib/angular-lib.d.ts +27 -0
  184. package/dist/src/generators/lib/angular-lib.js +85 -0
  185. package/dist/src/generators/lib/angular-lib.js.map +1 -0
  186. package/dist/src/generators/lib/files/angular/component/src/index.ts__template__ +2 -0
  187. package/dist/src/generators/lib/files/angular/component/src/lib/__fileName__/__fileName__.component.html__template__ +1 -0
  188. package/dist/src/generators/lib/files/angular/component/src/lib/__fileName__/__fileName__.component.scss__template__ +3 -0
  189. package/dist/src/generators/lib/files/angular/component/src/lib/__fileName__/__fileName__.component.ts__template__ +9 -0
  190. package/dist/src/generators/lib/files/angular/component/src/lib/__fileName__.module.ts__template__ +11 -0
  191. package/dist/src/generators/lib/files/angular/config/.eslintrc.json__template__ +32 -0
  192. package/dist/src/generators/lib/files/angular/config/tsconfig.json__template__ +22 -0
  193. package/dist/src/generators/lib/files/angular/config/tsconfig.lib.json__template__ +12 -0
  194. package/dist/src/generators/lib/files/assets/README.md__template__ +13 -0
  195. package/dist/src/generators/lib/files/design-tokens/README.md__template__ +90 -0
  196. package/dist/src/generators/lib/files/design-tokens/generated/dart/pubspec.yaml__template__ +11 -0
  197. package/dist/src/generators/lib/files/design-tokens/src/index.ts__template__ +1 -0
  198. package/dist/src/generators/lib/files/design-tokens/style-dictionary.config.js__template__ +41 -0
  199. package/dist/src/generators/lib/files/flutter/.gitignore__template__ +7 -0
  200. package/dist/src/generators/lib/files/flutter/analysis_options.yaml__template__ +6 -0
  201. package/dist/src/generators/lib/files/flutter/lib/__snakeName__.dart__template__ +1 -0
  202. package/dist/src/generators/lib/files/flutter/lib/src/__snakeName__.dart__template__ +6 -0
  203. package/dist/src/generators/lib/files/flutter/pubspec.yaml__template__ +18 -0
  204. package/dist/src/generators/lib/files/flutter/test/__snakeName___test.dart__template__ +8 -0
  205. package/dist/src/generators/lib/files/ionic/src/index.ts__template__ +2 -0
  206. package/dist/src/generators/lib/files/ionic/src/lib/__fileName__/__fileName__.page.html__template__ +9 -0
  207. package/dist/src/generators/lib/files/ionic/src/lib/__fileName__/__fileName__.page.scss__template__ +3 -0
  208. package/dist/src/generators/lib/files/ionic/src/lib/__fileName__/__fileName__.page.ts__template__ +9 -0
  209. package/dist/src/generators/lib/files/ionic/src/lib/__fileName__.module.ts__template__ +12 -0
  210. package/dist/src/generators/lib/files/pii/README.md__template__ +35 -0
  211. package/dist/src/generators/lib/files/pii/src/index.ts__template__ +5 -0
  212. package/dist/src/generators/lib/files/pii/src/lib/pii-mask.directive.ts__template__ +30 -0
  213. package/dist/src/generators/lib/files/pii/src/lib/pii-mask.module.ts__template__ +17 -0
  214. package/dist/src/generators/lib/files/pii/src/lib/pii-mask.options.ts__template__ +6 -0
  215. package/dist/src/generators/lib/files/pii/src/lib/pii-mask.pipe.ts__template__ +14 -0
  216. package/dist/src/generators/lib/files/pii/src/lib/pii-mask.ts__template__ +117 -0
  217. package/dist/src/generators/lib/files/session/README.md__template__ +39 -0
  218. package/dist/src/generators/lib/files/session/src/index.ts__template__ +5 -0
  219. package/dist/src/generators/lib/files/session/src/lib/session-clock.ts__template__ +113 -0
  220. package/dist/src/generators/lib/files/session/src/lib/session-timeout.config.ts__template__ +8 -0
  221. package/dist/src/generators/lib/files/session/src/lib/session-timeout.module.ts__template__ +23 -0
  222. package/dist/src/generators/lib/files/session/src/lib/session-timeout.service.ts__template__ +289 -0
  223. package/dist/src/generators/lib/files/session/src/lib/session-warning/session-warning.component.html__template__ +21 -0
  224. package/dist/src/generators/lib/files/session/src/lib/session-warning/session-warning.component.scss__template__ +40 -0
  225. package/dist/src/generators/lib/files/session/src/lib/session-warning/session-warning.component.ts__template__ +105 -0
  226. package/dist/src/generators/lib/files/state/ngrx/README.md__template__ +33 -0
  227. package/dist/src/generators/lib/files/state/ngrx/src/index.ts__template__ +6 -0
  228. package/dist/src/generators/lib/files/state/ngrx/src/lib/__fileName__-state.module.ts__template__ +18 -0
  229. package/dist/src/generators/lib/files/state/ngrx/src/lib/__fileName__.actions.ts__template__ +12 -0
  230. package/dist/src/generators/lib/files/state/ngrx/src/lib/__fileName__.effects.ts__template__ +26 -0
  231. package/dist/src/generators/lib/files/state/ngrx/src/lib/__fileName__.models.ts__template__ +4 -0
  232. package/dist/src/generators/lib/files/state/ngrx/src/lib/__fileName__.reducer.ts__template__ +33 -0
  233. package/dist/src/generators/lib/files/state/ngrx/src/lib/__fileName__.selectors.ts__template__ +14 -0
  234. package/dist/src/generators/lib/files/state/simple-service/README.md__template__ +20 -0
  235. package/dist/src/generators/lib/files/state/simple-service/src/index.ts__template__ +2 -0
  236. package/dist/src/generators/lib/files/state/simple-service/src/lib/__fileName__.store.ts__template__ +58 -0
  237. package/dist/src/generators/lib/files/state/simple-service/src/lib/store.ts__template__ +34 -0
  238. package/dist/src/generators/lib/files/styles/README.md__template__ +39 -0
  239. package/dist/src/generators/lib/files/styles/src/_index.scss__template__ +3 -0
  240. package/dist/src/generators/lib/files/styles/src/mixins/_index.scss__template__ +13 -0
  241. package/dist/src/generators/lib/files/styles/src/themes/_index.scss__template__ +20 -0
  242. package/dist/src/generators/lib/files/styles/src/tokens/_index.scss__template__ +27 -0
  243. package/dist/src/generators/lib/files/ts/config/.eslintrc.json__template__ +10 -0
  244. package/dist/src/generators/lib/files/ts/config/tsconfig.json__template__ +14 -0
  245. package/dist/src/generators/lib/files/ts/config/tsconfig.lib.json__template__ +10 -0
  246. package/dist/src/generators/lib/files/ts/sample/src/index.ts__template__ +1 -0
  247. package/dist/src/generators/lib/files/ts/sample/src/lib/__fileName__.ts__template__ +4 -0
  248. package/dist/src/generators/lib/generator.d.ts +3 -0
  249. package/dist/src/generators/lib/generator.js +53 -0
  250. package/dist/src/generators/lib/generator.js.map +1 -0
  251. package/dist/src/generators/lib/lib-utils.d.ts +72 -0
  252. package/dist/src/generators/lib/lib-utils.js +170 -0
  253. package/dist/src/generators/lib/lib-utils.js.map +1 -0
  254. package/dist/src/generators/lib/schema.d.ts +31 -0
  255. package/dist/src/generators/lib/schema.json +63 -0
  256. package/dist/src/generators/lib/style-dictionary.d.ts +36 -0
  257. package/dist/src/generators/lib/style-dictionary.js +183 -0
  258. package/dist/src/generators/lib/style-dictionary.js.map +1 -0
  259. package/dist/src/generators/lib/types/angular.d.ts +2 -0
  260. package/dist/src/generators/lib/types/angular.js +20 -0
  261. package/dist/src/generators/lib/types/angular.js.map +1 -0
  262. package/dist/src/generators/lib/types/assets.d.ts +2 -0
  263. package/dist/src/generators/lib/types/assets.js +20 -0
  264. package/dist/src/generators/lib/types/assets.js.map +1 -0
  265. package/dist/src/generators/lib/types/design-tokens.d.ts +10 -0
  266. package/dist/src/generators/lib/types/design-tokens.js +78 -0
  267. package/dist/src/generators/lib/types/design-tokens.js.map +1 -0
  268. package/dist/src/generators/lib/types/flutter.d.ts +2 -0
  269. package/dist/src/generators/lib/types/flutter.js +28 -0
  270. package/dist/src/generators/lib/types/flutter.js.map +1 -0
  271. package/dist/src/generators/lib/types/index.d.ts +8 -0
  272. package/dist/src/generators/lib/types/index.js +31 -0
  273. package/dist/src/generators/lib/types/index.js.map +1 -0
  274. package/dist/src/generators/lib/types/ionic.d.ts +4 -0
  275. package/dist/src/generators/lib/types/ionic.js +35 -0
  276. package/dist/src/generators/lib/types/ionic.js.map +1 -0
  277. package/dist/src/generators/lib/types/pii.d.ts +3 -0
  278. package/dist/src/generators/lib/types/pii.js +19 -0
  279. package/dist/src/generators/lib/types/pii.js.map +1 -0
  280. package/dist/src/generators/lib/types/session.d.ts +3 -0
  281. package/dist/src/generators/lib/types/session.js +21 -0
  282. package/dist/src/generators/lib/types/session.js.map +1 -0
  283. package/dist/src/generators/lib/types/state.d.ts +5 -0
  284. package/dist/src/generators/lib/types/state.js +48 -0
  285. package/dist/src/generators/lib/types/state.js.map +1 -0
  286. package/dist/src/generators/lib/types/styles.d.ts +2 -0
  287. package/dist/src/generators/lib/types/styles.js +19 -0
  288. package/dist/src/generators/lib/types/styles.js.map +1 -0
  289. package/dist/src/generators/lib/types/ts.d.ts +5 -0
  290. package/dist/src/generators/lib/types/ts.js +30 -0
  291. package/dist/src/generators/lib/types/ts.js.map +1 -0
  292. package/dist/src/generators/llm/generator.d.ts +8 -0
  293. package/dist/src/generators/llm/generator.js +13 -0
  294. package/dist/src/generators/llm/generator.js.map +1 -0
  295. package/dist/src/generators/llm/schema.d.ts +4 -0
  296. package/dist/src/generators/llm/schema.json +16 -0
  297. package/dist/src/generators/migrate/adapters/angular-cli.d.ts +82 -0
  298. package/dist/src/generators/migrate/adapters/angular-cli.js +439 -0
  299. package/dist/src/generators/migrate/adapters/angular-cli.js.map +1 -0
  300. package/dist/src/generators/migrate/adapters/angular-workspace.d.ts +28 -0
  301. package/dist/src/generators/migrate/adapters/angular-workspace.js +397 -0
  302. package/dist/src/generators/migrate/adapters/angular-workspace.js.map +1 -0
  303. package/dist/src/generators/migrate/adapters/external.d.ts +23 -0
  304. package/dist/src/generators/migrate/adapters/external.js +230 -0
  305. package/dist/src/generators/migrate/adapters/external.js.map +1 -0
  306. package/dist/src/generators/migrate/adapters/flutter.d.ts +26 -0
  307. package/dist/src/generators/migrate/adapters/flutter.js +176 -0
  308. package/dist/src/generators/migrate/adapters/flutter.js.map +1 -0
  309. package/dist/src/generators/migrate/adapters/index.d.ts +34 -0
  310. package/dist/src/generators/migrate/adapters/index.js +136 -0
  311. package/dist/src/generators/migrate/adapters/index.js.map +1 -0
  312. package/dist/src/generators/migrate/adapters/ionic.d.ts +17 -0
  313. package/dist/src/generators/migrate/adapters/ionic.js +137 -0
  314. package/dist/src/generators/migrate/adapters/ionic.js.map +1 -0
  315. package/dist/src/generators/migrate/adapters/npm-workspaces.d.ts +23 -0
  316. package/dist/src/generators/migrate/adapters/npm-workspaces.js +734 -0
  317. package/dist/src/generators/migrate/adapters/npm-workspaces.js.map +1 -0
  318. package/dist/src/generators/migrate/adapters/nx-workspace.d.ts +47 -0
  319. package/dist/src/generators/migrate/adapters/nx-workspace.js +1037 -0
  320. package/dist/src/generators/migrate/adapters/nx-workspace.js.map +1 -0
  321. package/dist/src/generators/migrate/adapters/scaffold.d.ts +2 -0
  322. package/dist/src/generators/migrate/adapters/scaffold.js +200 -0
  323. package/dist/src/generators/migrate/adapters/scaffold.js.map +1 -0
  324. package/dist/src/generators/migrate/adapters/types.d.ts +184 -0
  325. package/dist/src/generators/migrate/adapters/types.js +63 -0
  326. package/dist/src/generators/migrate/adapters/types.js.map +1 -0
  327. package/dist/src/generators/migrate/angular-code-scan.d.ts +6 -0
  328. package/dist/src/generators/migrate/angular-code-scan.js +150 -0
  329. package/dist/src/generators/migrate/angular-code-scan.js.map +1 -0
  330. package/dist/src/generators/migrate/angular-config-files.d.ts +49 -0
  331. package/dist/src/generators/migrate/angular-config-files.js +158 -0
  332. package/dist/src/generators/migrate/angular-config-files.js.map +1 -0
  333. package/dist/src/generators/migrate/angular-project-json.d.ts +73 -0
  334. package/dist/src/generators/migrate/angular-project-json.js +352 -0
  335. package/dist/src/generators/migrate/angular-project-json.js.map +1 -0
  336. package/dist/src/generators/migrate/angular-workspace/aliases.d.ts +30 -0
  337. package/dist/src/generators/migrate/angular-workspace/aliases.js +73 -0
  338. package/dist/src/generators/migrate/angular-workspace/aliases.js.map +1 -0
  339. package/dist/src/generators/migrate/angular-workspace/eslint.d.ts +8 -0
  340. package/dist/src/generators/migrate/angular-workspace/eslint.js +38 -0
  341. package/dist/src/generators/migrate/angular-workspace/eslint.js.map +1 -0
  342. package/dist/src/generators/migrate/angular-workspace/ng-package.d.ts +4 -0
  343. package/dist/src/generators/migrate/angular-workspace/ng-package.js +16 -0
  344. package/dist/src/generators/migrate/angular-workspace/ng-package.js.map +1 -0
  345. package/dist/src/generators/migrate/angular-workspace/source.d.ts +15 -0
  346. package/dist/src/generators/migrate/angular-workspace/source.js +108 -0
  347. package/dist/src/generators/migrate/angular-workspace/source.js.map +1 -0
  348. package/dist/src/generators/migrate/angular17.d.ts +45 -0
  349. package/dist/src/generators/migrate/angular17.js +495 -0
  350. package/dist/src/generators/migrate/angular17.js.map +1 -0
  351. package/dist/src/generators/migrate/batch.d.ts +29 -0
  352. package/dist/src/generators/migrate/batch.js +211 -0
  353. package/dist/src/generators/migrate/batch.js.map +1 -0
  354. package/dist/src/generators/migrate/copy.d.ts +60 -0
  355. package/dist/src/generators/migrate/copy.js +224 -0
  356. package/dist/src/generators/migrate/copy.js.map +1 -0
  357. package/dist/src/generators/migrate/dependencies.d.ts +38 -0
  358. package/dist/src/generators/migrate/dependencies.js +196 -0
  359. package/dist/src/generators/migrate/dependencies.js.map +1 -0
  360. package/dist/src/generators/migrate/generator.d.ts +9 -0
  361. package/dist/src/generators/migrate/generator.js +347 -0
  362. package/dist/src/generators/migrate/generator.js.map +1 -0
  363. package/dist/src/generators/migrate/imports/rewrite.d.ts +46 -0
  364. package/dist/src/generators/migrate/imports/rewrite.js +382 -0
  365. package/dist/src/generators/migrate/imports/rewrite.js.map +1 -0
  366. package/dist/src/generators/migrate/ionic/capacitor-config.d.ts +24 -0
  367. package/dist/src/generators/migrate/ionic/capacitor-config.js +113 -0
  368. package/dist/src/generators/migrate/ionic/capacitor-config.js.map +1 -0
  369. package/dist/src/generators/migrate/ionic/packages.d.ts +34 -0
  370. package/dist/src/generators/migrate/ionic/packages.js +92 -0
  371. package/dist/src/generators/migrate/ionic/packages.js.map +1 -0
  372. package/dist/src/generators/migrate/ionic/shape.d.ts +32 -0
  373. package/dist/src/generators/migrate/ionic/shape.js +221 -0
  374. package/dist/src/generators/migrate/ionic/shape.js.map +1 -0
  375. package/dist/src/generators/migrate/ionic/skip.d.ts +3 -0
  376. package/dist/src/generators/migrate/ionic/skip.js +25 -0
  377. package/dist/src/generators/migrate/ionic/skip.js.map +1 -0
  378. package/dist/src/generators/migrate/names.d.ts +3 -0
  379. package/dist/src/generators/migrate/names.js +21 -0
  380. package/dist/src/generators/migrate/names.js.map +1 -0
  381. package/dist/src/generators/migrate/npm-deps.d.ts +28 -0
  382. package/dist/src/generators/migrate/npm-deps.js +63 -0
  383. package/dist/src/generators/migrate/npm-deps.js.map +1 -0
  384. package/dist/src/generators/migrate/npm-workspaces/pnpm-yaml.d.ts +10 -0
  385. package/dist/src/generators/migrate/npm-workspaces/pnpm-yaml.js +246 -0
  386. package/dist/src/generators/migrate/npm-workspaces/pnpm-yaml.js.map +1 -0
  387. package/dist/src/generators/migrate/npm-workspaces/source.d.ts +46 -0
  388. package/dist/src/generators/migrate/npm-workspaces/source.js +253 -0
  389. package/dist/src/generators/migrate/npm-workspaces/source.js.map +1 -0
  390. package/dist/src/generators/migrate/nx/build-scripts.d.ts +22 -0
  391. package/dist/src/generators/migrate/nx/build-scripts.js +147 -0
  392. package/dist/src/generators/migrate/nx/build-scripts.js.map +1 -0
  393. package/dist/src/generators/migrate/nx/detect.d.ts +3 -0
  394. package/dist/src/generators/migrate/nx/detect.js +43 -0
  395. package/dist/src/generators/migrate/nx/detect.js.map +1 -0
  396. package/dist/src/generators/migrate/nx/env-encryption.d.ts +35 -0
  397. package/dist/src/generators/migrate/nx/env-encryption.js +423 -0
  398. package/dist/src/generators/migrate/nx/env-encryption.js.map +1 -0
  399. package/dist/src/generators/migrate/nx/rewrite.d.ts +27 -0
  400. package/dist/src/generators/migrate/nx/rewrite.js +223 -0
  401. package/dist/src/generators/migrate/nx/rewrite.js.map +1 -0
  402. package/dist/src/generators/migrate/nx/selection.d.ts +25 -0
  403. package/dist/src/generators/migrate/nx/selection.js +173 -0
  404. package/dist/src/generators/migrate/nx/selection.js.map +1 -0
  405. package/dist/src/generators/migrate/nx/shared-folders.d.ts +58 -0
  406. package/dist/src/generators/migrate/nx/shared-folders.js +239 -0
  407. package/dist/src/generators/migrate/nx/shared-folders.js.map +1 -0
  408. package/dist/src/generators/migrate/nx/workspace-source.d.ts +58 -0
  409. package/dist/src/generators/migrate/nx/workspace-source.js +275 -0
  410. package/dist/src/generators/migrate/nx/workspace-source.js.map +1 -0
  411. package/dist/src/generators/migrate/pnpm.d.ts +42 -0
  412. package/dist/src/generators/migrate/pnpm.js +132 -0
  413. package/dist/src/generators/migrate/pnpm.js.map +1 -0
  414. package/dist/src/generators/migrate/report.d.ts +21 -0
  415. package/dist/src/generators/migrate/report.js +243 -0
  416. package/dist/src/generators/migrate/report.js.map +1 -0
  417. package/dist/src/generators/migrate/rollback/manifest.d.ts +84 -0
  418. package/dist/src/generators/migrate/rollback/manifest.js +162 -0
  419. package/dist/src/generators/migrate/rollback/manifest.js.map +1 -0
  420. package/dist/src/generators/migrate/rollback/recording-tree.d.ts +19 -0
  421. package/dist/src/generators/migrate/rollback/recording-tree.js +87 -0
  422. package/dist/src/generators/migrate/rollback/recording-tree.js.map +1 -0
  423. package/dist/src/generators/migrate/rollback/rollback.d.ts +29 -0
  424. package/dist/src/generators/migrate/rollback/rollback.js +271 -0
  425. package/dist/src/generators/migrate/rollback/rollback.js.map +1 -0
  426. package/dist/src/generators/migrate/schema.d.ts +41 -0
  427. package/dist/src/generators/migrate/schema.json +85 -0
  428. package/dist/src/generators/migrate/source.d.ts +26 -0
  429. package/dist/src/generators/migrate/source.js +70 -0
  430. package/dist/src/generators/migrate/source.js.map +1 -0
  431. package/dist/src/generators/preset/files/root/.editorconfig__template__ +15 -0
  432. package/dist/src/generators/preset/files/root/.eslintignore__template__ +2 -0
  433. package/dist/src/generators/preset/files/root/.eslintrc.json__template__ +38 -0
  434. package/dist/src/generators/preset/files/root/.gitattributes__template__ +12 -0
  435. package/dist/src/generators/preset/files/root/.gitignore__template__ +9 -0
  436. package/dist/src/generators/preset/files/root/.husky/commit-msg__template__ +1 -0
  437. package/dist/src/generators/preset/files/root/.husky/pre-commit__template__ +1 -0
  438. package/dist/src/generators/preset/files/root/.npmrc__template__ +4 -0
  439. package/dist/src/generators/preset/files/root/.nvmrc__template__ +1 -0
  440. package/dist/src/generators/preset/files/root/.prettierignore__template__ +6 -0
  441. package/dist/src/generators/preset/files/root/.prettierrc__template__ +7 -0
  442. package/dist/src/generators/preset/files/root/commitlint.config.js__template__ +6 -0
  443. package/dist/src/generators/preset/files/root/nx.json__template__ +30 -0
  444. package/dist/src/generators/preset/files/root/package.json__template__ +34 -0
  445. package/dist/src/generators/preset/files/root/tools/config/sri-cdn-allowlist.json__template__ +1 -0
  446. package/dist/src/generators/preset/files/root/tsconfig.base.json__template__ +18 -0
  447. package/dist/src/generators/preset/generator.d.ts +11 -0
  448. package/dist/src/generators/preset/generator.js +91 -0
  449. package/dist/src/generators/preset/generator.js.map +1 -0
  450. package/dist/src/generators/preset/schema.d.ts +20 -0
  451. package/dist/src/generators/preset/schema.json +86 -0
  452. package/dist/src/generators/shared-libs/generator.d.ts +4 -0
  453. package/dist/src/generators/shared-libs/generator.js +60 -0
  454. package/dist/src/generators/shared-libs/generator.js.map +1 -0
  455. package/dist/src/generators/shared-libs/schema.d.ts +6 -0
  456. package/dist/src/generators/shared-libs/schema.json +21 -0
  457. package/dist/src/index.d.ts +16 -0
  458. package/dist/src/index.js +20 -0
  459. package/dist/src/index.js.map +1 -0
  460. package/dist/src/lib/csp/allowlist.d.ts +64 -0
  461. package/dist/src/lib/csp/allowlist.js +126 -0
  462. package/dist/src/lib/csp/allowlist.js.map +1 -0
  463. package/dist/src/lib/csp/import.d.ts +52 -0
  464. package/dist/src/lib/csp/import.js +291 -0
  465. package/dist/src/lib/csp/import.js.map +1 -0
  466. package/dist/src/lib/csp/render.d.ts +19 -0
  467. package/dist/src/lib/csp/render.js +116 -0
  468. package/dist/src/lib/csp/render.js.map +1 -0
  469. package/dist/src/lib/env/derive.d.ts +38 -0
  470. package/dist/src/lib/env/derive.js +115 -0
  471. package/dist/src/lib/env/derive.js.map +1 -0
  472. package/dist/src/lib/env-encryption/backup.d.ts +40 -0
  473. package/dist/src/lib/env-encryption/backup.js +234 -0
  474. package/dist/src/lib/env-encryption/backup.js.map +1 -0
  475. package/dist/src/lib/env-encryption/config.d.ts +50 -0
  476. package/dist/src/lib/env-encryption/config.js +173 -0
  477. package/dist/src/lib/env-encryption/config.js.map +1 -0
  478. package/dist/src/lib/env-encryption/domains.d.ts +9 -0
  479. package/dist/src/lib/env-encryption/domains.js +52 -0
  480. package/dist/src/lib/env-encryption/domains.js.map +1 -0
  481. package/dist/src/lib/env-encryption/encrypt.d.ts +48 -0
  482. package/dist/src/lib/env-encryption/encrypt.js +407 -0
  483. package/dist/src/lib/env-encryption/encrypt.js.map +1 -0
  484. package/dist/src/lib/env-encryption/env-file.d.ts +72 -0
  485. package/dist/src/lib/env-encryption/env-file.js +395 -0
  486. package/dist/src/lib/env-encryption/env-file.js.map +1 -0
  487. package/dist/src/lib/env-encryption/gcm.d.ts +51 -0
  488. package/dist/src/lib/env-encryption/gcm.js +76 -0
  489. package/dist/src/lib/env-encryption/gcm.js.map +1 -0
  490. package/dist/src/lib/env-encryption/key-material.d.ts +53 -0
  491. package/dist/src/lib/env-encryption/key-material.js +148 -0
  492. package/dist/src/lib/env-encryption/key-material.js.map +1 -0
  493. package/dist/src/lib/env-encryption/placeholders.d.ts +15 -0
  494. package/dist/src/lib/env-encryption/placeholders.js +93 -0
  495. package/dist/src/lib/env-encryption/placeholders.js.map +1 -0
  496. package/dist/src/lib/env-encryption/prepare.d.ts +43 -0
  497. package/dist/src/lib/env-encryption/prepare.js +245 -0
  498. package/dist/src/lib/env-encryption/prepare.js.map +1 -0
  499. package/dist/src/lib/env-encryption/sensitive.d.ts +2 -0
  500. package/dist/src/lib/env-encryption/sensitive.js +180 -0
  501. package/dist/src/lib/env-encryption/sensitive.js.map +1 -0
  502. package/dist/src/lib/env-encryption/stamp.d.ts +2 -0
  503. package/dist/src/lib/env-encryption/stamp.js +52 -0
  504. package/dist/src/lib/env-encryption/stamp.js.map +1 -0
  505. package/dist/src/lib/env-encryption/switch-gcm.d.ts +43 -0
  506. package/dist/src/lib/env-encryption/switch-gcm.js +371 -0
  507. package/dist/src/lib/env-encryption/switch-gcm.js.map +1 -0
  508. package/dist/src/lib/env-encryption/workspace.d.ts +10 -0
  509. package/dist/src/lib/env-encryption/workspace.js +48 -0
  510. package/dist/src/lib/env-encryption/workspace.js.map +1 -0
  511. package/dist/src/lib/hardening/files.d.ts +17 -0
  512. package/dist/src/lib/hardening/files.js +43 -0
  513. package/dist/src/lib/hardening/files.js.map +1 -0
  514. package/dist/src/lib/hardening/integrity.d.ts +24 -0
  515. package/dist/src/lib/hardening/integrity.js +112 -0
  516. package/dist/src/lib/hardening/integrity.js.map +1 -0
  517. package/dist/src/lib/hardening/leak-check.d.ts +15 -0
  518. package/dist/src/lib/hardening/leak-check.js +100 -0
  519. package/dist/src/lib/hardening/leak-check.js.map +1 -0
  520. package/dist/src/lib/hardening/ngsw.d.ts +7 -0
  521. package/dist/src/lib/hardening/ngsw.js +55 -0
  522. package/dist/src/lib/hardening/ngsw.js.map +1 -0
  523. package/dist/src/lib/hardening/obfuscate.d.ts +36 -0
  524. package/dist/src/lib/hardening/obfuscate.js +153 -0
  525. package/dist/src/lib/hardening/obfuscate.js.map +1 -0
  526. package/dist/src/lib/hardening/options.d.ts +36 -0
  527. package/dist/src/lib/hardening/options.js +143 -0
  528. package/dist/src/lib/hardening/options.js.map +1 -0
  529. package/dist/src/lib/hardening/source-maps.d.ts +7 -0
  530. package/dist/src/lib/hardening/source-maps.js +37 -0
  531. package/dist/src/lib/hardening/source-maps.js.map +1 -0
  532. package/dist/src/lib/hardening/strip.d.ts +55 -0
  533. package/dist/src/lib/hardening/strip.js +178 -0
  534. package/dist/src/lib/hardening/strip.js.map +1 -0
  535. package/dist/src/lib/helpers/encrypt-env.d.ts +13 -0
  536. package/dist/src/lib/helpers/encrypt-env.js +33 -0
  537. package/dist/src/lib/helpers/encrypt-env.js.map +1 -0
  538. package/dist/src/lib/helpers/inject-meta.d.ts +14 -0
  539. package/dist/src/lib/helpers/inject-meta.js +49 -0
  540. package/dist/src/lib/helpers/inject-meta.js.map +1 -0
  541. package/dist/src/lib/helpers/inject-nonce.d.ts +7 -0
  542. package/dist/src/lib/helpers/inject-nonce.js +59 -0
  543. package/dist/src/lib/helpers/inject-nonce.js.map +1 -0
  544. package/dist/src/lib/helpers/inject-sri.d.ts +11 -0
  545. package/dist/src/lib/helpers/inject-sri.js +92 -0
  546. package/dist/src/lib/helpers/inject-sri.js.map +1 -0
  547. package/dist/src/lib/helpers/strip-exif.d.ts +9 -0
  548. package/dist/src/lib/helpers/strip-exif.js +52 -0
  549. package/dist/src/lib/helpers/strip-exif.js.map +1 -0
  550. package/dist/src/lib/release/plan.d.ts +45 -0
  551. package/dist/src/lib/release/plan.js +76 -0
  552. package/dist/src/lib/release/plan.js.map +1 -0
  553. package/dist/src/lib/release/run.d.ts +46 -0
  554. package/dist/src/lib/release/run.js +160 -0
  555. package/dist/src/lib/release/run.js.map +1 -0
  556. package/dist/src/lib/utils/angular-deps.d.ts +22 -0
  557. package/dist/src/lib/utils/angular-deps.js +108 -0
  558. package/dist/src/lib/utils/angular-deps.js.map +1 -0
  559. package/dist/src/lib/utils/angular-project.d.ts +52 -0
  560. package/dist/src/lib/utils/angular-project.js +168 -0
  561. package/dist/src/lib/utils/angular-project.js.map +1 -0
  562. package/dist/src/lib/utils/app-dir.d.ts +17 -0
  563. package/dist/src/lib/utils/app-dir.js +52 -0
  564. package/dist/src/lib/utils/app-dir.js.map +1 -0
  565. package/dist/src/lib/utils/base-href.d.ts +26 -0
  566. package/dist/src/lib/utils/base-href.js +60 -0
  567. package/dist/src/lib/utils/base-href.js.map +1 -0
  568. package/dist/src/lib/utils/ci-resolve.d.ts +10 -0
  569. package/dist/src/lib/utils/ci-resolve.js +50 -0
  570. package/dist/src/lib/utils/ci-resolve.js.map +1 -0
  571. package/dist/src/lib/utils/csp-nonce.d.ts +34 -0
  572. package/dist/src/lib/utils/csp-nonce.js +142 -0
  573. package/dist/src/lib/utils/csp-nonce.js.map +1 -0
  574. package/dist/src/lib/utils/dependencies.d.ts +25 -0
  575. package/dist/src/lib/utils/dependencies.js +71 -0
  576. package/dist/src/lib/utils/dependencies.js.map +1 -0
  577. package/dist/src/lib/utils/devkit-deps.d.ts +19 -0
  578. package/dist/src/lib/utils/devkit-deps.js +34 -0
  579. package/dist/src/lib/utils/devkit-deps.js.map +1 -0
  580. package/dist/src/lib/utils/env-files.d.ts +18 -0
  581. package/dist/src/lib/utils/env-files.js +41 -0
  582. package/dist/src/lib/utils/env-files.js.map +1 -0
  583. package/dist/src/lib/utils/filesystem.d.ts +7 -0
  584. package/dist/src/lib/utils/filesystem.js +20 -0
  585. package/dist/src/lib/utils/filesystem.js.map +1 -0
  586. package/dist/src/lib/utils/flutter-web.d.ts +7 -0
  587. package/dist/src/lib/utils/flutter-web.js +56 -0
  588. package/dist/src/lib/utils/flutter-web.js.map +1 -0
  589. package/dist/src/lib/utils/knip.d.ts +16 -0
  590. package/dist/src/lib/utils/knip.js +71 -0
  591. package/dist/src/lib/utils/knip.js.map +1 -0
  592. package/dist/src/lib/utils/lint-staged.d.ts +5 -0
  593. package/dist/src/lib/utils/lint-staged.js +34 -0
  594. package/dist/src/lib/utils/lint-staged.js.map +1 -0
  595. package/dist/src/lib/utils/llm-block.d.ts +88 -0
  596. package/dist/src/lib/utils/llm-block.js +457 -0
  597. package/dist/src/lib/utils/llm-block.js.map +1 -0
  598. package/dist/src/lib/utils/node-engine.d.ts +9 -0
  599. package/dist/src/lib/utils/node-engine.js +63 -0
  600. package/dist/src/lib/utils/node-engine.js.map +1 -0
  601. package/dist/src/lib/utils/npm-scripts.d.ts +7 -0
  602. package/dist/src/lib/utils/npm-scripts.js +28 -0
  603. package/dist/src/lib/utils/npm-scripts.js.map +1 -0
  604. package/dist/src/lib/utils/nx-targets.d.ts +3 -0
  605. package/dist/src/lib/utils/nx-targets.js +25 -0
  606. package/dist/src/lib/utils/nx-targets.js.map +1 -0
  607. package/dist/src/lib/utils/project-json-files.d.ts +23 -0
  608. package/dist/src/lib/utils/project-json-files.js +73 -0
  609. package/dist/src/lib/utils/project-json-files.js.map +1 -0
  610. package/dist/src/lib/utils/quality.d.ts +71 -0
  611. package/dist/src/lib/utils/quality.js +295 -0
  612. package/dist/src/lib/utils/quality.js.map +1 -0
  613. package/dist/src/lib/utils/serve-port.d.ts +28 -0
  614. package/dist/src/lib/utils/serve-port.js +73 -0
  615. package/dist/src/lib/utils/serve-port.js.map +1 -0
  616. package/dist/src/lib/utils/shared-libs.d.ts +37 -0
  617. package/dist/src/lib/utils/shared-libs.js +152 -0
  618. package/dist/src/lib/utils/shared-libs.js.map +1 -0
  619. package/dist/src/lib/utils/ts-paths.d.ts +3 -0
  620. package/dist/src/lib/utils/ts-paths.js +31 -0
  621. package/dist/src/lib/utils/ts-paths.js.map +1 -0
  622. package/dist/src/lib/utils/workspace.d.ts +3 -0
  623. package/dist/src/lib/utils/workspace.js +15 -0
  624. package/dist/src/lib/utils/workspace.js.map +1 -0
  625. package/dist/src/migrate-sdk.d.ts +31 -0
  626. package/dist/src/migrate-sdk.js +35 -0
  627. package/dist/src/migrate-sdk.js.map +1 -0
  628. package/dist/src/migrations/add-csp-nonce-import/add-csp-nonce-import.d.ts +2 -0
  629. package/dist/src/migrations/add-csp-nonce-import/add-csp-nonce-import.js +40 -0
  630. package/dist/src/migrations/add-csp-nonce-import/add-csp-nonce-import.js.map +1 -0
  631. package/dist/src/migrations/add-executor-peers/add-executor-peers.d.ts +6 -0
  632. package/dist/src/migrations/add-executor-peers/add-executor-peers.js +21 -0
  633. package/dist/src/migrations/add-executor-peers/add-executor-peers.js.map +1 -0
  634. package/dist/src/migrations/add-lib-build-dependencies/add-lib-build-dependencies.d.ts +7 -0
  635. package/dist/src/migrations/add-lib-build-dependencies/add-lib-build-dependencies.js +47 -0
  636. package/dist/src/migrations/add-lib-build-dependencies/add-lib-build-dependencies.js.map +1 -0
  637. package/dist/src/migrations/add-lint-dependencies/add-lint-dependencies.d.ts +6 -0
  638. package/dist/src/migrations/add-lint-dependencies/add-lint-dependencies.js +27 -0
  639. package/dist/src/migrations/add-lint-dependencies/add-lint-dependencies.js.map +1 -0
  640. package/dist/src/migrations/add-lint-staged-config/add-lint-staged-config.d.ts +7 -0
  641. package/dist/src/migrations/add-lint-staged-config/add-lint-staged-config.js +22 -0
  642. package/dist/src/migrations/add-lint-staged-config/add-lint-staged-config.js.map +1 -0
  643. package/dist/src/migrations/angular-release-target/angular-release-target.d.ts +3 -0
  644. package/dist/src/migrations/angular-release-target/angular-release-target.js +80 -0
  645. package/dist/src/migrations/angular-release-target/angular-release-target.js.map +1 -0
  646. package/dist/src/migrations/app-clean-and-port/app-clean-and-port.d.ts +7 -0
  647. package/dist/src/migrations/app-clean-and-port/app-clean-and-port.js +89 -0
  648. package/dist/src/migrations/app-clean-and-port/app-clean-and-port.js.map +1 -0
  649. package/dist/src/migrations/env-encryption-config/env-encryption-config.d.ts +7 -0
  650. package/dist/src/migrations/env-encryption-config/env-encryption-config.js +42 -0
  651. package/dist/src/migrations/env-encryption-config/env-encryption-config.js.map +1 -0
  652. package/dist/src/migrations/env-encryption-key-sources/env-encryption-key-sources.d.ts +3 -0
  653. package/dist/src/migrations/env-encryption-key-sources/env-encryption-key-sources.js +15 -0
  654. package/dist/src/migrations/env-encryption-key-sources/env-encryption-key-sources.js.map +1 -0
  655. package/dist/src/migrations/fix-lint-script/fix-lint-script.d.ts +7 -0
  656. package/dist/src/migrations/fix-lint-script/fix-lint-script.js +27 -0
  657. package/dist/src/migrations/fix-lint-script/fix-lint-script.js.map +1 -0
  658. package/dist/src/migrations/flutter-web-platform/flutter-web-platform.d.ts +8 -0
  659. package/dist/src/migrations/flutter-web-platform/flutter-web-platform.js +35 -0
  660. package/dist/src/migrations/flutter-web-platform/flutter-web-platform.js.map +1 -0
  661. package/dist/src/migrations/plugin-repo-dev/plugin-repo-dev.d.ts +9 -0
  662. package/dist/src/migrations/plugin-repo-dev/plugin-repo-dev.js +42 -0
  663. package/dist/src/migrations/plugin-repo-dev/plugin-repo-dev.js.map +1 -0
  664. package/dist/src/migrations/prepush-audit-warn-only/prepush-audit-warn-only.d.ts +8 -0
  665. package/dist/src/migrations/prepush-audit-warn-only/prepush-audit-warn-only.js +30 -0
  666. package/dist/src/migrations/prepush-audit-warn-only/prepush-audit-warn-only.js.map +1 -0
  667. package/dist/src/migrations/quality-checks/quality-checks.d.ts +7 -0
  668. package/dist/src/migrations/quality-checks/quality-checks.js +46 -0
  669. package/dist/src/migrations/quality-checks/quality-checks.js.map +1 -0
  670. package/dist/src/migrations/release-hardening/release-hardening.d.ts +8 -0
  671. package/dist/src/migrations/release-hardening/release-hardening.js +98 -0
  672. package/dist/src/migrations/release-hardening/release-hardening.js.map +1 -0
  673. package/dist/src/migrations/sharp-security-update/sharp-security-update.d.ts +10 -0
  674. package/dist/src/migrations/sharp-security-update/sharp-security-update.js +40 -0
  675. package/dist/src/migrations/sharp-security-update/sharp-security-update.js.map +1 -0
  676. package/migrate/package.json +5 -0
  677. package/package.json +120 -4
  678. package/runtime/csp-nonce.js +109 -0
  679. package/runtime/env-secret.d.ts +63 -0
  680. package/runtime/env-secret.mjs +698 -0
@@ -0,0 +1,117 @@
1
+ /**
2
+ * PII masking without Angular: plain functions, unit-testable. A value that does not look like
3
+ * its format is masked completely (fail closed), never shown — in any script (Devanagari digits,
4
+ * full-width letters and names in Indian scripts are masked too).
5
+ */
6
+ export interface PiiMaskRule {
7
+ /** The value must match (after trimming) or it is masked completely. */
8
+ valid?: RegExp;
9
+ /** Characters (letters and digits) left visible at the start. */
10
+ visibleStart?: number;
11
+ /** Characters left visible at the end. At least half of them stay masked whatever is set. */
12
+ visibleEnd?: number;
13
+ /** Full control: returns the masked text (`valid` is still checked first). */
14
+ mask?: (value: string, maskChar: string) => string;
15
+ }
16
+
17
+ export interface PiiMaskOptions {
18
+ /** Character that replaces hidden characters (default X; only its first character is used). */
19
+ maskChar?: string;
20
+ /** Extra or replacement formats, by name. */
21
+ rules?: Record<string, PiiMaskRule>;
22
+ }
23
+
24
+ /** Letters, combining marks (e.g. Devanagari vowel signs) and digits of every script. */
25
+ const MASKABLE = /[\p{L}\p{M}\p{N}]/gu;
26
+
27
+ const digitsOf = (v: string) => v.replace(/\D/g, '');
28
+
29
+ /** Built-in formats. */
30
+ export const PII_FORMATS: Readonly<Record<string, PiiMaskRule>> = {
31
+ /** PAN: ABCDE1234F → XXXXX1234F */
32
+ pan: {
33
+ valid: /^[A-Za-z]{5}\d{4}[A-Za-z]$/,
34
+ mask: (v, c) => c.repeat(5) + v.slice(5).toUpperCase(),
35
+ },
36
+ /** Aadhaar: 1234 5678 9012 → XXXX XXXX 9012 */
37
+ aadhaar: {
38
+ valid: /^\d{4}[\s-]?\d{4}[\s-]?\d{4}$/,
39
+ mask: (v, c) => `${c.repeat(4)} ${c.repeat(4)} ${digitsOf(v).slice(8)}`,
40
+ },
41
+ /** Mobile: +91 98765 43210 → +91 XXXXX X3210, +919876543210 → +91XXXXXX3210 */
42
+ mobile: {
43
+ valid: /^(\+\d{1,3}?[\s-]?)?\d{5}[\s-]?\d{5}$/,
44
+ mask: (v, c) => {
45
+ // The same anchored split as `valid`: the country code is the shortest prefix that leaves
46
+ // a ten-digit number.
47
+ const m = /^(\+\d{1,3}?[\s-]?)?(\d{5}[\s-]?\d{5})$/.exec(v);
48
+ return m ? (m[1] ?? '') + maskChars(m[2], c, 0, 4) : maskChars(v, c);
49
+ },
50
+ },
51
+ /** Email: asha.k@example.com → aXXX@example.com (one-letter names are masked too) */
52
+ email: {
53
+ valid: /^[^\s@]+@[^\s@]+\.[^\s@]+$/,
54
+ mask: (v, c) => {
55
+ const at = v.lastIndexOf('@');
56
+ const local = Array.from(v.slice(0, at));
57
+ return `${local.length > 1 ? local[0] : c}${c.repeat(3)}${v.slice(at)}`;
58
+ },
59
+ },
60
+ /** Bank account number: last 4 visible */
61
+ account: { valid: /^\d{6,18}$/, visibleEnd: 4 },
62
+ /** Card number: 4111 1111 1111 1111 → XXXX XXXX XXXX 1111 */
63
+ card: {
64
+ valid: /^(?=(?:\D*\d){12,19}\D*$)[\d\s-]+$/,
65
+ visibleEnd: 4,
66
+ },
67
+ /** IFSC: not personal, shown as it is when valid */
68
+ ifsc: { valid: /^[A-Za-z]{4}0[A-Za-z0-9]{6}$/, mask: (v) => v.toUpperCase() },
69
+ };
70
+
71
+ /**
72
+ * Masks letters and digits (any script), keeping separators and the first/last visible ones;
73
+ * at most half of them are ever shown.
74
+ */
75
+ export function maskChars(
76
+ value: string,
77
+ maskChar: string,
78
+ visibleStart = 0,
79
+ visibleEnd = 0,
80
+ ): string {
81
+ const total = (value.match(MASKABLE) ?? []).length;
82
+ const shown = Math.floor(total / 2);
83
+ const end = Math.min(Math.max(visibleEnd, 0), shown);
84
+ const start = Math.min(Math.max(visibleStart, 0), shown - end);
85
+ let seen = 0;
86
+ return value.replace(MASKABLE, (ch) => {
87
+ seen++;
88
+ return seen <= start || seen > total - end ? ch : maskChar;
89
+ });
90
+ }
91
+
92
+ /** The mask character: the first character of the option, else X. */
93
+ function maskCharOf(option: unknown): string {
94
+ const first = Array.from(typeof option === 'string' ? option : '')[0];
95
+ return first && first.trim() !== '' ? first : 'X';
96
+ }
97
+
98
+ /** `value` masked as `format`; empty for null/undefined; fully masked when it does not match. */
99
+ export function maskPii(value: unknown, format: string, options: PiiMaskOptions = {}): string {
100
+ if (value === null || value === undefined) return '';
101
+ const text = String(value).trim();
102
+ if (text === '') return '';
103
+ const maskChar = maskCharOf(options.maskChar);
104
+ const rules = options.rules ?? {};
105
+ const rule = Object.prototype.hasOwnProperty.call(rules, format)
106
+ ? rules[format]
107
+ : Object.prototype.hasOwnProperty.call(PII_FORMATS, format)
108
+ ? PII_FORMATS[format]
109
+ : undefined;
110
+ if (!rule) return maskChars(text, maskChar);
111
+ if (rule.valid) {
112
+ rule.valid.lastIndex = 0; // a /g or /y pattern keeps state between test() calls
113
+ if (!rule.valid.test(text)) return maskChars(text, maskChar);
114
+ }
115
+ if (rule.mask) return rule.mask(text, maskChar);
116
+ return maskChars(text, maskChar, rule.visibleStart ?? 0, rule.visibleEnd ?? 0);
117
+ }
@@ -0,0 +1,39 @@
1
+ # <%= importPath %>
2
+
3
+ Session and idle timeout for Angular apps. It reports; it never signs anyone out — logout, tokens
4
+ and server calls stay in the app.
5
+
6
+ ```ts
7
+ // app.module.ts (root module only)
8
+ imports: [SessionTimeoutModule.forRoot({ idleMs: 15 * 60_000, warningMs: 60_000, absoluteMs: 8 * 60 * 60_000 })]
9
+
10
+ // after login (loginTime in milliseconds, persisted so a reload keeps the absolute limit)
11
+ this.session.start(loginTime);
12
+ this.session.timeout$.subscribe((reason) => this.auth.logout(reason));
13
+ this.session.stoppedElsewhere$.subscribe(() => this.auth.logout('elsewhere'));
14
+ // in auth.logout()
15
+ this.session.stop();
16
+ ```
17
+
18
+ ```html
19
+ <<%= prefix %>-session-warning (signOut)="auth.logout()"></<%= prefix %>-session-warning>
20
+ ```
21
+
22
+ - **Idle**: mouse, keys, touch, wheel and scroll on the document count as activity
23
+ (`activityEvents`), also while the warning is shown; `idleMs` without activity times the
24
+ session out. Activity inside iframes is not seen.
25
+ - **Warning**: `warningMs` before the timeout `state$` turns to `warning` and `warning$` counts
26
+ down the seconds; `extend()` (the component's "Stay signed in") counts as activity.
27
+ - **Absolute limit** (`absoluteMs`, optional): the session ends that long after the `start()`
28
+ time, whatever the activity; "Stay signed in" is not offered then.
29
+ - **States**: `stopped`, `active`, `warning`, `timedOut`. Sign out on `timeout$` (once per
30
+ session); `state$` is for the UI.
31
+ - **Tabs**: activity, timeouts and logouts are shared between the app's tabs (BroadcastChannel,
32
+ or localStorage events where it is missing; the key includes the app's base path, so two apps
33
+ on one domain stay apart). A tab that slept checks the others' last activity before timing out.
34
+ `stoppedElsewhere$` fires when another tab signs out: sign this one out too.
35
+ - **Warning component**: non-modal, moves focus to its first button, announces the time left to
36
+ screen readers when it opens and at 30, 10 and 5 seconds; `[texts]` replaces the English texts.
37
+ - Timers and messages from other tabs run outside Angular's zone; the state is emitted only when
38
+ it changes (every second during the warning). Nothing runs during server-side rendering.
39
+ - `sessionState()` in `session-clock.ts` is the timing logic without Angular, for tests.
@@ -0,0 +1,5 @@
1
+ export * from './lib/session-clock';
2
+ export * from './lib/session-timeout.config';
3
+ export * from './lib/session-timeout.service';
4
+ export * from './lib/session-timeout.module';
5
+ export * from './lib/session-warning/session-warning.component';
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Session timing without Angular or RxJS: what the session looks like at a given moment.
3
+ * Kept separate so it can be unit-tested with plain numbers.
4
+ */
5
+ export interface SessionTimeoutConfig {
6
+ /** Time without user activity before the session times out (ms). */
7
+ idleMs: number;
8
+ /** How long before the timeout the warning starts (ms). */
9
+ warningMs: number;
10
+ /** Maximum session length since start, whatever the activity (ms); unset: no limit. */
11
+ absoluteMs?: number;
12
+ /** DOM events on the document that count as activity. */
13
+ activityEvents: string[];
14
+ /**
15
+ * BroadcastChannel / localStorage key shared by the app's tabs. The app's base path is added,
16
+ * so two apps on one domain (/retail/, /corporate/) do not share sessions.
17
+ */
18
+ channelName: string;
19
+ /** How often the state is checked (ms). */
20
+ tickMs: number;
21
+ }
22
+
23
+ export const DEFAULT_SESSION_TIMEOUT: SessionTimeoutConfig = {
24
+ idleMs: 15 * 60 * 1000,
25
+ warningMs: 60 * 1000,
26
+ activityEvents: ['mousemove', 'mousedown', 'keydown', 'touchstart', 'wheel', 'scroll'],
27
+ channelName: 'session-timeout',
28
+ tickMs: 1000,
29
+ };
30
+
31
+ export type SessionStatus = 'stopped' | 'active' | 'warning' | 'timedOut';
32
+ export type TimeoutReason = 'idle' | 'absolute';
33
+
34
+ export interface SessionState {
35
+ status: SessionStatus;
36
+ /** Time left before the timeout (ms); 0 when stopped or timed out. */
37
+ remainingMs: number;
38
+ /** Which limit comes first: inactivity, or the absolute session length. */
39
+ reason?: TimeoutReason;
40
+ }
41
+
42
+ /** The session at `now`, given when it started and when the user was last active. */
43
+ export function sessionState(
44
+ now: number,
45
+ startedAt: number,
46
+ lastActivity: number,
47
+ config: SessionTimeoutConfig,
48
+ ): SessionState {
49
+ // A clock that went back must not extend the session: times in the future count as now.
50
+ const last = Math.min(lastActivity, now);
51
+ const started = Math.min(startedAt, now);
52
+ const idleLeft = last + config.idleMs - now;
53
+ const absoluteLeft =
54
+ config.absoluteMs === undefined ? Infinity : started + config.absoluteMs - now;
55
+ const reason: TimeoutReason = absoluteLeft <= idleLeft ? 'absolute' : 'idle';
56
+ const remainingMs = Math.min(idleLeft, absoluteLeft);
57
+ // Fail closed: a timestamp that is not a number ends the session instead of keeping it alive.
58
+ if (!(remainingMs > 0)) return { status: 'timedOut', remainingMs: 0, reason };
59
+ if (remainingMs <= config.warningMs) return { status: 'warning', remainingMs, reason };
60
+ return { status: 'active', remainingMs, reason };
61
+ }
62
+
63
+ /** Problems with a configuration, empty when it is usable. */
64
+ export function sessionConfigProblems(config: SessionTimeoutConfig): string[] {
65
+ const problems: string[] = [];
66
+ const positive = (n: unknown) => typeof n === 'number' && Number.isFinite(n) && n > 0;
67
+ if (!positive(config.idleMs)) problems.push('idleMs must be a positive number of milliseconds');
68
+ if (!(typeof config.warningMs === 'number' && config.warningMs >= 0)) {
69
+ problems.push('warningMs must be zero or more milliseconds');
70
+ } else if (positive(config.idleMs) && config.warningMs >= config.idleMs) {
71
+ problems.push('warningMs must be shorter than idleMs');
72
+ }
73
+ if (config.absoluteMs !== undefined && !positive(config.absoluteMs)) {
74
+ problems.push('absoluteMs must be a positive number of milliseconds when set');
75
+ }
76
+ if (!positive(config.tickMs)) problems.push('tickMs must be a positive number of milliseconds');
77
+ if (!Array.isArray(config.activityEvents) || config.activityEvents.length === 0) {
78
+ problems.push('activityEvents must list at least one event');
79
+ }
80
+ if (!config.channelName) problems.push('channelName must not be empty');
81
+ return problems;
82
+ }
83
+
84
+ /** Earliest accepted session start (catches seconds passed instead of milliseconds). */
85
+ const EARLIEST = Date.UTC(2000, 0, 1);
86
+ /** Clock difference between tabs that is tolerated for messages. */
87
+ const MAX_SKEW_MS = 5000;
88
+
89
+ /** Why `startedAt` cannot start a session, or null. */
90
+ export function startedAtProblem(startedAt: unknown, now: number): string | null {
91
+ if (typeof startedAt !== 'number' || !Number.isFinite(startedAt)) {
92
+ return 'startedAt must be a time in milliseconds (e.g. Date.now())';
93
+ }
94
+ if (startedAt < EARLIEST) return 'startedAt is before 2000: pass milliseconds, not seconds';
95
+ if (startedAt > now + MAX_SKEW_MS) return 'startedAt is in the future';
96
+ return null;
97
+ }
98
+
99
+ /** An activity time from another tab: a finite number, not ahead of this tab's clock. */
100
+ export function validActivityTime(at: unknown, now: number): at is number {
101
+ return typeof at === 'number' && Number.isFinite(at) && at >= EARLIEST && at <= now + MAX_SKEW_MS;
102
+ }
103
+
104
+ /** The channel / storage key for an app: the configured name plus the app's base path. */
105
+ export function channelKey(channelName: string, baseURI: string | undefined): string {
106
+ let base = '/';
107
+ try {
108
+ base = baseURI ? new URL(baseURI).pathname : '/';
109
+ } catch {
110
+ // keep /
111
+ }
112
+ return `${channelName}:${base}`;
113
+ }
@@ -0,0 +1,8 @@
1
+ import { InjectionToken } from '@angular/core';
2
+
3
+ import { SessionTimeoutConfig } from './session-clock';
4
+
5
+ /** Overrides of DEFAULT_SESSION_TIMEOUT; provide it with SessionTimeoutModule.forRoot(…). */
6
+ export const SESSION_TIMEOUT_CONFIG = new InjectionToken<Partial<SessionTimeoutConfig>>(
7
+ 'SESSION_TIMEOUT_CONFIG',
8
+ );
@@ -0,0 +1,23 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { ModuleWithProviders, NgModule } from '@angular/core';
3
+
4
+ import { SessionTimeoutConfig } from './session-clock';
5
+ import { SESSION_TIMEOUT_CONFIG } from './session-timeout.config';
6
+ import { SessionWarningComponent } from './session-warning/session-warning.component';
7
+
8
+ @NgModule({
9
+ imports: [CommonModule],
10
+ declarations: [SessionWarningComponent],
11
+ exports: [SessionWarningComponent],
12
+ })
13
+ export class SessionTimeoutModule {
14
+ /** In the root module: SessionTimeoutModule.forRoot({ idleMs: 10 * 60_000 }). */
15
+ static forRoot(
16
+ config: Partial<SessionTimeoutConfig> = {},
17
+ ): ModuleWithProviders<SessionTimeoutModule> {
18
+ return {
19
+ ngModule: SessionTimeoutModule,
20
+ providers: [{ provide: SESSION_TIMEOUT_CONFIG, useValue: config }],
21
+ };
22
+ }
23
+ }
@@ -0,0 +1,289 @@
1
+ import { DOCUMENT, isPlatformBrowser } from '@angular/common';
2
+ import { Inject, Injectable, NgZone, OnDestroy, Optional, PLATFORM_ID } from '@angular/core';
3
+ import {
4
+ BehaviorSubject,
5
+ distinctUntilChanged,
6
+ filter,
7
+ fromEvent,
8
+ interval,
9
+ map,
10
+ merge,
11
+ Observable,
12
+ Subject,
13
+ Subscription,
14
+ } from 'rxjs';
15
+
16
+ import {
17
+ channelKey,
18
+ DEFAULT_SESSION_TIMEOUT,
19
+ SessionState,
20
+ sessionConfigProblems,
21
+ sessionState,
22
+ SessionTimeoutConfig,
23
+ startedAtProblem,
24
+ TimeoutReason,
25
+ validActivityTime,
26
+ } from './session-clock';
27
+ import { SESSION_TIMEOUT_CONFIG } from './session-timeout.config';
28
+
29
+ type TabMessage =
30
+ | { type: 'activity'; at: number }
31
+ | { type: 'timeout'; reason: TimeoutReason }
32
+ | { type: 'stop' };
33
+
34
+ /** Activity is recorded (and shared with other tabs) at most this often. */
35
+ const ACTIVITY_THROTTLE_MS = 1000;
36
+
37
+ /**
38
+ * Watches user activity and reports when the session is about to time out and when it has.
39
+ * It never signs anyone out: the app does that on `timeout$` and `stoppedElsewhere$`.
40
+ *
41
+ * session.start(loginTime); // after login
42
+ * session.timeout$.subscribe(() => auth.logout());
43
+ * session.stoppedElsewhere$.subscribe(() => auth.logout()); // logout in another tab
44
+ * session.stop(); // in auth.logout()
45
+ *
46
+ * Any user activity counts, also while the warning is shown (moving the mouse dismisses it).
47
+ * Without a persisted login time, the absolute limit restarts with every page load.
48
+ * Configure it once, in the root module: forRoot() in a lazy module is not seen.
49
+ */
50
+ @Injectable({ providedIn: 'root' })
51
+ export class SessionTimeoutService implements OnDestroy {
52
+ readonly config: SessionTimeoutConfig;
53
+
54
+ private readonly stateSubject = new BehaviorSubject<SessionState>({
55
+ status: 'stopped',
56
+ remainingMs: 0,
57
+ });
58
+ /** Current state; emitted on status changes, and every tick during the warning. */
59
+ readonly state$: Observable<SessionState> = this.stateSubject.asObservable();
60
+ /** Seconds left, while the warning is shown (restarts with every warning). */
61
+ readonly warning$: Observable<number> = this.state$.pipe(
62
+ map((s) => (s.status === 'warning' ? Math.ceil(s.remainingMs / 1000) : null)),
63
+ distinctUntilChanged(),
64
+ filter((s): s is number => s !== null),
65
+ );
66
+ private readonly timeoutSubject = new Subject<TimeoutReason>();
67
+ /** Emits once per session when it times out (here or in another tab). Sign out on it. */
68
+ readonly timeout$: Observable<TimeoutReason> = this.timeoutSubject.asObservable();
69
+ private readonly stoppedElsewhereSubject = new Subject<void>();
70
+ /** Another tab stopped the session (its user signed out): sign this tab out too. */
71
+ readonly stoppedElsewhere$: Observable<void> = this.stoppedElsewhereSubject.asObservable();
72
+
73
+ private readonly browser: boolean;
74
+ private readonly key: string;
75
+ private current: SessionState = { status: 'stopped', remainingMs: 0 };
76
+ private queue: SessionState[] = [];
77
+ private emitting = false;
78
+ private startedAt = 0;
79
+ private lastActivity = 0;
80
+ private timers = new Subscription();
81
+ private channel?: BroadcastChannel;
82
+ private storageListener?: (e: StorageEvent) => void;
83
+
84
+ constructor(
85
+ private readonly zone: NgZone,
86
+ @Inject(DOCUMENT) private readonly document: Document,
87
+ // eslint-disable-next-line @typescript-eslint/ban-types
88
+ @Inject(PLATFORM_ID) platformId: Object,
89
+ @Optional() @Inject(SESSION_TIMEOUT_CONFIG) config: Partial<SessionTimeoutConfig> | null,
90
+ ) {
91
+ this.config = { ...DEFAULT_SESSION_TIMEOUT, ...(config ?? {}) };
92
+ const problems = sessionConfigProblems(this.config);
93
+ if (problems.length > 0) {
94
+ throw new Error(`SessionTimeoutService: ${problems.join('; ')}.`);
95
+ }
96
+ this.browser = isPlatformBrowser(platformId);
97
+ this.key = channelKey(this.config.channelName, this.document.baseURI);
98
+ }
99
+
100
+ get state(): SessionState {
101
+ return this.current;
102
+ }
103
+
104
+ /**
105
+ * Starts watching. `startedAt` (the login time, in milliseconds) is where the absolute limit
106
+ * counts from. Does nothing during server-side rendering.
107
+ */
108
+ start(startedAt = Date.now()): void {
109
+ const problem = startedAtProblem(startedAt, Date.now());
110
+ if (problem) throw new Error(`SessionTimeoutService.start: ${problem}.`);
111
+ this.stop(false);
112
+ if (!this.browser) return;
113
+ this.startedAt = startedAt;
114
+ this.lastActivity = Date.now();
115
+ this.zone.runOutsideAngular(() => {
116
+ const activity = merge(
117
+ ...this.config.activityEvents.map((name) =>
118
+ fromEvent(this.document, name, { passive: true, capture: true }),
119
+ ),
120
+ );
121
+ this.timers.add(activity.subscribe(() => this.recordActivity(Date.now(), true)));
122
+ // Timers are slowed down in background tabs: check again when the tab is shown.
123
+ this.timers.add(fromEvent(this.document, 'visibilitychange').subscribe(() => this.tick()));
124
+ this.timers.add(interval(this.config.tickMs).subscribe(() => this.tick()));
125
+ // Messages from other tabs arrive outside the zone (no change detection per message).
126
+ this.openChannel();
127
+ });
128
+ this.writeSharedActivity(this.lastActivity);
129
+ this.tick(true);
130
+ }
131
+
132
+ /** Stops watching (after logout); other tabs are told unless `broadcast` is false. */
133
+ stop(broadcast = true): void {
134
+ this.timers.unsubscribe();
135
+ this.timers = new Subscription();
136
+ const status = this.current.status;
137
+ if (broadcast && (status === 'active' || status === 'warning')) this.post({ type: 'stop' });
138
+ this.closeChannel();
139
+ if (status !== 'stopped') this.emit({ status: 'stopped', remainingMs: 0 });
140
+ }
141
+
142
+ /** Counts as activity (e.g. "Stay signed in"); does not lift the absolute limit. */
143
+ extend(): void {
144
+ if (this.current.status !== 'active' && this.current.status !== 'warning') return;
145
+ this.recordActivity(Date.now(), true, true);
146
+ this.tick(true);
147
+ }
148
+
149
+ ngOnDestroy(): void {
150
+ this.stop(false);
151
+ this.timeoutSubject.complete();
152
+ this.stoppedElsewhereSubject.complete();
153
+ this.stateSubject.complete();
154
+ }
155
+
156
+ /** States are delivered in order, also when a subscriber calls stop() while one is emitted. */
157
+ private emit(state: SessionState): void {
158
+ this.current = state;
159
+ this.queue.push(state);
160
+ if (this.emitting) return;
161
+ this.emitting = true;
162
+ try {
163
+ while (this.queue.length > 0) {
164
+ const next = this.queue.shift() as SessionState;
165
+ this.zone.run(() => this.stateSubject.next(next));
166
+ }
167
+ } finally {
168
+ this.emitting = false;
169
+ }
170
+ }
171
+
172
+ private recordActivity(at: number, share: boolean, force = false): void {
173
+ if (this.current.status !== 'active' && this.current.status !== 'warning') return;
174
+ if (!force && at - this.lastActivity < ACTIVITY_THROTTLE_MS) return;
175
+ this.lastActivity = Math.max(this.lastActivity, Math.min(at, Date.now()));
176
+ if (share) {
177
+ this.writeSharedActivity(this.lastActivity);
178
+ this.post({ type: 'activity', at: this.lastActivity });
179
+ }
180
+ }
181
+
182
+ private tick(force = false): void {
183
+ // start() forces the first tick while still stopped; afterwards a stopped session stays so.
184
+ if (this.current.status === 'timedOut') return;
185
+ if (this.current.status === 'stopped' && !force) return;
186
+ // A tab that slept missed the other tabs' messages: their last activity is in storage.
187
+ const shared = this.readSharedActivity();
188
+ if (shared !== undefined && shared > this.lastActivity) this.lastActivity = shared;
189
+ const next = sessionState(Date.now(), this.startedAt, this.lastActivity, this.config);
190
+ if (next.status === 'timedOut') {
191
+ if (this.current.status === 'stopped') this.emit({ ...next, status: 'active' });
192
+ this.timeOut(next.reason ?? 'idle', true);
193
+ return;
194
+ }
195
+ if (force || next.status !== this.current.status || next.status === 'warning') {
196
+ this.emit(next);
197
+ }
198
+ }
199
+
200
+ private timeOut(reason: TimeoutReason, share: boolean): void {
201
+ if (this.current.status !== 'active' && this.current.status !== 'warning') return;
202
+ this.timers.unsubscribe();
203
+ this.timers = new Subscription();
204
+ if (share) this.post({ type: 'timeout', reason });
205
+ this.closeChannel();
206
+ this.emit({ status: 'timedOut', remainingMs: 0, reason });
207
+ this.zone.run(() => this.timeoutSubject.next(reason));
208
+ }
209
+
210
+ private onMessage(message: TabMessage): void {
211
+ if (!message || typeof message !== 'object') return;
212
+ if (message.type === 'activity') {
213
+ if (validActivityTime(message.at, Date.now())) this.recordActivity(message.at, false, true);
214
+ } else if (message.type === 'timeout') {
215
+ // The absolute limit is the same everywhere; inactivity is checked against this tab's
216
+ // own activity too, so a tab waking from sleep cannot sign out the one in use.
217
+ if (message.reason === 'absolute') this.timeOut('absolute', false);
218
+ else this.tick();
219
+ } else if (message.type === 'stop') {
220
+ if (this.current.status !== 'active' && this.current.status !== 'warning') return;
221
+ this.stop(false);
222
+ this.zone.run(() => this.stoppedElsewhereSubject.next());
223
+ }
224
+ }
225
+
226
+ // ── tabs: BroadcastChannel, or storage events where it is missing ──────────────
227
+
228
+ private openChannel(): void {
229
+ const view = this.document.defaultView;
230
+ if (typeof BroadcastChannel !== 'undefined') {
231
+ this.channel = new BroadcastChannel(this.key);
232
+ this.channel.onmessage = (e: MessageEvent<TabMessage>) => this.onMessage(e.data);
233
+ } else if (view) {
234
+ this.storageListener = (e: StorageEvent) => {
235
+ if (e.key !== this.key || !e.newValue) return;
236
+ try {
237
+ this.onMessage(JSON.parse(e.newValue) as TabMessage);
238
+ } catch {
239
+ // not one of ours
240
+ }
241
+ };
242
+ view.addEventListener('storage', this.storageListener);
243
+ }
244
+ }
245
+
246
+ private closeChannel(): void {
247
+ this.channel?.close();
248
+ this.channel = undefined;
249
+ if (this.storageListener) {
250
+ this.document.defaultView?.removeEventListener('storage', this.storageListener);
251
+ this.storageListener = undefined;
252
+ }
253
+ }
254
+
255
+ private post(message: TabMessage): void {
256
+ if (this.channel) {
257
+ this.channel.postMessage(message);
258
+ return;
259
+ }
260
+ if (!this.storageListener) return; // no channel open: nobody to tell
261
+ try {
262
+ // A changing value makes the storage event fire in the other tabs.
263
+ this.document.defaultView?.localStorage.setItem(
264
+ this.key,
265
+ JSON.stringify({ ...message, n: Math.random() }),
266
+ );
267
+ } catch {
268
+ // storage blocked (private mode): this tab only
269
+ }
270
+ }
271
+
272
+ private writeSharedActivity(at: number): void {
273
+ try {
274
+ this.document.defaultView?.localStorage.setItem(`${this.key}:last`, String(at));
275
+ } catch {
276
+ // storage blocked: messages only
277
+ }
278
+ }
279
+
280
+ private readSharedActivity(): number | undefined {
281
+ try {
282
+ const raw = this.document.defaultView?.localStorage.getItem(`${this.key}:last`);
283
+ const at = raw === null || raw === undefined ? NaN : Number(raw);
284
+ return validActivityTime(at, Date.now()) ? at : undefined;
285
+ } catch {
286
+ return undefined;
287
+ }
288
+ }
289
+ }
@@ -0,0 +1,21 @@
1
+ <ng-container *ngIf="{ view: view$ | async } as ctx">
2
+ <!-- Always present, so the first announcement is read. -->
3
+ <p class="session-warning__live" aria-live="assertive">{{ ctx.view?.announce }}</p>
4
+ <div
5
+ *ngIf="ctx.view as view"
6
+ class="session-warning"
7
+ role="dialog"
8
+ [attr.aria-labelledby]="id + '-title'"
9
+ [attr.aria-describedby]="id + '-text'"
10
+ >
11
+ <h2 class="session-warning__title" [id]="id + '-title'">{{ view.title }}</h2>
12
+ <p class="session-warning__text" [id]="id + '-text'">{{ view.message }}</p>
13
+ <div class="session-warning__actions">
14
+ <button *ngIf="view.idle" #firstButton type="button" (click)="stay()">{{ view.stay }}</button>
15
+ <button *ngIf="!view.idle" #firstButton type="button" (click)="signOut.emit()">
16
+ {{ view.signOut }}
17
+ </button>
18
+ <button *ngIf="view.idle" type="button" (click)="signOut.emit()">{{ view.signOut }}</button>
19
+ </div>
20
+ </div>
21
+ </ng-container>
@@ -0,0 +1,40 @@
1
+ :host {
2
+ display: contents;
3
+ }
4
+
5
+ .session-warning {
6
+ position: fixed;
7
+ inset: auto 1rem 1rem auto;
8
+ z-index: 1000;
9
+ max-width: 24rem;
10
+ padding: 1rem 1.25rem;
11
+ border-radius: 0.5rem;
12
+ background: #fff;
13
+ color: #1f2937;
14
+ box-shadow: 0 10px 30px rgb(0 0 0 / 20%);
15
+ }
16
+
17
+ .session-warning__title {
18
+ margin: 0 0 0.5rem;
19
+ font-size: 1.1rem;
20
+ }
21
+
22
+ .session-warning__text {
23
+ margin: 0 0 1rem;
24
+ }
25
+
26
+ .session-warning__actions {
27
+ display: flex;
28
+ gap: 0.5rem;
29
+ justify-content: flex-end;
30
+ }
31
+
32
+ /* Read by screen readers, not shown. */
33
+ .session-warning__live {
34
+ position: absolute;
35
+ width: 1px;
36
+ height: 1px;
37
+ overflow: hidden;
38
+ clip: rect(0 0 0 0);
39
+ white-space: nowrap;
40
+ }