@nutin/cli 1.3.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (289) hide show
  1. package/CHANGELOG.md +106 -9
  2. package/README.md +17 -35
  3. package/bin/add-feature.mjs +9 -0
  4. package/bin/cli.mjs +8 -0
  5. package/bin/create-app.mjs +5 -4
  6. package/bin/update-app.mjs +9 -0
  7. package/lib/index.mjs +76 -25
  8. package/lib/src/add-feature/feature-adder.mjs +83 -0
  9. package/lib/src/add-feature/feature-context-builder.mjs +25 -0
  10. package/lib/src/add-feature/nutin-config-updater.mjs +29 -0
  11. package/lib/src/add-feature/package-json-updater.mjs +49 -0
  12. package/lib/src/common/feature-registry.mjs +11 -0
  13. package/lib/src/common/file-generator.mjs +159 -0
  14. package/lib/src/common/meta-bootstrap-prompt.mjs +33 -0
  15. package/lib/src/common/package-data.mjs +10 -0
  16. package/lib/src/common/package-json-helper.mjs +103 -0
  17. package/lib/src/common/project-meta.mjs +54 -0
  18. package/lib/src/create-app/context-builder.mjs +21 -0
  19. package/lib/src/{git-manager.mjs → create-app/git-manager.mjs} +2 -2
  20. package/lib/src/create-app/json-manager.mjs +73 -0
  21. package/lib/src/{prompts.mjs → create-app/new-app-prompt.mjs} +6 -6
  22. package/lib/src/{project-generator.mjs → create-app/project-generator.mjs} +10 -8
  23. package/lib/src/create-app/success-message.mjs +13 -0
  24. package/lib/src/update-app/conflict-report-writer.mjs +31 -0
  25. package/lib/src/update-app/fetch-old-templates.mjs +61 -0
  26. package/lib/src/update-app/project-updater.mjs +142 -0
  27. package/lib/src/update-app/template-differ.mjs +124 -0
  28. package/lib/src/update-app/update-context-builder.mjs +25 -0
  29. package/lib/src/update-app/update-summary-printer.mjs +22 -0
  30. package/lib/src/update-app/version-compare.mjs +12 -0
  31. package/lib/src/utils/print.mjs +36 -0
  32. package/lib/src/utils/promise-exec-alias.mjs +4 -0
  33. package/package.json +17 -12
  34. package/templates/base/.gitignore.hbs +6 -1
  35. package/templates/base/AGENTS.md.hbs +168 -0
  36. package/templates/base/GETTING_STARTED.md.hbs +199 -0
  37. package/templates/base/README.md.hbs +8 -17
  38. package/templates/base/config/languages.json.hbs +6 -0
  39. package/templates/base/config/seo.json.hbs +12 -0
  40. package/templates/base/nutin.config.js.hbs +44 -0
  41. package/templates/base/src/app/components/index.ts.hbs +1 -2
  42. package/templates/base/src/app/globals.d.ts.hbs +3 -19
  43. package/templates/base/src/{libs/guards → app}/guards.ts.hbs +1 -5
  44. package/templates/base/src/app/main.ts.hbs +6 -26
  45. package/templates/base/src/app/services/index.ts.hbs +1 -1
  46. package/templates/base/src/app/views/home/home.view.html.hbs +7 -0
  47. package/templates/base/src/app/views/home/home.view.ts.hbs +2 -57
  48. package/templates/base/src/app/views/index.ts.hbs +1 -0
  49. package/templates/base/src/app/views/not-found/not-found.view.html.hbs +8 -0
  50. package/templates/base/src/app/views/not-found/not-found.view.ts.hbs +5 -38
  51. package/templates/base/src/core/base-classes/base-component/base-component.test.js.hbs +158 -0
  52. package/templates/base/src/core/base-classes/base-component/base-component.ts.hbs +68 -35
  53. package/templates/base/src/core/base-classes/base-component/helpers/catalog.helper.test.js.hbs +124 -0
  54. package/templates/base/src/core/base-classes/base-component/helpers/catalog.helper.ts.hbs +9 -8
  55. package/templates/base/src/core/base-classes/base-component/helpers/children.helper.test.js.hbs +96 -0
  56. package/templates/base/src/core/base-classes/base-component/helpers/children.helper.ts.hbs +6 -3
  57. package/templates/base/src/core/base-classes/base-component/helpers/dom.helper.test.js.hbs +151 -0
  58. package/templates/base/src/core/base-classes/base-component/helpers/dom.helper.ts.hbs +8 -2
  59. package/templates/base/src/core/base-classes/base-component/helpers/event.helper.test.js.hbs +88 -0
  60. package/templates/base/src/core/base-classes/base-component/helpers/event.helper.ts.hbs +2 -2
  61. package/templates/base/src/core/base-classes/base-component/helpers/i18n.helper.test.js.hbs +62 -0
  62. package/templates/base/src/core/base-classes/base-component/helpers/pipe.helper.test.js.hbs +89 -0
  63. package/templates/base/src/core/base-classes/base-component/helpers/pipe.helper.ts.hbs +4 -1
  64. package/templates/base/src/core/base-classes/base-component/helpers/security.helper.test.js.hbs +142 -0
  65. package/templates/base/src/core/base-classes/base-component/helpers/security.helper.ts.hbs +67 -22
  66. package/templates/base/src/core/base-classes/base-component/helpers/token.helper.test.js.hbs +183 -0
  67. package/templates/base/src/core/base-classes/component/component.test.js.hbs +85 -0
  68. package/templates/base/src/core/base-classes/component/component.ts.hbs +24 -33
  69. package/templates/base/src/core/base-classes/component/helpers/config.helper.test.js.hbs +58 -0
  70. package/templates/base/src/core/base-classes/component/helpers/data-binding.helper.test.js.hbs +75 -0
  71. package/templates/base/src/core/base-classes/service/service.test.js.hbs +150 -0
  72. package/templates/base/src/core/base-classes/service/service.ts.hbs +26 -20
  73. package/templates/base/src/core/base-classes/view/view.test.js.hbs +71 -0
  74. package/templates/base/src/core/base-classes/view/view.ts.hbs +24 -49
  75. package/templates/base/src/core/config.ts.hbs +10 -0
  76. package/templates/base/src/core/index.ts.hbs +0 -3
  77. package/templates/base/src/core/internals.d.ts.hbs +27 -0
  78. package/templates/base/src/core/nutin-config.d.ts.hbs +4 -0
  79. package/templates/base/src/core/services/event-bus/event-bus.test.js.hbs +67 -3
  80. package/templates/base/src/core/services/event-bus/event-bus.ts.hbs +9 -4
  81. package/templates/base/src/core/services/event-bus/index.ts.hbs +3 -0
  82. package/templates/base/src/core/services/event-bus/lifecycle.facade.test.js.hbs +123 -0
  83. package/templates/base/src/core/services/event-bus/lifecycle.facade.ts.hbs +61 -0
  84. package/templates/base/src/core/services/event-bus/navigation.facade.test.js.hbs +46 -0
  85. package/templates/base/src/core/services/event-bus/navigation.facade.ts.hbs +25 -0
  86. package/templates/base/src/core/services/globals/globals.test.js.hbs +187 -0
  87. package/templates/base/src/core/services/globals/globals.ts.hbs +104 -0
  88. package/templates/base/src/core/services/http-client/helpers/http-builder.helper.test.js.hbs +25 -0
  89. package/templates/base/src/core/services/http-client/helpers/http-manager.helper.test.js.hbs +20 -0
  90. package/templates/base/src/core/services/http-client/http-client.test.js.hbs +73 -2
  91. package/templates/base/src/core/services/http-client/http-client.ts.hbs +4 -1
  92. package/templates/base/src/core/services/i18n/i18n.test.js.hbs +270 -0
  93. package/templates/{features/i18n → base}/src/core/services/i18n/i18n.ts.hbs +22 -4
  94. package/templates/base/src/core/services/index.ts.hbs +5 -6
  95. package/templates/base/src/core/services/pipe-registry/pipe-registry.test.js.hbs +60 -1
  96. package/templates/base/src/core/services/pipe-registry/pipe-registry.ts.hbs +1 -1
  97. package/templates/base/src/core/services/pipe-registry/pipes.test.js.hbs +128 -0
  98. package/templates/base/src/{libs/pipes → core/services/pipe-registry}/pipes.ts.hbs +8 -5
  99. package/templates/base/src/core/services/router/helpers/navigation-manager.helper.test.js.hbs +257 -6
  100. package/templates/base/src/core/services/router/helpers/navigation-manager.helper.ts.hbs +56 -29
  101. package/templates/base/src/core/services/router/helpers/route-guard-manager.helper.test.js.hbs +27 -0
  102. package/templates/base/src/core/services/router/helpers/view-render-manager.helper.test.js.hbs +83 -17
  103. package/templates/base/src/core/services/router/helpers/view-render-manager.helper.ts.hbs +14 -38
  104. package/templates/base/src/core/services/router/router.test.js.hbs +304 -2
  105. package/templates/base/src/core/services/router/router.ts.hbs +47 -12
  106. package/templates/base/src/index.html.hbs +2 -6
  107. package/templates/base/src/styles/_styles.scss.hbs +102 -43
  108. package/templates/base/src/styles/base/_variables.scss.hbs +1 -86
  109. package/templates/base/src/styles/main.scss.hbs +1 -18
  110. package/templates/base/src/styles/tailwind.css.hbs +2 -0
  111. package/templates/base/tools/builder/builder.config.js.hbs +40 -0
  112. package/templates/base/tools/builder/builder.js.hbs +24 -26
  113. package/templates/base/tools/builder/core/app/binary-extensions.test.js.hbs +16 -0
  114. package/templates/base/tools/builder/core/app/compile-ts.js.hbs +16 -0
  115. package/templates/base/tools/builder/core/{copy-static.js.hbs → app/copy-static.js.hbs} +27 -34
  116. package/templates/base/tools/builder/core/app/validate-routes.js.hbs +77 -0
  117. package/templates/base/tools/builder/core/finalize-build.js.hbs +16 -7
  118. package/templates/base/tools/builder/core/{add-tags.js.hbs → html-index/add-tags.js.hbs} +2 -2
  119. package/templates/base/tools/builder/core/html-index/add-tags.test.js.hbs +56 -0
  120. package/templates/base/tools/builder/core/{validate-html.js.hbs → html-index/validate-html.js.hbs} +5 -11
  121. package/templates/base/tools/builder/core/html-templates/merge-templates.js.hbs +152 -0
  122. package/templates/base/tools/builder/core/html-templates/minify-html.js.hbs +15 -0
  123. package/templates/base/tools/builder/core/html-templates/process-html-templates.js.hbs +8 -0
  124. package/templates/{features/i18n/tools/builder/core → base/tools/builder/core/i18n}/build-i18n.js.hbs +6 -17
  125. package/templates/base/tools/builder/core/prod-bundle/compress-files.js.hbs +37 -0
  126. package/templates/base/tools/builder/core/prod-bundle/esbuild.js.hbs +30 -0
  127. package/templates/base/tools/builder/core/{hash-files.js.hbs → prod-bundle/hash-files.js.hbs} +14 -11
  128. package/templates/base/tools/builder/core/seo/generate-robots-txt.js.hbs +51 -0
  129. package/templates/base/tools/builder/core/seo/generate-seo-files.js.hbs +16 -0
  130. package/templates/base/tools/builder/core/seo/generate-seo-html.js.hbs +128 -0
  131. package/templates/base/tools/builder/core/seo/generate-sitemap-xml.js.hbs +43 -0
  132. package/templates/base/tools/builder/core/seo/html-substitutions.js.hbs +99 -0
  133. package/templates/base/tools/builder/core/seo/i18n-resolution.js.hbs +66 -0
  134. package/templates/base/tools/builder/core/seo/route-output.js.hbs +64 -0
  135. package/templates/base/tools/builder/core/seo/ssr/ssr-bundle.js.hbs +54 -0
  136. package/templates/base/tools/builder/core/seo/ssr/ssr-polyfills.js.hbs +132 -0
  137. package/templates/base/tools/builder/core/seo/ssr/ssr-render.js.hbs +95 -0
  138. package/templates/base/tools/builder/core/styles/sass.js.hbs +40 -0
  139. package/templates/base/tools/builder/core/styles/tailwind.js.hbs +84 -0
  140. package/templates/base/tools/dev/dev-serve.js.hbs +26 -18
  141. package/templates/base/tools/dev/serve.js.hbs +11 -1
  142. package/templates/base/tools/dev/watcher.js.hbs +14 -6
  143. package/templates/base/tools/generator/generator.js.hbs +44 -47
  144. package/templates/base/tools/generator/handle-file.js.hbs +17 -44
  145. package/templates/base/tools/generator/handle-file.test.js.hbs +72 -0
  146. package/templates/base/tools/generator/templates/{component.template.js.hbs → component/component.template.js.hbs} +3 -2
  147. package/templates/base/tools/generator/templates/component/component.template.test.js.hbs +23 -0
  148. package/templates/base/tools/generator/templates/html/html.template.js.hbs +2 -0
  149. package/templates/base/tools/generator/templates/html/html.template.test.js.hbs +7 -0
  150. package/templates/base/tools/generator/templates/index.js.hbs +7 -12
  151. package/templates/base/tools/generator/templates/locale/locale.template.js.hbs +8 -0
  152. package/templates/base/tools/generator/templates/locale/locale.template.test.js.hbs +17 -0
  153. package/templates/base/tools/generator/templates/scss/scss.template.js.hbs +1 -0
  154. package/templates/base/tools/generator/templates/scss/scss.template.test.js.hbs +7 -0
  155. package/templates/base/tools/generator/templates/service/service.template.js.hbs +17 -0
  156. package/templates/base/tools/generator/templates/service/service.template.test.js.hbs +22 -0
  157. package/templates/base/tools/generator/templates/test/test.template.js.hbs +10 -0
  158. package/templates/base/tools/generator/templates/test/test.template.test.js.hbs +27 -0
  159. package/templates/base/tools/generator/templates/{view.template.js.hbs → view/view.template.js.hbs} +4 -3
  160. package/templates/base/tools/generator/templates/view/view.template.test.js.hbs +24 -0
  161. package/templates/base/tools/testin-nutin/core/coverage/collect-coverage.js.hbs +39 -0
  162. package/templates/base/tools/testin-nutin/core/coverage/compute-coverage.js.hbs +115 -0
  163. package/templates/base/tools/testin-nutin/core/coverage/compute-coverage.test.js.hbs +74 -0
  164. package/templates/base/tools/testin-nutin/core/coverage/write-summary-report.js.hbs +54 -0
  165. package/templates/base/tools/testin-nutin/core/coverage/write-uncovered-report.js.hbs +44 -0
  166. package/templates/{features/testinNutin/testin-nutin/core/src → base/tools/testin-nutin/core}/globals/assertion-lib.js.hbs +62 -24
  167. package/templates/base/tools/testin-nutin/core/globals/clock.js.hbs +206 -0
  168. package/templates/{features/testinNutin/testin-nutin/core/src → base/tools/testin-nutin/core}/globals/jsdom-setup.js.hbs +19 -6
  169. package/templates/{features/testinNutin/testin-nutin/core/src → base/tools/testin-nutin/core}/globals/register-test-globals.js.hbs +13 -4
  170. package/templates/base/tools/testin-nutin/core/globals/silence-console.js.hbs +23 -0
  171. package/templates/{features/testinNutin/testin-nutin/core/src → base/tools/testin-nutin/core}/globals/spyon.js.hbs +2 -0
  172. package/templates/base/tools/testin-nutin/core/index.js.hbs +9 -0
  173. package/templates/base/tools/testin-nutin/core/printer.js.hbs +85 -0
  174. package/templates/base/tools/testin-nutin/core/queue/queue.test.js.hbs +46 -0
  175. package/templates/base/tools/testin-nutin/core/queue/test-discovery.test.js.hbs +46 -0
  176. package/templates/base/tools/testin-nutin/core/queue/test-queue.js.hbs +154 -0
  177. package/templates/{features/testinNutin → base/tools}/testin-nutin/core/tests/assertions.test.js.hbs +27 -0
  178. package/templates/base/tools/testin-nutin/core/tests/clock.test.js.hbs +118 -0
  179. package/templates/base/tools/testin-nutin/core/tests/globals-each-all.test.js.hbs +28 -0
  180. package/templates/{features/testinNutin → base/tools}/testin-nutin/mocks/create-mock-method.js.hbs +2 -1
  181. package/templates/base/tools/testin-nutin/mocks/create-mock-method.test.js.hbs +64 -0
  182. package/templates/{features/testinNutin → base/tools}/testin-nutin/mocks/mock-event-bus.js.hbs +3 -2
  183. package/templates/base/tools/testin-nutin/mocks/mock-event-bus.test.js.hbs +66 -0
  184. package/templates/base/tools/testin-nutin/mocks/mock-http-client.test.js.hbs +26 -0
  185. package/templates/base/tools/testin-nutin/mocks/mock-i18n.test.js.hbs +61 -0
  186. package/templates/base/tools/testin-nutin/mocks/mock-router.test.js.hbs +29 -0
  187. package/templates/base/tools/testin-nutin/runner.js.hbs +100 -0
  188. package/templates/base/tools/testin-nutin/watch-tests.js.hbs +37 -0
  189. package/templates/base/tools/utils/error-exit.js.hbs +8 -0
  190. package/templates/base/tools/utils/format.js.hbs +10 -10
  191. package/templates/base/tools/utils/format.test.js.hbs +45 -0
  192. package/templates/base/tools/utils/get-files-recursive.js.hbs +6 -1
  193. package/templates/base/tools/utils/get-files-recursive.test.js.hbs +49 -0
  194. package/templates/base/tools/utils/get-rel-to-core.test.js.hbs +18 -0
  195. package/templates/base/tools/utils/index.js.hbs +1 -3
  196. package/templates/base/tools/utils/languages.js.hbs +15 -0
  197. package/templates/base/tools/utils/languages.test.js.hbs +16 -0
  198. package/templates/base/tools/utils/print.js.hbs +19 -13
  199. package/templates/base/tools/utils/print.test.js.hbs +60 -0
  200. package/templates/base/tools/utils/prompt-boolean.js.hbs +7 -0
  201. package/templates/base/tools/utils/prompt-boolean.test.js.hbs +54 -0
  202. package/templates/base/tools/utils/run-command.js.hbs +4 -2
  203. package/templates/base/tools/utils/run-command.test.js.hbs +19 -0
  204. package/templates/base/tools/utils/run-script.js.hbs +14 -3
  205. package/templates/base/tools/utils/run-script.test.js.hbs +40 -0
  206. package/templates/features/{deployHelper → docker}/.dockerignore.hbs +4 -4
  207. package/templates/features/docker/tools/docker/Dockerfile.template.hbs +51 -0
  208. package/templates/features/{deployHelper/tools/deployment/nginx.conf.hbs → docker/tools/docker/nginx.conf.template} +4 -2
  209. package/templates/features/docker/tools/docker/scripts/docker-build.js.hbs +20 -0
  210. package/templates/features/docker/tools/docker/scripts/docker-ports.js.hbs +48 -0
  211. package/templates/features/docker/tools/docker/scripts/docker-ports.test.js.hbs +52 -0
  212. package/templates/features/docker/tools/docker/scripts/docker-run.js.hbs +28 -0
  213. package/templates/features/docker/tools/docker/scripts/render-docker-template.js.hbs +23 -0
  214. package/templates/features/docker/tools/docker/scripts/render-docker-template.test.js.hbs +60 -0
  215. package/templates/features/docker/tools/docker/scripts/validate-docker.js.hbs +30 -0
  216. package/lib/src/context-builder.mjs +0 -40
  217. package/lib/src/file-generator.mjs +0 -109
  218. package/lib/src/json-generator.mjs +0 -31
  219. package/lib/src/package-manager.mjs +0 -139
  220. package/lib/src/print.mjs +0 -32
  221. package/lib/src/utils.mjs +0 -18
  222. package/lib/src/version.mjs +0 -1
  223. package/templates/base/builder.config.js.hbs +0 -36
  224. package/templates/base/src/app/components/common/anchor/anchor.component.ts.hbs +0 -32
  225. package/templates/base/src/app/components/common/button/button.component.ts.hbs +0 -40
  226. package/templates/base/src/app/dom.test.js.hbs +0 -13
  227. package/templates/base/src/app/services/example/example.service.ts.hbs +0 -18
  228. package/templates/base/src/app/views/home/home.view.test.js.hbs +0 -26
  229. package/templates/base/src/core/services/store/store.test.js.hbs +0 -8
  230. package/templates/base/src/core/services/store/store.ts.hbs +0 -39
  231. package/templates/base/src/core/utils/anchor-manager/anchor-manager.utils.test.js.hbs +0 -0
  232. package/templates/base/src/core/utils/anchor-manager/anchor-manager.utils.ts.hbs +0 -113
  233. package/templates/base/src/core/utils/button-manager/button-manager.utils.test.js.hbs +0 -249
  234. package/templates/base/src/core/utils/button-manager/button-manager.utils.ts.hbs +0 -131
  235. package/templates/base/src/core/utils/helpers/attributes.helper.ts.hbs +0 -50
  236. package/templates/base/src/core/utils/index.ts.hbs +0 -2
  237. package/templates/base/src/libs/index.ts.hbs +0 -4
  238. package/templates/base/src/libs/popover/helpers/focus-trap.helper.ts.hbs +0 -197
  239. package/templates/base/src/libs/popover/helpers/popover-dom.helper.ts.hbs +0 -75
  240. package/templates/base/src/libs/popover/popover.ts.hbs +0 -138
  241. package/templates/base/src/libs/snackbar/snackbar.ts.hbs +0 -75
  242. package/templates/base/src/styles/base/_functions.scss.hbs +0 -9
  243. package/templates/base/src/styles/core/_anchors.scss.hbs +0 -10
  244. package/templates/base/src/styles/core/_index.scss.hbs +0 -6
  245. package/templates/base/src/styles/core/_popover.scss.hbs +0 -96
  246. package/templates/base/src/styles/core/_snackbar.scss.hbs +0 -50
  247. package/templates/base/tools/builder/core/esbuild.js.hbs +0 -25
  248. package/templates/base/tools/builder/core/minify-html.js.hbs +0 -60
  249. package/templates/base/tools/builder/core/sass.js.hbs +0 -22
  250. package/templates/base/tools/builder/core/tsc.js.hbs +0 -12
  251. package/templates/base/tools/generator/templates/service.template.js.hbs +0 -17
  252. package/templates/base/tools/utils/export-flags.js.hbs +0 -6
  253. package/templates/features/deployHelper/tools/builder/core/compress-files.js.hbs +0 -56
  254. package/templates/features/deployHelper/tools/deployment/Dockerfile.hbs +0 -30
  255. package/templates/features/i18n/src/app/views/home/locales/en.json.hbs +0 -9
  256. package/templates/features/i18n/src/app/views/not-found/locales/en.json +0 -8
  257. package/templates/features/i18n/src/app/views/not-found/locales/fr.json +0 -8
  258. package/templates/features/i18n/src/core/config.ts.hbs +0 -3
  259. package/templates/features/i18n/src/core/services/i18n/i18n.test.js.hbs +0 -125
  260. package/templates/features/i18n/tools/generator/templates/json.template.js.hbs +0 -8
  261. package/templates/features/i18n/tools/utils/languages.js.hbs +0 -7
  262. package/templates/features/stylinNutin/src/styles/_custom-classes.scss.hbs +0 -9
  263. package/templates/features/stylinNutin/src/styles/base/_mixins.scss.hbs +0 -372
  264. package/templates/features/stylinNutin/src/styles/components/_index.scss.hbs +0 -3
  265. package/templates/features/stylinNutin/src/styles/core/_utilities.scss.hbs +0 -254
  266. package/templates/features/stylinNutin/src/styles/views/_index.scss.hbs +0 -0
  267. package/templates/features/stylinNutin/tools/generator/templates/scss.template.js.hbs +0 -4
  268. package/templates/features/template/src/app/views/home/home.view.html.hbs +0 -56
  269. package/templates/features/template/src/app/views/not-found/not-found.view.html.hbs +0 -19
  270. package/templates/features/template/tools/builder/core/merge-templates.js.hbs +0 -49
  271. package/templates/features/template/tools/generator/templates/html.template.js.hbs +0 -2
  272. package/templates/features/testinNutin/testin-nutin/core/index.js.hbs +0 -5
  273. package/templates/features/testinNutin/testin-nutin/core/src/utils/print.js.hbs +0 -64
  274. package/templates/features/testinNutin/testin-nutin/core/src/utils/test-queue.js.hbs +0 -64
  275. package/templates/features/testinNutin/testin-nutin/core/tests/globals-each-all.test.js.hbs +0 -28
  276. package/templates/features/testinNutin/testin-nutin/mocks/mock-store.js.hbs +0 -38
  277. package/templates/features/testinNutin/testin-nutin/runner.js.hbs +0 -36
  278. package/templates/features/testinNutin/testin-nutin/watch-tests.js.hbs +0 -21
  279. package/templates/features/testinNutin/testin-nutin.config.js.hbs +0 -14
  280. /package/lib/src/{template-compiler.mjs → common/template-compiler.mjs} +0 -0
  281. /package/templates/{features/i18n → base}/src/core/base-classes/base-component/helpers/i18n.helper.ts.hbs +0 -0
  282. /package/templates/{features/i18n → base}/src/core/services/i18n/languages.ts.hbs +0 -0
  283. /package/templates/base/tools/builder/{variables → core/app}/binary-extensions.js.hbs +0 -0
  284. /package/templates/base/tools/builder/core/{paths.js.hbs → app/paths.js.hbs} +0 -0
  285. /package/templates/{features/testinNutin/testin-nutin/core/src/utils → base/tools/testin-nutin/core/queue}/queue.js.hbs +0 -0
  286. /package/templates/{features/testinNutin/testin-nutin/core/src/utils → base/tools/testin-nutin/core/queue}/test-discovery.js.hbs +0 -0
  287. /package/templates/{features/testinNutin → base/tools}/testin-nutin/mocks/mock-http-client.js.hbs +0 -0
  288. /package/templates/{features/testinNutin → base/tools}/testin-nutin/mocks/mock-i18n.js.hbs +0 -0
  289. /package/templates/{features/testinNutin → base/tools}/testin-nutin/mocks/mock-router.js.hbs +0 -0
@@ -1,75 +0,0 @@
1
- import { ButtonManager } from "src/core/index.js";
2
-
3
- export interface IPopoverDomElements {
4
- wrapper: HTMLElement;
5
- overlay: HTMLElement;
6
- }
7
-
8
- export class PopoverDomHelper {
9
- public static createDomElements(
10
- content: HTMLElement,
11
- buttonManager: ButtonManager
12
- ): IPopoverDomElements {
13
- const overlay = this.createOverlay();
14
- const wrapper = this.createWrapper();
15
- content = this.createContent(content);
16
-
17
- this.appendCloseButton(content);
18
- this.appendFooterButtons(content, buttonManager);
19
-
20
- wrapper.appendChild(content);
21
- overlay.appendChild(wrapper);
22
- document.body.appendChild(overlay);
23
-
24
- return { wrapper, overlay };
25
- }
26
-
27
- public static removeDomElements(overlay: HTMLElement | null, onRemoved?: () => void): null {
28
- if (overlay) {
29
- const wrapper = overlay.querySelector('.popover-wrapper');
30
- overlay.classList.remove('show');
31
- wrapper?.classList.remove('show');
32
-
33
- setTimeout(() => {
34
- wrapper?.remove();
35
- overlay?.remove();
36
- onRemoved?.();
37
- }, 300); // match transition duration
38
- }
39
- return null;
40
- }
41
-
42
- private static createOverlay(): HTMLElement {
43
- const overlay = document.createElement('div');
44
- overlay.className = 'popover-overlay';
45
- return overlay;
46
- }
47
-
48
- private static createWrapper(): HTMLElement {
49
- const wrapper = document.createElement('div');
50
- wrapper.className = 'popover-wrapper';
51
- return wrapper;
52
- }
53
-
54
- private static createContent(content: HTMLElement): HTMLElement {
55
- content.classList.add('popover-content');
56
- return content;
57
- }
58
-
59
- private static appendCloseButton(content: HTMLElement): void {
60
- const closeButton = document.createElement('button');
61
- closeButton.className = 'popover-close-button';
62
- closeButton.innerHTML = '×';
63
- closeButton.setAttribute('aria-label', 'Close');
64
- // bind method onCloseClick
65
- closeButton.setAttribute('data-event', 'click:onCloseClick');
66
- content.prepend(closeButton);
67
- }
68
-
69
- private static appendFooterButtons(
70
- content: HTMLElement,
71
- buttonManager: ButtonManager
72
- ): void {
73
- buttonManager.appendTo(content);
74
- }
75
- }
@@ -1,138 +0,0 @@
1
- import { View, ButtonManager, BaseButton, ComponentConfig, AppPipeRegistry, CatalogConfig, AppEventBus } from '../../core/index.js';
2
- import { FocusTrapHelper, IFocusTrapOptions } from './helpers/focus-trap.helper.js';
3
- import { IPopoverDomElements, PopoverDomHelper } from './helpers/popover-dom.helper.js';
4
-
5
- export interface PopoverButton extends BaseButton {
6
- // if needed for Popover-specific properties
7
- }
8
-
9
- export interface PopoverOptions {
10
- template: string;
11
- components?: ComponentConfig[];
12
- catalogs?: CatalogConfig[];
13
- viewName?: string;
14
- onClose?: () => void;
15
- buttons?: PopoverButton[];
16
- focusTrapOptions?: IFocusTrapOptions;
17
- }
18
-
19
- export class PopoverView extends View {
20
- private _onClose?: () => void;
21
- private _overlay: HTMLElement | null = null;
22
- private _buttonManager: ButtonManager;
23
- private _prevTitle: string | undefined;
24
- private _catalogs: CatalogConfig[];
25
- private _focusTrap: FocusTrapHelper | null = null;
26
- private _focusTrapOptions: IFocusTrapOptions;
27
- private _components: ComponentConfig[];
28
-
29
- constructor({
30
- template,
31
- buttons = [],
32
- onClose,
33
- viewName,
34
- components = [],
35
- catalogs = [],
36
- focusTrapOptions = {}
37
- }: PopoverOptions) {
38
- super({ template, tagName: 'div', mountTarget: 'body' });
39
- this._onClose = onClose;
40
- this._components = components;
41
- this._catalogs = catalogs;
42
- this._buttonManager = this.createButtonManager(buttons);
43
- this.setOptionalViewName(viewName);
44
- this._focusTrapOptions = focusTrapOptions;
45
- AppEventBus.subscribe('popover-close', () => this.destroy());
46
- }
47
-
48
- public childConfigs(): ComponentConfig[] {
49
- return [
50
- ...this._components,
51
- ...this.catalogConfigs()
52
- ];
53
- }
54
-
55
- public catalogConfigs(): ComponentConfig[] {
56
- const configs: ComponentConfig[] = []
57
- this._catalogs.map((catalog) => {
58
- configs.push(...this.catalogConfig(catalog));
59
- })
60
- return configs;
61
- }
62
-
63
- public override shouldUpdateMetaContent(): boolean {
64
- return false;
65
- }
66
-
67
- public override render(): HTMLElement {
68
- document.documentElement.classList.add('no-scroll');
69
-
70
- const { wrapper, overlay } = this.createPopoverDomElements();
71
-
72
- this._focusTrap = this.createFocusTrap(wrapper, overlay);
73
- this._focusTrap.activate();
74
-
75
- AppEventBus.emit('popover-opened');
76
- this._overlay = overlay;
77
- return overlay;
78
- }
79
-
80
- public override destroy(): void {
81
- this._focusTrap?.deactivate();
82
- if (this._prevTitle) document.title = this._prevTitle;
83
-
84
- this._overlay = PopoverDomHelper.removeDomElements(this._overlay, () => {
85
- document.documentElement.classList.remove('no-scroll');
86
- super.destroy();
87
- if (typeof this._onClose === 'function') {
88
- this._onClose();
89
- }
90
- });
91
- }
92
-
93
- private setOptionalViewName(viewName: string | undefined): void {
94
- if (viewName) {
95
- this._prevTitle = document.title;
96
- document.title = AppPipeRegistry.apply('capitalize', viewName);
97
- }
98
- }
99
-
100
- private createButtonManager(buttons: PopoverButton[]): ButtonManager {
101
- return new ButtonManager(
102
- this,
103
- buttons,
104
- { containerClassName: 'popover-buttons' }
105
- );
106
- }
107
-
108
- private createPopoverDomElements(): IPopoverDomElements {
109
- const content = super.render();
110
- const { overlay, wrapper } = PopoverDomHelper.createDomElements(content, this._buttonManager);
111
-
112
- this.autoBindEvents();
113
- this.parseDataAttributes();
114
- this.animateIn(wrapper);
115
-
116
- return { overlay, wrapper };
117
- }
118
-
119
- private createFocusTrap(wrapper: HTMLElement, overlay: HTMLElement): FocusTrapHelper {
120
- return new FocusTrapHelper({
121
- container: wrapper,
122
- overlay: overlay,
123
- options: this._focusTrapOptions
124
- });
125
- }
126
-
127
- // Handles the close button (via data-event bound in appendCloseButton)
128
- private onCloseClick(): void {
129
- this.destroy();
130
- }
131
-
132
- private animateIn(wrapper: HTMLElement): void {
133
- requestAnimationFrame(() => {
134
- this._overlay?.classList.add('show');
135
- wrapper.classList.add('show');
136
- });
137
- }
138
- }
@@ -1,75 +0,0 @@
1
- import {SecurityHelper} from "../../core/base-classes/base-component/helpers/security.helper.js";
2
-
3
- export type NotifyOptions = {
4
- type?: 'info' | 'success' | 'error';
5
- position?: 'top' | 'bottom';
6
- duration?: number;
7
- actionText?: string;
8
- onAction?: () => void;
9
- };
10
-
11
- type SnackbarItem = {
12
- message: string;
13
- options: NotifyOptions;
14
- };
15
-
16
- const queue: SnackbarItem[] = [];
17
- let isDisplaying = false;
18
-
19
- /**
20
- * ```typescript
21
- type NotifyOptions = {
22
- type?: 'info' | 'success' | 'error';
23
- position?: 'top' | 'bottom';
24
- duration?: number;
25
- actionText?: string;
26
- onAction?: () => void;
27
- };
28
-
29
- type SnackbarItem = {
30
- message: string;
31
- options: NotifyOptions;
32
- };
33
- ```
34
- */
35
- export function notify(message: string, options: NotifyOptions = {}): void {
36
- queue.push({ message, options });
37
- if (!isDisplaying) {
38
- displayNext();
39
- }
40
- }
41
-
42
- function displayNext(): void {
43
- if (queue.length === 0) {
44
- isDisplaying = false;
45
- return;
46
- }
47
-
48
- isDisplaying = true;
49
- let { message, options } = queue.shift()!;
50
- let { type = 'info', position = 'bottom', duration = 3000, actionText, onAction } = options;
51
- message = SecurityHelper.sanitizeTemplate(message);
52
- actionText = SecurityHelper.sanitizeTemplate(actionText);
53
- const snackbar = document.createElement('div');
54
- snackbar.className = `app-snackbar app-snackbar--${type} app-snackbar--${position}`;
55
- snackbar.innerHTML = `
56
- <span>${message}</span>
57
- ${actionText ? `<button>${actionText}</button>` : ''}
58
- `;
59
-
60
- document.body.appendChild(snackbar);
61
-
62
- const remove = () => {
63
- snackbar.remove();
64
- displayNext();
65
- };
66
-
67
- if (actionText && onAction) {
68
- snackbar.querySelector('button')?.addEventListener('click', () => {
69
- onAction();
70
- remove();
71
- });
72
- }
73
-
74
- setTimeout(remove, duration);
75
- }
@@ -1,9 +0,0 @@
1
- @function calcul_rem($size, $base) {
2
- @return 1rem * $size / $base;
3
- }
4
-
5
- @function strip_unit($number) {
6
- @if type-of($number) == 'number' and not unitless ($number) {
7
- @return $number / ($number * 0 + 1);
8
- }
9
- }
@@ -1,10 +0,0 @@
1
- .sr-only {
2
- position: absolute;
3
- width: 1px;
4
- height: 1px;
5
- overflow: hidden;
6
- clip: rect(1px, 1px, 1px, 1px);
7
- white-space: nowrap;
8
- text-decoration: none;
9
- outline: none;
10
- }
@@ -1,6 +0,0 @@
1
- @forward "anchors";
2
- @forward "popover";
3
- @forward "snackbar";
4
- {{#if stylinNutin}}
5
- @forward "utilities";
6
- {{/if}}
@@ -1,96 +0,0 @@
1
- /* Prevent scroll when popover is active */
2
- html.no-scroll {
3
- overflow: hidden;
4
- }
5
-
6
- .popover-overlay {
7
- z-index: 99;
8
- position: fixed;
9
- inset: 0;
10
- backdrop-filter: blur(5px);
11
- background-color: rgba(0, 0, 0, .1);
12
- display: flex;
13
- align-items: center;
14
- justify-content: center;
15
- opacity: 0;
16
- animation: hide-pop 0.3s ease forwards;
17
- &.show {
18
- animation: show-pop 0.3s ease forwards;
19
- }
20
- }
21
-
22
- .popover-wrapper {
23
- overflow-y: auto;
24
- position: relative;
25
- overscroll-behavior: none;
26
- border-radius: 1rem;
27
- width: 90%;
28
- height: 90%;
29
- transform: scale(0.95);
30
- opacity: 0;
31
- transition: opacity 0.3s ease, transform 0.3s ease;
32
- -moz-transition: opacity 0.3s ease, -moz-transform 0.3s ease;
33
- -webkit-transition: opacity 0.3s ease, -webkit-transform 0.3s ease;
34
- -o-transition: opacity 0.3s ease, -o-transform 0.3s ease;
35
- &.show {
36
- transform: scale(1);
37
- -moz-transform: scale(1);
38
- -webkit-transform: scale(1);
39
- -o-transform: scale(1);
40
- opacity: 1;
41
- }
42
- }
43
-
44
- .popover-content {
45
- position: relative;
46
- height: 100%;
47
- overflow-y: auto;
48
- -webkit-overflow-scrolling: touch;
49
- overscroll-behavior: contain;
50
- }
51
-
52
- .popover-close-button {
53
- position: absolute;
54
- top: 0.5rem;
55
- right: 0.75rem;
56
- background: none;
57
- border: none;
58
- font-size: 1.5rem;
59
- cursor: pointer;
60
- padding: 0 1rem;
61
- &:focus:not(:focus-visible) {
62
- }
63
- &:focus-visible {
64
- }
65
- }
66
-
67
- .popover-buttons {
68
- display: flex;
69
- justify-content: flex-end;
70
- gap: 1rem;
71
- margin-top: 1.5rem;
72
- }
73
-
74
- .popover-buttons button {
75
- background-color: inherit;
76
- transition: ease-in-out 0.3s;
77
- padding: 0.5rem 1rem;
78
- font-size: 1rem;
79
- cursor: pointer;
80
- &:hover {
81
- }
82
- @media (hover: none) {
83
- &:hover {
84
- }
85
- }
86
- }
87
-
88
- @keyframes show-pop {
89
- from { opacity: 0 }
90
- to { opacity: 1 }
91
- }
92
-
93
- @keyframes hide-pop {
94
- from { opacity: 1 }
95
- to { opacity: 0 }
96
- }
@@ -1,50 +0,0 @@
1
- @use "sass:map";
2
- @use "variables" as *;
3
- {{#if stylinNutin}}
4
- @use "mixins";
5
- {{/if}}
6
-
7
- .app-snackbar {
8
- position: fixed;
9
- left: 50%;
10
- transform: translateX(-50%);
11
- {{#if stylinNutin}}
12
- @include mixins.flex-center;
13
- {{else}}
14
- display: flex;
15
- align-items: center;
16
- justify-content: center;
17
- {{/if}}
18
- background: $snack-default;
19
- color: white;
20
- padding: 0.75rem 1.5rem;
21
- border-radius: 0.5rem;
22
- box-shadow: 0 2px 6px rgba(0,0,0,0.3);
23
- gap: 1rem;
24
- animation: fade-in 0.3s ease;
25
- {{#if stylinNutin}}
26
- @include mixins.respond-to(medium) {
27
- min-width: 80%;
28
- }
29
- {{/if}}
30
- }
31
-
32
- .app-snackbar--bottom { bottom: 1rem; }
33
- .app-snackbar--top { top: 1rem; }
34
-
35
- .app-snackbar--success { background: $snack-success; }
36
- .app-snackbar--error { background: $snack-error; }
37
- .app-snackbar--info { background: $snack-info; }
38
-
39
- .app-snackbar button {
40
- background: transparent;
41
- border: none;
42
- color: #fff;
43
- font-weight: bold;
44
- cursor: pointer;
45
- }
46
-
47
- @keyframes fade-in {
48
- from { opacity: 0; transform: translateX(-50%) translateY(10px); }
49
- to { opacity: 1; transform: translateX(-50%) translateY(0); }
50
- }
@@ -1,25 +0,0 @@
1
- import esbuild from 'esbuild';
2
- import path from 'path';
3
- import { exit } from 'process';
4
- import { print, isVerbose } from '../../utils/index.js';
5
- import { PATHS } from './paths.js';
6
- import builderConfig from '../../../builder.config.js';
7
-
8
- const ENTRY_FILE = path.join(PATHS.tempApp, 'main.ts');
9
- const OUT_FILE = path.join(PATHS.tempSource, 'bundle.js');
10
-
11
- async function build() {
12
- await esbuild.build({
13
- ...builderConfig.esbuild,
14
- entryPoints: [ENTRY_FILE],
15
- outfile: OUT_FILE,
16
- keepNames: true, // View names are used to update meta.title
17
- });
18
-
19
- if (isVerbose) print.boldInfo(`ESBuild complete.\n`);
20
- }
21
-
22
- build().catch((err) => {
23
- print.boldError(`ESBuild failed: ${err.message}`);
24
- exit(1);
25
- });
@@ -1,60 +0,0 @@
1
- import { minify } from 'html-minifier-terser';
2
- {{#unless template}}
3
- import fs from 'fs';
4
- import { exit } from 'process';
5
- import { getFilesRecursive, print, isProd, isVerbose } from '../../utils/index.js';
6
- import { PATHS } from './paths.js';
7
- {{/unless}}
8
-
9
- {{#if template}}export {{/if}}async function minifyHTML(html) {
10
- return minify(html, {
11
- collapseWhitespace: true,
12
- removeComments: true,
13
- removeRedundantAttributes: true,
14
- removeScriptTypeAttributes: true,
15
- removeStyleLinkTypeAttributes: true,
16
- useShortDoctype: true,
17
- keepClosingSlash: true,
18
- minifyCSS: true,
19
- minifyJS: true,
20
- });
21
- }
22
-
23
- {{#unless template}}
24
- const TEMPLATE_REGEX =
25
- /const\s+(template|templateFn)\s*=?\s*(?:\(.*?\)\s*=>\s*)?`([\s\S]*?)`/gm;
26
-
27
- async function minifyInlineHTML() {
28
- const extension = isProd ? '.ts' : '.js';
29
- const jsFiles = getFilesRecursive(PATHS.tempApp, extension);
30
-
31
- for (const file of jsFiles) {
32
- let code = fs.readFileSync(file, 'utf8');
33
- let hasChanges = false;
34
-
35
- const matches = [...code.matchAll(TEMPLATE_REGEX)];
36
-
37
- if (matches.length) {
38
- for (const match of matches) {
39
- const [full, , html] = match;
40
- const minified = await minifyHTML(html);
41
- const minifiedBlock = full.replace(html, minified);
42
- code = code.replace(full, minifiedBlock);
43
- hasChanges = true;
44
- }
45
- }
46
-
47
- if (hasChanges) {
48
- fs.writeFileSync(file, code, 'utf8');
49
- if (isVerbose) print.info(`Minified inline HTML in: ${file}`);
50
- }
51
- }
52
- if (isVerbose) print.boldInfo('Inline templates minified.\n');
53
- }
54
-
55
- minifyInlineHTML().catch((err) => {
56
- print.boldError(`Unexpected error: ${err.message}`);
57
- exit(1);
58
- });
59
-
60
- {{/unless}}
@@ -1,22 +0,0 @@
1
- import * as sass from 'sass';
2
- import * as fs from 'fs';
3
- import path from 'path';
4
- import { isVerbose, print } from '../../utils/index.js';
5
- import { PATHS } from './paths.js';
6
- import builderConfig from '../../../builder.config.js';
7
-
8
- const stylesInput = path.join(PATHS.source, 'styles');
9
- const stylesOutput = path.join(PATHS.tempSource, 'main.css');
10
-
11
- const scssPath = (origin) => path.join(stylesInput, origin);
12
- const scssOrigins = builderConfig.sass.paths;
13
-
14
- const pathsToLoad = scssOrigins.map(origin => scssPath(origin));
15
-
16
- sass.compileAsync(path.join(stylesInput, 'main.scss'), {
17
- loadPaths: [ ...pathsToLoad ],
18
- style: 'compressed'
19
- }).then(result => {
20
- fs.writeFileSync(stylesOutput, result.css);
21
- if (isVerbose) print.boldInfo('Global styles compiled.\n');
22
- });
@@ -1,12 +0,0 @@
1
- import { runCommand, print, isVerbose } from "../../utils/index.js";
2
- import { exit } from 'process';
3
-
4
- async function compileTS() {
5
- await runCommand('tsc', ['--project', 'tsconfig.json']);
6
- if (isVerbose) print.boldInfo('TypeScript compiled.\n');
7
- }
8
-
9
- compileTS().catch((err) => {
10
- print.boldError(`Unexpected error: ${err.message}`);
11
- exit(1);
12
- });
@@ -1,17 +0,0 @@
1
- import { getRelToCore } from "../../utils/get-rel-to-core.js";
2
-
3
- export const serviceTemplate = (name, targetPath) => {
4
- const relToCore = getRelToCore(targetPath);
5
-
6
- return `import { Service } from '${relToCore}';
7
-
8
- export class ${name.pascal} extends Service<${name.pascal}> {
9
- constructor() {
10
- super();
11
- }
12
-
13
- }
14
-
15
- export const ${name.pascal}Service = ${name.pascal}.getInstance();
16
- `;
17
- }
@@ -1,6 +0,0 @@
1
- import process from 'process';
2
- import builderConfig from '../../builder.config.js';
3
-
4
- export const isProd = process.env.npm_config_bundle || process.env.NODE_ENV === 'production';
5
-
6
- export const isVerbose = process.env.npm_config_log || builderConfig.verbose;
@@ -1,56 +0,0 @@
1
- import { readFileSync, writeFileSync } from 'fs';
2
- import { gzipSync
3
- // BROTLI OPTIONAL
4
- //, brotliCompressSync, constants
5
- } from 'zlib';
6
- import { print, getFilesRecursive, isVerbose } from '../../utils/index.js';
7
- import { PATHS } from './paths.js';
8
- import builderConfig from '../../../builder.config.js';
9
-
10
- const compress = {
11
- gzip: builderConfig.compression.gzip,
12
- // BROTLI OPTIONAL
13
- // brotli: builderConfig.compression.brotli,
14
- };
15
-
16
- function compressStaticAssets() {
17
- if (
18
- !compress.gzip
19
- // BROTLI OPTIONAL
20
- // && !compress.brotli
21
- ) return;
22
-
23
- const files = getFilesRecursive(PATHS.tempSource, ['.js', '.css', '.json', '.svg', 'ttf', 'otf', 'eot']);
24
-
25
- files.forEach(file => {
26
- const content = readFileSync(file);
27
-
28
- if (compress.gzip) {
29
- const gzipped = gzipSync(content, {
30
- level: 9,
31
- memLevel: 9,
32
- windowBits: 15
33
- });
34
- writeFileSync(`${file}.gz`, gzipped);
35
- if (isVerbose) print.info(`Gzip compression: ${file}`);
36
- }
37
-
38
- // BROTLI OPTIONAL
39
- /*
40
- if (compress.brotli) {
41
- const brotlied = brotliCompressSync(content, {
42
- params: {
43
- [constants.BROTLI_PARAM_QUALITY]: 11,
44
- [constants.BROTLI_PARAM_LGWIN]: 22,
45
- [constants.BROTLI_PARAM_MODE]: constants.BROTLI_MODE_GENERIC,
46
- [constants.BROTLI_PARAM_SIZE_HINT]: content.length
47
- }
48
- });
49
- writeFileSync(`${file}.br`, brotlied);
50
- if (isVerbose) print.info(`Brotli compression: ${file}`);
51
- }
52
- */
53
- });
54
- }
55
-
56
- compressStaticAssets();