@skyroc/scripts 2.5.0 → 2.5.2

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 (277) hide show
  1. package/README.md +6 -3
  2. package/dist/cli.mjs +2 -2
  3. package/dist/{config-BKkdncJS.mjs → config-Cj9IzlRz.mjs} +105 -5
  4. package/dist/index.mjs +1 -1
  5. package/package.json +1 -1
  6. package/templates/admin/package.json +5 -3
  7. package/templates/admin/src/assets/svg-icon/logo.svg +2 -14
  8. package/templates/admin/src/features/router/routeTree.gen.ts +71 -1
  9. package/templates/admin/src/pages/(auth)/login/code-login.tsx +79 -0
  10. package/templates/admin/src/pages/(auth)/login/index.tsx +22 -1
  11. package/templates/admin/src/pages/(auth)/login/layout.tsx +25 -23
  12. package/templates/admin/src/pages/(auth)/login/modules/Header.tsx +25 -0
  13. package/templates/admin/src/pages/(auth)/login/register.tsx +86 -0
  14. package/templates/admin/src/pages/(auth)/login/reset-pwd.tsx +73 -0
  15. package/templates/admin/uno.config.ts +1 -1
  16. package/templates/admin-root/.agents/skills/component-doc/SKILL.md +304 -0
  17. package/templates/admin-root/.agents/skills/component-refactoring/SKILL.md +483 -0
  18. package/templates/admin-root/.agents/skills/component-refactoring/references/complexity-patterns.md +493 -0
  19. package/templates/admin-root/.agents/skills/component-refactoring/references/component-splitting.md +477 -0
  20. package/templates/admin-root/.agents/skills/component-refactoring/references/hook-extraction.md +317 -0
  21. package/templates/admin-root/.agents/skills/doc-coauthoring/SKILL.md +375 -0
  22. package/templates/admin-root/.agents/skills/feature-dev/SKILL.md +78 -0
  23. package/templates/admin-root/.agents/skills/frontend-code-review/SKILL.md +73 -0
  24. package/templates/admin-root/.agents/skills/frontend-code-review/references/business-logic.md +15 -0
  25. package/templates/admin-root/.agents/skills/frontend-code-review/references/code-quality.md +44 -0
  26. package/templates/admin-root/.agents/skills/frontend-code-review/references/performance.md +45 -0
  27. package/templates/admin-root/.agents/skills/frontend-design/LICENSE.txt +177 -0
  28. package/templates/admin-root/.agents/skills/frontend-design/SKILL.md +42 -0
  29. package/templates/admin-root/.agents/skills/frontend-testing/SKILL.md +325 -0
  30. package/templates/admin-root/.agents/skills/frontend-testing/assets/component-test.template.tsx +293 -0
  31. package/templates/admin-root/.agents/skills/frontend-testing/assets/hook-test.template.ts +207 -0
  32. package/templates/admin-root/.agents/skills/frontend-testing/assets/utility-test.template.ts +154 -0
  33. package/templates/admin-root/.agents/skills/frontend-testing/references/async-testing.md +345 -0
  34. package/templates/admin-root/.agents/skills/frontend-testing/references/checklist.md +205 -0
  35. package/templates/admin-root/.agents/skills/frontend-testing/references/common-patterns.md +449 -0
  36. package/templates/admin-root/.agents/skills/frontend-testing/references/domain-components.md +523 -0
  37. package/templates/admin-root/.agents/skills/frontend-testing/references/mocking.md +512 -0
  38. package/templates/admin-root/.agents/skills/frontend-testing/references/workflow.md +269 -0
  39. package/templates/admin-root/.agents/skills/migrate-nativewind-to-uniwind/SKILL.md +734 -0
  40. package/templates/admin-root/.agents/skills/migrate-oxfmt/SKILL.md +202 -0
  41. package/templates/admin-root/.agents/skills/migrate-oxlint/SKILL.md +196 -0
  42. package/templates/admin-root/.agents/skills/native-component-doc/SKILL.md +245 -0
  43. package/templates/admin-root/.agents/skills/senior-frontend/SKILL.md +209 -0
  44. package/templates/admin-root/.agents/skills/senior-frontend/references/frontend_best_practices.md +103 -0
  45. package/templates/admin-root/.agents/skills/senior-frontend/references/nextjs_optimization_guide.md +103 -0
  46. package/templates/admin-root/.agents/skills/senior-frontend/references/react_patterns.md +103 -0
  47. package/templates/admin-root/.agents/skills/senior-frontend/scripts/bundle_analyzer.py +114 -0
  48. package/templates/admin-root/.agents/skills/senior-frontend/scripts/component_generator.py +114 -0
  49. package/templates/admin-root/.agents/skills/senior-frontend/scripts/frontend_scaffolder.py +114 -0
  50. package/templates/admin-root/.agents/skills/skill-creator/SKILL.md +355 -0
  51. package/templates/admin-root/.agents/skills/skill-creator/references/output-patterns.md +86 -0
  52. package/templates/admin-root/.agents/skills/skill-creator/references/workflows.md +28 -0
  53. package/templates/admin-root/.agents/skills/skill-creator/scripts/init_skill.py +300 -0
  54. package/templates/admin-root/.agents/skills/skill-creator/scripts/package_skill.py +110 -0
  55. package/templates/admin-root/.agents/skills/skill-creator/scripts/quick_validate.py +97 -0
  56. package/templates/admin-root/.agents/skills/skyroc-admin-prd-prototype/SKILL.md +163 -0
  57. package/templates/admin-root/.agents/skills/skyroc-admin-prd-prototype/references/acceptance-checklist.md +75 -0
  58. package/templates/admin-root/.agents/skills/skyroc-admin-prd-prototype/references/evidence-order.md +109 -0
  59. package/templates/admin-root/.agents/skills/skyroc-admin-prd-prototype/references/prd-rules.md +103 -0
  60. package/templates/admin-root/.agents/skills/skyroc-admin-prd-prototype/references/prototype-rules.md +85 -0
  61. package/templates/admin-root/.agents/skills/skyroc-admin-prd-prototype/scripts/verify-prototypes.mjs +144 -0
  62. package/templates/admin-root/.agents/skills/skyroc-admin-prd-prototype/templates/admin-page.html +771 -0
  63. package/templates/admin-root/.agents/skills/skyroc-admin-prd-prototype/templates/prd.md +182 -0
  64. package/templates/admin-root/.agents/skills/ui-ux-pro-max/SKILL.md +292 -0
  65. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/charts.csv +26 -0
  66. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/colors.csv +97 -0
  67. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/icons.csv +101 -0
  68. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/landing.csv +31 -0
  69. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/products.csv +97 -0
  70. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
  71. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -0
  72. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
  73. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
  74. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
  75. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
  76. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
  77. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
  78. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
  79. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
  80. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
  81. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
  82. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
  83. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
  84. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/styles.csv +68 -0
  85. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/typography.csv +58 -0
  86. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
  87. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
  88. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/web-interface.csv +31 -0
  89. package/templates/admin-root/.agents/skills/ui-ux-pro-max/scripts/core.py +253 -0
  90. package/templates/admin-root/.agents/skills/ui-ux-pro-max/scripts/design_system.py +1067 -0
  91. package/templates/admin-root/.agents/skills/ui-ux-pro-max/scripts/search.py +114 -0
  92. package/templates/admin-root/.agents/skills/uniwind/SKILL.md +64 -0
  93. package/templates/admin-root/.agents/skills/uniwind/references/component-bindings.md +338 -0
  94. package/templates/admin-root/.agents/skills/uniwind/references/css-and-utilities.md +325 -0
  95. package/templates/admin-root/.agents/skills/uniwind/references/integrations.md +75 -0
  96. package/templates/admin-root/.agents/skills/uniwind/references/pro.md +354 -0
  97. package/templates/admin-root/.agents/skills/uniwind/references/setup.md +144 -0
  98. package/templates/admin-root/.agents/skills/uniwind/references/styling-patterns.md +237 -0
  99. package/templates/admin-root/.agents/skills/uniwind/references/theming.md +309 -0
  100. package/templates/admin-root/.agents/skills/uniwind/references/troubleshooting.md +179 -0
  101. package/templates/admin-root/.agents/skills/uniwind/references/variants-and-selectors.md +224 -0
  102. package/templates/admin-root/.agents/skills/vercel-react-best-practices/AGENTS.md +2934 -0
  103. package/templates/admin-root/.agents/skills/vercel-react-best-practices/SKILL.md +136 -0
  104. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  105. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
  106. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
  107. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
  108. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/async-defer-await.md +80 -0
  109. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
  110. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
  111. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
  112. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +59 -0
  113. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
  114. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
  115. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  116. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
  117. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
  118. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
  119. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
  120. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
  121. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
  122. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
  123. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
  124. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
  125. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
  126. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
  127. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
  128. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
  129. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
  130. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
  131. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
  132. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
  133. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
  134. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  135. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
  136. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
  137. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  138. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  139. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
  140. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
  141. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
  142. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
  143. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
  144. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  145. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
  146. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
  147. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  148. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
  149. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
  150. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  151. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  152. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
  153. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  154. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
  155. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
  156. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
  157. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
  158. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
  159. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
  160. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
  161. package/templates/admin-root/.claude/settings.json +5 -0
  162. package/templates/admin-root/.claude/skills/component-doc/SKILL.md +304 -0
  163. package/templates/admin-root/.claude/skills/component-refactoring/SKILL.md +483 -0
  164. package/templates/admin-root/.claude/skills/component-refactoring/references/complexity-patterns.md +493 -0
  165. package/templates/admin-root/.claude/skills/component-refactoring/references/component-splitting.md +477 -0
  166. package/templates/admin-root/.claude/skills/component-refactoring/references/hook-extraction.md +317 -0
  167. package/templates/admin-root/.claude/skills/doc-coauthoring/SKILL.md +375 -0
  168. package/templates/admin-root/.claude/skills/feature-dev/SKILL.md +78 -0
  169. package/templates/admin-root/.claude/skills/frontend-code-review/SKILL.md +73 -0
  170. package/templates/admin-root/.claude/skills/frontend-code-review/references/business-logic.md +15 -0
  171. package/templates/admin-root/.claude/skills/frontend-code-review/references/code-quality.md +44 -0
  172. package/templates/admin-root/.claude/skills/frontend-code-review/references/performance.md +45 -0
  173. package/templates/admin-root/.claude/skills/frontend-design/LICENSE.txt +177 -0
  174. package/templates/admin-root/.claude/skills/frontend-design/SKILL.md +42 -0
  175. package/templates/admin-root/.claude/skills/frontend-testing/SKILL.md +325 -0
  176. package/templates/admin-root/.claude/skills/frontend-testing/assets/component-test.template.tsx +293 -0
  177. package/templates/admin-root/.claude/skills/frontend-testing/assets/hook-test.template.ts +207 -0
  178. package/templates/admin-root/.claude/skills/frontend-testing/assets/utility-test.template.ts +154 -0
  179. package/templates/admin-root/.claude/skills/frontend-testing/references/async-testing.md +345 -0
  180. package/templates/admin-root/.claude/skills/frontend-testing/references/checklist.md +205 -0
  181. package/templates/admin-root/.claude/skills/frontend-testing/references/common-patterns.md +449 -0
  182. package/templates/admin-root/.claude/skills/frontend-testing/references/domain-components.md +523 -0
  183. package/templates/admin-root/.claude/skills/frontend-testing/references/mocking.md +512 -0
  184. package/templates/admin-root/.claude/skills/frontend-testing/references/workflow.md +269 -0
  185. package/templates/admin-root/.claude/skills/migrate-nativewind-to-uniwind +1 -0
  186. package/templates/admin-root/.claude/skills/native-component-doc/SKILL.md +245 -0
  187. package/templates/admin-root/.claude/skills/senior-frontend/SKILL.md +209 -0
  188. package/templates/admin-root/.claude/skills/senior-frontend/references/frontend_best_practices.md +103 -0
  189. package/templates/admin-root/.claude/skills/senior-frontend/references/nextjs_optimization_guide.md +103 -0
  190. package/templates/admin-root/.claude/skills/senior-frontend/references/react_patterns.md +103 -0
  191. package/templates/admin-root/.claude/skills/senior-frontend/scripts/bundle_analyzer.py +114 -0
  192. package/templates/admin-root/.claude/skills/senior-frontend/scripts/component_generator.py +114 -0
  193. package/templates/admin-root/.claude/skills/senior-frontend/scripts/frontend_scaffolder.py +114 -0
  194. package/templates/admin-root/.claude/skills/skill-creator/SKILL.md +355 -0
  195. package/templates/admin-root/.claude/skills/skill-creator/references/output-patterns.md +86 -0
  196. package/templates/admin-root/.claude/skills/skill-creator/references/workflows.md +28 -0
  197. package/templates/admin-root/.claude/skills/skill-creator/scripts/init_skill.py +300 -0
  198. package/templates/admin-root/.claude/skills/skill-creator/scripts/package_skill.py +110 -0
  199. package/templates/admin-root/.claude/skills/skill-creator/scripts/quick_validate.py +97 -0
  200. package/templates/admin-root/.claude/skills/ui-ux-pro-max/SKILL.md +386 -0
  201. package/templates/admin-root/.claude/skills/ui-ux-pro-max/data +1 -0
  202. package/templates/admin-root/.claude/skills/ui-ux-pro-max/scripts +1 -0
  203. package/templates/admin-root/.claude/skills/uniwind +1 -0
  204. package/templates/admin-root/.claude/skills/vercel-react-best-practices/AGENTS.md +2934 -0
  205. package/templates/admin-root/.claude/skills/vercel-react-best-practices/SKILL.md +136 -0
  206. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  207. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
  208. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
  209. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
  210. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/async-defer-await.md +80 -0
  211. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
  212. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
  213. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
  214. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +59 -0
  215. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
  216. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
  217. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  218. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
  219. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
  220. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
  221. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
  222. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
  223. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
  224. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
  225. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
  226. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
  227. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
  228. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
  229. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
  230. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
  231. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
  232. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
  233. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
  234. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
  235. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
  236. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  237. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
  238. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
  239. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  240. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  241. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
  242. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
  243. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
  244. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
  245. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
  246. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  247. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
  248. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
  249. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  250. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
  251. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
  252. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  253. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  254. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
  255. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  256. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
  257. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
  258. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
  259. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
  260. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
  261. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
  262. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
  263. package/templates/admin-root/.cursor/settings.json +10 -0
  264. package/templates/admin-root/.editorconfig +19 -0
  265. package/templates/admin-root/.gitattributes +16 -0
  266. package/templates/admin-root/.oxfmtrc.json +35 -0
  267. package/templates/admin-root/AGENTS.md +297 -0
  268. package/templates/admin-root/CLAUDE.md +1 -0
  269. package/templates/admin-root/skills-lock.json +27 -0
  270. package/templates/admin-root.manifest.json +1317 -0
  271. package/templates/admin-shell/theme/antd/AntdProvider.tsx +1 -0
  272. package/templates/admin-shell/theme/antd/shared.ts +3 -3
  273. package/templates/admin-shell/theme/antd-algorithm/algorithm/dark/colors.ts +3 -3
  274. package/templates/admin-shell/theme/antd-algorithm/algorithm/default/colors.ts +1 -1
  275. package/templates/admin-shell/theme/presets/default.json +1 -1
  276. package/templates/admin.meta.json +10 -6
  277. package/LICENSE +0 -21
@@ -0,0 +1,512 @@
1
+ # Mocking Guide for Dify Frontend Tests
2
+
3
+ ## ⚠️ Important: What NOT to Mock
4
+
5
+ ### DO NOT Mock Base Components
6
+
7
+ **Never mock components from `@/app/components/base/`** such as:
8
+
9
+ - `Loading`, `Spinner`
10
+ - `Button`, `Input`, `Select`
11
+ - `Tooltip`, `Modal`, `Dropdown`
12
+ - `Icon`, `Badge`, `Tag`
13
+
14
+ **Why?**
15
+
16
+ - Base components will have their own dedicated tests
17
+ - Mocking them creates false positives (tests pass but real integration fails)
18
+ - Using real components tests actual integration behavior
19
+
20
+ ```typescript
21
+ // ❌ WRONG: Don't mock base components
22
+ vi.mock('@/app/components/base/loading', () => () => <div>Loading</div>)
23
+ vi.mock('@/app/components/base/button', () => ({ children }: any) => <button>{children}</button>)
24
+
25
+ // ✅ CORRECT: Import and use real base components
26
+ import Loading from '@/app/components/base/loading'
27
+ import Button from '@/app/components/base/button'
28
+ // They will render normally in tests
29
+ ```
30
+
31
+ ### What TO Mock
32
+
33
+ Only mock these categories:
34
+
35
+ 1. **API services** (`@/service/*`) - Network calls
36
+ 1. **Complex context providers** - When setup is too difficult
37
+ 1. **Third-party libraries with side effects** - `next/navigation`, external SDKs
38
+ 1. **i18n** - Always mock to return keys
39
+
40
+ ### Zustand Stores - DO NOT Mock Manually
41
+
42
+ **Zustand is globally mocked** in `web/vitest.setup.ts`. Use real stores with `setState()`:
43
+
44
+ ```typescript
45
+ // ✅ CORRECT: Use real store, set test state
46
+ import { useAppStore } from '@/app/components/app/store'
47
+
48
+ useAppStore.setState({ appDetail: { id: 'test', name: 'Test' } })
49
+ render(<MyComponent />)
50
+
51
+ // ❌ WRONG: Don't mock the store module
52
+ vi.mock('@/app/components/app/store', () => ({ ... }))
53
+ ```
54
+
55
+ See [Zustand Store Testing](#zustand-store-testing) section for full details.
56
+
57
+ ## Mock Placement
58
+
59
+ | Location | Purpose |
60
+ |----------|---------|
61
+ | `web/vitest.setup.ts` | Global mocks shared by all tests (`react-i18next`, `next/image`, `zustand`) |
62
+ | `web/__mocks__/zustand.ts` | Zustand mock implementation (auto-resets stores after each test) |
63
+ | `web/__mocks__/` | Reusable mock factories shared across multiple test files |
64
+ | Test file | Test-specific mocks, inline with `vi.mock()` |
65
+
66
+ Modules are not mocked automatically. Use `vi.mock` in test files, or add global mocks in `web/vitest.setup.ts`.
67
+
68
+ **Note**: Zustand is special - it's globally mocked but you should NOT mock store modules manually. See [Zustand Store Testing](#zustand-store-testing).
69
+
70
+ ## Essential Mocks
71
+
72
+ ### 1. i18n (Auto-loaded via Global Mock)
73
+
74
+ A global mock is defined in `web/vitest.setup.ts` and is auto-loaded by Vitest setup.
75
+
76
+ The global mock provides:
77
+
78
+ - `useTranslation` - returns translation keys with namespace prefix
79
+ - `Trans` component - renders i18nKey and components
80
+ - `useMixedTranslation` (from `@/app/components/plugins/marketplace/hooks`)
81
+ - `useGetLanguage` (from `@/context/i18n`) - returns `'en-US'`
82
+
83
+ **Default behavior**: Most tests should use the global mock (no local override needed).
84
+
85
+ **For custom translations**: Use the helper function from `@/test/i18n-mock`:
86
+
87
+ ```typescript
88
+ import { createReactI18nextMock } from '@/test/i18n-mock'
89
+
90
+ vi.mock('react-i18next', () => createReactI18nextMock({
91
+ 'my.custom.key': 'Custom translation',
92
+ 'button.save': 'Save',
93
+ }))
94
+ ```
95
+
96
+ **Avoid**: Manually defining `useTranslation` mocks that just return the key - the global mock already does this.
97
+
98
+ ### 2. Next.js Router
99
+
100
+ ```typescript
101
+ const mockPush = vi.fn()
102
+ const mockReplace = vi.fn()
103
+
104
+ vi.mock('next/navigation', () => ({
105
+ useRouter: () => ({
106
+ push: mockPush,
107
+ replace: mockReplace,
108
+ back: vi.fn(),
109
+ prefetch: vi.fn(),
110
+ }),
111
+ usePathname: () => '/current-path',
112
+ useSearchParams: () => new URLSearchParams('?key=value'),
113
+ }))
114
+
115
+ describe('Component', () => {
116
+ beforeEach(() => {
117
+ vi.clearAllMocks()
118
+ })
119
+
120
+ it('should navigate on click', () => {
121
+ render(<Component />)
122
+ fireEvent.click(screen.getByRole('button'))
123
+ expect(mockPush).toHaveBeenCalledWith('/expected-path')
124
+ })
125
+ })
126
+ ```
127
+
128
+ ### 3. Portal Components (with Shared State)
129
+
130
+ ```typescript
131
+ // ⚠️ Important: Use shared state for components that depend on each other
132
+ let mockPortalOpenState = false
133
+
134
+ vi.mock('@/app/components/base/portal-to-follow-elem', () => ({
135
+ PortalToFollowElem: ({ children, open, ...props }: any) => {
136
+ mockPortalOpenState = open || false // Update shared state
137
+ return <div data-testid="portal" data-open={open}>{children}</div>
138
+ },
139
+ PortalToFollowElemContent: ({ children }: any) => {
140
+ // ✅ Matches actual: returns null when portal is closed
141
+ if (!mockPortalOpenState) return null
142
+ return <div data-testid="portal-content">{children}</div>
143
+ },
144
+ PortalToFollowElemTrigger: ({ children }: any) => (
145
+ <div data-testid="portal-trigger">{children}</div>
146
+ ),
147
+ }))
148
+
149
+ describe('Component', () => {
150
+ beforeEach(() => {
151
+ vi.clearAllMocks()
152
+ mockPortalOpenState = false // ✅ Reset shared state
153
+ })
154
+ })
155
+ ```
156
+
157
+ ### 4. API Service Mocks
158
+
159
+ ```typescript
160
+ import * as api from '@/service/api'
161
+
162
+ vi.mock('@/service/api')
163
+
164
+ const mockedApi = vi.mocked(api)
165
+
166
+ describe('Component', () => {
167
+ beforeEach(() => {
168
+ vi.clearAllMocks()
169
+
170
+ // Setup default mock implementation
171
+ mockedApi.fetchData.mockResolvedValue({ data: [] })
172
+ })
173
+
174
+ it('should show data on success', async () => {
175
+ mockedApi.fetchData.mockResolvedValue({ data: [{ id: 1 }] })
176
+
177
+ render(<Component />)
178
+
179
+ await waitFor(() => {
180
+ expect(screen.getByText('1')).toBeInTheDocument()
181
+ })
182
+ })
183
+
184
+ it('should show error on failure', async () => {
185
+ mockedApi.fetchData.mockRejectedValue(new Error('Network error'))
186
+
187
+ render(<Component />)
188
+
189
+ await waitFor(() => {
190
+ expect(screen.getByText(/error/i)).toBeInTheDocument()
191
+ })
192
+ })
193
+ })
194
+ ```
195
+
196
+ ### 5. HTTP Mocking with Nock
197
+
198
+ ```typescript
199
+ import nock from 'nock'
200
+
201
+ const GITHUB_HOST = 'https://api.github.com'
202
+ const GITHUB_PATH = '/repos/owner/repo'
203
+
204
+ const mockGithubApi = (status: number, body: Record<string, unknown>, delayMs = 0) => {
205
+ return nock(GITHUB_HOST)
206
+ .get(GITHUB_PATH)
207
+ .delay(delayMs)
208
+ .reply(status, body)
209
+ }
210
+
211
+ describe('GithubComponent', () => {
212
+ afterEach(() => {
213
+ nock.cleanAll()
214
+ })
215
+
216
+ it('should display repo info', async () => {
217
+ mockGithubApi(200, { name: 'dify', stars: 1000 })
218
+
219
+ render(<GithubComponent />)
220
+
221
+ await waitFor(() => {
222
+ expect(screen.getByText('dify')).toBeInTheDocument()
223
+ })
224
+ })
225
+
226
+ it('should handle API error', async () => {
227
+ mockGithubApi(500, { message: 'Server error' })
228
+
229
+ render(<GithubComponent />)
230
+
231
+ await waitFor(() => {
232
+ expect(screen.getByText(/error/i)).toBeInTheDocument()
233
+ })
234
+ })
235
+ })
236
+ ```
237
+
238
+ ### 6. Context Providers
239
+
240
+ ```typescript
241
+ import { ProviderContext } from '@/context/provider-context'
242
+ import { createMockProviderContextValue, createMockPlan } from '@/__mocks__/provider-context'
243
+
244
+ describe('Component with Context', () => {
245
+ it('should render for free plan', () => {
246
+ const mockContext = createMockPlan('sandbox')
247
+
248
+ render(
249
+ <ProviderContext.Provider value={mockContext}>
250
+ <Component />
251
+ </ProviderContext.Provider>
252
+ )
253
+
254
+ expect(screen.getByText('Upgrade')).toBeInTheDocument()
255
+ })
256
+
257
+ it('should render for pro plan', () => {
258
+ const mockContext = createMockPlan('professional')
259
+
260
+ render(
261
+ <ProviderContext.Provider value={mockContext}>
262
+ <Component />
263
+ </ProviderContext.Provider>
264
+ )
265
+
266
+ expect(screen.queryByText('Upgrade')).not.toBeInTheDocument()
267
+ })
268
+ })
269
+ ```
270
+
271
+ ### 7. React Query
272
+
273
+ ```typescript
274
+ import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
275
+
276
+ const createTestQueryClient = () => new QueryClient({
277
+ defaultOptions: {
278
+ queries: { retry: false },
279
+ mutations: { retry: false },
280
+ },
281
+ })
282
+
283
+ const renderWithQueryClient = (ui: React.ReactElement) => {
284
+ const queryClient = createTestQueryClient()
285
+ return render(
286
+ <QueryClientProvider client={queryClient}>
287
+ {ui}
288
+ </QueryClientProvider>
289
+ )
290
+ }
291
+ ```
292
+
293
+ ## Mock Best Practices
294
+
295
+ ### ✅ DO
296
+
297
+ 1. **Use real base components** - Import from `@/app/components/base/` directly
298
+ 1. **Use real project components** - Prefer importing over mocking
299
+ 1. **Use real Zustand stores** - Set test state via `store.setState()`
300
+ 1. **Reset mocks in `beforeEach`**, not `afterEach`
301
+ 1. **Match actual component behavior** in mocks (when mocking is necessary)
302
+ 1. **Use factory functions** for complex mock data
303
+ 1. **Import actual types** for type safety
304
+ 1. **Reset shared mock state** in `beforeEach`
305
+
306
+ ### ❌ DON'T
307
+
308
+ 1. **Don't mock base components** (`Loading`, `Button`, `Tooltip`, etc.)
309
+ 1. **Don't mock Zustand store modules** - Use real stores with `setState()`
310
+ 1. Don't mock components you can import directly
311
+ 1. Don't create overly simplified mocks that miss conditional logic
312
+ 1. Don't forget to clean up nock after each test
313
+ 1. Don't use `any` types in mocks without necessity
314
+
315
+ ### Mock Decision Tree
316
+
317
+ ```
318
+ Need to use a component in test?
319
+
320
+ ├─ Is it from @/app/components/base/*?
321
+ │ └─ YES → Import real component, DO NOT mock
322
+
323
+ ├─ Is it a project component?
324
+ │ └─ YES → Prefer importing real component
325
+ │ Only mock if setup is extremely complex
326
+
327
+ ├─ Is it an API service (@/service/*)?
328
+ │ └─ YES → Mock it
329
+
330
+ ├─ Is it a third-party lib with side effects?
331
+ │ └─ YES → Mock it (next/navigation, external SDKs)
332
+
333
+ ├─ Is it a Zustand store?
334
+ │ └─ YES → DO NOT mock the module!
335
+ │ Use real store + setState() to set test state
336
+ │ (Global mock handles auto-reset)
337
+
338
+ └─ Is it i18n?
339
+ └─ YES → Uses shared mock (auto-loaded). Override only for custom translations
340
+ ```
341
+
342
+ ## Zustand Store Testing
343
+
344
+ ### Global Zustand Mock (Auto-loaded)
345
+
346
+ Zustand is globally mocked in `web/vitest.setup.ts` following the [official Zustand testing guide](https://zustand.docs.pmnd.rs/guides/testing). The mock in `web/__mocks__/zustand.ts` provides:
347
+
348
+ - Real store behavior with `getState()`, `setState()`, `subscribe()` methods
349
+ - Automatic store reset after each test via `afterEach`
350
+ - Proper test isolation between tests
351
+
352
+ ### ✅ Recommended: Use Real Stores (Official Best Practice)
353
+
354
+ **DO NOT mock store modules manually.** Import and use the real store, then use `setState()` to set test state:
355
+
356
+ ```typescript
357
+ // ✅ CORRECT: Use real store with setState
358
+ import { useAppStore } from '@/app/components/app/store'
359
+
360
+ describe('MyComponent', () => {
361
+ it('should render app details', () => {
362
+ // Arrange: Set test state via setState
363
+ useAppStore.setState({
364
+ appDetail: {
365
+ id: 'test-app',
366
+ name: 'Test App',
367
+ mode: 'chat',
368
+ },
369
+ })
370
+
371
+ // Act
372
+ render(<MyComponent />)
373
+
374
+ // Assert
375
+ expect(screen.getByText('Test App')).toBeInTheDocument()
376
+ // Can also verify store state directly
377
+ expect(useAppStore.getState().appDetail?.name).toBe('Test App')
378
+ })
379
+
380
+ // No cleanup needed - global mock auto-resets after each test
381
+ })
382
+ ```
383
+
384
+ ### ❌ Avoid: Manual Store Module Mocking
385
+
386
+ Manual mocking conflicts with the global Zustand mock and loses store functionality:
387
+
388
+ ```typescript
389
+ // ❌ WRONG: Don't mock the store module
390
+ vi.mock('@/app/components/app/store', () => ({
391
+ useStore: (selector) => mockSelector(selector), // Missing getState, setState!
392
+ }))
393
+
394
+ // ❌ WRONG: This conflicts with global zustand mock
395
+ vi.mock('@/app/components/workflow/store', () => ({
396
+ useWorkflowStore: vi.fn(() => mockState),
397
+ }))
398
+ ```
399
+
400
+ **Problems with manual mocking:**
401
+
402
+ 1. Loses `getState()`, `setState()`, `subscribe()` methods
403
+ 1. Conflicts with global Zustand mock behavior
404
+ 1. Requires manual maintenance of store API
405
+ 1. Tests don't reflect actual store behavior
406
+
407
+ ### When Manual Store Mocking is Necessary
408
+
409
+ In rare cases where the store has complex initialization or side effects, you can mock it, but ensure you provide the full store API:
410
+
411
+ ```typescript
412
+ // If you MUST mock (rare), include full store API
413
+ const mockStore = {
414
+ appDetail: { id: 'test', name: 'Test' },
415
+ setAppDetail: vi.fn(),
416
+ }
417
+
418
+ vi.mock('@/app/components/app/store', () => ({
419
+ useStore: Object.assign(
420
+ (selector: (state: typeof mockStore) => unknown) => selector(mockStore),
421
+ {
422
+ getState: () => mockStore,
423
+ setState: vi.fn(),
424
+ subscribe: vi.fn(),
425
+ },
426
+ ),
427
+ }))
428
+ ```
429
+
430
+ ### Store Testing Decision Tree
431
+
432
+ ```
433
+ Need to test a component using Zustand store?
434
+
435
+ ├─ Can you use the real store?
436
+ │ └─ YES → Use real store + setState (RECOMMENDED)
437
+ │ useAppStore.setState({ ... })
438
+
439
+ ├─ Does the store have complex initialization/side effects?
440
+ │ └─ YES → Consider mocking, but include full API
441
+ │ (getState, setState, subscribe)
442
+
443
+ └─ Are you testing the store itself (not a component)?
444
+ └─ YES → Test store directly with getState/setState
445
+ const store = useMyStore
446
+ store.setState({ count: 0 })
447
+ store.getState().increment()
448
+ expect(store.getState().count).toBe(1)
449
+ ```
450
+
451
+ ### Example: Testing Store Actions
452
+
453
+ ```typescript
454
+ import { useCounterStore } from '@/stores/counter'
455
+
456
+ describe('Counter Store', () => {
457
+ it('should increment count', () => {
458
+ // Initial state (auto-reset by global mock)
459
+ expect(useCounterStore.getState().count).toBe(0)
460
+
461
+ // Call action
462
+ useCounterStore.getState().increment()
463
+
464
+ // Verify state change
465
+ expect(useCounterStore.getState().count).toBe(1)
466
+ })
467
+
468
+ it('should reset to initial state', () => {
469
+ // Set some state
470
+ useCounterStore.setState({ count: 100 })
471
+ expect(useCounterStore.getState().count).toBe(100)
472
+
473
+ // After this test, global mock will reset to initial state
474
+ })
475
+ })
476
+ ```
477
+
478
+ ## Factory Function Pattern
479
+
480
+ ```typescript
481
+ // __mocks__/data-factories.ts
482
+ import type { User, Project } from '@/types'
483
+
484
+ export const createMockUser = (overrides: Partial<User> = {}): User => ({
485
+ id: 'user-1',
486
+ name: 'Test User',
487
+ email: 'test@example.com',
488
+ role: 'member',
489
+ createdAt: new Date().toISOString(),
490
+ ...overrides,
491
+ })
492
+
493
+ export const createMockProject = (overrides: Partial<Project> = {}): Project => ({
494
+ id: 'project-1',
495
+ name: 'Test Project',
496
+ description: 'A test project',
497
+ owner: createMockUser(),
498
+ members: [],
499
+ createdAt: new Date().toISOString(),
500
+ ...overrides,
501
+ })
502
+
503
+ // Usage in tests
504
+ it('should display project owner', () => {
505
+ const project = createMockProject({
506
+ owner: createMockUser({ name: 'John Doe' }),
507
+ })
508
+
509
+ render(<ProjectCard project={project} />)
510
+ expect(screen.getByText('John Doe')).toBeInTheDocument()
511
+ })
512
+ ```