@nrwl/angular 13.1.2 → 13.2.0-beta.3

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 (412) hide show
  1. package/README.md +1 -1
  2. package/{esm2015/index.js → esm2020/index.mjs} +0 -0
  3. package/{esm2015/nrwl-angular.js → esm2020/nrwl-angular.mjs} +0 -0
  4. package/esm2020/src/runtime/nx/data-persistence.mjs +327 -0
  5. package/esm2020/src/runtime/nx/nx.module.mjs +21 -0
  6. package/esm2020/testing/index.mjs +19 -0
  7. package/{esm2015/testing/nrwl-angular-testing.js → esm2020/testing/nrwl-angular-testing.mjs} +0 -0
  8. package/{esm2015/testing/src/testing-utils.js → esm2020/testing/src/testing-utils.mjs} +0 -0
  9. package/fesm2015/{nrwl-angular-testing.js → nrwl-angular-testing.mjs} +20 -3
  10. package/fesm2015/nrwl-angular-testing.mjs.map +1 -0
  11. package/fesm2015/{nrwl-angular.js → nrwl-angular.mjs} +17 -13
  12. package/fesm2015/nrwl-angular.mjs.map +1 -0
  13. package/fesm2020/nrwl-angular-testing.mjs +57 -0
  14. package/fesm2020/nrwl-angular-testing.mjs.map +1 -0
  15. package/fesm2020/nrwl-angular.mjs +352 -0
  16. package/fesm2020/nrwl-angular.mjs.map +1 -0
  17. package/generators.js +16 -16
  18. package/generators.js.map +1 -1
  19. package/migrations.json +161 -0
  20. package/ng-package.json +3 -9
  21. package/nrwl-angular.d.ts +1 -0
  22. package/package.json +40 -15
  23. package/src/builders/webpack-browser/schema.json +4 -9
  24. package/src/builders/webpack-browser/webpack-browser.impl.d.ts +1 -1
  25. package/src/builders/webpack-browser/webpack-browser.impl.js +12 -12
  26. package/src/builders/webpack-browser/webpack-browser.impl.js.map +1 -1
  27. package/src/builders/webpack-server/lib/index.js +1 -1
  28. package/src/builders/webpack-server/lib/index.js.map +1 -1
  29. package/src/builders/webpack-server/schema.d.ts +0 -12
  30. package/src/builders/webpack-server/schema.json +0 -104
  31. package/src/builders/webpack-server/webpack-server.impl.d.ts +1 -1
  32. package/src/builders/webpack-server/webpack-server.impl.js +10 -10
  33. package/src/builders/webpack-server/webpack-server.impl.js.map +1 -1
  34. package/src/executors/delegate-build/compat.js +1 -1
  35. package/src/executors/delegate-build/compat.js.map +1 -1
  36. package/src/executors/delegate-build/delegate-build.impl.js +8 -8
  37. package/src/executors/delegate-build/delegate-build.impl.js.map +1 -1
  38. package/src/executors/ng-packagr-lite/compat.js +1 -1
  39. package/src/executors/ng-packagr-lite/compat.js.map +1 -1
  40. package/src/executors/ng-packagr-lite/ng-packagr-adjustments/compile-ngc.d.ts +4 -2
  41. package/src/executors/ng-packagr-lite/ng-packagr-adjustments/compile-ngc.js +22 -15
  42. package/src/executors/ng-packagr-lite/ng-packagr-adjustments/compile-ngc.js.map +1 -1
  43. package/src/executors/ng-packagr-lite/ng-packagr-adjustments/compile-source-files.d.ts +12 -0
  44. package/src/executors/ng-packagr-lite/ng-packagr-adjustments/compile-source-files.js +147 -0
  45. package/src/executors/ng-packagr-lite/ng-packagr-adjustments/compile-source-files.js.map +1 -0
  46. package/src/executors/ng-packagr-lite/ng-packagr-adjustments/entry-point.d.ts +3 -3
  47. package/src/executors/ng-packagr-lite/ng-packagr-adjustments/entry-point.di.js +2 -2
  48. package/src/executors/ng-packagr-lite/ng-packagr-adjustments/entry-point.di.js.map +1 -1
  49. package/src/executors/ng-packagr-lite/ng-packagr-adjustments/entry-point.js +7 -7
  50. package/src/executors/ng-packagr-lite/ng-packagr-adjustments/entry-point.js.map +1 -1
  51. package/src/executors/ng-packagr-lite/ng-packagr-adjustments/package.di.d.ts +1 -1
  52. package/src/executors/ng-packagr-lite/ng-packagr-adjustments/package.di.js +5 -9
  53. package/src/executors/ng-packagr-lite/ng-packagr-adjustments/package.di.js.map +1 -1
  54. package/src/executors/ng-packagr-lite/ng-packagr-adjustments/write-package.d.ts +2 -2
  55. package/src/executors/ng-packagr-lite/ng-packagr-adjustments/write-package.di.d.ts +2 -1
  56. package/src/executors/ng-packagr-lite/ng-packagr-adjustments/write-package.di.js +4 -2
  57. package/src/executors/ng-packagr-lite/ng-packagr-adjustments/write-package.di.js.map +1 -1
  58. package/src/executors/ng-packagr-lite/ng-packagr-adjustments/write-package.js +31 -29
  59. package/src/executors/ng-packagr-lite/ng-packagr-adjustments/write-package.js.map +1 -1
  60. package/src/executors/ng-packagr-lite/ng-packagr-lite.impl.js +6 -6
  61. package/src/executors/ng-packagr-lite/ng-packagr-lite.impl.js.map +1 -1
  62. package/src/executors/package/compat.js +1 -1
  63. package/src/executors/package/compat.js.map +1 -1
  64. package/src/executors/package/ng-packagr-adjustments/ng-package/entry-point/compile-ngc.di.js +1 -1
  65. package/src/executors/package/ng-packagr-adjustments/ng-package/entry-point/compile-ngc.di.js.map +1 -1
  66. package/src/executors/package/ng-packagr-adjustments/ng-package/entry-point/compile-ngc.transform.js +19 -42
  67. package/src/executors/package/ng-packagr-adjustments/ng-package/entry-point/compile-ngc.transform.js.map +1 -1
  68. package/src/executors/package/ng-packagr-adjustments/ng-package/entry-point/entry-point.di.js +1 -1
  69. package/src/executors/package/ng-packagr-adjustments/ng-package/entry-point/entry-point.di.js.map +1 -1
  70. package/src/executors/package/ng-packagr-adjustments/ng-package/package.di.js +1 -2
  71. package/src/executors/package/ng-packagr-adjustments/ng-package/package.di.js.map +1 -1
  72. package/src/executors/package/ng-packagr-adjustments/styles/stylesheet-processor.d.ts +19 -15
  73. package/src/executors/package/ng-packagr-adjustments/styles/stylesheet-processor.js +208 -40
  74. package/src/executors/package/ng-packagr-adjustments/styles/stylesheet-processor.js.map +1 -1
  75. package/src/executors/package/ng-packagr-adjustments/utilities/tailwindcss.js +3 -3
  76. package/src/executors/package/ng-packagr-adjustments/utilities/tailwindcss.js.map +1 -1
  77. package/src/executors/package/package.impl.js +15 -32
  78. package/src/executors/package/package.impl.js.map +1 -1
  79. package/src/generators/add-linting/add-linting.js +6 -6
  80. package/src/generators/add-linting/add-linting.js.map +1 -1
  81. package/src/generators/add-linting/compat.js +1 -1
  82. package/src/generators/add-linting/compat.js.map +1 -1
  83. package/src/generators/add-linting/lib/add-angular-eslint-dependencies.js +1 -1
  84. package/src/generators/add-linting/lib/add-angular-eslint-dependencies.js.map +1 -1
  85. package/src/generators/add-linting/lib/add-project-lint-target.js +2 -2
  86. package/src/generators/add-linting/lib/add-project-lint-target.js.map +1 -1
  87. package/src/generators/add-linting/lib/create-eslint-configuration.js +2 -2
  88. package/src/generators/add-linting/lib/create-eslint-configuration.js.map +1 -1
  89. package/src/generators/application/application.compat.js +1 -1
  90. package/src/generators/application/application.compat.js.map +1 -1
  91. package/src/generators/application/application.js +23 -23
  92. package/src/generators/application/application.js.map +1 -1
  93. package/src/generators/application/lib/add-e2e.js +10 -9
  94. package/src/generators/application/lib/add-e2e.js.map +1 -1
  95. package/src/generators/application/lib/add-linting.js +2 -2
  96. package/src/generators/application/lib/add-linting.js.map +1 -1
  97. package/src/generators/application/lib/add-mfe.js +2 -2
  98. package/src/generators/application/lib/add-mfe.js.map +1 -1
  99. package/src/generators/application/lib/add-protractor.js +3 -11
  100. package/src/generators/application/lib/add-protractor.js.map +1 -1
  101. package/src/generators/application/lib/add-proxy-config.js +3 -3
  102. package/src/generators/application/lib/add-proxy-config.js.map +1 -1
  103. package/src/generators/application/lib/add-unit-test-runner.js +3 -3
  104. package/src/generators/application/lib/add-unit-test-runner.js.map +1 -1
  105. package/src/generators/application/lib/create-files.js +1 -1
  106. package/src/generators/application/lib/create-files.js.map +1 -1
  107. package/src/generators/application/lib/enable-strict-type-checking.js +1 -1
  108. package/src/generators/application/lib/enable-strict-type-checking.js.map +1 -1
  109. package/src/generators/application/lib/index.js +19 -19
  110. package/src/generators/application/lib/index.js.map +1 -1
  111. package/src/generators/application/lib/normalize-options.js +6 -6
  112. package/src/generators/application/lib/normalize-options.js.map +1 -1
  113. package/src/generators/application/lib/remove-scaffolded-e2e.js +2 -2
  114. package/src/generators/application/lib/remove-scaffolded-e2e.js.map +1 -1
  115. package/src/generators/application/lib/root-router-config.js +2 -2
  116. package/src/generators/application/lib/root-router-config.js.map +1 -1
  117. package/src/generators/application/lib/set-app-strict-default.js +2 -2
  118. package/src/generators/application/lib/set-app-strict-default.js.map +1 -1
  119. package/src/generators/application/lib/update-component-spec.js +2 -2
  120. package/src/generators/application/lib/update-component-spec.js.map +1 -1
  121. package/src/generators/application/lib/update-component-styles.js +2 -2
  122. package/src/generators/application/lib/update-component-styles.js.map +1 -1
  123. package/src/generators/application/lib/update-component-template.js +2 -2
  124. package/src/generators/application/lib/update-component-template.js.map +1 -1
  125. package/src/generators/application/lib/update-config-files.js +13 -11
  126. package/src/generators/application/lib/update-config-files.js.map +1 -1
  127. package/src/generators/application/lib/update-e2e-project.js +7 -7
  128. package/src/generators/application/lib/update-e2e-project.js.map +1 -1
  129. package/src/generators/application/lib/update-editor-tsconfig.js +1 -1
  130. package/src/generators/application/lib/update-editor-tsconfig.js.map +1 -1
  131. package/src/generators/component-cypress-spec/compat.js +1 -1
  132. package/src/generators/component-cypress-spec/compat.js.map +1 -1
  133. package/src/generators/component-cypress-spec/component-cypress-spec.js +9 -9
  134. package/src/generators/component-cypress-spec/component-cypress-spec.js.map +1 -1
  135. package/src/generators/component-cypress-spec/lib/get-component-selector.js +3 -3
  136. package/src/generators/component-cypress-spec/lib/get-component-selector.js.map +1 -1
  137. package/src/generators/component-story/compat.js +1 -1
  138. package/src/generators/component-story/compat.js.map +1 -1
  139. package/src/generators/component-story/component-story.js +5 -5
  140. package/src/generators/component-story/component-story.js.map +1 -1
  141. package/src/generators/convert-tslint-to-eslint/convert-tslint-to-eslint.js +8 -8
  142. package/src/generators/convert-tslint-to-eslint/convert-tslint-to-eslint.js.map +1 -1
  143. package/src/generators/downgrade-module/compat.js +1 -1
  144. package/src/generators/downgrade-module/compat.js.map +1 -1
  145. package/src/generators/downgrade-module/downgrade-module.js +7 -7
  146. package/src/generators/downgrade-module/downgrade-module.js.map +1 -1
  147. package/src/generators/downgrade-module/lib/add-entry-components-to-module.js +2 -2
  148. package/src/generators/downgrade-module/lib/add-entry-components-to-module.js.map +1 -1
  149. package/src/generators/downgrade-module/lib/index.js +4 -4
  150. package/src/generators/downgrade-module/lib/index.js.map +1 -1
  151. package/src/generators/downgrade-module/lib/update-main.js +2 -2
  152. package/src/generators/downgrade-module/lib/update-main.js.map +1 -1
  153. package/src/generators/downgrade-module/lib/update-module-bootstrap.js +3 -3
  154. package/src/generators/downgrade-module/lib/update-module-bootstrap.js.map +1 -1
  155. package/src/generators/init/init.compat.js +1 -1
  156. package/src/generators/init/init.compat.js.map +1 -1
  157. package/src/generators/init/init.d.ts +1 -1
  158. package/src/generators/init/init.js +28 -13
  159. package/src/generators/init/init.js.map +1 -1
  160. package/src/generators/karma/compat.js +1 -1
  161. package/src/generators/karma/compat.js.map +1 -1
  162. package/src/generators/karma/karma.js +3 -3
  163. package/src/generators/karma/karma.js.map +1 -1
  164. package/src/generators/karma-project/compat.js +1 -1
  165. package/src/generators/karma-project/compat.js.map +1 -1
  166. package/src/generators/karma-project/karma-project.js +6 -6
  167. package/src/generators/karma-project/karma-project.js.map +1 -1
  168. package/src/generators/karma-project/lib/check-test-target.js +1 -1
  169. package/src/generators/karma-project/lib/check-test-target.js.map +1 -1
  170. package/src/generators/karma-project/lib/generate-karma-project-files.js +3 -3
  171. package/src/generators/karma-project/lib/generate-karma-project-files.js.map +1 -1
  172. package/src/generators/karma-project/lib/update-tsconfig.js +3 -3
  173. package/src/generators/karma-project/lib/update-tsconfig.js.map +1 -1
  174. package/src/generators/karma-project/lib/update-workspace-config.js +7 -7
  175. package/src/generators/karma-project/lib/update-workspace-config.js.map +1 -1
  176. package/src/generators/library/lib/add-children.js +4 -4
  177. package/src/generators/library/lib/add-children.js.map +1 -1
  178. package/src/generators/library/lib/add-lazy-loaded-router-configuration.js +2 -2
  179. package/src/generators/library/lib/add-lazy-loaded-router-configuration.js.map +1 -1
  180. package/src/generators/library/lib/add-load-children.js +3 -3
  181. package/src/generators/library/lib/add-load-children.js.map +1 -1
  182. package/src/generators/library/lib/add-module.js +4 -4
  183. package/src/generators/library/lib/add-module.js.map +1 -1
  184. package/src/generators/library/lib/add-router-configuration.js +4 -4
  185. package/src/generators/library/lib/add-router-configuration.js.map +1 -1
  186. package/src/generators/library/lib/enable-strict-type-checking.js +3 -3
  187. package/src/generators/library/lib/enable-strict-type-checking.js.map +1 -1
  188. package/src/generators/library/lib/normalize-options.js +6 -6
  189. package/src/generators/library/lib/normalize-options.js.map +1 -1
  190. package/src/generators/library/lib/update-lib-package-npm-scope.js +1 -1
  191. package/src/generators/library/lib/update-lib-package-npm-scope.js.map +1 -1
  192. package/src/generators/library/lib/update-ng-package.js +3 -3
  193. package/src/generators/library/lib/update-ng-package.js.map +1 -1
  194. package/src/generators/library/lib/update-project.js +10 -10
  195. package/src/generators/library/lib/update-project.js.map +1 -1
  196. package/src/generators/library/lib/update-tsconfig.js +11 -8
  197. package/src/generators/library/lib/update-tsconfig.js.map +1 -1
  198. package/src/generators/library/library.compat.js +1 -1
  199. package/src/generators/library/library.compat.js.map +1 -1
  200. package/src/generators/library/library.js +20 -23
  201. package/src/generators/library/library.js.map +1 -1
  202. package/src/generators/library/schema.d.ts +0 -2
  203. package/src/generators/library/schema.json +0 -5
  204. package/src/generators/library-secondary-entry-point/compat.js +1 -1
  205. package/src/generators/library-secondary-entry-point/compat.js.map +1 -1
  206. package/src/generators/library-secondary-entry-point/lib/add-files.js +3 -3
  207. package/src/generators/library-secondary-entry-point/lib/add-files.js.map +1 -1
  208. package/src/generators/library-secondary-entry-point/lib/add-path-mapping.js +1 -1
  209. package/src/generators/library-secondary-entry-point/lib/add-path-mapping.js.map +1 -1
  210. package/src/generators/library-secondary-entry-point/lib/index.js +4 -4
  211. package/src/generators/library-secondary-entry-point/lib/index.js.map +1 -1
  212. package/src/generators/library-secondary-entry-point/lib/normalize-options.js +4 -4
  213. package/src/generators/library-secondary-entry-point/lib/normalize-options.js.map +1 -1
  214. package/src/generators/library-secondary-entry-point/lib/update-linting-file-patterns.js +1 -1
  215. package/src/generators/library-secondary-entry-point/lib/update-linting-file-patterns.js.map +1 -1
  216. package/src/generators/library-secondary-entry-point/library-secondary-entry-point.js +6 -6
  217. package/src/generators/library-secondary-entry-point/library-secondary-entry-point.js.map +1 -1
  218. package/src/generators/move/lib/update-module-name.js +7 -7
  219. package/src/generators/move/lib/update-module-name.js.map +1 -1
  220. package/src/generators/move/lib/update-ng-package.js +4 -4
  221. package/src/generators/move/lib/update-ng-package.js.map +1 -1
  222. package/src/generators/move/move.js +6 -6
  223. package/src/generators/move/move.js.map +1 -1
  224. package/src/generators/ngrx/compat.js +1 -1
  225. package/src/generators/ngrx/compat.js.map +1 -1
  226. package/src/generators/ngrx/files/classes-syntax/__directory__/__fileName__.effects.spec.ts__tmpl__ +1 -1
  227. package/src/generators/ngrx/files/creator-syntax/__directory__/__fileName__.effects.spec.ts__tmpl__ +1 -1
  228. package/src/generators/ngrx/lib/add-exports-barrel.js +9 -9
  229. package/src/generators/ngrx/lib/add-exports-barrel.js.map +1 -1
  230. package/src/generators/ngrx/lib/add-imports-to-module.js +21 -21
  231. package/src/generators/ngrx/lib/add-imports-to-module.js.map +1 -1
  232. package/src/generators/ngrx/lib/add-ngrx-to-package-json.js +12 -1
  233. package/src/generators/ngrx/lib/add-ngrx-to-package-json.js.map +1 -1
  234. package/src/generators/ngrx/lib/generate-files.js +5 -5
  235. package/src/generators/ngrx/lib/generate-files.js.map +1 -1
  236. package/src/generators/ngrx/lib/normalize-options.js +1 -1
  237. package/src/generators/ngrx/lib/normalize-options.js.map +1 -1
  238. package/src/generators/ngrx/ngrx.js +7 -7
  239. package/src/generators/ngrx/ngrx.js.map +1 -1
  240. package/src/generators/setup-mfe/lib/add-entry-module.js +2 -2
  241. package/src/generators/setup-mfe/lib/add-entry-module.js.map +1 -1
  242. package/src/generators/setup-mfe/lib/add-implicit-deps.js +2 -2
  243. package/src/generators/setup-mfe/lib/add-implicit-deps.js.map +1 -1
  244. package/src/generators/setup-mfe/lib/add-remote-to-host.js +5 -5
  245. package/src/generators/setup-mfe/lib/add-remote-to-host.js.map +1 -1
  246. package/src/generators/setup-mfe/lib/change-build-target.js +2 -2
  247. package/src/generators/setup-mfe/lib/change-build-target.js.map +1 -1
  248. package/src/generators/setup-mfe/lib/fix-bootstrap.js +2 -2
  249. package/src/generators/setup-mfe/lib/fix-bootstrap.js.map +1 -1
  250. package/src/generators/setup-mfe/lib/generate-config.js +2 -2
  251. package/src/generators/setup-mfe/lib/generate-config.js.map +1 -1
  252. package/src/generators/setup-mfe/lib/get-remotes-with-ports.js +1 -1
  253. package/src/generators/setup-mfe/lib/get-remotes-with-ports.js.map +1 -1
  254. package/src/generators/setup-mfe/lib/index.js +8 -8
  255. package/src/generators/setup-mfe/lib/index.js.map +1 -1
  256. package/src/generators/setup-mfe/lib/setup-serve-target.js +4 -4
  257. package/src/generators/setup-mfe/lib/setup-serve-target.js.map +1 -1
  258. package/src/generators/setup-mfe/setup-mfe.compat.js +1 -1
  259. package/src/generators/setup-mfe/setup-mfe.compat.js.map +1 -1
  260. package/src/generators/setup-mfe/setup-mfe.js +12 -12
  261. package/src/generators/setup-mfe/setup-mfe.js.map +1 -1
  262. package/src/generators/stories/compat.js +1 -1
  263. package/src/generators/stories/compat.js.map +1 -1
  264. package/src/generators/stories/lib/component-info.js +9 -8
  265. package/src/generators/stories/lib/component-info.js.map +1 -1
  266. package/src/generators/stories/lib/get-e2e-project.js +1 -1
  267. package/src/generators/stories/lib/get-e2e-project.js.map +1 -1
  268. package/src/generators/stories/lib/module-info.js +46 -10
  269. package/src/generators/stories/lib/module-info.js.map +1 -1
  270. package/src/generators/stories/lib/tree-utilities.js +2 -2
  271. package/src/generators/stories/lib/tree-utilities.js.map +1 -1
  272. package/src/generators/stories/stories.js +6 -6
  273. package/src/generators/stories/stories.js.map +1 -1
  274. package/src/generators/storybook-configuration/compat.js +1 -1
  275. package/src/generators/storybook-configuration/compat.js.map +1 -1
  276. package/src/generators/storybook-configuration/lib/assert-compatible-storybook-version.js +1 -1
  277. package/src/generators/storybook-configuration/lib/assert-compatible-storybook-version.js.map +1 -1
  278. package/src/generators/storybook-configuration/lib/generate-stories.js +3 -3
  279. package/src/generators/storybook-configuration/lib/generate-stories.js.map +1 -1
  280. package/src/generators/storybook-configuration/lib/generate-storybook-configuration.js +2 -2
  281. package/src/generators/storybook-configuration/lib/generate-storybook-configuration.js.map +1 -1
  282. package/src/generators/storybook-configuration/storybook-configuration.js +5 -5
  283. package/src/generators/storybook-configuration/storybook-configuration.js.map +1 -1
  284. package/src/generators/storybook-migrate-defaults-5-to-6/compat.js +1 -1
  285. package/src/generators/storybook-migrate-defaults-5-to-6/compat.js.map +1 -1
  286. package/src/generators/storybook-migrate-defaults-5-to-6/storybook-migrate-defaults-5-to-6.js +1 -1
  287. package/src/generators/storybook-migrate-defaults-5-to-6/storybook-migrate-defaults-5-to-6.js.map +1 -1
  288. package/src/generators/storybook-migrate-stories-to-6-2/compat.js +1 -1
  289. package/src/generators/storybook-migrate-stories-to-6-2/compat.js.map +1 -1
  290. package/src/generators/storybook-migrate-stories-to-6-2/migrate-stories-to-6-2.js +2 -2
  291. package/src/generators/storybook-migrate-stories-to-6-2/migrate-stories-to-6-2.js.map +1 -1
  292. package/src/generators/upgrade-module/compat.js +1 -1
  293. package/src/generators/upgrade-module/compat.js.map +1 -1
  294. package/src/generators/upgrade-module/lib/add-imports-to-module.js +7 -7
  295. package/src/generators/upgrade-module/lib/add-imports-to-module.js.map +1 -1
  296. package/src/generators/upgrade-module/lib/create-files.js +3 -3
  297. package/src/generators/upgrade-module/lib/create-files.js.map +1 -1
  298. package/src/generators/upgrade-module/lib/index.js +4 -4
  299. package/src/generators/upgrade-module/lib/index.js.map +1 -1
  300. package/src/generators/upgrade-module/lib/update-module-bootstrap.js +5 -5
  301. package/src/generators/upgrade-module/lib/update-module-bootstrap.js.map +1 -1
  302. package/src/generators/upgrade-module/upgrade-module.js +7 -7
  303. package/src/generators/upgrade-module/upgrade-module.js.map +1 -1
  304. package/src/generators/utils/index.d.ts +1 -0
  305. package/src/generators/utils/index.js +5 -0
  306. package/src/generators/utils/index.js.map +1 -0
  307. package/src/generators/utils/insert-ngmodule-import.js +15 -15
  308. package/src/generators/utils/insert-ngmodule-import.js.map +1 -1
  309. package/src/generators/utils/storybook.js +4 -4
  310. package/src/generators/utils/storybook.js.map +1 -1
  311. package/src/generators/utils/testing.js +44 -6
  312. package/src/generators/utils/testing.js.map +1 -1
  313. package/src/generators/utils/upgrade.js +2 -2
  314. package/src/generators/utils/upgrade.js.map +1 -1
  315. package/src/generators/web-worker/compat.js +1 -1
  316. package/src/generators/web-worker/compat.js.map +1 -1
  317. package/src/generators/web-worker/lib/index.js +2 -2
  318. package/src/generators/web-worker/lib/index.js.map +1 -1
  319. package/src/generators/web-worker/lib/update-tsconfig.js +4 -4
  320. package/src/generators/web-worker/lib/update-tsconfig.js.map +1 -1
  321. package/src/generators/web-worker/web-worker.js +6 -6
  322. package/src/generators/web-worker/web-worker.js.map +1 -1
  323. package/src/migrations/update-10-0-0/update-10-0-0.js +5 -5
  324. package/src/migrations/update-10-0-0/update-10-0-0.js.map +1 -1
  325. package/src/migrations/update-10-2-0/update-10-2-0.js +4 -4
  326. package/src/migrations/update-10-2-0/update-10-2-0.js.map +1 -1
  327. package/src/migrations/update-10-3-0/update-10-3-0.js +15 -15
  328. package/src/migrations/update-10-3-0/update-10-3-0.js.map +1 -1
  329. package/src/migrations/update-10-4-0/update-10-4-0.js +9 -9
  330. package/src/migrations/update-10-4-0/update-10-4-0.js.map +1 -1
  331. package/src/migrations/update-10-5-0/add-template-support-and-presets-to-eslint.js +11 -11
  332. package/src/migrations/update-10-5-0/add-template-support-and-presets-to-eslint.js.map +1 -1
  333. package/src/migrations/update-11-0-0/update-builders-config.js +5 -5
  334. package/src/migrations/update-11-0-0/update-builders-config.js.map +1 -1
  335. package/src/migrations/update-12-0-0/update-ngcc-postinstall.js +2 -2
  336. package/src/migrations/update-12-0-0/update-ngcc-postinstall.js.map +1 -1
  337. package/src/migrations/update-12-3-0/convert-webpack-browser-build-target-to-delegate-build.js +10 -10
  338. package/src/migrations/update-12-3-0/convert-webpack-browser-build-target-to-delegate-build.js.map +1 -1
  339. package/src/migrations/update-12-3-0/update-angular-eslint-rules.js +5 -5
  340. package/src/migrations/update-12-3-0/update-angular-eslint-rules.js.map +1 -1
  341. package/src/migrations/update-12-3-0/update-storybook.js +8 -8
  342. package/src/migrations/update-12-3-0/update-storybook.js.map +1 -1
  343. package/src/migrations/update-12-3-0/update-webpack-browser-config.js +4 -4
  344. package/src/migrations/update-12-3-0/update-webpack-browser-config.js.map +1 -1
  345. package/src/migrations/update-12-9-0/update-invalid-import-paths.js +12 -12
  346. package/src/migrations/update-12-9-0/update-invalid-import-paths.js.map +1 -1
  347. package/src/migrations/update-13-0-0/add-postcss-packages.js +4 -4
  348. package/src/migrations/update-13-0-0/add-postcss-packages.js.map +1 -1
  349. package/src/migrations/update-13-2-0/update-angular-config.d.ts +2 -0
  350. package/src/migrations/update-13-2-0/update-angular-config.js +21 -0
  351. package/src/migrations/update-13-2-0/update-angular-config.js.map +1 -0
  352. package/src/migrations/update-13-2-0/update-angular-jest-config.d.ts +3 -0
  353. package/src/migrations/update-13-2-0/update-angular-jest-config.js +97 -0
  354. package/src/migrations/update-13-2-0/update-angular-jest-config.js.map +1 -0
  355. package/src/migrations/update-13-2-0/update-libraries.d.ts +2 -0
  356. package/src/migrations/update-13-2-0/update-libraries.js +59 -0
  357. package/src/migrations/update-13-2-0/update-libraries.js.map +1 -0
  358. package/src/migrations/update-13-2-0/update-testing-imports.d.ts +2 -0
  359. package/src/migrations/update-13-2-0/update-testing-imports.js +95 -0
  360. package/src/migrations/update-13-2-0/update-testing-imports.js.map +1 -0
  361. package/src/migrations/update-8-12-0/change-angular-lib-builder.js +3 -3
  362. package/src/migrations/update-8-12-0/change-angular-lib-builder.js.map +1 -1
  363. package/src/migrations/update-8-3-0/upgrade-ngrx-8-0.js +11 -11
  364. package/src/migrations/update-8-3-0/upgrade-ngrx-8-0.js.map +1 -1
  365. package/src/migrations/update-8-5-0/upgrade-cli-8-3.js +13 -13
  366. package/src/migrations/update-8-5-0/upgrade-cli-8-3.js.map +1 -1
  367. package/src/migrations/update-9-0-0/add-postinstall.js +3 -3
  368. package/src/migrations/update-9-0-0/add-postinstall.js.map +1 -1
  369. package/src/migrations/update-9-0-0/update-9-0-0.js +5 -5
  370. package/src/migrations/update-9-0-0/update-9-0-0.js.map +1 -1
  371. package/src/runtime/nx/data-persistence.js +20 -20
  372. package/src/runtime/nx/data-persistence.js.map +1 -1
  373. package/src/runtime/nx/nx.module.js +2 -2
  374. package/src/runtime/nx/nx.module.js.map +1 -1
  375. package/src/utils/nx-devkit/ast-utils.js +13 -13
  376. package/src/utils/nx-devkit/ast-utils.js.map +1 -1
  377. package/src/utils/nx-devkit/testing.js +2 -2
  378. package/src/utils/nx-devkit/testing.js.map +1 -1
  379. package/src/utils/testing.js +6 -6
  380. package/src/utils/testing.js.map +1 -1
  381. package/src/utils/versions.d.ts +6 -7
  382. package/src/utils/versions.js +8 -9
  383. package/src/utils/versions.js.map +1 -1
  384. package/tailwind.js +1 -1
  385. package/tailwind.js.map +1 -1
  386. package/testing/index.d.ts +17 -1
  387. package/testing/index.js +17 -5
  388. package/testing/index.js.map +1 -1
  389. package/testing/nrwl-angular-testing.d.ts +1 -0
  390. package/testing/package.json +7 -6
  391. package/testing/src/testing-utils.js +2 -2
  392. package/testing/src/testing-utils.js.map +1 -1
  393. package/bundles/nrwl-angular-testing.umd.js +0 -72
  394. package/bundles/nrwl-angular-testing.umd.js.map +0 -1
  395. package/bundles/nrwl-angular.umd.js +0 -690
  396. package/bundles/nrwl-angular.umd.js.map +0 -1
  397. package/esm2015/src/runtime/nx/data-persistence.js +0 -327
  398. package/esm2015/src/runtime/nx/nx.module.js +0 -16
  399. package/esm2015/testing/index.js +0 -3
  400. package/fesm2015/nrwl-angular-testing.js.map +0 -1
  401. package/fesm2015/nrwl-angular.js.map +0 -1
  402. package/nrwl-angular.metadata.json +0 -1
  403. package/src/executors/ng-packagr-lite/ng-packagr-adjustments/init-tsconfig.d.ts +0 -10
  404. package/src/executors/ng-packagr-lite/ng-packagr-adjustments/init-tsconfig.js +0 -28
  405. package/src/executors/ng-packagr-lite/ng-packagr-adjustments/init-tsconfig.js.map +0 -1
  406. package/src/executors/package/ng-packagr-adjustments/ivy/styles/stylesheet-processor.d.ts +0 -30
  407. package/src/executors/package/ng-packagr-adjustments/ivy/styles/stylesheet-processor.js +0 -189
  408. package/src/executors/package/ng-packagr-adjustments/ivy/styles/stylesheet-processor.js.map +0 -1
  409. package/src/executors/package/ng-packagr-adjustments/styles/stylesheet-processor-worker.d.ts +0 -9
  410. package/src/executors/package/ng-packagr-adjustments/styles/stylesheet-processor-worker.js +0 -178
  411. package/src/executors/package/ng-packagr-adjustments/styles/stylesheet-processor-worker.js.map +0 -1
  412. package/testing/nrwl-angular-testing.metadata.json +0 -1
package/README.md CHANGED
@@ -203,6 +203,6 @@ Even though Nx isn't technology specific, we provide 3 separate flavours of the
203
203
 
204
204
  # Engage with the Core Team and the Community
205
205
 
206
- - [Nx Office Hours Playlist on YouTube](https://www.youtube.com/playlist?list=PLakNactNC1dE8KLQ5zd3fQwu_yQHjTmR5). It's a regular YouTube stream where we talk all things Nx. Join the stream, ask questions, etc.
206
+ - [The Nx Show Playlist on YouTube](https://www.youtube.com/playlist?list=PLakNactNC1dE8KLQ5zd3fQwu_yQHjTmR5). It's a regular YouTube stream where we talk all things Nx. Join the stream, ask questions, etc.
207
207
  - [Follow Nx on Twitter](https://twitter.com/NxDevTools)
208
208
 
File without changes
@@ -0,0 +1,327 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { ofType } from '@ngrx/effects';
3
+ import { ROUTER_NAVIGATION } from '@ngrx/router-store';
4
+ import { isObservable, of } from 'rxjs';
5
+ import { catchError, concatMap, filter, groupBy, map, mergeMap, switchMap, withLatestFrom, } from 'rxjs/operators';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@ngrx/store";
8
+ import * as i2 from "@ngrx/effects";
9
+ export function pessimisticUpdate(opts) {
10
+ return (source) => {
11
+ return source.pipe(mapActionAndState(), concatMap(runWithErrorHandling(opts.run, opts.onError)));
12
+ };
13
+ }
14
+ export function optimisticUpdate(opts) {
15
+ return (source) => {
16
+ return source.pipe(mapActionAndState(), concatMap(runWithErrorHandling(opts.run, opts.undoAction)));
17
+ };
18
+ }
19
+ export function fetch(opts) {
20
+ return (source) => {
21
+ if (opts.id) {
22
+ const groupedFetches = source.pipe(mapActionAndState(), groupBy(([action, store]) => {
23
+ return opts.id(action, store);
24
+ }));
25
+ return groupedFetches.pipe(mergeMap((pairs) => pairs.pipe(switchMap(runWithErrorHandling(opts.run, opts.onError)))));
26
+ }
27
+ return source.pipe(mapActionAndState(), concatMap(runWithErrorHandling(opts.run, opts.onError)));
28
+ };
29
+ }
30
+ export function navigation(component, opts) {
31
+ return (source) => {
32
+ const nav = source.pipe(mapActionAndState(), filter(([action, state]) => isStateSnapshot(action)), map(([action, state]) => {
33
+ if (!isStateSnapshot(action)) {
34
+ // Because of the above filter we'll never get here,
35
+ // but this properly type narrows `action`
36
+ return;
37
+ }
38
+ return [
39
+ findSnapshot(component, action.payload.routerState.root),
40
+ state,
41
+ ];
42
+ }), filter(([snapshot, state]) => !!snapshot));
43
+ return nav.pipe(switchMap(runWithErrorHandling(opts.run, opts.onError)));
44
+ };
45
+ }
46
+ function isStateSnapshot(action) {
47
+ return action.type === ROUTER_NAVIGATION;
48
+ }
49
+ function runWithErrorHandling(run, onError) {
50
+ return ([action, state]) => {
51
+ try {
52
+ const r = wrapIntoObservable(run(action, state));
53
+ return r.pipe(catchError((e) => wrapIntoObservable(onError(action, e))));
54
+ }
55
+ catch (e) {
56
+ return wrapIntoObservable(onError(action, e));
57
+ }
58
+ };
59
+ }
60
+ /**
61
+ * @whatItDoes maps Observable<Action | [Action, State]> to
62
+ * Observable<[Action, State]>
63
+ */
64
+ function mapActionAndState() {
65
+ return (source) => {
66
+ return source.pipe(map((value) => {
67
+ const [action, store] = normalizeActionAndState(value);
68
+ return [action, store];
69
+ }));
70
+ };
71
+ }
72
+ /**
73
+ * @whatItDoes Normalizes either a bare action or an array of action and state
74
+ * into an array of action and state (or undefined)
75
+ */
76
+ function normalizeActionAndState(args) {
77
+ let action, state;
78
+ if (args instanceof Array) {
79
+ [action, state] = args;
80
+ }
81
+ else {
82
+ action = args;
83
+ }
84
+ return [action, state];
85
+ }
86
+ /**
87
+ * @whatItDoes Provides convenience methods for implementing common operations of persisting data.
88
+ */
89
+ export class DataPersistence {
90
+ constructor(store, actions) {
91
+ this.store = store;
92
+ this.actions = actions;
93
+ }
94
+ /**
95
+ *
96
+ * @whatItDoes Handles pessimistic updates (updating the server first).
97
+ *
98
+ * Update the server implemented naively suffers from race conditions and poor error handling.
99
+ *
100
+ * `pessimisticUpdate` addresses these problems--it runs all fetches in order, which removes race conditions
101
+ * and forces the developer to handle errors.
102
+ *
103
+ * ## Example:
104
+ *
105
+ * ```typescript
106
+ * @Injectable()
107
+ * class TodoEffects {
108
+ * @Effect() updateTodo = this.s.pessimisticUpdate<UpdateTodo>('UPDATE_TODO', {
109
+ * // provides an action and the current state of the store
110
+ * run(a, state) {
111
+ * // update the backend first, and then dispatch an action that will
112
+ * // update the client side
113
+ * return this.backend(state.user, a.payload).map(updated => ({
114
+ * type: 'TODO_UPDATED',
115
+ * payload: updated
116
+ * }));
117
+ * },
118
+ *
119
+ * onError(a, e: any) {
120
+ * // we don't need to undo the changes on the client side.
121
+ * // we can dispatch an error, or simply log the error here and return `null`
122
+ * return null;
123
+ * }
124
+ * });
125
+ *
126
+ * constructor(private s: DataPersistence<TodosState>, private backend: Backend) {}
127
+ * }
128
+ * ```
129
+ *
130
+ * Note that if you don't return a new action from the run callback, you must set the dispatch property
131
+ * of the effect to false, like this:
132
+ *
133
+ * ```
134
+ * class TodoEffects {
135
+ * @Effect({dispatch: false})
136
+ * updateTodo; //...
137
+ * }
138
+ * ```
139
+ */
140
+ pessimisticUpdate(actionType, opts) {
141
+ return this.actions.pipe(ofType(actionType), withLatestFrom(this.store), pessimisticUpdate(opts));
142
+ }
143
+ /**
144
+ *
145
+ * @whatItDoes Handles optimistic updates (updating the client first).
146
+ *
147
+ * `optimisticUpdate` addresses these problems--it runs all fetches in order, which removes race conditions
148
+ * and forces the developer to handle errors.
149
+ *
150
+ * `optimisticUpdate` is different from `pessimisticUpdate`. In case of a failure, when using `optimisticUpdate`,
151
+ * the developer already updated the state locally, so the developer must provide an undo action.
152
+ *
153
+ * The error handling must be done in the callback, or by means of the undo action.
154
+ *
155
+ * ## Example:
156
+ *
157
+ * ```typescript
158
+ * @Injectable()
159
+ * class TodoEffects {
160
+ * @Effect() updateTodo = this.s.optimisticUpdate<UpdateTodo>('UPDATE_TODO', {
161
+ * // provides an action and the current state of the store
162
+ * run: (a, state) => {
163
+ * return this.backend(state.user, a.payload);
164
+ * },
165
+ *
166
+ * undoAction: (a, e: any) => {
167
+ * // dispatch an undo action to undo the changes in the client state
168
+ * return ({
169
+ * type: 'UNDO_UPDATE_TODO',
170
+ * payload: a
171
+ * });
172
+ * }
173
+ * });
174
+ *
175
+ * constructor(private s: DataPersistence<TodosState>, private backend: Backend) {}
176
+ * }
177
+ * ```
178
+ *
179
+ * Note that if you don't return a new action from the run callback, you must set the dispatch property
180
+ * of the effect to false, like this:
181
+ *
182
+ * ```
183
+ * class TodoEffects {
184
+ * @Effect({dispatch: false})
185
+ * updateTodo; //...
186
+ * }
187
+ * ```
188
+ */
189
+ optimisticUpdate(actionType, opts) {
190
+ return this.actions.pipe(ofType(actionType), withLatestFrom(this.store), optimisticUpdate(opts));
191
+ }
192
+ /**
193
+ *
194
+ * @whatItDoes Handles data fetching.
195
+ *
196
+ * Data fetching implemented naively suffers from race conditions and poor error handling.
197
+ *
198
+ * `fetch` addresses these problems--it runs all fetches in order, which removes race conditions
199
+ * and forces the developer to handle errors.
200
+ *
201
+ * ## Example:
202
+ *
203
+ * ```typescript
204
+ * @Injectable()
205
+ * class TodoEffects {
206
+ * @Effect() loadTodos = this.s.fetch<GetTodos>('GET_TODOS', {
207
+ * // provides an action and the current state of the store
208
+ * run: (a, state) => {
209
+ * return this.backend(state.user, a.payload).map(r => ({
210
+ * type: 'TODOS',
211
+ * payload: r
212
+ * });
213
+ * },
214
+ *
215
+ * onError: (a, e: any) => {
216
+ * // dispatch an undo action to undo the changes in the client state
217
+ * }
218
+ * });
219
+ *
220
+ * constructor(private s: DataPersistence<TodosState>, private backend: Backend) {}
221
+ * }
222
+ * ```
223
+ *
224
+ * This is correct, but because it set the concurrency to 1, it may not be performant.
225
+ *
226
+ * To fix that, you can provide the `id` function, like this:
227
+ *
228
+ * ```typescript
229
+ * @Injectable()
230
+ * class TodoEffects {
231
+ * @Effect() loadTodo = this.s.fetch<GetTodo>('GET_TODO', {
232
+ * id: (a, state) => {
233
+ * return a.payload.id;
234
+ * }
235
+ *
236
+ * // provides an action and the current state of the store
237
+ * run: (a, state) => {
238
+ * return this.backend(state.user, a.payload).map(r => ({
239
+ * type: 'TODO',
240
+ * payload: r
241
+ * });
242
+ * },
243
+ *
244
+ * onError: (a, e: any) => {
245
+ * // dispatch an undo action to undo the changes in the client state
246
+ * return null;
247
+ * }
248
+ * });
249
+ *
250
+ * constructor(private s: DataPersistence<TodosState>, private backend: Backend) {}
251
+ * }
252
+ * ```
253
+ *
254
+ * With this setup, the requests for Todo 1 will run concurrently with the requests for Todo 2.
255
+ *
256
+ * In addition, if DataPersistence notices that there are multiple requests for Todo 1 scheduled,
257
+ * it will only run the last one.
258
+ */
259
+ fetch(actionType, opts) {
260
+ return this.actions.pipe(ofType(actionType), withLatestFrom(this.store), fetch(opts));
261
+ }
262
+ /**
263
+ * @whatItDoes Handles data fetching as part of router navigation.
264
+ *
265
+ * Data fetching implemented naively suffers from race conditions and poor error handling.
266
+ *
267
+ * `navigation` addresses these problems.
268
+ *
269
+ * It checks if an activated router state contains the passed in component type, and, if it does, runs the `run`
270
+ * callback. It provides the activated snapshot associated with the component and the current state. And it only runs
271
+ * the last request.
272
+ *
273
+ * ## Example:
274
+ *
275
+ * ```typescript
276
+ * @Injectable()
277
+ * class TodoEffects {
278
+ * @Effect() loadTodo = this.s.navigation(TodoComponent, {
279
+ * run: (a, state) => {
280
+ * return this.backend.fetchTodo(a.params['id']).map(todo => ({
281
+ * type: 'TODO_LOADED',
282
+ * payload: todo
283
+ * }));
284
+ * },
285
+ * onError: (a, e: any) => {
286
+ * // we can log and error here and return null
287
+ * // we can also navigate back
288
+ * return null;
289
+ * }
290
+ * });
291
+ * constructor(private s: DataPersistence<TodosState>, private backend: Backend) {}
292
+ * }
293
+ * ```
294
+ */
295
+ navigation(component, opts) {
296
+ return this.actions.pipe(withLatestFrom(this.store), navigation(component, opts));
297
+ }
298
+ }
299
+ DataPersistence.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: DataPersistence, deps: [{ token: i1.Store }, { token: i2.Actions }], target: i0.ɵɵFactoryTarget.Injectable });
300
+ DataPersistence.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: DataPersistence });
301
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: DataPersistence, decorators: [{
302
+ type: Injectable
303
+ }], ctorParameters: function () { return [{ type: i1.Store }, { type: i2.Actions }]; } });
304
+ function findSnapshot(component, s) {
305
+ if (s.routeConfig && s.routeConfig.component === component) {
306
+ return s;
307
+ }
308
+ for (const c of s.children) {
309
+ const ss = findSnapshot(component, c);
310
+ if (ss) {
311
+ return ss;
312
+ }
313
+ }
314
+ return null;
315
+ }
316
+ function wrapIntoObservable(obj) {
317
+ if (isObservable(obj)) {
318
+ return obj;
319
+ }
320
+ else if (!obj) {
321
+ return of();
322
+ }
323
+ else {
324
+ return of(obj);
325
+ }
326
+ }
327
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1wZXJzaXN0ZW5jZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9ydW50aW1lL254L2RhdGEtcGVyc2lzdGVuY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBUSxNQUFNLGVBQWUsQ0FBQztBQUVqRCxPQUFPLEVBQVcsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxpQkFBaUIsRUFBMEIsTUFBTSxvQkFBb0IsQ0FBQztBQUUvRSxPQUFPLEVBQUUsWUFBWSxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwRCxPQUFPLEVBQ0wsVUFBVSxFQUNWLFNBQVMsRUFDVCxNQUFNLEVBQ04sT0FBTyxFQUNQLEdBQUcsRUFDSCxRQUFRLEVBQ1IsU0FBUyxFQUNULGNBQWMsR0FDZixNQUFNLGdCQUFnQixDQUFDOzs7O0FBcUN4QixNQUFNLFVBQVUsaUJBQWlCLENBQy9CLElBQWlDO0lBRWpDLE9BQU8sQ0FBQyxNQUErQixFQUFzQixFQUFFO1FBQzdELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FDaEIsaUJBQWlCLEVBQUUsRUFDbkIsU0FBUyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQ3hELENBQUM7SUFDSixDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUM5QixJQUFnQztJQUVoQyxPQUFPLENBQUMsTUFBK0IsRUFBc0IsRUFBRTtRQUM3RCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQ2hCLGlCQUFpQixFQUFFLEVBQ25CLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUMzRCxDQUFDO0lBQ0osQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sVUFBVSxLQUFL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QUU7UUFDMUIsTUFBTSxFQUFFLEdBQUcsWUFBWSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0QyxJQUFJLEVBQUUsRUFBRTtZQUNOLE9BQU8sRUFBRSxDQUFDO1NBQ1g7S0FDRjtJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELFNBQVMsa0JBQWtCLENBQUksR0FBNkI7SUFDMUQsSUFBSSxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDckIsT0FBTyxHQUFHLENBQUM7S0FDWjtTQUFNLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDZixPQUFPLEVBQUUsRUFBRSxDQUFDO0tBQ2I7U0FBTTtRQUNMLE9BQU8sRUFBRSxDQUFDLEdBQVEsQ0FBQyxDQUFDO0tBQ3JCO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIFJvdXRlclN0YXRlU25hcHNob3QgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQWN0aW9ucywgb2ZUeXBlIH0gZnJvbSAnQG5ncngvZWZmZWN0cyc7XG5pbXBvcnQgeyBST1VURVJfTkFWSUdBVElPTiwgUm91dGVyTmF2aWdhdGlvbkFjdGlvbiB9IGZyb20gJ0BuZ3J4L3JvdXRlci1zdG9yZSc7XG5pbXBvcnQgeyBBY3Rpb24sIFN0b3JlLCBBY3Rpb25DcmVhdG9yIH0gZnJvbSAnQG5ncngvc3RvcmUnO1xuaW1wb3J0IHsgaXNPYnNlcnZhYmxlLCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgY2F0Y2hFcnJvcixcbiAgY29uY2F0TWFwLFxuICBmaWx0ZXIsXG4gIGdyb3VwQnksXG4gIG1hcCxcbiAgbWVyZ2VNYXAsXG4gIHN3aXRjaE1hcCxcbiAgd2l0aExhdGVzdEZyb20sXG59IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuLyoqXG4gKiBTZWUge0BsaW5rIERhdGFQZXJzaXN0ZW5jZS5wZXNzaW1pc3RpY1VwZGF0ZX0gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGVzc2ltaXN0aWNVcGRhdGVPcHRzPFQsIEE+IHtcbiAgcnVuKGE6IEEsIHN0YXRlPzogVCk6IE9ic2VydmFibGU8QWN0aW9uPiB8IEFjdGlvbiB8IHZvaWQ7XG4gIG9uRXJyb3IoYTogQSwgZTogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHwgYW55O1xufVxuLyoqXG4gKiBTZWUge0BsaW5rIERhdGFQZXJzaXN0ZW5jZS5wZXNzaW1pc3RpY1VwZGF0ZX0gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3B0aW1pc3RpY1VwZGF0ZU9wdHM8VCwgQT4ge1xuICBydW4oYTogQSwgc3RhdGU/OiBUKTogT2JzZXJ2YWJsZTxBY3Rpb24+IHwgQWN0aW9uIHwgdm9pZDtcbiAgdW5kb0FjdGlvbihhOiBBLCBlOiBhbnkpOiBPYnNlcnZhYmxlPEFjdGlvbj4gfCBBY3Rpb247XG59XG5cbi8qKlxuICogU2VlIHtAbGluayBEYXRhUGVyc2lzdGVuY2UuZmV0Y2h9IGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZldGNoT3B0czxULCBBPiB7XG4gIGlkPyhhOiBBLCBzdGF0ZT86IFQpOiBhbnk7XG4gIHJ1bihhOiBBLCBzdGF0ZT86IFQpOiBPYnNlcnZhYmxlPEFjdGlvbj4gfCBBY3Rpb24gfCB2b2lkO1xuICBvbkVycm9yPyhhOiBBLCBlOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4gfCBhbnk7XG59XG5cbi8qKlxuICogU2VlIHtAbGluayBEYXRhUGVyc2lzdGVuY2UubmF2aWdhdGlvbn0gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGFuZGxlTmF2aWdhdGlvbk9wdHM8VD4ge1xuICBydW4oYTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgc3RhdGU/OiBUKTogT2JzZXJ2YWJsZTxBY3Rpb24+IHwgQWN0aW9uIHwgdm9pZDtcbiAgb25FcnJvcj8oYTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgZTogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHwgYW55O1xufVxuXG5leHBvcnQgdHlwZSBBY3Rpb25PckFjdGlvbldpdGhTdGF0ZTxULCBBPiA9IEEgfCBbQSwgVF07XG5leHBvcnQgdHlwZSBBY3Rpb25TdGF0ZVN0cmVhbTxULCBBPiA9IE9ic2VydmFibGU8QWN0aW9uT3JBY3Rpb25XaXRoU3RhdGU8VCwgQT4+O1xuXG5leHBvcnQgZnVuY3Rpb24gcGVzc2ltaXN0aWNVcGRhdGU8VCwgQSBleHRlbmRzIEFjdGlvbj4oXG4gIG9wdHM6IFBlc3NpbWlzdGljVXBkYXRlT3B0czxULCBBPlxuKSB7XG4gIHJldHVybiAoc291cmNlOiBBY3Rpb25TdGF0ZVN0cmVhbTxULCBBPik6IE9ic2VydmFibGU8QWN0aW9uPiA9PiB7XG4gICAgcmV0dXJuIHNvdXJjZS5waXBlKFxuICAgICAgbWFwQWN0aW9uQW5kU3RhdGUoKSxcbiAgICAgIGNvbmNhdE1hcChydW5XaXRoRXJyb3JIYW5kbGluZyhvcHRzLnJ1biwgb3B0cy5vbkVycm9yKSlcbiAgICApO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb3B0aW1pc3RpY1VwZGF0ZTxULCBBIGV4dGVuZHMgQWN0aW9uPihcbiAgb3B0czogT3B0aW1pc3RpY1VwZGF0ZU9wdHM8VCwgQT5cbikge1xuICByZXR1cm4gKHNvdXJjZTogQWN0aW9uU3RhdGVTdHJlYW08VCwgQT4pOiBPYnNlcnZhYmxlPEFjdGlvbj4gPT4ge1xuICAgIHJldHVybiBzb3VyY2UucGlwZShcbiAgICAgIG1hcEFjdGlvbkFuZFN0YXRlKCksXG4gICAgICBjb25jYXRNYXAocnVuV2l0aEVycm9ySGFuZGxpbmcob3B0cy5ydW4sIG9wdHMudW5kb0FjdGlvbikpXG4gICAgKTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZldGNoPFQsIEEgZXh0ZW5kcyBBY3Rpb24+KG9wdHM6IEZldGNoT3B0czxULCBBPikge1xuICByZXR1cm4gKHNvdXJjZTogQWN0aW9uU3RhdGVTdHJlYW08VCwgQT4pOiBPYnNlcnZhYmxlPEFjdGlvbj4gPT4ge1xuICAgIGlmIChvcHRzLmlkKSB7XG4gICAgICBjb25zdCBncm91cGVkRmV0Y2hlcyA9IHNvdXJjZS5waXBlKFxuICAgICAgICBtYXBBY3Rpb25BbmRTdGF0ZSgpLFxuICAgICAgICBncm91cEJ5KChbYWN0aW9uLCBzdG9yZV0pID0+IHtcbiAgICAgICAgICByZXR1cm4gb3B0cy5pZChhY3Rpb24sIHN0b3JlKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBncm91cGVkRmV0Y2hlcy5waXBlKFxuICAgICAgICBtZXJnZU1hcCgocGFpcnMpID0+XG4gICAgICAgICAgcGFpcnMucGlwZShzd2l0Y2hNYXAocnVuV2l0aEVycm9ySGFuZGxpbmcob3B0cy5ydW4sIG9wdHMub25FcnJvcikpKVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBzb3VyY2UucGlwZShcbiAgICAgIG1hcEFjdGlvbkFuZFN0YXRlKCksXG4gICAgICBjb25jYXRNYXAocnVuV2l0aEVycm9ySGFuZGxpbmcob3B0cy5ydW4sIG9wdHMub25FcnJvcikpXG4gICAgKTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5hdmlnYXRpb248VCwgQSBleHRlbmRzIEFjdGlvbj4oXG4gIGNvbXBvbmVudDogVHlwZTxhbnk+LFxuICBvcHRzOiBIYW5kbGVOYXZpZ2F0aW9uT3B0czxUPlxuKSB7XG4gIHJldHVybiAoc291cmNlOiBBY3Rpb25TdGF0ZVN0cmVhbTxULCBBPikgPT4ge1xuICAgIGNvbnN0IG5hdiA9IHNvdXJjZS5waXBlKFxuICAgICAgbWFwQWN0aW9uQW5kU3RhdGUoKSxcbiAgICAgIGZpbHRlcigoW2FjdGlvbiwgc3RhdGVdKSA9PiBpc1N0YXRlU25hcHNob3QoYWN0aW9uKSksXG4gICAgICBtYXAoKFthY3Rpb24sIHN0YXRlXSkgPT4ge1xuICAgICAgICBpZiAoIWlzU3RhdGVTbmFwc2hvdChhY3Rpb24pKSB7XG4gICAgICAgICAgLy8gQmVjYXVzZSBvZiB0aGUgYWJvdmUgZmlsdGVyIHdlJ2xsIG5ldmVyIGdldCBoZXJlLFxuICAgICAgICAgIC8vIGJ1dCB0aGlzIHByb3Blcmx5IHR5cGUgbmFycm93cyBgYWN0aW9uYFxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgZmluZFNuYXBzaG90KGNvbXBvbmVudCwgYWN0aW9uLnBheWxvYWQucm91dGVyU3RhdGUucm9vdCksXG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgIF0gYXMgW0FjdGl2YXRlZFJvdXRlU25hcHNob3QsIFRdO1xuICAgICAgfSksXG4gICAgICBmaWx0ZXIoKFtzbmFwc2hvdCwgc3RhdGVdKSA9PiAhIXNuYXBzaG90KVxuICAgICk7XG5cbiAgICByZXR1cm4gbmF2LnBpcGUoc3dpdGNoTWFwKHJ1bldpdGhFcnJvckhhbmRsaW5nKG9wdHMucnVuLCBvcHRzLm9uRXJyb3IpKSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGlzU3RhdGVTbmFwc2hvdChcbiAgYWN0aW9uOiBhbnlcbik6IGFjdGlvbiBpcyBSb3V0ZXJOYXZpZ2F0aW9uQWN0aW9uPFJvdXRlclN0YXRlU25hcHNob3Q+IHtcbiAgcmV0dXJuIGFjdGlvbi50eXBlID09PSBST1VURVJfTkFWSUdBVElPTjtcbn1cblxuZnVuY3Rpb24gcnVuV2l0aEVycm9ySGFuZGxpbmc8VCwgQSwgUj4oXG4gIHJ1bjogKGE6IEEsIHN0YXRlPzogVCkgPT4gT2JzZXJ2YWJsZTxSPiB8IFIgfCB2b2lkLFxuICBvbkVycm9yOiBhbnlcbikge1xuICByZXR1cm4gKFthY3Rpb24sIHN0YXRlXTogW0EsIFRdKTogT2JzZXJ2YWJsZTxSPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHIgPSB3cmFwSW50b09ic2VydmFibGUocnVuKGFjdGlvbiwgc3RhdGUpKTtcbiAgICAgIHJldHVybiByLnBpcGUoY2F0Y2hFcnJvcigoZSkgPT4gd3JhcEludG9PYnNlcnZhYmxlKG9uRXJyb3IoYWN0aW9uLCBlKSkpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gd3JhcEludG9PYnNlcnZhYmxlKG9uRXJyb3IoYWN0aW9uLCBlKSk7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIEB3aGF0SXREb2VzIG1hcHMgT2JzZXJ2YWJsZTxBY3Rpb24gfCBbQWN0aW9uLCBTdGF0ZV0+IHRvXG4gKiBPYnNlcnZhYmxlPFtBY3Rpb24sIFN0YXRlXT5cbiAqL1xuZnVuY3Rpb24gbWFwQWN0aW9uQW5kU3RhdGU8VCwgQT4oKSB7XG4gIHJldHVybiAoc291cmNlOiBPYnNlcnZhYmxlPEFjdGlvbk9yQWN0aW9uV2l0aFN0YXRlPFQsIEE+PikgPT4ge1xuICAgIHJldHVybiBzb3VyY2UucGlwZShcbiAgICAgIG1hcCgodmFsdWUpID0+IHtcbiAgICAgICAgY29uc3QgW2FjdGlvbiwgc3RvcmVdID0gbm9ybWFsaXplQWN0aW9uQW5kU3RhdGUodmFsdWUpO1xuICAgICAgICByZXR1cm4gW2FjdGlvbiwgc3RvcmVdIGFzIFtBLCBUXTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAd2hhdEl0RG9lcyBOb3JtYWxpemVzIGVpdGhlciBhIGJhcmUgYWN0aW9uIG9yIGFuIGFycmF5IG9mIGFjdGlvbiBhbmQgc3RhdGVcbiAqIGludG8gYW4gYXJyYXkgb2YgYWN0aW9uIGFuZCBzdGF0ZSAob3IgdW5kZWZpbmVkKVxuICovXG5mdW5jdGlvbiBub3JtYWxpemVBY3Rpb25BbmRTdGF0ZTxULCBBPihcbiAgYXJnczogQWN0aW9uT3JBY3Rpb25XaXRoU3RhdGU8VCwgQT5cbik6IFtBLCBUXSB7XG4gIGxldCBhY3Rpb246IEEsIHN0YXRlOiBUO1xuXG4gIGlmIChhcmdzIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICBbYWN0aW9uLCBzdGF0ZV0gPSBhcmdzO1xuICB9IGVsc2Uge1xuICAgIGFjdGlvbiA9IGFyZ3M7XG4gIH1cblxuICByZXR1cm4gW2FjdGlvbiwgc3RhdGVdO1xufVxuXG4vKipcbiAqIEB3aGF0SXREb2VzIFByb3ZpZGVzIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGltcGxlbWVudGluZyBjb21tb24gb3BlcmF0aW9ucyBvZiBwZXJzaXN0aW5nIGRhdGEuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEYXRhUGVyc2lzdGVuY2U8VD4ge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgc3RvcmU6IFN0b3JlPFQ+LCBwdWJsaWMgYWN0aW9uczogQWN0aW9ucykge31cblxuICAvKipcbiAgICpcbiAgICogQHdoYXRJdERvZXMgSGFuZGxlcyBwZXNzaW1pc3RpYyB1cGRhdGVzICh1cGRhdGluZyB0aGUgc2VydmVyIGZpcnN0KS5cbiAgICpcbiAgICogVXBkYXRlIHRoZSBzZXJ2ZXIgaW1wbGVtZW50ZWQgbmFpdmVseSBzdWZmZXJzIGZyb20gcmFjZSBjb25kaXRpb25zIGFuZCBwb29yIGVycm9yIGhhbmRsaW5nLlxuICAgKlxuICAgKiBgcGVzc2ltaXN0aWNVcGRhdGVgIGFkZHJlc3NlcyB0aGVzZSBwcm9ibGVtcy0taXQgcnVucyBhbGwgZmV0Y2hlcyBpbiBvcmRlciwgd2hpY2ggcmVtb3ZlcyByYWNlIGNvbmRpdGlvbnNcbiAgICogYW5kIGZvcmNlcyB0aGUgZGV2ZWxvcGVyIHRvIGhhbmRsZSBlcnJvcnMuXG4gICAqXG4gICAqICMjIEV4YW1wbGU6XG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogQEluamVjdGFibGUoKVxuICAgKiBjbGFzcyBUb2RvRWZmZWN0cyB7XG4gICAqICAgQEVmZmVjdCgpIHVwZGF0ZVRvZG8gPSB0aGlzLnMucGVzc2ltaXN0aWNVcGRhdGU8VXBkYXRlVG9kbz4oJ1VQREFURV9UT0RPJywge1xuICAgKiAgICAgLy8gcHJvdmlkZXMgYW4gYWN0aW9uIGFuZCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgc3RvcmVcbiAgICogICAgIHJ1bihhLCBzdGF0ZSkge1xuICAgKiAgICAgICAvLyB1cGRhdGUgdGhlIGJhY2tlbmQgZmlyc3QsIGFuZCB0aGVuIGRpc3BhdGNoIGFuIGFjdGlvbiB0aGF0IHdpbGxcbiAgICogICAgICAgLy8gdXBkYXRlIHRoZSBjbGllbnQgc2lkZVxuICAgKiAgICAgICByZXR1cm4gdGhpcy5iYWNrZW5kKHN0YXRlLnVzZXIsIGEucGF5bG9hZCkubWFwKHVwZGF0ZWQgPT4gKHtcbiAgICogICAgICAgICB0eXBlOiAnVE9ET19VUERBVEVEJyxcbiAgICogICAgICAgICBwYXlsb2FkOiB1cGRhdGVkXG4gICAqICAgICAgIH0pKTtcbiAgICogICAgIH0sXG4gICAqXG4gICAqICAgICBvbkVycm9yKGEsIGU6IGFueSkge1xuICAgKiAgICAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIHVuZG8gdGhlIGNoYW5nZXMgb24gdGhlIGNsaWVudCBzaWRlLlxuICAgKiAgICAgICAvLyB3ZSBjYW4gZGlzcGF0Y2ggYW4gZXJyb3IsIG9yIHNpbXBseSBsb2cgdGhlIGVycm9yIGhlcmUgYW5kIHJldHVybiBgbnVsbGBcbiAgICogICAgICAgcmV0dXJuIG51bGw7XG4gICAqICAgICB9XG4gICAqICAgfSk7XG4gICAqXG4gICAqICAgY29uc3RydWN0b3IocHJpdmF0ZSBzOiBEYXRhUGVyc2lzdGVuY2U8VG9kb3NTdGF0ZT4sIHByaXZhdGUgYmFja2VuZDogQmFja2VuZCkge31cbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogTm90ZSB0aGF0IGlmIHlvdSBkb24ndCByZXR1cm4gYSBuZXcgYWN0aW9uIGZyb20gdGhlIHJ1biBjYWxsYmFjaywgeW91IG11c3Qgc2V0IHRoZSBkaXNwYXRjaCBwcm9wZXJ0eVxuICAgKiBvZiB0aGUgZWZmZWN0IHRvIGZhbHNlLCBsaWtlIHRoaXM6XG4gICAqXG4gICAqIGBgYFxuICAgKiBjbGFzcyBUb2RvRWZmZWN0cyB7XG4gICAqICAgQEVmZmVjdCh7ZGlzcGF0Y2g6IGZhbHNlfSlcbiAgICogICB1cGRhdGVUb2RvOyAvLy4uLlxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgcGVzc2ltaXN0aWNVcGRhdGU8QSBleHRlbmRzIEFjdGlvbiA9IEFjdGlvbj4oXG4gICAgYWN0aW9uVHlwZTogc3RyaW5nIHwgQWN0aW9uQ3JlYXRvcixcbiAgICBvcHRzOiBQZXNzaW1pc3RpY1VwZGF0ZU9wdHM8VCwgQT5cbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5hY3Rpb25zLnBpcGUoXG4gICAgICBvZlR5cGU8QT4oYWN0aW9uVHlwZSksXG4gICAgICB3aXRoTGF0ZXN0RnJvbSh0aGlzLnN0b3JlKSxcbiAgICAgIHBlc3NpbWlzdGljVXBkYXRlKG9wdHMpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAd2hhdEl0RG9lcyBIYW5kbGVzIG9wdGltaXN0aWMgdXBkYXRlcyAodXBkYXRpbmcgdGhlIGNsaWVudCBmaXJzdCkuXG4gICAqXG4gICAqIGBvcHRpbWlzdGljVXBkYXRlYCBhZGRyZXNzZXMgdGhlc2UgcHJvYmxlbXMtLWl0IHJ1bnMgYWxsIGZldGNoZXMgaW4gb3JkZXIsIHdoaWNoIHJlbW92ZXMgcmFjZSBjb25kaXRpb25zXG4gICAqIGFuZCBmb3JjZXMgdGhlIGRldmVsb3BlciB0byBoYW5kbGUgZXJyb3JzLlxuICAgKlxuICAgKiBgb3B0aW1pc3RpY1VwZGF0ZWAgaXMgZGlmZmVyZW50IGZyb20gYHBlc3NpbWlzdGljVXBkYXRlYC4gSW4gY2FzZSBvZiBhIGZhaWx1cmUsIHdoZW4gdXNpbmcgYG9wdGltaXN0aWNVcGRhdGVgLFxuICAgKiB0aGUgZGV2ZWxvcGVyIGFscmVhZHkgdXBkYXRlZCB0aGUgc3RhdGUgbG9jYWxseSwgc28gdGhlIGRldmVsb3BlciBtdXN0IHByb3ZpZGUgYW4gdW5kbyBhY3Rpb24uXG4gICAqXG4gICAqIFRoZSBlcnJvciBoYW5kbGluZyBtdXN0IGJlIGRvbmUgaW4gdGhlIGNhbGxiYWNrLCBvciBieSBtZWFucyBvZiB0aGUgdW5kbyBhY3Rpb24uXG4gICAqXG4gICAqICMjIEV4YW1wbGU6XG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogQEluamVjdGFibGUoKVxuICAgKiBjbGFzcyBUb2RvRWZmZWN0cyB7XG4gICAqICAgQEVmZmVjdCgpIHVwZGF0ZVRvZG8gPSB0aGlzLnMub3B0aW1pc3RpY1VwZGF0ZTxVcGRhdGVUb2RvPignVVBEQVRFX1RPRE8nLCB7XG4gICAqICAgICAvLyBwcm92aWRlcyBhbiBhY3Rpb24gYW5kIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBzdG9yZVxuICAgKiAgICAgcnVuOiAoYSwgc3RhdGUpID0+IHtcbiAgICogICAgICAgcmV0dXJuIHRoaXMuYmFja2VuZChzdGF0ZS51c2VyLCBhLnBheWxvYWQpO1xuICAgKiAgICAgfSxcbiAgICpcbiAgICogICAgIHVuZG9BY3Rpb246IChhLCBlOiBhbnkpID0+IHtcbiAgICogICAgICAgLy8gZGlzcGF0Y2ggYW4gdW5kbyBhY3Rpb24gdG8gdW5kbyB0aGUgY2hhbmdlcyBpbiB0aGUgY2xpZW50IHN0YXRlXG4gICAqICAgICAgIHJldHVybiAoe1xuICAgKiAgICAgICAgIHR5cGU6ICdVTkRPX1VQREFURV9UT0RPJyxcbiAgICogICAgICAgICBwYXlsb2FkOiBhXG4gICAqICAgICAgIH0pO1xuICAgKiAgICAgfVxuICAgKiAgIH0pO1xuICAgKlxuICAgKiAgIGNvbnN0cnVjdG9yKHByaXZhdGUgczogRGF0YVBlcnNpc3RlbmNlPFRvZG9zU3RhdGU+LCBwcml2YXRlIGJhY2tlbmQ6IEJhY2tlbmQpIHt9XG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIE5vdGUgdGhhdCBpZiB5b3UgZG9uJ3QgcmV0dXJuIGEgbmV3IGFjdGlvbiBmcm9tIHRoZSBydW4gY2FsbGJhY2ssIHlvdSBtdXN0IHNldCB0aGUgZGlzcGF0Y2ggcHJvcGVydHlcbiAgICogb2YgdGhlIGVmZmVjdCB0byBmYWxzZSwgbGlrZSB0aGlzOlxuICAgKlxuICAgKiBgYGBcbiAgICogY2xhc3MgVG9kb0VmZmVjdHMge1xuICAgKiAgIEBFZmZlY3Qoe2Rpc3BhdGNoOiBmYWxzZX0pXG4gICAqICAgdXBkYXRlVG9kbzsgLy8uLi5cbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIG9wdGltaXN0aWNVcGRhdGU8QSBleHRlbmRzIEFjdGlvbiA9IEFjdGlvbj4oXG4gICAgYWN0aW9uVHlwZTogc3RyaW5nIHwgQWN0aW9uQ3JlYXRvcixcbiAgICBvcHRzOiBPcHRpbWlzdGljVXBkYXRlT3B0czxULCBBPlxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmFjdGlvbnMucGlwZShcbiAgICAgIG9mVHlwZTxBPihhY3Rpb25UeXBlKSxcbiAgICAgIHdpdGhMYXRlc3RGcm9tKHRoaXMuc3RvcmUpLFxuICAgICAgb3B0aW1pc3RpY1VwZGF0ZShvcHRzKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHdoYXRJdERvZXMgSGFuZGxlcyBkYXRhIGZldGNoaW5nLlxuICAgKlxuICAgKiBEYXRhIGZldGNoaW5nIGltcGxlbWVudGVkIG5haXZlbHkgc3VmZmVycyBmcm9tIHJhY2UgY29uZGl0aW9ucyBhbmQgcG9vciBlcnJvciBoYW5kbGluZy5cbiAgICpcbiAgICogYGZldGNoYCBhZGRyZXNzZXMgdGhlc2UgcHJvYmxlbXMtLWl0IHJ1bnMgYWxsIGZldGNoZXMgaW4gb3JkZXIsIHdoaWNoIHJlbW92ZXMgcmFjZSBjb25kaXRpb25zXG4gICAqIGFuZCBmb3JjZXMgdGhlIGRldmVsb3BlciB0byBoYW5kbGUgZXJyb3JzLlxuICAgKlxuICAgKiAjIyBFeGFtcGxlOlxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIEBJbmplY3RhYmxlKClcbiAgICogY2xhc3MgVG9kb0VmZmVjdHMge1xuICAgKiAgIEBFZmZlY3QoKSBsb2FkVG9kb3MgPSB0aGlzLnMuZmV0Y2g8R2V0VG9kb3M+KCdHRVRfVE9ET1MnLCB7XG4gICAqICAgICAvLyBwcm92aWRlcyBhbiBhY3Rpb24gYW5kIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBzdG9yZVxuICAgKiAgICAgcnVuOiAoYSwgc3RhdGUpID0+IHtcbiAgICogICAgICAgcmV0dXJuIHRoaXMuYmFja2VuZChzdGF0ZS51c2VyLCBhLnBheWxvYWQpLm1hcChyID0+ICh7XG4gICAqICAgICAgICAgdHlwZTogJ1RPRE9TJyxcbiAgICogICAgICAgICBwYXlsb2FkOiByXG4gICAqICAgICAgIH0pO1xuICAgKiAgICAgfSxcbiAgICpcbiAgICogICAgIG9uRXJyb3I6IChhLCBlOiBhbnkpID0+IHtcbiAgICogICAgICAgLy8gZGlzcGF0Y2ggYW4gdW5kbyBhY3Rpb24gdG8gdW5kbyB0aGUgY2hhbmdlcyBpbiB0aGUgY2xpZW50IHN0YXRlXG4gICAqICAgICB9XG4gICAqICAgfSk7XG4gICAqXG4gICAqICAgY29uc3RydWN0b3IocHJpdmF0ZSBzOiBEYXRhUGVyc2lzdGVuY2U8VG9kb3NTdGF0ZT4sIHByaXZhdGUgYmFja2VuZDogQmFja2VuZCkge31cbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogVGhpcyBpcyBjb3JyZWN0LCBidXQgYmVjYXVzZSBpdCBzZXQgdGhlIGNvbmN1cnJlbmN5IHRvIDEsIGl0IG1heSBub3QgYmUgcGVyZm9ybWFudC5cbiAgICpcbiAgICogVG8gZml4IHRoYXQsIHlvdSBjYW4gcHJvdmlkZSB0aGUgYGlkYCBmdW5jdGlvbiwgbGlrZSB0aGlzOlxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIEBJbmplY3RhYmxlKClcbiAgICogY2xhc3MgVG9kb0VmZmVjdHMge1xuICAgKiAgIEBFZmZlY3QoKSBsb2FkVG9kbyA9IHRoaXMucy5mZXRjaDxHZXRUb2RvPignR0VUX1RPRE8nLCB7XG4gICAqICAgICBpZDogKGEsIHN0YXRlKSA9PiB7XG4gICAqICAgICAgIHJldHVybiBhLnBheWxvYWQuaWQ7XG4gICAqICAgICB9XG4gICAqXG4gICAqICAgICAvLyBwcm92aWRlcyBhbiBhY3Rpb24gYW5kIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBzdG9yZVxuICAgKiAgICAgcnVuOiAoYSwgc3RhdGUpID0+IHtcbiAgICogICAgICAgcmV0dXJuIHRoaXMuYmFja2VuZChzdGF0ZS51c2VyLCBhLnBheWxvYWQpLm1hcChyID0+ICh7XG4gICAqICAgICAgICAgdHlwZTogJ1RPRE8nLFxuICAgKiAgICAgICAgIHBheWxvYWQ6IHJcbiAgICogICAgICAgfSk7XG4gICAqICAgICB9LFxuICAgKlxuICAgKiAgICAgb25FcnJvcjogKGEsIGU6IGFueSkgPT4ge1xuICAgKiAgICAgICAvLyBkaXNwYXRjaCBhbiB1bmRvIGFjdGlvbiB0byB1bmRvIHRoZSBjaGFuZ2VzIGluIHRoZSBjbGllbnQgc3RhdGVcbiAgICogICAgICAgcmV0dXJuIG51bGw7XG4gICAqICAgICB9XG4gICAqICAgfSk7XG4gICAqXG4gICAqICAgY29uc3RydWN0b3IocHJpdmF0ZSBzOiBEYXRhUGVyc2lzdGVuY2U8VG9kb3NTdGF0ZT4sIHByaXZhdGUgYmFja2VuZDogQmFja2VuZCkge31cbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogV2l0aCB0aGlzIHNldHVwLCB0aGUgcmVxdWVzdHMgZm9yIFRvZG8gMSB3aWxsIHJ1biBjb25jdXJyZW50bHkgd2l0aCB0aGUgcmVxdWVzdHMgZm9yIFRvZG8gMi5cbiAgICpcbiAgICogSW4gYWRkaXRpb24sIGlmIERhdGFQZXJzaXN0ZW5jZSBub3RpY2VzIHRoYXQgdGhlcmUgYXJlIG11bHRpcGxlIHJlcXVlc3RzIGZvciBUb2RvIDEgc2NoZWR1bGVkLFxuICAgKiBpdCB3aWxsIG9ubHkgcnVuIHRoZSBsYXN0IG9uZS5cbiAgICovXG4gIGZldGNoPEEgZXh0ZW5kcyBBY3Rpb24gPSBBY3Rpb24+KFxuICAgIGFjdGlvblR5cGU6IHN0cmluZyB8IEFjdGlvbkNyZWF0b3IsXG4gICAgb3B0czogRmV0Y2hPcHRzPFQsIEE+XG4gICk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aW9ucy5waXBlKFxuICAgICAgb2ZUeXBlPEE+KGFjdGlvblR5cGUpLFxuICAgICAgd2l0aExhdGVzdEZyb20odGhpcy5zdG9yZSksXG4gICAgICBmZXRjaChvcHRzKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHdoYXRJdERvZXMgSGFuZGxlcyBkYXRhIGZldGNoaW5nIGFzIHBhcnQgb2Ygcm91dGVyIG5hdmlnYXRpb24uXG4gICAqXG4gICAqIERhdGEgZmV0Y2hpbmcgaW1wbGVtZW50ZWQgbmFpdmVseSBzdWZmZXJzIGZyb20gcmFjZSBjb25kaXRpb25zIGFuZCBwb29yIGVycm9yIGhhbmRsaW5nLlxuICAgKlxuICAgKiBgbmF2aWdhdGlvbmAgYWRkcmVzc2VzIHRoZXNlIHByb2JsZW1zLlxuICAgKlxuICAgKiBJdCBjaGVja3MgaWYgYW4gYWN0aXZhdGVkIHJvdXRlciBzdGF0ZSBjb250YWlucyB0aGUgcGFzc2VkIGluIGNvbXBvbmVudCB0eXBlLCBhbmQsIGlmIGl0IGRvZXMsIHJ1bnMgdGhlIGBydW5gXG4gICAqIGNhbGxiYWNrLiBJdCBwcm92aWRlcyB0aGUgYWN0aXZhdGVkIHNuYXBzaG90IGFzc29jaWF0ZWQgd2l0aCB0aGUgY29tcG9uZW50IGFuZCB0aGUgY3VycmVudCBzdGF0ZS4gQW5kIGl0IG9ubHkgcnVuc1xuICAgKiB0aGUgbGFzdCByZXF1ZXN0LlxuICAgKlxuICAgKiAjIyBFeGFtcGxlOlxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIEBJbmplY3RhYmxlKClcbiAgICogY2xhc3MgVG9kb0VmZmVjdHMge1xuICAgKiAgIEBFZmZlY3QoKSBsb2FkVG9kbyA9IHRoaXMucy5uYXZpZ2F0aW9uKFRvZG9Db21wb25lbnQsIHtcbiAgICogICAgIHJ1bjogKGEsIHN0YXRlKSA9PiB7XG4gICAqICAgICAgIHJldHVybiB0aGlzLmJhY2tlbmQuZmV0Y2hUb2RvKGEucGFyYW1zWydpZCddKS5tYXAodG9kbyA9PiAoe1xuICAgKiAgICAgICAgIHR5cGU6ICdUT0RPX0xPQURFRCcsXG4gICAqICAgICAgICAgcGF5bG9hZDogdG9kb1xuICAgKiAgICAgICB9KSk7XG4gICAqICAgICB9LFxuICAgKiAgICAgb25FcnJvcjogKGEsIGU6IGFueSkgPT4ge1xuICAgKiAgICAgICAvLyB3ZSBjYW4gbG9nIGFuZCBlcnJvciBoZXJlIGFuZCByZXR1cm4gbnVsbFxuICAgKiAgICAgICAvLyB3ZSBjYW4gYWxzbyBuYXZpZ2F0ZSBiYWNrXG4gICAqICAgICAgIHJldHVybiBudWxsO1xuICAgKiAgICAgfVxuICAgKiAgIH0pO1xuICAgKiAgIGNvbnN0cnVjdG9yKHByaXZhdGUgczogRGF0YVBlcnNpc3RlbmNlPFRvZG9zU3RhdGU+LCBwcml2YXRlIGJhY2tlbmQ6IEJhY2tlbmQpIHt9XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBuYXZpZ2F0aW9uKFxuICAgIGNvbXBvbmVudDogVHlwZTxhbnk+LFxuICAgIG9wdHM6IEhhbmRsZU5hdmlnYXRpb25PcHRzPFQ+XG4gICk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aW9ucy5waXBlKFxuICAgICAgd2l0aExhdGVzdEZyb20odGhpcy5zdG9yZSksXG4gICAgICBuYXZpZ2F0aW9uKGNvbXBvbmVudCwgb3B0cylcbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRTbmFwc2hvdChcbiAgY29tcG9uZW50OiBUeXBlPGFueT4sXG4gIHM6IEFjdGl2YXRlZFJvdXRlU25hcHNob3Rcbik6IEFjdGl2YXRlZFJvdXRlU25hcHNob3Qge1xuICBpZiAocy5yb3V0ZUNvbmZpZyAmJiBzLnJvdXRlQ29uZmlnLmNvbXBvbmVudCA9PT0gY29tcG9uZW50KSB7XG4gICAgcmV0dXJuIHM7XG4gIH1cbiAgZm9yIChjb25zdCBjIG9mIHMuY2hpbGRyZW4pIHtcbiAgICBjb25zdCBzcyA9IGZpbmRTbmFwc2hvdChjb21wb25lbnQsIGMpO1xuICAgIGlmIChzcykge1xuICAgICAgcmV0dXJuIHNzO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gd3JhcEludG9PYnNlcnZhYmxlPE8+KG9iajogT2JzZXJ2YWJsZTxPPiB8IE8gfCB2b2lkKTogT2JzZXJ2YWJsZTxPPiB7XG4gIGlmIChpc09ic2VydmFibGUob2JqKSkge1xuICAgIHJldHVybiBvYmo7XG4gIH0gZWxzZSBpZiAoIW9iaikge1xuICAgIHJldHVybiBvZigpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBvZihvYmogYXMgTyk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,21 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { DataPersistence } from './data-persistence';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * @whatItDoes Provides services for enterprise Angular applications.
6
+ *
7
+ * See {@link DataPersistence} for more information.
8
+ */
9
+ export class NxModule {
10
+ static forRoot() {
11
+ return { ngModule: NxModule, providers: [DataPersistence] };
12
+ }
13
+ }
14
+ NxModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: NxModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
15
+ NxModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: NxModule });
16
+ NxModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: NxModule });
17
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: NxModule, decorators: [{
18
+ type: NgModule,
19
+ args: [{}]
20
+ }] });
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibngubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3J1bnRpbWUvbngvbngubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBdUIsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFFckQ7Ozs7R0FJRztBQUVILE1BQU0sT0FBTyxRQUFRO0lBQ25CLE1BQU0sQ0FBQyxPQUFPO1FBQ1osT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztJQUM5RCxDQUFDOztxR0FIVSxRQUFRO3NHQUFSLFFBQVE7c0dBQVIsUUFBUTsyRkFBUixRQUFRO2tCQURwQixRQUFRO21CQUFDLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNb2R1bGVXaXRoUHJvdmlkZXJzLCBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGF0YVBlcnNpc3RlbmNlIH0gZnJvbSAnLi9kYXRhLXBlcnNpc3RlbmNlJztcblxuLyoqXG4gKiBAd2hhdEl0RG9lcyBQcm92aWRlcyBzZXJ2aWNlcyBmb3IgZW50ZXJwcmlzZSBBbmd1bGFyIGFwcGxpY2F0aW9ucy5cbiAqXG4gKiBTZWUge0BsaW5rIERhdGFQZXJzaXN0ZW5jZX0gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKi9cbkBOZ01vZHVsZSh7fSlcbmV4cG9ydCBjbGFzcyBOeE1vZHVsZSB7XG4gIHN0YXRpYyBmb3JSb290KCk6IE1vZHVsZVdpdGhQcm92aWRlcnM8TnhNb2R1bGU+IHtcbiAgICByZXR1cm4geyBuZ01vZHVsZTogTnhNb2R1bGUsIHByb3ZpZGVyczogW0RhdGFQZXJzaXN0ZW5jZV0gfTtcbiAgfVxufVxuIl19
@@ -0,0 +1,19 @@
1
+ import { cold as rxjsMarblesCold, hot as rxjsMarblesHot, getTestScheduler as rxjsMarblesTestScheduler, time as rxjsMarblesTime, } from 'jasmine-marbles';
2
+ /**
3
+ * @deprecated Import from 'jasmine-marbles' instead
4
+ */
5
+ export const cold = rxjsMarblesCold;
6
+ /**
7
+ * @deprecated Import from 'jasmine-marbles' instead
8
+ */
9
+ export const hot = rxjsMarblesHot;
10
+ /**
11
+ * @deprecated Import from 'jasmine-marbles' instead
12
+ */
13
+ export const getTestScheduler = rxjsMarblesTestScheduler;
14
+ /**
15
+ * @deprecated Import from 'jasmine-marbles' instead
16
+ */
17
+ export const time = rxjsMarblesTime;
18
+ export { readAll, readFirst } from './src/testing-utils';
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0aW5nL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxJQUFJLElBQUksZUFBZSxFQUN2QixHQUFHLElBQUksY0FBYyxFQUNyQixnQkFBZ0IsSUFBSSx3QkFBd0IsRUFDNUMsSUFBSSxJQUFJLGVBQWUsR0FDeEIsTUFBTSxpQkFBaUIsQ0FBQztBQUV6Qjs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxlQUFlLENBQUM7QUFDcEM7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsY0FBYyxDQUFDO0FBQ2xDOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsd0JBQXdCLENBQUM7QUFDekQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUFDO0FBRXBDLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBjb2xkIGFzIHJ4anNNYXJibGVzQ29sZCxcbiAgaG90IGFzIHJ4anNNYXJibGVzSG90LFxuICBnZXRUZXN0U2NoZWR1bGVyIGFzIHJ4anNNYXJibGVzVGVzdFNjaGVkdWxlcixcbiAgdGltZSBhcyByeGpzTWFyYmxlc1RpbWUsXG59IGZyb20gJ2phc21pbmUtbWFyYmxlcyc7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgSW1wb3J0IGZyb20gJ2phc21pbmUtbWFyYmxlcycgaW5zdGVhZFxuICovXG5leHBvcnQgY29uc3QgY29sZCA9IHJ4anNNYXJibGVzQ29sZDtcbi8qKlxuICogQGRlcHJlY2F0ZWQgSW1wb3J0IGZyb20gJ2phc21pbmUtbWFyYmxlcycgaW5zdGVhZFxuICovXG5leHBvcnQgY29uc3QgaG90ID0gcnhqc01hcmJsZXNIb3Q7XG4vKipcbiAqIEBkZXByZWNhdGVkIEltcG9ydCBmcm9tICdqYXNtaW5lLW1hcmJsZXMnIGluc3RlYWRcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFRlc3RTY2hlZHVsZXIgPSByeGpzTWFyYmxlc1Rlc3RTY2hlZHVsZXI7XG4vKipcbiAqIEBkZXByZWNhdGVkIEltcG9ydCBmcm9tICdqYXNtaW5lLW1hcmJsZXMnIGluc3RlYWRcbiAqL1xuZXhwb3J0IGNvbnN0IHRpbWUgPSByeGpzTWFyYmxlc1RpbWU7XG5cbmV4cG9ydCB7IHJlYWRBbGwsIHJlYWRGaXJzdCB9IGZyb20gJy4vc3JjL3Rlc3RpbmctdXRpbHMnO1xuIl19
@@ -1,4 +1,4 @@
1
- export { cold, getTestScheduler, hot, time } from 'jasmine-marbles';
1
+ import { cold as cold$1, hot as hot$1, getTestScheduler as getTestScheduler$1, time as time$1 } from 'jasmine-marbles';
2
2
  import { toArray, first } from 'rxjs/operators';
3
3
 
4
4
  /**
@@ -32,9 +32,26 @@ function readFirst(o) {
32
32
  return o.pipe(first()).toPromise();
33
33
  }
34
34
 
35
+ /**
36
+ * @deprecated Import from 'jasmine-marbles' instead
37
+ */
38
+ const cold = cold$1;
39
+ /**
40
+ * @deprecated Import from 'jasmine-marbles' instead
41
+ */
42
+ const hot = hot$1;
43
+ /**
44
+ * @deprecated Import from 'jasmine-marbles' instead
45
+ */
46
+ const getTestScheduler = getTestScheduler$1;
47
+ /**
48
+ * @deprecated Import from 'jasmine-marbles' instead
49
+ */
50
+ const time = time$1;
51
+
35
52
  /**
36
53
  * Generated bundle index. Do not edit.
37
54
  */
38
55
 
39
- export { readAll, readFirst };
40
- //# sourceMappingURL=nrwl-angular-testing.js.map
56
+ export { cold, getTestScheduler, hot, readAll, readFirst, time };
57
+ //# sourceMappingURL=nrwl-angular-testing.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nrwl-angular-testing.mjs","sources":["../../testing/src/testing-utils.ts","../../testing/index.ts","../../testing/nrwl-angular-testing.ts"],"sourcesContent":["import type { Observable } from 'rxjs';\nimport { first, toArray } from 'rxjs/operators';\n\n/**\n * @whatItDoes reads all the values from an observable and returns a promise\n * with an array of all values. This should be used in combination with async/await.\n *\n * ## Example\n *\n * ```typescript\n * const obs = of(1, 2, 3, 4);\n * const res = await readAll(obs)\n * expect(res).toEqual([1, 2, 3, 4]);\n * ```\n */\nexport function readAll<T>(o: Observable<T>): Promise<T[]> {\n return o.pipe(toArray()).toPromise();\n}\n\n/**\n * @whatItDoes reads the first value from an observable and returns a promise\n * with it. This should be used in combination with async/await.\n *\n * ## Example\n *\n * ```typescript\n * const obs = of(1, 2, 3, 4);\n * const res = await readFirst(obs)\n * expect(res).toEqual(1);\n * ```\n */\nexport function readFirst<T>(o: Observable<T>): Promise<T> {\n return o.pipe(first()).toPromise();\n}\n","import {\n cold as rxjsMarblesCold,\n hot as rxjsMarblesHot,\n getTestScheduler as rxjsMarblesTestScheduler,\n time as rxjsMarblesTime,\n} from 'jasmine-marbles';\n\n/**\n * @deprecated Import from 'jasmine-marbles' instead\n */\nexport const cold = rxjsMarblesCold;\n/**\n * @deprecated Import from 'jasmine-marbles' instead\n */\nexport const hot = rxjsMarblesHot;\n/**\n * @deprecated Import from 'jasmine-marbles' instead\n */\nexport const getTestScheduler = rxjsMarblesTestScheduler;\n/**\n * @deprecated Import from 'jasmine-marbles' instead\n */\nexport const time = rxjsMarblesTime;\n\nexport { readAll, readFirst } from './src/testing-utils';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["rxjsMarblesCold","rxjsMarblesHot","rxjsMarblesTestScheduler","rxjsMarblesTime"],"mappings":";;;AAGA;;;;;;;;;;;;SAYgB,OAAO,CAAI,CAAgB;IACzC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;AACvC,CAAC;AAED;;;;;;;;;;;;SAYgB,SAAS,CAAI,CAAgB;IAC3C,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;AACrC;;AC1BA;;;MAGa,IAAI,GAAGA,OAAgB;AACpC;;;MAGa,GAAG,GAAGC,MAAe;AAClC;;;MAGa,gBAAgB,GAAGC,mBAAyB;AACzD;;;MAGa,IAAI,GAAGC;;ACtBpB;;;;;;"}
@@ -1,9 +1,11 @@
1
+ import * as i0 from '@angular/core';
1
2
  import { Injectable, NgModule } from '@angular/core';
2
- import { ofType, Actions } from '@ngrx/effects';
3
+ import * as i2 from '@ngrx/effects';
4
+ import { ofType } from '@ngrx/effects';
3
5
  import { ROUTER_NAVIGATION } from '@ngrx/router-store';
4
- import { Store } from '@ngrx/store';
5
6
  import { isObservable, of } from 'rxjs';
6
7
  import { map, concatMap, catchError, groupBy, mergeMap, switchMap, filter, withLatestFrom } from 'rxjs/operators';
8
+ import * as i1 from '@ngrx/store';
7
9
 
8
10
  function pessimisticUpdate(opts) {
9
11
  return (source) => {
@@ -295,13 +297,11 @@ class DataPersistence {
295
297
  return this.actions.pipe(withLatestFrom(this.store), navigation(component, opts));
296
298
  }
297
299
  }
298
- DataPersistence.decorators = [
299
- { type: Injectable }
300
- ];
301
- DataPersistence.ctorParameters = () => [
302
- { type: Store },
303
- { type: Actions }
304
- ];
300
+ DataPersistence.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: DataPersistence, deps: [{ token: i1.Store }, { token: i2.Actions }], target: i0.ɵɵFactoryTarget.Injectable });
301
+ DataPersistence.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: DataPersistence });
302
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: DataPersistence, decorators: [{
303
+ type: Injectable
304
+ }], ctorParameters: function () { return [{ type: i1.Store }, { type: i2.Actions }]; } });
305
305
  function findSnapshot(component, s) {
306
306
  if (s.routeConfig && s.routeConfig.component === component) {
307
307
  return s;
@@ -336,13 +336,17 @@ class NxModule {
336
336
  return { ngModule: NxModule, providers: [DataPersistence] };
337
337
  }
338
338
  }
339
- NxModule.decorators = [
340
- { type: NgModule, args: [{},] }
341
- ];
339
+ NxModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: NxModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
340
+ NxModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: NxModule });
341
+ NxModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: NxModule });
342
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: NxModule, decorators: [{
343
+ type: NgModule,
344
+ args: [{}]
345
+ }] });
342
346
 
343
347
  /**
344
348
  * Generated bundle index. Do not edit.
345
349
  */
346
350
 
347
351
  export { DataPersistence, NxModule, fetch, navigation, optimisticUpdate, pessimisticUpdate };
348
- //# sourceMappingURL=nrwl-angular.js.map
352
+ //# sourceMappingURL=nrwl-angular.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nrwl-angular.mjs","sources":["../../src/runtime/nx/data-persistence.ts","../../src/runtime/nx/nx.module.ts","../../nrwl-angular.ts"],"sourcesContent":["import { Injectable, Type } from '@angular/core';\nimport { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';\nimport { Actions, ofType } from '@ngrx/effects';\nimport { ROUTER_NAVIGATION, RouterNavigationAction } from '@ngrx/router-store';\nimport { Action, Store, ActionCreator } from '@ngrx/store';\nimport { isObservable, Observable, of } from 'rxjs';\nimport {\n catchError,\n concatMap,\n filter,\n groupBy,\n map,\n mergeMap,\n switchMap,\n withLatestFrom,\n} from 'rxjs/operators';\n\n/**\n * See {@link DataPersistence.pessimisticUpdate} for more information.\n */\nexport interface PessimisticUpdateOpts<T, A> {\n run(a: A, state?: T): Observable<Action> | Action | void;\n onError(a: A, e: any): Observable<any> | any;\n}\n/**\n * See {@link DataPersistence.pessimisticUpdate} for more information.\n */\nexport interface OptimisticUpdateOpts<T, A> {\n run(a: A, state?: T): Observable<Action> | Action | void;\n undoAction(a: A, e: any): Observable<Action> | Action;\n}\n\n/**\n * See {@link DataPersistence.fetch} for more information.\n */\nexport interface FetchOpts<T, A> {\n id?(a: A, state?: T): any;\n run(a: A, state?: T): Observable<Action> | Action | void;\n onError?(a: A, e: any): Observable<any> | any;\n}\n\n/**\n * See {@link DataPersistence.navigation} for more information.\n */\nexport interface HandleNavigationOpts<T> {\n run(a: ActivatedRouteSnapshot, state?: T): Observable<Action> | Action | void;\n onError?(a: ActivatedRouteSnapshot, e: any): Observable<any> | any;\n}\n\nexport type ActionOrActionWithState<T, A> = A | [A, T];\nexport type ActionStateStream<T, A> = Observable<ActionOrActionWithState<T, A>>;\n\nexport function pessimisticUpdate<T, A extends Action>(\n opts: PessimisticUpdateOpts<T, A>\n) {\n return (source: ActionStateStream<T, A>): Observable<Action> => {\n return source.pipe(\n mapActionAndState(),\n concatMap(runWithErrorHandling(opts.run, opts.onError))\n );\n };\n}\n\nexport function optimisticUpdate<T, A extends Action>(\n opts: OptimisticUpdateOpts<T, A>\n) {\n return (source: ActionStateStream<T, A>): Observable<Action> => {\n return source.pipe(\n mapActionAndState(),\n concatMap(runWithErrorHandling(opts.run, opts.undoAction))\n );\n };\n}\n\nexport function fetch<T, A extends Action>(opts: FetchOpts<T, A>) {\n return (source: ActionStateStream<T, A>): Observable<Action> => {\n if (opts.id) {\n const groupedFetches = source.pipe(\n mapActionAndState(),\n groupBy(([action, store]) => {\n return opts.id(action, store);\n })\n );\n\n return groupedFetches.pipe(\n mergeMap((pairs) =>\n pairs.pipe(switchMap(runWithErrorHandling(opts.run, opts.onError)))\n )\n );\n }\n\n return source.pipe(\n mapActionAndState(),\n concatMap(runWithErrorHandling(opts.run, opts.onError))\n );\n };\n}\n\nexport function navigation<T, A extends Action>(\n component: Type<any>,\n opts: HandleNavigationOpts<T>\n) {\n return (source: ActionStateStream<T, A>) => {\n const nav = source.pipe(\n mapActionAndState(),\n filter(([action, state]) => isStateSnapshot(action)),\n map(([action, state]) => {\n if (!isStateSnapshot(action)) {\n // Because of the above filter we'll never get here,\n // but this properly type narrows `action`\n return;\n }\n\n return [\n findSnapshot(component, action.payload.routerState.root),\n state,\n ] as [ActivatedRouteSnapshot, T];\n }),\n filter(([snapshot, state]) => !!snapshot)\n );\n\n return nav.pipe(switchMap(runWithErrorHandling(opts.run, opts.onError)));\n };\n}\n\nfunction isStateSnapshot(\n action: any\n): action is RouterNavigationAction<RouterStateSnapshot> {\n return action.type === ROUTER_NAVIGATION;\n}\n\nfunction runWithErrorHandling<T, A, R>(\n run: (a: A, state?: T) => Observable<R> | R | void,\n onError: any\n) {\n return ([action, state]: [A, T]): Observable<R> => {\n try {\n const r = wrapIntoObservable(run(action, state));\n return r.pipe(catchError((e) => wrapIntoObservable(onError(action, e))));\n } catch (e) {\n return wrapIntoObservable(onError(action, e));\n }\n };\n}\n\n/**\n * @whatItDoes maps Observable<Action | [Action, State]> to\n * Observable<[Action, State]>\n */\nfunction mapActionAndState<T, A>() {\n return (source: Observable<ActionOrActionWithState<T, A>>) => {\n return source.pipe(\n map((value) => {\n const [action, store] = normalizeActionAndState(value);\n return [action, store] as [A, T];\n })\n );\n };\n}\n\n/**\n * @whatItDoes Normalizes either a bare action or an array of action and state\n * into an array of action and state (or undefined)\n */\nfunction normalizeActionAndState<T, A>(\n args: ActionOrActionWithState<T, A>\n): [A, T] {\n let action: A, state: T;\n\n if (args instanceof Array) {\n [action, state] = args;\n } else {\n action = args;\n }\n\n return [action, state];\n}\n\n/**\n * @whatItDoes Provides convenience methods for implementing common operations of persisting data.\n */\n@Injectable()\nexport class DataPersistence<T> {\n constructor(public store: Store<T>, public actions: Actions) {}\n\n /**\n *\n * @whatItDoes Handles pessimistic updates (updating the server first).\n *\n * Update the server implemented naively suffers from race conditions and poor error handling.\n *\n * `pessimisticUpdate` addresses these problems--it runs all fetches in order, which removes race conditions\n * and forces the developer to handle errors.\n *\n * ## Example:\n *\n * ```typescript\n * @Injectable()\n * class TodoEffects {\n * @Effect() updateTodo = this.s.pessimisticUpdate<UpdateTodo>('UPDATE_TODO', {\n * // provides an action and the current state of the store\n * run(a, state) {\n * // update the backend first, and then dispatch an action that will\n * // update the client side\n * return this.backend(state.user, a.payload).map(updated => ({\n * type: 'TODO_UPDATED',\n * payload: updated\n * }));\n * },\n *\n * onError(a, e: any) {\n * // we don't need to undo the changes on the client side.\n * // we can dispatch an error, or simply log the error here and return `null`\n * return null;\n * }\n * });\n *\n * constructor(private s: DataPersistence<TodosState>, private backend: Backend) {}\n * }\n * ```\n *\n * Note that if you don't return a new action from the run callback, you must set the dispatch property\n * of the effect to false, like this:\n *\n * ```\n * class TodoEffects {\n * @Effect({dispatch: false})\n * updateTodo; //...\n * }\n * ```\n */\n pessimisticUpdate<A extends Action = Action>(\n actionType: string | ActionCreator,\n opts: PessimisticUpdateOpts<T, A>\n ): Observable<any> {\n return this.actions.pipe(\n ofType<A>(actionType),\n withLatestFrom(this.store),\n pessimisticUpdate(opts)\n );\n }\n\n /**\n *\n * @whatItDoes Handles optimistic updates (updating the client first).\n *\n * `optimisticUpdate` addresses these problems--it runs all fetches in order, which removes race conditions\n * and forces the developer to handle errors.\n *\n * `optimisticUpdate` is different from `pessimisticUpdate`. In case of a failure, when using `optimisticUpdate`,\n * the developer already updated the state locally, so the developer must provide an undo action.\n *\n * The error handling must be done in the callback, or by means of the undo action.\n *\n * ## Example:\n *\n * ```typescript\n * @Injectable()\n * class TodoEffects {\n * @Effect() updateTodo = this.s.optimisticUpdate<UpdateTodo>('UPDATE_TODO', {\n * // provides an action and the current state of the store\n * run: (a, state) => {\n * return this.backend(state.user, a.payload);\n * },\n *\n * undoAction: (a, e: any) => {\n * // dispatch an undo action to undo the changes in the client state\n * return ({\n * type: 'UNDO_UPDATE_TODO',\n * payload: a\n * });\n * }\n * });\n *\n * constructor(private s: DataPersistence<TodosState>, private backend: Backend) {}\n * }\n * ```\n *\n * Note that if you don't return a new action from the run callback, you must set the dispatch property\n * of the effect to false, like this:\n *\n * ```\n * class TodoEffects {\n * @Effect({dispatch: false})\n * updateTodo; //...\n * }\n * ```\n */\n optimisticUpdate<A extends Action = Action>(\n actionType: string | ActionCreator,\n opts: OptimisticUpdateOpts<T, A>\n ): Observable<any> {\n return this.actions.pipe(\n ofType<A>(actionType),\n withLatestFrom(this.store),\n optimisticUpdate(opts)\n );\n }\n\n /**\n *\n * @whatItDoes Handles data fetching.\n *\n * Data fetching implemented naively suffers from race conditions and poor error handling.\n *\n * `fetch` addresses these problems--it runs all fetches in order, which removes race conditions\n * and forces the developer to handle errors.\n *\n * ## Example:\n *\n * ```typescript\n * @Injectable()\n * class TodoEffects {\n * @Effect() loadTodos = this.s.fetch<GetTodos>('GET_TODOS', {\n * // provides an action and the current state of the store\n * run: (a, state) => {\n * return this.backend(state.user, a.payload).map(r => ({\n * type: 'TODOS',\n * payload: r\n * });\n * },\n *\n * onError: (a, e: any) => {\n * // dispatch an undo action to undo the changes in the client state\n * }\n * });\n *\n * constructor(private s: DataPersistence<TodosState>, private backend: Backend) {}\n * }\n * ```\n *\n * This is correct, but because it set the concurrency to 1, it may not be performant.\n *\n * To fix that, you can provide the `id` function, like this:\n *\n * ```typescript\n * @Injectable()\n * class TodoEffects {\n * @Effect() loadTodo = this.s.fetch<GetTodo>('GET_TODO', {\n * id: (a, state) => {\n * return a.payload.id;\n * }\n *\n * // provides an action and the current state of the store\n * run: (a, state) => {\n * return this.backend(state.user, a.payload).map(r => ({\n * type: 'TODO',\n * payload: r\n * });\n * },\n *\n * onError: (a, e: any) => {\n * // dispatch an undo action to undo the changes in the client state\n * return null;\n * }\n * });\n *\n * constructor(private s: DataPersistence<TodosState>, private backend: Backend) {}\n * }\n * ```\n *\n * With this setup, the requests for Todo 1 will run concurrently with the requests for Todo 2.\n *\n * In addition, if DataPersistence notices that there are multiple requests for Todo 1 scheduled,\n * it will only run the last one.\n */\n fetch<A extends Action = Action>(\n actionType: string | ActionCreator,\n opts: FetchOpts<T, A>\n ): Observable<any> {\n return this.actions.pipe(\n ofType<A>(actionType),\n withLatestFrom(this.store),\n fetch(opts)\n );\n }\n\n /**\n * @whatItDoes Handles data fetching as part of router navigation.\n *\n * Data fetching implemented naively suffers from race conditions and poor error handling.\n *\n * `navigation` addresses these problems.\n *\n * It checks if an activated router state contains the passed in component type, and, if it does, runs the `run`\n * callback. It provides the activated snapshot associated with the component and the current state. And it only runs\n * the last request.\n *\n * ## Example:\n *\n * ```typescript\n * @Injectable()\n * class TodoEffects {\n * @Effect() loadTodo = this.s.navigation(TodoComponent, {\n * run: (a, state) => {\n * return this.backend.fetchTodo(a.params['id']).map(todo => ({\n * type: 'TODO_LOADED',\n * payload: todo\n * }));\n * },\n * onError: (a, e: any) => {\n * // we can log and error here and return null\n * // we can also navigate back\n * return null;\n * }\n * });\n * constructor(private s: DataPersistence<TodosState>, private backend: Backend) {}\n * }\n * ```\n */\n navigation(\n component: Type<any>,\n opts: HandleNavigationOpts<T>\n ): Observable<any> {\n return this.actions.pipe(\n withLatestFrom(this.store),\n navigation(component, opts)\n );\n }\n}\n\nfunction findSnapshot(\n component: Type<any>,\n s: ActivatedRouteSnapshot\n): ActivatedRouteSnapshot {\n if (s.routeConfig && s.routeConfig.component === component) {\n return s;\n }\n for (const c of s.children) {\n const ss = findSnapshot(component, c);\n if (ss) {\n return ss;\n }\n }\n return null;\n}\n\nfunction wrapIntoObservable<O>(obj: Observable<O> | O | void): Observable<O> {\n if (isObservable(obj)) {\n return obj;\n } else if (!obj) {\n return of();\n } else {\n return of(obj as O);\n }\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { DataPersistence } from './data-persistence';\n\n/**\n * @whatItDoes Provides services for enterprise Angular applications.\n *\n * See {@link DataPersistence} for more information.\n */\n@NgModule({})\nexport class NxModule {\n static forRoot(): ModuleWithProviders<NxModule> {\n return { ngModule: NxModule, providers: [DataPersistence] };\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import { cold as cold$1, hot as hot$1, getTestScheduler as getTestScheduler$1, time as time$1 } from 'jasmine-marbles';
2
+ import { toArray, first } from 'rxjs/operators';
3
+
4
+ /**
5
+ * @whatItDoes reads all the values from an observable and returns a promise
6
+ * with an array of all values. This should be used in combination with async/await.
7
+ *
8
+ * ## Example
9
+ *
10
+ * ```typescript
11
+ * const obs = of(1, 2, 3, 4);
12
+ * const res = await readAll(obs)
13
+ * expect(res).toEqual([1, 2, 3, 4]);
14
+ * ```
15
+ */
16
+ function readAll(o) {
17
+ return o.pipe(toArray()).toPromise();
18
+ }
19
+ /**
20
+ * @whatItDoes reads the first value from an observable and returns a promise
21
+ * with it. This should be used in combination with async/await.
22
+ *
23
+ * ## Example
24
+ *
25
+ * ```typescript
26
+ * const obs = of(1, 2, 3, 4);
27
+ * const res = await readFirst(obs)
28
+ * expect(res).toEqual(1);
29
+ * ```
30
+ */
31
+ function readFirst(o) {
32
+ return o.pipe(first()).toPromise();
33
+ }
34
+
35
+ /**
36
+ * @deprecated Import from 'jasmine-marbles' instead
37
+ */
38
+ const cold = cold$1;
39
+ /**
40
+ * @deprecated Import from 'jasmine-marbles' instead
41
+ */
42
+ const hot = hot$1;
43
+ /**
44
+ * @deprecated Import from 'jasmine-marbles' instead
45
+ */
46
+ const getTestScheduler = getTestScheduler$1;
47
+ /**
48
+ * @deprecated Import from 'jasmine-marbles' instead
49
+ */
50
+ const time = time$1;
51
+
52
+ /**
53
+ * Generated bundle index. Do not edit.
54
+ */
55
+
56
+ export { cold, getTestScheduler, hot, readAll, readFirst, time };
57
+ //# sourceMappingURL=nrwl-angular-testing.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nrwl-angular-testing.mjs","sources":["../../testing/src/testing-utils.ts","../../testing/index.ts","../../testing/nrwl-angular-testing.ts"],"sourcesContent":["import type { Observable } from 'rxjs';\nimport { first, toArray } from 'rxjs/operators';\n\n/**\n * @whatItDoes reads all the values from an observable and returns a promise\n * with an array of all values. This should be used in combination with async/await.\n *\n * ## Example\n *\n * ```typescript\n * const obs = of(1, 2, 3, 4);\n * const res = await readAll(obs)\n * expect(res).toEqual([1, 2, 3, 4]);\n * ```\n */\nexport function readAll<T>(o: Observable<T>): Promise<T[]> {\n return o.pipe(toArray()).toPromise();\n}\n\n/**\n * @whatItDoes reads the first value from an observable and returns a promise\n * with it. This should be used in combination with async/await.\n *\n * ## Example\n *\n * ```typescript\n * const obs = of(1, 2, 3, 4);\n * const res = await readFirst(obs)\n * expect(res).toEqual(1);\n * ```\n */\nexport function readFirst<T>(o: Observable<T>): Promise<T> {\n return o.pipe(first()).toPromise();\n}\n","import {\n cold as rxjsMarblesCold,\n hot as rxjsMarblesHot,\n getTestScheduler as rxjsMarblesTestScheduler,\n time as rxjsMarblesTime,\n} from 'jasmine-marbles';\n\n/**\n * @deprecated Import from 'jasmine-marbles' instead\n */\nexport const cold = rxjsMarblesCold;\n/**\n * @deprecated Import from 'jasmine-marbles' instead\n */\nexport const hot = rxjsMarblesHot;\n/**\n * @deprecated Import from 'jasmine-marbles' instead\n */\nexport const getTestScheduler = rxjsMarblesTestScheduler;\n/**\n * @deprecated Import from 'jasmine-marbles' instead\n */\nexport const time = rxjsMarblesTime;\n\nexport { readAll, readFirst } from './src/testing-utils';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["rxjsMarblesCold","rxjsMarblesHot","rxjsMarblesTestScheduler","rxjsMarblesTime"],"mappings":";;;AAGA;;;;;;;;;;;;SAYgB,OAAO,CAAI,CAAgB;IACzC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;AACvC,CAAC;AAED;;;;;;;;;;;;SAYgB,SAAS,CAAI,CAAgB;IAC3C,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;AACrC;;AC1BA;;;MAGa,IAAI,GAAGA,OAAgB;AACpC;;;MAGa,GAAG,GAAGC,MAAe;AAClC;;;MAGa,gBAAgB,GAAGC,mBAAyB;AACzD;;;MAGa,IAAI,GAAGC;;ACtBpB;;;;;;"}