@fecommunity/reactpress 3.0.3 → 3.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (541) hide show
  1. package/bin/reactpress.js +127 -20
  2. package/dist/index.js +0 -0
  3. package/lib/build.js +25 -9
  4. package/lib/db-backup.js +21 -0
  5. package/lib/dev-banner.js +42 -10
  6. package/lib/dev.js +48 -29
  7. package/lib/docker.js +162 -44
  8. package/lib/doctor.js +71 -15
  9. package/lib/http.js +39 -4
  10. package/lib/i18n/strings.js +297 -40
  11. package/lib/lifecycle.js +43 -2
  12. package/lib/nginx.js +342 -0
  13. package/lib/project-type.js +72 -0
  14. package/lib/publish.js +46 -30
  15. package/lib/status.js +69 -45
  16. package/package.json +5 -6
  17. package/server/dist/dist/app.module.d.ts +2 -0
  18. package/server/dist/dist/app.module.js +105 -0
  19. package/server/dist/dist/app.module.js.map +1 -0
  20. package/server/dist/dist/common/api-messages.d.ts +32 -0
  21. package/server/dist/dist/common/api-messages.js +36 -0
  22. package/server/dist/dist/common/api-messages.js.map +1 -0
  23. package/server/dist/dist/filters/http-exception.filter.d.ts +4 -0
  24. package/server/dist/dist/filters/http-exception.filter.js +36 -0
  25. package/server/dist/dist/filters/http-exception.filter.js.map +1 -0
  26. package/server/dist/dist/generate-swagger.d.ts +1 -0
  27. package/server/dist/dist/generate-swagger.js +73 -0
  28. package/server/dist/dist/generate-swagger.js.map +1 -0
  29. package/server/dist/dist/interceptors/transform.interceptor.d.ts +9 -0
  30. package/server/dist/dist/interceptors/transform.interceptor.js +36 -0
  31. package/server/dist/dist/interceptors/transform.interceptor.js.map +1 -0
  32. package/server/dist/dist/logger/index.d.ts +4 -0
  33. package/server/dist/dist/logger/index.js +33 -0
  34. package/server/dist/dist/logger/index.js.map +1 -0
  35. package/server/dist/dist/main.d.ts +6 -0
  36. package/server/dist/dist/main.js +263 -0
  37. package/server/dist/dist/main.js.map +1 -0
  38. package/server/dist/dist/modules/api-key/api-key.controller.d.ts +14 -0
  39. package/server/dist/dist/modules/api-key/api-key.controller.js +63 -0
  40. package/server/dist/dist/modules/api-key/api-key.controller.js.map +1 -0
  41. package/server/dist/dist/modules/api-key/api-key.entity.d.ts +11 -0
  42. package/server/dist/dist/modules/api-key/api-key.entity.js +63 -0
  43. package/server/dist/dist/modules/api-key/api-key.entity.js.map +1 -0
  44. package/server/dist/dist/modules/api-key/api-key.guard.d.ts +7 -0
  45. package/server/dist/dist/modules/api-key/api-key.guard.js +40 -0
  46. package/server/dist/dist/modules/api-key/api-key.guard.js.map +1 -0
  47. package/server/dist/dist/modules/api-key/api-key.module.d.ts +2 -0
  48. package/server/dist/dist/modules/api-key/api-key.module.js +28 -0
  49. package/server/dist/dist/modules/api-key/api-key.module.js.map +1 -0
  50. package/server/dist/dist/modules/api-key/api-key.service.d.ts +15 -0
  51. package/server/dist/dist/modules/api-key/api-key.service.js +81 -0
  52. package/server/dist/dist/modules/api-key/api-key.service.js.map +1 -0
  53. package/server/dist/dist/modules/article/article-revision.entity.d.ts +11 -0
  54. package/server/dist/dist/modules/article/article-revision.entity.js +53 -0
  55. package/server/dist/dist/modules/article/article-revision.entity.js.map +1 -0
  56. package/server/dist/dist/modules/article/article.controller.d.ts +32 -0
  57. package/server/dist/dist/modules/article/article.controller.js +242 -0
  58. package/server/dist/dist/modules/article/article.controller.js.map +1 -0
  59. package/server/dist/dist/modules/article/article.entity.d.ts +24 -0
  60. package/server/dist/dist/modules/article/article.entity.js +133 -0
  61. package/server/dist/dist/modules/article/article.entity.js.map +1 -0
  62. package/server/dist/dist/modules/article/article.module.d.ts +2 -0
  63. package/server/dist/dist/modules/article/article.module.js +42 -0
  64. package/server/dist/dist/modules/article/article.module.js.map +1 -0
  65. package/server/dist/dist/modules/article/article.service.d.ts +38 -0
  66. package/server/dist/dist/modules/article/article.service.js +357 -0
  67. package/server/dist/dist/modules/article/article.service.js.map +1 -0
  68. package/server/dist/dist/modules/article/article.util.d.ts +1 -0
  69. package/server/dist/dist/modules/article/article.util.js +9 -0
  70. package/server/dist/dist/modules/article/article.util.js.map +1 -0
  71. package/server/dist/dist/modules/article/scheduled-publish.service.d.ts +13 -0
  72. package/server/dist/dist/modules/article/scheduled-publish.service.js +65 -0
  73. package/server/dist/dist/modules/article/scheduled-publish.service.js.map +1 -0
  74. package/server/dist/dist/modules/auth/auth.controller.d.ts +12 -0
  75. package/server/dist/dist/modules/auth/auth.controller.js +66 -0
  76. package/server/dist/dist/modules/auth/auth.controller.js.map +1 -0
  77. package/server/dist/dist/modules/auth/auth.module.d.ts +2 -0
  78. package/server/dist/dist/modules/auth/auth.module.js +41 -0
  79. package/server/dist/dist/modules/auth/auth.module.js.map +1 -0
  80. package/server/dist/dist/modules/auth/auth.service.d.ts +26 -0
  81. package/server/dist/dist/modules/auth/auth.service.js +128 -0
  82. package/server/dist/dist/modules/auth/auth.service.js.map +1 -0
  83. package/server/dist/dist/modules/auth/jwt-auth.guard.d.ts +7 -0
  84. package/server/dist/dist/modules/auth/jwt-auth.guard.js +30 -0
  85. package/server/dist/dist/modules/auth/jwt-auth.guard.js.map +1 -0
  86. package/server/dist/dist/modules/auth/jwt.strategy.d.ts +9 -0
  87. package/server/dist/dist/modules/auth/jwt.strategy.js +39 -0
  88. package/server/dist/dist/modules/auth/jwt.strategy.js.map +1 -0
  89. package/server/dist/dist/modules/auth/roles.guard.d.ts +10 -0
  90. package/server/dist/dist/modules/auth/roles.guard.js +46 -0
  91. package/server/dist/dist/modules/auth/roles.guard.js.map +1 -0
  92. package/server/dist/dist/modules/category/category.controller.d.ts +11 -0
  93. package/server/dist/dist/modules/category/category.controller.js +91 -0
  94. package/server/dist/dist/modules/category/category.controller.js.map +1 -0
  95. package/server/dist/dist/modules/category/category.entity.d.ts +9 -0
  96. package/server/dist/dist/modules/category/category.entity.js +60 -0
  97. package/server/dist/dist/modules/category/category.entity.js.map +1 -0
  98. package/server/dist/dist/modules/category/category.module.d.ts +2 -0
  99. package/server/dist/dist/modules/category/category.module.js +27 -0
  100. package/server/dist/dist/modules/category/category.module.js.map +1 -0
  101. package/server/dist/dist/modules/category/category.service.d.ts +12 -0
  102. package/server/dist/dist/modules/category/category.service.js +90 -0
  103. package/server/dist/dist/modules/category/category.service.js.map +1 -0
  104. package/server/dist/dist/modules/comment/comment.controller.d.ts +12 -0
  105. package/server/dist/dist/modules/comment/comment.controller.js +100 -0
  106. package/server/dist/dist/modules/comment/comment.controller.js.map +1 -0
  107. package/server/dist/dist/modules/comment/comment.entity.d.ts +17 -0
  108. package/server/dist/dist/modules/comment/comment.entity.js +104 -0
  109. package/server/dist/dist/modules/comment/comment.entity.js.map +1 -0
  110. package/server/dist/dist/modules/comment/comment.module.d.ts +2 -0
  111. package/server/dist/dist/modules/comment/comment.module.js +39 -0
  112. package/server/dist/dist/modules/comment/comment.module.js.map +1 -0
  113. package/server/dist/dist/modules/comment/comment.service.d.ts +26 -0
  114. package/server/dist/dist/modules/comment/comment.service.js +182 -0
  115. package/server/dist/dist/modules/comment/comment.service.js.map +1 -0
  116. package/server/dist/dist/modules/comment/html.d.ts +15 -0
  117. package/server/dist/dist/modules/comment/html.js +632 -0
  118. package/server/dist/dist/modules/comment/html.js.map +1 -0
  119. package/server/dist/dist/modules/file/file.controller.d.ts +10 -0
  120. package/server/dist/dist/modules/file/file.controller.js +84 -0
  121. package/server/dist/dist/modules/file/file.controller.js.map +1 -0
  122. package/server/dist/dist/modules/file/file.entity.d.ts +9 -0
  123. package/server/dist/dist/modules/file/file.entity.js +60 -0
  124. package/server/dist/dist/modules/file/file.entity.js.map +1 -0
  125. package/server/dist/dist/modules/file/file.module.d.ts +2 -0
  126. package/server/dist/dist/modules/file/file.module.js +27 -0
  127. package/server/dist/dist/modules/file/file.module.js.map +1 -0
  128. package/server/dist/dist/modules/file/file.service.d.ts +17 -0
  129. package/server/dist/dist/modules/file/file.service.js +111 -0
  130. package/server/dist/dist/modules/file/file.service.js.map +1 -0
  131. package/server/dist/dist/modules/health/health.controller.d.ts +11 -0
  132. package/server/dist/dist/modules/health/health.controller.js +57 -0
  133. package/server/dist/dist/modules/health/health.controller.js.map +1 -0
  134. package/server/dist/dist/modules/health/health.module.d.ts +2 -0
  135. package/server/dist/dist/modules/health/health.module.js +20 -0
  136. package/server/dist/dist/modules/health/health.module.js.map +1 -0
  137. package/server/dist/dist/modules/install/install.controller.d.ts +11 -0
  138. package/server/dist/dist/modules/install/install.controller.js +49 -0
  139. package/server/dist/dist/modules/install/install.controller.js.map +1 -0
  140. package/server/dist/dist/modules/install/install.module.d.ts +2 -0
  141. package/server/dist/dist/modules/install/install.module.js +26 -0
  142. package/server/dist/dist/modules/install/install.module.js.map +1 -0
  143. package/server/dist/dist/modules/install/install.service.d.ts +12 -0
  144. package/server/dist/dist/modules/install/install.service.js +63 -0
  145. package/server/dist/dist/modules/install/install.service.js.map +1 -0
  146. package/server/dist/dist/modules/knowledge/knowledge.controller.d.ts +14 -0
  147. package/server/dist/dist/modules/knowledge/knowledge.controller.js +128 -0
  148. package/server/dist/dist/modules/knowledge/knowledge.controller.js.map +1 -0
  149. package/server/dist/dist/modules/knowledge/knowledge.entity.d.ts +18 -0
  150. package/server/dist/dist/modules/knowledge/knowledge.entity.js +109 -0
  151. package/server/dist/dist/modules/knowledge/knowledge.entity.js.map +1 -0
  152. package/server/dist/dist/modules/knowledge/knowledge.module.d.ts +2 -0
  153. package/server/dist/dist/modules/knowledge/knowledge.module.js +27 -0
  154. package/server/dist/dist/modules/knowledge/knowledge.module.js.map +1 -0
  155. package/server/dist/dist/modules/knowledge/knowledge.service.d.ts +14 -0
  156. package/server/dist/dist/modules/knowledge/knowledge.service.js +144 -0
  157. package/server/dist/dist/modules/knowledge/knowledge.service.js.map +1 -0
  158. package/server/dist/dist/modules/page/page.controller.d.ts +12 -0
  159. package/server/dist/dist/modules/page/page.controller.js +102 -0
  160. package/server/dist/dist/modules/page/page.controller.js.map +1 -0
  161. package/server/dist/dist/modules/page/page.entity.d.ts +15 -0
  162. package/server/dist/dist/modules/page/page.entity.js +94 -0
  163. package/server/dist/dist/modules/page/page.entity.js.map +1 -0
  164. package/server/dist/dist/modules/page/page.module.d.ts +2 -0
  165. package/server/dist/dist/modules/page/page.module.js +27 -0
  166. package/server/dist/dist/modules/page/page.module.js.map +1 -0
  167. package/server/dist/dist/modules/page/page.service.d.ts +12 -0
  168. package/server/dist/dist/modules/page/page.service.js +98 -0
  169. package/server/dist/dist/modules/page/page.service.js.map +1 -0
  170. package/server/dist/dist/modules/search/search.controller.d.ts +8 -0
  171. package/server/dist/dist/modules/search/search.controller.js +67 -0
  172. package/server/dist/dist/modules/search/search.controller.js.map +1 -0
  173. package/server/dist/dist/modules/search/search.entity.d.ts +8 -0
  174. package/server/dist/dist/modules/search/search.entity.js +59 -0
  175. package/server/dist/dist/modules/search/search.entity.js.map +1 -0
  176. package/server/dist/dist/modules/search/search.module.d.ts +2 -0
  177. package/server/dist/dist/modules/search/search.module.js +27 -0
  178. package/server/dist/dist/modules/search/search.module.js.map +1 -0
  179. package/server/dist/dist/modules/search/search.service.d.ts +12 -0
  180. package/server/dist/dist/modules/search/search.service.js +84 -0
  181. package/server/dist/dist/modules/search/search.service.js.map +1 -0
  182. package/server/dist/dist/modules/setting/setting.constant.d.ts +3 -0
  183. package/server/dist/dist/modules/setting/setting.constant.js +25 -0
  184. package/server/dist/dist/modules/setting/setting.constant.js.map +1 -0
  185. package/server/dist/dist/modules/setting/setting.controller.d.ts +12 -0
  186. package/server/dist/dist/modules/setting/setting.controller.js +77 -0
  187. package/server/dist/dist/modules/setting/setting.controller.js.map +1 -0
  188. package/server/dist/dist/modules/setting/setting.entity.d.ts +26 -0
  189. package/server/dist/dist/modules/setting/setting.entity.js +149 -0
  190. package/server/dist/dist/modules/setting/setting.entity.js.map +1 -0
  191. package/server/dist/dist/modules/setting/setting.module.d.ts +2 -0
  192. package/server/dist/dist/modules/setting/setting.module.js +28 -0
  193. package/server/dist/dist/modules/setting/setting.module.js.map +1 -0
  194. package/server/dist/dist/modules/setting/setting.service.d.ts +10 -0
  195. package/server/dist/dist/modules/setting/setting.service.js +106 -0
  196. package/server/dist/dist/modules/setting/setting.service.js.map +1 -0
  197. package/server/dist/dist/modules/smtp/mail.util.d.ts +6 -0
  198. package/server/dist/dist/modules/smtp/mail.util.js +33 -0
  199. package/server/dist/dist/modules/smtp/mail.util.js.map +1 -0
  200. package/server/dist/dist/modules/smtp/smtp.controller.d.ts +9 -0
  201. package/server/dist/dist/modules/smtp/smtp.controller.js +69 -0
  202. package/server/dist/dist/modules/smtp/smtp.controller.js.map +1 -0
  203. package/server/dist/dist/modules/smtp/smtp.entity.d.ts +9 -0
  204. package/server/dist/dist/modules/smtp/smtp.entity.js +60 -0
  205. package/server/dist/dist/modules/smtp/smtp.entity.js.map +1 -0
  206. package/server/dist/dist/modules/smtp/smtp.module.d.ts +2 -0
  207. package/server/dist/dist/modules/smtp/smtp.module.js +28 -0
  208. package/server/dist/dist/modules/smtp/smtp.module.js.map +1 -0
  209. package/server/dist/dist/modules/smtp/smtp.service.d.ts +11 -0
  210. package/server/dist/dist/modules/smtp/smtp.service.js +83 -0
  211. package/server/dist/dist/modules/smtp/smtp.service.js.map +1 -0
  212. package/server/dist/dist/modules/tag/tag.controller.d.ts +12 -0
  213. package/server/dist/dist/modules/tag/tag.controller.js +101 -0
  214. package/server/dist/dist/modules/tag/tag.controller.js.map +1 -0
  215. package/server/dist/dist/modules/tag/tag.entity.d.ts +9 -0
  216. package/server/dist/dist/modules/tag/tag.entity.js +59 -0
  217. package/server/dist/dist/modules/tag/tag.entity.js.map +1 -0
  218. package/server/dist/dist/modules/tag/tag.module.d.ts +2 -0
  219. package/server/dist/dist/modules/tag/tag.module.js +27 -0
  220. package/server/dist/dist/modules/tag/tag.module.js.map +1 -0
  221. package/server/dist/dist/modules/tag/tag.service.d.ts +13 -0
  222. package/server/dist/dist/modules/tag/tag.service.js +104 -0
  223. package/server/dist/dist/modules/tag/tag.service.js.map +1 -0
  224. package/server/dist/dist/modules/user/user.controller.d.ts +13 -0
  225. package/server/dist/dist/modules/user/user.controller.js +115 -0
  226. package/server/dist/dist/modules/user/user.controller.js.map +1 -0
  227. package/server/dist/dist/modules/user/user.entity.d.ts +15 -0
  228. package/server/dist/dist/modules/user/user.entity.js +96 -0
  229. package/server/dist/dist/modules/user/user.entity.js.map +1 -0
  230. package/server/dist/dist/modules/user/user.module.d.ts +2 -0
  231. package/server/dist/dist/modules/user/user.module.js +28 -0
  232. package/server/dist/dist/modules/user/user.module.js.map +1 -0
  233. package/server/dist/dist/modules/user/user.service.d.ts +16 -0
  234. package/server/dist/dist/modules/user/user.service.js +152 -0
  235. package/server/dist/dist/modules/user/user.service.js.map +1 -0
  236. package/server/dist/dist/modules/view/view.controller.d.ts +11 -0
  237. package/server/dist/dist/modules/view/view.controller.js +92 -0
  238. package/server/dist/dist/modules/view/view.controller.js.map +1 -0
  239. package/server/dist/dist/modules/view/view.entity.d.ts +14 -0
  240. package/server/dist/dist/modules/view/view.entity.js +88 -0
  241. package/server/dist/dist/modules/view/view.entity.js.map +1 -0
  242. package/server/dist/dist/modules/view/view.module.d.ts +2 -0
  243. package/server/dist/dist/modules/view/view.module.js +27 -0
  244. package/server/dist/dist/modules/view/view.module.js.map +1 -0
  245. package/server/dist/dist/modules/view/view.service.d.ts +11 -0
  246. package/server/dist/dist/modules/view/view.service.js +89 -0
  247. package/server/dist/dist/modules/view/view.service.js.map +1 -0
  248. package/server/dist/dist/modules/webhook/webhook.controller.d.ts +12 -0
  249. package/server/dist/dist/modules/webhook/webhook.controller.js +63 -0
  250. package/server/dist/dist/modules/webhook/webhook.controller.js.map +1 -0
  251. package/server/dist/dist/modules/webhook/webhook.entity.d.ts +9 -0
  252. package/server/dist/dist/modules/webhook/webhook.entity.js +54 -0
  253. package/server/dist/dist/modules/webhook/webhook.entity.js.map +1 -0
  254. package/server/dist/dist/modules/webhook/webhook.module.d.ts +2 -0
  255. package/server/dist/dist/modules/webhook/webhook.module.js +27 -0
  256. package/server/dist/dist/modules/webhook/webhook.module.js.map +1 -0
  257. package/server/dist/dist/modules/webhook/webhook.service.d.ts +16 -0
  258. package/server/dist/dist/modules/webhook/webhook.service.js +97 -0
  259. package/server/dist/dist/modules/webhook/webhook.service.js.map +1 -0
  260. package/server/dist/dist/public/favicon.png +0 -0
  261. package/server/dist/dist/public/index.html +439 -0
  262. package/server/dist/dist/public/swagger/custom.css +11 -0
  263. package/server/dist/dist/starter.d.ts +1 -0
  264. package/server/dist/dist/starter.js +84 -0
  265. package/server/dist/dist/starter.js.map +1 -0
  266. package/server/dist/dist/tsconfig.build.tsbuildinfo +16966 -0
  267. package/server/dist/dist/utils/date.util.d.ts +1 -0
  268. package/server/dist/dist/utils/date.util.js +13 -0
  269. package/server/dist/dist/utils/date.util.js.map +1 -0
  270. package/server/dist/dist/utils/ip.util.d.ts +2 -0
  271. package/server/dist/dist/utils/ip.util.js +27 -0
  272. package/server/dist/dist/utils/ip.util.js.map +1 -0
  273. package/server/dist/dist/utils/markdown.util.d.ts +4 -0
  274. package/server/dist/dist/utils/markdown.util.js +42 -0
  275. package/server/dist/dist/utils/markdown.util.js.map +1 -0
  276. package/server/dist/dist/utils/oss/aliyun-oss-client.d.ts +6 -0
  277. package/server/dist/dist/utils/oss/aliyun-oss-client.js +28 -0
  278. package/server/dist/dist/utils/oss/aliyun-oss-client.js.map +1 -0
  279. package/server/dist/dist/utils/oss/oss-client.d.ts +6 -0
  280. package/server/dist/dist/utils/oss/oss-client.js +10 -0
  281. package/server/dist/dist/utils/oss/oss-client.js.map +1 -0
  282. package/server/dist/dist/utils/oss.util.d.ts +13 -0
  283. package/server/dist/dist/utils/oss.util.js +49 -0
  284. package/server/dist/dist/utils/oss.util.js.map +1 -0
  285. package/server/dist/dist/utils/ua.util.d.ts +9 -0
  286. package/server/dist/dist/utils/ua.util.js +36 -0
  287. package/server/dist/dist/utils/ua.util.js.map +1 -0
  288. package/server/dist/dist/utils/uniqueid.util.d.ts +1 -0
  289. package/server/dist/dist/utils/uniqueid.util.js +9 -0
  290. package/server/dist/dist/utils/uniqueid.util.js.map +1 -0
  291. package/server/dist/dist/utils/upload.util.d.ts +5 -0
  292. package/server/dist/dist/utils/upload.util.js +34 -0
  293. package/server/dist/dist/utils/upload.util.js.map +1 -0
  294. package/server/dist/dist/utils/user.util.d.ts +1 -0
  295. package/server/dist/dist/utils/user.util.js +18 -0
  296. package/server/dist/dist/utils/user.util.js.map +1 -0
  297. package/server/logs/error/error.log.-2026-05-19.log +123 -0
  298. package/server/node_modules/@nestjs/cli/node_modules/rimraf/bin.js +0 -0
  299. package/server/node_modules/@nestjs/cli/node_modules/typescript/bin/tsc +0 -0
  300. package/server/node_modules/@nestjs/cli/node_modules/typescript/bin/tsserver +0 -0
  301. package/server/node_modules/@nestjs/common/node_modules/axios/README.md +0 -0
  302. package/server/node_modules/@nestjs/common/node_modules/axios/lib/adapters/http.js +0 -0
  303. package/server/node_modules/@nestjs/config/node_modules/uuid/dist/bin/uuid +0 -0
  304. package/server/node_modules/@nestjs/platform-express/node_modules/mime/cli.js +0 -0
  305. package/server/node_modules/@nestjs/platform-express/node_modules/mime/src/build.js +0 -0
  306. package/server/node_modules/@nestjs/typeorm/node_modules/uuid/dist/bin/uuid +0 -0
  307. package/server/node_modules/@nuxtjs/opencollective/bin/opencollective.js +0 -0
  308. package/server/node_modules/@pm2/agent/node_modules/dayjs/plugin/objectSupport.d.ts +0 -0
  309. package/server/node_modules/@pm2/agent/node_modules/semver/bin/semver.js +0 -0
  310. package/server/node_modules/@pm2/io/node_modules/semver/bin/semver.js +0 -0
  311. package/server/node_modules/@types/node/LICENSE +0 -0
  312. package/server/node_modules/@types/node/README.md +0 -0
  313. package/server/node_modules/@types/node/assert.d.ts +0 -0
  314. package/server/node_modules/@types/node/async_hooks.d.ts +0 -0
  315. package/server/node_modules/@types/node/buffer.d.ts +0 -0
  316. package/server/node_modules/@types/node/child_process.d.ts +0 -0
  317. package/server/node_modules/@types/node/cluster.d.ts +0 -0
  318. package/server/node_modules/@types/node/console.d.ts +0 -0
  319. package/server/node_modules/@types/node/constants.d.ts +0 -0
  320. package/server/node_modules/@types/node/crypto.d.ts +0 -0
  321. package/server/node_modules/@types/node/dgram.d.ts +0 -0
  322. package/server/node_modules/@types/node/dns.d.ts +0 -0
  323. package/server/node_modules/@types/node/domain.d.ts +0 -0
  324. package/server/node_modules/@types/node/events.d.ts +0 -0
  325. package/server/node_modules/@types/node/fs.d.ts +0 -0
  326. package/server/node_modules/@types/node/globals.d.ts +0 -0
  327. package/server/node_modules/@types/node/globals.global.d.ts +0 -0
  328. package/server/node_modules/@types/node/http.d.ts +0 -0
  329. package/server/node_modules/@types/node/http2.d.ts +0 -0
  330. package/server/node_modules/@types/node/https.d.ts +0 -0
  331. package/server/node_modules/@types/node/index.d.ts +0 -0
  332. package/server/node_modules/@types/node/inspector.d.ts +0 -0
  333. package/server/node_modules/@types/node/module.d.ts +0 -0
  334. package/server/node_modules/@types/node/net.d.ts +0 -0
  335. package/server/node_modules/@types/node/os.d.ts +0 -0
  336. package/server/node_modules/@types/node/package.json +0 -0
  337. package/server/node_modules/@types/node/path.d.ts +0 -0
  338. package/server/node_modules/@types/node/perf_hooks.d.ts +0 -0
  339. package/server/node_modules/@types/node/process.d.ts +0 -0
  340. package/server/node_modules/@types/node/punycode.d.ts +0 -0
  341. package/server/node_modules/@types/node/querystring.d.ts +0 -0
  342. package/server/node_modules/@types/node/readline.d.ts +0 -0
  343. package/server/node_modules/@types/node/repl.d.ts +0 -0
  344. package/server/node_modules/@types/node/stream.d.ts +0 -0
  345. package/server/node_modules/@types/node/string_decoder.d.ts +0 -0
  346. package/server/node_modules/@types/node/timers.d.ts +0 -0
  347. package/server/node_modules/@types/node/tls.d.ts +0 -0
  348. package/server/node_modules/@types/node/trace_events.d.ts +0 -0
  349. package/server/node_modules/@types/node/tty.d.ts +0 -0
  350. package/server/node_modules/@types/node/url.d.ts +0 -0
  351. package/server/node_modules/@types/node/util.d.ts +0 -0
  352. package/server/node_modules/@types/node/v8.d.ts +0 -0
  353. package/server/node_modules/@types/node/vm.d.ts +0 -0
  354. package/server/node_modules/@types/node/wasi.d.ts +0 -0
  355. package/server/node_modules/@types/node/worker_threads.d.ts +0 -0
  356. package/server/node_modules/@types/node/zlib.d.ts +0 -0
  357. package/server/node_modules/@types/zen-observable/LICENSE +0 -0
  358. package/server/node_modules/@types/zen-observable/README.md +0 -0
  359. package/server/node_modules/@types/zen-observable/esm.d.ts +0 -0
  360. package/server/node_modules/@types/zen-observable/extras.d.ts +0 -0
  361. package/server/node_modules/@types/zen-observable/index.d.ts +0 -0
  362. package/server/node_modules/@types/zen-observable/package.json +0 -0
  363. package/server/node_modules/ajv/scripts/info +0 -0
  364. package/server/node_modules/ajv/scripts/prepare-tests +0 -0
  365. package/server/node_modules/ajv/scripts/publish-built-version +0 -0
  366. package/server/node_modules/ajv/scripts/travis-gh-pages +0 -0
  367. package/server/node_modules/arr-diff/LICENSE +0 -0
  368. package/server/node_modules/arr-flatten/LICENSE +0 -0
  369. package/server/node_modules/arr-flatten/README.md +0 -0
  370. package/server/node_modules/array-unique/LICENSE +0 -0
  371. package/server/node_modules/array-unique/README.md +0 -0
  372. package/server/node_modules/aws-ssl-profiles/package.json +0 -0
  373. package/server/node_modules/axios/README.md +0 -0
  374. package/server/node_modules/axios/lib/adapters/http.js +0 -0
  375. package/server/node_modules/blessed/bin/tput.js +0 -0
  376. package/server/node_modules/blessed/example/blessed-telnet.js +0 -0
  377. package/server/node_modules/blessed/example/multiplex.js +0 -0
  378. package/server/node_modules/blessed/example/ping +0 -0
  379. package/server/node_modules/blessed/example/time.js +0 -0
  380. package/server/node_modules/cacache/node_modules/rimraf/bin.js +0 -0
  381. package/server/node_modules/cli-color/bin/generate-color-images +0 -0
  382. package/server/node_modules/cli-color/test/__playground/throbber.formatted.js +0 -0
  383. package/server/node_modules/cli-color/test/__playground/throbber.js +0 -0
  384. package/server/node_modules/cli-highlight/node_modules/wrap-ansi/index.js +0 -0
  385. package/server/node_modules/cliui/node_modules/wrap-ansi/index.js +0 -0
  386. package/server/node_modules/constants-browserify/build.sh +0 -0
  387. package/server/node_modules/copy-concurrently/node_modules/rimraf/bin.js +0 -0
  388. package/server/node_modules/copyfiles/copyfiles +0 -0
  389. package/server/node_modules/copyfiles/index.js +0 -0
  390. package/server/node_modules/cross-env/README.md +0 -0
  391. package/server/node_modules/date-fns/esm/index.js +0 -0
  392. package/server/node_modules/date-fns/esm/previousDay/index.js +0 -0
  393. package/server/node_modules/date-fns/esm/previousFriday/index.js +0 -0
  394. package/server/node_modules/date-fns/esm/previousMonday/index.js +0 -0
  395. package/server/node_modules/date-fns/esm/previousSaturday/index.js +0 -0
  396. package/server/node_modules/date-fns/esm/previousSunday/index.js +0 -0
  397. package/server/node_modules/date-fns/esm/previousThursday/index.js +0 -0
  398. package/server/node_modules/date-fns/esm/previousTuesday/index.js +0 -0
  399. package/server/node_modules/date-fns/esm/previousWednesday/index.js +0 -0
  400. package/server/node_modules/date-fns/index.js +0 -0
  401. package/server/node_modules/date-fns/previousDay/index.js +0 -0
  402. package/server/node_modules/date-fns/previousFriday/index.js +0 -0
  403. package/server/node_modules/date-fns/previousMonday/index.js +0 -0
  404. package/server/node_modules/date-fns/previousSaturday/index.js +0 -0
  405. package/server/node_modules/date-fns/previousSunday/index.js +0 -0
  406. package/server/node_modules/date-fns/previousThursday/index.js +0 -0
  407. package/server/node_modules/date-fns/previousTuesday/index.js +0 -0
  408. package/server/node_modules/date-fns/previousWednesday/index.js +0 -0
  409. package/server/node_modules/dayjs/plugin/arraySupport.d.ts +0 -0
  410. package/server/node_modules/dayjs/plugin/objectSupport.d.ts +0 -0
  411. package/server/node_modules/default-user-agent/node_modules/os-name/cli.js +0 -0
  412. package/server/node_modules/degenerator/node_modules/escodegen/bin/escodegen.js +0 -0
  413. package/server/node_modules/degenerator/node_modules/escodegen/bin/esgenerate.js +0 -0
  414. package/server/node_modules/emojis-list/LICENSE.md +0 -0
  415. package/server/node_modules/emojis-list/README.md +0 -0
  416. package/server/node_modules/errno/build.js +0 -0
  417. package/server/node_modules/errno/cli.js +0 -0
  418. package/server/node_modules/es5-ext/_postinstall.js +0 -0
  419. package/server/node_modules/esprima/bin/esparse.js +0 -0
  420. package/server/node_modules/esprima/bin/esvalidate.js +0 -0
  421. package/server/node_modules/esrecurse/package.json +0 -0
  422. package/server/node_modules/execa/node_modules/semver/bin/semver +0 -0
  423. package/server/node_modules/execa/node_modules/which/bin/which +0 -0
  424. package/server/node_modules/extrareqp2/README.md +0 -0
  425. package/server/node_modules/extrareqp2/lib/adapters/http.js +0 -0
  426. package/server/node_modules/fork-ts-checker-webpack-plugin/node_modules/semver/bin/semver +0 -0
  427. package/server/node_modules/is-class-hotfix/.editorconfig +0 -0
  428. package/server/node_modules/is-class-hotfix/.gitattributes +0 -0
  429. package/server/node_modules/is-class-hotfix/CHANGELOG.md +0 -0
  430. package/server/node_modules/is-class-hotfix/LICENSE.md +0 -0
  431. package/server/node_modules/is-class-hotfix/README.md +0 -0
  432. package/server/node_modules/is-class-hotfix/bower.json +0 -0
  433. package/server/node_modules/is-class-hotfix/is-class.js +0 -0
  434. package/server/node_modules/is-class-hotfix/package.json +0 -0
  435. package/server/node_modules/is-class-hotfix/test/is-class.js +0 -0
  436. package/server/node_modules/is-docker/cli.js +0 -0
  437. package/server/node_modules/js-yaml/bin/js-yaml.js +0 -0
  438. package/server/node_modules/jsonwebtoken/node_modules/semver/bin/semver +0 -0
  439. package/server/node_modules/jstoxml/dist.sh +0 -0
  440. package/server/node_modules/log4js/lib/appenders/fileSync.js +0 -0
  441. package/server/node_modules/log4js/lib/connect-logger.js +0 -0
  442. package/server/node_modules/make-dir/node_modules/semver/bin/semver +0 -0
  443. package/server/node_modules/micromatch/LICENSE +0 -0
  444. package/server/node_modules/miller-rabin/bin/miller-rabin +0 -0
  445. package/server/node_modules/mime/cli.js +0 -0
  446. package/server/node_modules/mkdirp/bin/cmd.js +0 -0
  447. package/server/node_modules/move-concurrently/node_modules/rimraf/bin.js +0 -0
  448. package/server/node_modules/nan/tools/1to2.js +0 -0
  449. package/server/node_modules/needle/bin/needle +0 -0
  450. package/server/node_modules/node-libs-browser/node_modules/buffer/bin/download-node-tests.js +0 -0
  451. package/server/node_modules/node-libs-browser/node_modules/buffer/bin/update-authors.sh +0 -0
  452. package/server/node_modules/open/xdg-open +0 -0
  453. package/server/node_modules/osx-release/cli.js +0 -0
  454. package/server/node_modules/pm2/bin/pm2 +0 -0
  455. package/server/node_modules/pm2/bin/pm2-dev +0 -0
  456. package/server/node_modules/pm2/bin/pm2-docker +0 -0
  457. package/server/node_modules/pm2/bin/pm2-runtime +0 -0
  458. package/server/node_modules/pm2/lib/templates/init-scripts/openrc.tpl +0 -0
  459. package/server/node_modules/pm2/lib/tools/xdg-open +0 -0
  460. package/server/node_modules/pm2/node_modules/mkdirp/bin/cmd.js +0 -0
  461. package/server/node_modules/pm2/pm2 +0 -0
  462. package/server/node_modules/pm2-deploy/deploy +0 -0
  463. package/server/node_modules/require-in-the-middle/node_modules/resolve/bin/resolve +0 -0
  464. package/server/node_modules/rimraf/bin.js +0 -0
  465. package/server/node_modules/segment/repl +0 -0
  466. package/server/node_modules/semver/bin/semver.js +0 -0
  467. package/server/node_modules/send/node_modules/mime/cli.js +0 -0
  468. package/server/node_modules/send/node_modules/mime/src/build.js +0 -0
  469. package/server/node_modules/sha.js/bin.js +0 -0
  470. package/server/node_modules/systeminformation/lib/cli.js +0 -0
  471. package/server/node_modules/terser/bin/terser +0 -0
  472. package/server/node_modules/terser/bin/uglifyjs +0 -0
  473. package/server/node_modules/tree-kill/cli.js +0 -0
  474. package/server/node_modules/tree-kill/index.js +0 -0
  475. package/server/node_modules/typeorm/cli.js +0 -0
  476. package/server/node_modules/typeorm/node_modules/mkdirp/bin/cmd.js +0 -0
  477. package/server/node_modules/typeorm/node_modules/uuid/dist/bin/uuid +0 -0
  478. package/server/node_modules/typeorm/node_modules/wrap-ansi/index.js +0 -0
  479. package/server/node_modules/ua-parser-js/script/cli.js +0 -0
  480. package/server/node_modules/ua-parser-js/src/ua-parser.js +0 -0
  481. package/server/node_modules/upath/LICENSE +0 -0
  482. package/server/node_modules/uri-js/LICENSE +0 -0
  483. package/server/node_modules/uri-js/README.md +0 -0
  484. package/server/node_modules/uri-js/dist/es5/uri.all.d.ts +0 -0
  485. package/server/node_modules/uri-js/dist/es5/uri.all.js +0 -0
  486. package/server/node_modules/uri-js/dist/es5/uri.all.js.map +0 -0
  487. package/server/node_modules/uri-js/dist/es5/uri.all.min.d.ts +0 -0
  488. package/server/node_modules/uri-js/dist/es5/uri.all.min.js +0 -0
  489. package/server/node_modules/uri-js/dist/es5/uri.all.min.js.map +0 -0
  490. package/server/node_modules/uri-js/dist/esnext/index.d.ts +0 -0
  491. package/server/node_modules/uri-js/dist/esnext/index.js +0 -0
  492. package/server/node_modules/uri-js/dist/esnext/index.js.map +0 -0
  493. package/server/node_modules/uri-js/dist/esnext/regexps-iri.d.ts +0 -0
  494. package/server/node_modules/uri-js/dist/esnext/regexps-iri.js +0 -0
  495. package/server/node_modules/uri-js/dist/esnext/regexps-iri.js.map +0 -0
  496. package/server/node_modules/uri-js/dist/esnext/regexps-uri.d.ts +0 -0
  497. package/server/node_modules/uri-js/dist/esnext/regexps-uri.js +0 -0
  498. package/server/node_modules/uri-js/dist/esnext/regexps-uri.js.map +0 -0
  499. package/server/node_modules/uri-js/dist/esnext/schemes/http.d.ts +0 -0
  500. package/server/node_modules/uri-js/dist/esnext/schemes/http.js +0 -0
  501. package/server/node_modules/uri-js/dist/esnext/schemes/http.js.map +0 -0
  502. package/server/node_modules/uri-js/dist/esnext/schemes/https.d.ts +0 -0
  503. package/server/node_modules/uri-js/dist/esnext/schemes/https.js +0 -0
  504. package/server/node_modules/uri-js/dist/esnext/schemes/https.js.map +0 -0
  505. package/server/node_modules/uri-js/dist/esnext/schemes/mailto.d.ts +0 -0
  506. package/server/node_modules/uri-js/dist/esnext/schemes/mailto.js +0 -0
  507. package/server/node_modules/uri-js/dist/esnext/schemes/mailto.js.map +0 -0
  508. package/server/node_modules/uri-js/dist/esnext/schemes/urn-uuid.d.ts +0 -0
  509. package/server/node_modules/uri-js/dist/esnext/schemes/urn-uuid.js +0 -0
  510. package/server/node_modules/uri-js/dist/esnext/schemes/urn-uuid.js.map +0 -0
  511. package/server/node_modules/uri-js/dist/esnext/schemes/urn.d.ts +0 -0
  512. package/server/node_modules/uri-js/dist/esnext/schemes/urn.js +0 -0
  513. package/server/node_modules/uri-js/dist/esnext/schemes/urn.js.map +0 -0
  514. package/server/node_modules/uri-js/dist/esnext/schemes/ws.d.ts +0 -0
  515. package/server/node_modules/uri-js/dist/esnext/schemes/ws.js +0 -0
  516. package/server/node_modules/uri-js/dist/esnext/schemes/ws.js.map +0 -0
  517. package/server/node_modules/uri-js/dist/esnext/schemes/wss.d.ts +0 -0
  518. package/server/node_modules/uri-js/dist/esnext/schemes/wss.js +0 -0
  519. package/server/node_modules/uri-js/dist/esnext/schemes/wss.js.map +0 -0
  520. package/server/node_modules/uri-js/dist/esnext/uri.d.ts +0 -0
  521. package/server/node_modules/uri-js/dist/esnext/uri.js +0 -0
  522. package/server/node_modules/uri-js/dist/esnext/uri.js.map +0 -0
  523. package/server/node_modules/uri-js/dist/esnext/util.d.ts +0 -0
  524. package/server/node_modules/uri-js/dist/esnext/util.js +0 -0
  525. package/server/node_modules/uri-js/dist/esnext/util.js.map +0 -0
  526. package/server/node_modules/uri-js/package.json +0 -0
  527. package/server/node_modules/uri-js/yarn.lock +0 -0
  528. package/server/node_modules/uuid/dist/bin/uuid +0 -0
  529. package/server/node_modules/webpack/node_modules/acorn/bin/acorn +0 -0
  530. package/server/node_modules/webpack/node_modules/ajv/scripts/info +0 -0
  531. package/server/node_modules/webpack/node_modules/ajv/scripts/prepare-tests +0 -0
  532. package/server/node_modules/webpack/node_modules/ajv/scripts/publish-built-version +0 -0
  533. package/server/node_modules/webpack/node_modules/ajv/scripts/travis-gh-pages +0 -0
  534. package/server/node_modules/which/bin/node-which +0 -0
  535. package/server/node_modules/win-release/node_modules/semver/bin/semver +0 -0
  536. package/server/node_modules/wrap-ansi/index.js +0 -0
  537. package/templates/nginx.dev.conf +57 -0
  538. package/templates/nginx.prod.conf +75 -0
  539. package/ui/banner.js +432 -13
  540. package/ui/interactive.js +248 -52
  541. package/ui/theme.js +250 -10
package/lib/docker.js CHANGED
@@ -1,6 +1,9 @@
1
- const { spawn, execSync } = require('child_process');
1
+ const fs = require('fs');
2
2
  const path = require('path');
3
+ const { spawn, execSync, spawnSync } = require('child_process');
4
+ const ora = require('ora');
3
5
  const { ensureOriginalCwd } = require('./root');
6
+ const { detectProjectType, hasClient } = require('./project-type');
4
7
  const { t } = require('./i18n');
5
8
 
6
9
  function isDockerRunning() {
@@ -12,18 +15,58 @@ function isDockerRunning() {
12
15
  }
13
16
  }
14
17
 
18
+ function pickDockerComposeCommand() {
19
+ const v2 = spawnSync('docker', ['compose', 'version'], { stdio: 'ignore' });
20
+ if (v2.status === 0) return { command: 'docker', baseArgs: ['compose'] };
21
+
22
+ const v1 = spawnSync('docker-compose', ['version'], { stdio: 'ignore' });
23
+ if (v1.status === 0) return { command: 'docker-compose', baseArgs: [] };
24
+
25
+ return { command: 'docker', baseArgs: ['compose'] };
26
+ }
27
+
28
+ /**
29
+ * Resolve which docker-compose file to use for the current project.
30
+ *
31
+ * - Monorepo checkouts use `docker-compose.dev.yml` at the repo root.
32
+ * - Standalone projects use `.reactpress/docker-compose.yml` (managed by init).
33
+ *
34
+ * @returns {{ composeFile: string, cwd: string, type: 'monorepo' | 'standalone' }}
35
+ */
36
+ function resolveComposeContext(projectRoot) {
37
+ const type = detectProjectType(projectRoot);
38
+ if (type === 'monorepo') {
39
+ const composeFile = path.join(projectRoot, 'docker-compose.dev.yml');
40
+ if (fs.existsSync(composeFile)) {
41
+ return { composeFile, cwd: projectRoot, type };
42
+ }
43
+ }
44
+ const standaloneCompose = path.join(projectRoot, '.reactpress', 'docker-compose.yml');
45
+ if (fs.existsSync(standaloneCompose)) {
46
+ return { composeFile: standaloneCompose, cwd: path.dirname(standaloneCompose), type: 'standalone' };
47
+ }
48
+ const fallback = path.join(projectRoot, 'docker-compose.dev.yml');
49
+ return { composeFile: fallback, cwd: projectRoot, type };
50
+ }
51
+
52
+ function runCompose(args, ctx, options = {}) {
53
+ const { command, baseArgs } = pickDockerComposeCommand();
54
+ return spawnSync(
55
+ command,
56
+ [...baseArgs, '-f', ctx.composeFile, ...args],
57
+ { stdio: options.stdio ?? 'inherit', cwd: ctx.cwd, ...options }
58
+ );
59
+ }
60
+
15
61
  function stopDockerServices(projectRoot) {
16
62
  console.log(t('docker.stopping'));
17
- try {
18
- execSync('docker-compose -f docker-compose.dev.yml down', {
19
- stdio: 'inherit',
20
- cwd: projectRoot,
21
- });
22
- console.log(t('docker.stopped'));
23
- } catch (error) {
24
- console.error(t('docker.stopFailed'), error.message);
25
- throw error;
63
+ const ctx = resolveComposeContext(projectRoot);
64
+ const result = runCompose(['down'], ctx);
65
+ if (result.status !== 0) {
66
+ console.error(t('docker.stopFailed'));
67
+ throw new Error(t('docker.stopFailed'));
26
68
  }
69
+ console.log(t('docker.stopped'));
27
70
  }
28
71
 
29
72
  function startDockerServices(projectRoot) {
@@ -31,42 +74,86 @@ function startDockerServices(projectRoot) {
31
74
  if (!isDockerRunning()) {
32
75
  throw new Error(t('docker.notRunning'));
33
76
  }
34
- execSync('docker-compose -f docker-compose.dev.yml up -d', {
35
- stdio: 'inherit',
36
- cwd: projectRoot,
37
- });
77
+ try {
78
+ const { ensureNginxConfig } = require('./nginx');
79
+ const { configPath, created } = ensureNginxConfig(projectRoot, { mode: 'dev' });
80
+ if (created) {
81
+ console.log(t('nginx.configCreated', { path: configPath }));
82
+ }
83
+ } catch (err) {
84
+ console.warn(t('nginx.ensureWarn', { message: err.message || err }));
85
+ }
86
+ const ctx = resolveComposeContext(projectRoot);
87
+ const result = runCompose(['up', '-d'], ctx);
88
+ if (result.status !== 0) {
89
+ throw new Error(t('docker.notRunning'));
90
+ }
38
91
  console.log(t('docker.started'));
39
92
  }
40
93
 
41
- async function waitForMysql(maxAttempts = 30) {
42
- console.log(t('docker.waitingMysql'));
94
+ function resolveDbContainerName(ctx, projectRoot) {
95
+ if (ctx.type === 'standalone') return 'reactpress_cli_db';
96
+ return 'reactpress_db';
97
+ }
98
+
99
+ function resolveDbCredentialsFromEnv(projectRoot) {
100
+ const envPath = path.join(projectRoot, '.env');
101
+ let user = 'reactpress';
102
+ let password = 'reactpress';
103
+ try {
104
+ const content = fs.readFileSync(envPath, 'utf8');
105
+ const u = content.match(/^DB_USER=(.+)$/m);
106
+ const p = content.match(/^(DB_PASSWD|DB_PASSWORD)=(.+)$/m);
107
+ if (u) user = u[1].trim().replace(/^['"]|['"]$/g, '');
108
+ if (p) password = p[2].trim().replace(/^['"]|['"]$/g, '');
109
+ } catch {
110
+ // ignore
111
+ }
112
+ return { user, password };
113
+ }
114
+
115
+ async function waitForMysql(projectRoot, maxAttempts = 30) {
116
+ const ctx = resolveComposeContext(projectRoot);
117
+ const container = resolveDbContainerName(ctx, projectRoot);
118
+ const { user, password } = resolveDbCredentialsFromEnv(projectRoot);
119
+
120
+ const spinner = ora({
121
+ text: t('docker.waitingMysql'),
122
+ color: 'magenta',
123
+ spinner: 'dots',
124
+ }).start();
125
+
43
126
  let attempts = 0;
44
127
  while (attempts < maxAttempts) {
45
- try {
46
- execSync('docker exec reactpress_db mysql -u reactpress -preactpress -e "SELECT 1"', {
47
- stdio: 'ignore',
48
- });
49
- console.log(t('docker.mysqlReady'));
128
+ const probe = spawnSync(
129
+ 'docker',
130
+ ['exec', container, 'mysql', `-u${user}`, `-p${password}`, '-e', 'SELECT 1'],
131
+ { stdio: 'ignore' }
132
+ );
133
+ if (probe.status === 0) {
134
+ spinner.succeed(t('docker.mysqlReady'));
50
135
  return true;
51
- } catch {
52
- attempts += 1;
53
- if (attempts % 5 === 0) {
54
- console.log(t('docker.waitingMysqlProgress', { attempts, max: maxAttempts }));
55
- }
56
- await new Promise((r) => setTimeout(r, 1000));
57
136
  }
137
+ attempts += 1;
138
+ spinner.text = t('docker.waitingMysqlProgress', { attempts, max: maxAttempts });
139
+ await new Promise((r) => setTimeout(r, 1000));
58
140
  }
59
- console.error(t('docker.mysqlTimeout'));
141
+ spinner.fail(t('docker.mysqlTimeout'));
60
142
  return false;
61
143
  }
62
144
 
63
145
  async function dockerStartWithDev(projectRoot) {
64
146
  startDockerServices(projectRoot);
65
- const ready = await waitForMysql();
147
+ const ready = await waitForMysql(projectRoot);
66
148
  if (!ready) {
67
149
  throw new Error(t('docker.mysqlNotReady'));
68
150
  }
69
151
 
152
+ if (!hasClient(projectRoot)) {
153
+ console.log(t('dev.standaloneHint'));
154
+ return;
155
+ }
156
+
70
157
  const { buildToolkit } = require('./dev');
71
158
  await buildToolkit(projectRoot);
72
159
 
@@ -108,39 +195,67 @@ async function dockerStartWithDev(projectRoot) {
108
195
  });
109
196
  }
110
197
 
198
+ /**
199
+ * Run mysqldump inside the compose `db` container (MySQL image ships mysqldump).
200
+ * Used when the host has no `mysqldump` binary but Docker DB is running.
201
+ *
202
+ * @returns {{ ok: true, stdout: string } | { ok: false, stderr: string }}
203
+ */
204
+ function mysqldumpFromDbContainer(projectRoot, { user, password, database }) {
205
+ const ctx = resolveComposeContext(projectRoot);
206
+ if (!fs.existsSync(ctx.composeFile)) {
207
+ return { ok: false, stderr: 'compose file missing' };
208
+ }
209
+ if (!isDockerRunning()) {
210
+ return { ok: false, stderr: 'docker not running' };
211
+ }
212
+ const container = resolveDbContainerName(ctx, projectRoot);
213
+ const res = spawnSync(
214
+ 'docker',
215
+ ['exec', container, 'mysqldump', `-u${user}`, `-p${password}`, database],
216
+ { encoding: 'utf8', maxBuffer: 50 * 1024 * 1024 }
217
+ );
218
+ if (res.error) {
219
+ return { ok: false, stderr: res.error.message };
220
+ }
221
+ if (res.status !== 0) {
222
+ return { ok: false, stderr: res.stderr || res.stdout || `exit ${res.status}` };
223
+ }
224
+ return { ok: true, stdout: res.stdout };
225
+ }
226
+
111
227
  async function runDockerCommand(command, projectRoot = ensureOriginalCwd(), extraArgs = []) {
228
+ const ctx = resolveComposeContext(projectRoot);
112
229
  switch (command) {
113
230
  case 'up':
114
231
  startDockerServices(projectRoot);
115
- await waitForMysql();
232
+ await waitForMysql(projectRoot);
116
233
  return;
117
234
  case 'down':
235
+ case 'stop':
118
236
  stopDockerServices(projectRoot);
119
237
  return;
120
238
  case 'start':
121
239
  await dockerStartWithDev(projectRoot);
122
240
  return;
123
- case 'stop':
124
- stopDockerServices(projectRoot);
125
- return;
126
241
  case 'restart':
127
242
  stopDockerServices(projectRoot);
128
243
  await new Promise((r) => setTimeout(r, 2000));
129
244
  startDockerServices(projectRoot);
130
- await waitForMysql();
245
+ await waitForMysql(projectRoot);
131
246
  return;
132
- case 'status':
133
- execSync('docker-compose -f docker-compose.dev.yml ps', {
134
- stdio: 'inherit',
135
- cwd: projectRoot,
136
- });
247
+ case 'status': {
248
+ const res = runCompose(['ps'], ctx);
249
+ if (res.status !== 0) {
250
+ throw new Error(t('docker.unknownCommand', { command: 'ps' }));
251
+ }
137
252
  return;
253
+ }
138
254
  case 'logs': {
139
- const service = extraArgs[0] || '';
140
- execSync(`docker-compose -f docker-compose.dev.yml logs -f ${service}`.trim(), {
141
- stdio: 'inherit',
142
- cwd: projectRoot,
143
- });
255
+ const service = extraArgs[0];
256
+ const args = ['logs', '-f'];
257
+ if (service) args.push(service);
258
+ runCompose(args, ctx);
144
259
  return;
145
260
  }
146
261
  default:
@@ -154,4 +269,7 @@ module.exports = {
154
269
  stopDockerServices,
155
270
  waitForMysql,
156
271
  isDockerRunning,
272
+ resolveComposeContext,
273
+ pickDockerComposeCommand,
274
+ mysqldumpFromDbContainer,
157
275
  };
package/lib/doctor.js CHANGED
@@ -2,9 +2,21 @@ const fs = require('fs');
2
2
  const net = require('net');
3
3
  const path = require('path');
4
4
  const { execSync } = require('child_process');
5
- const chalk = require('chalk');
5
+ const ora = require('ora');
6
+ const {
7
+ brand,
8
+ icon,
9
+ ok,
10
+ warn,
11
+ divider,
12
+ sectionHeader,
13
+ terminalWidth,
14
+ gradientText,
15
+ palette,
16
+ } = require('../ui/theme');
6
17
  const { getHealthUrl, checkHealth } = require('./http');
7
18
  const { isDockerRunning } = require('./docker');
19
+ const { checkNginx } = require('./nginx');
8
20
  const { envFileStatus } = require('./status');
9
21
  const { t } = require('./i18n');
10
22
 
@@ -64,6 +76,16 @@ async function checkPorts(projectRoot) {
64
76
  const env = parseEnv(projectRoot);
65
77
  const apiPort = parseInt(env.SERVER_PORT || '3002', 10);
66
78
  const clientPort = parseInt(env.CLIENT_PORT || '3001', 10);
79
+
80
+ const healthUrl = getHealthUrl(projectRoot);
81
+ const apiHealth = await checkHealth(healthUrl);
82
+ if (apiHealth.ok) {
83
+ return {
84
+ ok: true,
85
+ message: t('doctor.portOk', { apiPort, clientPort }),
86
+ };
87
+ }
88
+
67
89
  const [apiBusy, clientBusy] = await Promise.all([checkPort(apiPort), checkPort(clientPort)]);
68
90
  const issues = [];
69
91
  if (apiBusy) issues.push(t('doctor.portApiBusy', { port: apiPort }));
@@ -152,6 +174,21 @@ function checkPnpm() {
152
174
  }
153
175
  }
154
176
 
177
+ async function runCheckWithSpinner(name, run) {
178
+ const spinner = ora({
179
+ text: t('doctor.checking', { name }),
180
+ color: 'magenta',
181
+ spinner: 'dots',
182
+ }).start();
183
+ const result = await run();
184
+ if (result.ok) {
185
+ spinner.stop();
186
+ } else {
187
+ spinner.stop();
188
+ }
189
+ return result;
190
+ }
191
+
155
192
  async function runDoctor(projectRoot) {
156
193
  const env = envFileStatus(projectRoot);
157
194
  const checks = [
@@ -174,34 +211,53 @@ async function runDoctor(projectRoot) {
174
211
  }),
175
212
  },
176
213
  { name: 'Docker', run: () => checkDocker() },
214
+ { name: t('doctor.check.nginx'), run: () => checkNginx(projectRoot) },
177
215
  { name: t('doctor.check.ports'), run: () => checkPorts(projectRoot) },
178
216
  { name: t('doctor.check.database'), run: () => checkDatabase(projectRoot) },
179
217
  { name: t('doctor.check.api'), run: () => checkApiHealth(projectRoot) },
180
218
  ];
181
219
 
220
+ const w = Math.min(terminalWidth() - 4, 52);
221
+ const results = [];
222
+ const fixes = [];
223
+
182
224
  console.log('');
183
- console.log(chalk.bold.cyan(' ReactPress Doctor'));
184
- console.log(chalk.gray(t('doctor.project', { path: projectRoot })));
185
- console.log(chalk.gray(' ─────────────────────────────────────'));
225
+ console.log(
226
+ ` ${gradientText(t('doctor.title'), [palette.primary, palette.accent], { bold: true })} ${brand.dim(t('doctor.subtitle'))}`
227
+ );
228
+ console.log(` ${brand.dim(t('doctor.project', { path: projectRoot }))}`);
229
+ console.log(` ${divider(w)}`);
186
230
 
187
- let failed = 0;
188
231
  for (const { name, run } of checks) {
189
- const result = await run();
190
- const icon = result.ok ? chalk.green('✓') : chalk.red('✗');
191
- console.log(` ${icon} ${chalk.bold(name)} ${result.message}`);
232
+ const result = await runCheckWithSpinner(name, run);
233
+ results.push({ name, ...result });
234
+ const mark = result.ok ? icon.ok : icon.fail;
235
+ const msgColor = result.ok ? brand.dim : brand.warn;
236
+ console.log(` ${mark} ${brand.bold(name)} ${msgColor(result.message)}`);
192
237
  if (!result.ok && result.fix) {
193
- console.log(chalk.yellow(` → ${result.fix}`));
194
- failed += 1;
195
- } else if (!result.ok) {
196
- failed += 1;
238
+ fixes.push({ name, fix: result.fix });
197
239
  }
198
240
  }
199
241
 
200
- console.log(chalk.gray(' ─────────────────────────────────────'));
242
+ const passed = results.filter((r) => r.ok).length;
243
+ const failed = results.length - passed;
244
+
245
+ console.log(` ${divider(w)}`);
246
+ console.log(
247
+ ` ${brand.dim(t('doctor.summary', { passed, failed, total: results.length }))}`
248
+ );
249
+
201
250
  if (failed === 0) {
202
- console.log(chalk.green(t('doctor.allPass')));
251
+ console.log(` ${ok(t('doctor.allPass'))}`);
203
252
  } else {
204
- console.log(chalk.yellow(t('doctor.failed', { count: failed })));
253
+ console.log(` ${warn(t('doctor.failed', { count: failed }))}`);
254
+ if (fixes.length) {
255
+ console.log('');
256
+ console.log(sectionHeader(t('doctor.fixesHeader')));
257
+ for (const { name, fix } of fixes) {
258
+ console.log(` ${brand.primary('→')} ${brand.dim(name)} ${brand.warn(fix)}`);
259
+ }
260
+ }
205
261
  }
206
262
  console.log('');
207
263
  return failed === 0 ? 0 : 1;
package/lib/http.js CHANGED
@@ -50,13 +50,13 @@ function getHealthUrl(projectRoot) {
50
50
  return `${base}${prefix}/health`;
51
51
  }
52
52
 
53
- function checkHealth(url, timeoutMs = 3000) {
53
+ function probeHttp(url, timeoutMs = 3000) {
54
54
  return new Promise((resolve) => {
55
55
  let parsed;
56
56
  try {
57
57
  parsed = new URL(url);
58
58
  } catch {
59
- resolve({ ok: false });
59
+ resolve({ ok: false, statusCode: 0, data: null });
60
60
  return;
61
61
  }
62
62
  const port = parsed.port || (parsed.protocol === 'https:' ? 443 : 80);
@@ -87,13 +87,48 @@ function checkHealth(url, timeoutMs = 3000) {
87
87
  );
88
88
  req.on('timeout', () => {
89
89
  req.destroy();
90
- resolve({ ok: false });
90
+ resolve({ ok: false, statusCode: 0, data: null });
91
91
  });
92
- req.on('error', () => resolve({ ok: false }));
92
+ req.on('error', () => resolve({ ok: false, statusCode: 0, data: null }));
93
93
  req.end();
94
94
  });
95
95
  }
96
96
 
97
+ /**
98
+ * Health probe: prefers `/api/health` JSON; falls back to API prefix (e.g. Swagger)
99
+ * for older bundled servers that omit the health route.
100
+ */
101
+ async function checkHealth(url, timeoutMs = 3000) {
102
+ const primary = await probeHttp(url, timeoutMs);
103
+ if (primary.ok) return primary;
104
+
105
+ if (primary.statusCode === 404 || primary.statusCode === 0) {
106
+ try {
107
+ const parsed = new URL(url);
108
+ const prefix = parsed.pathname.replace(/\/health\/?$/, '') || '/api';
109
+ const candidates = [
110
+ `${parsed.origin}${prefix}/`,
111
+ `${parsed.origin}${prefix}`,
112
+ parsed.origin,
113
+ ];
114
+ for (const fallback of candidates) {
115
+ const alt = await probeHttp(fallback, timeoutMs);
116
+ if (alt.statusCode === 200) {
117
+ return {
118
+ ok: true,
119
+ statusCode: 200,
120
+ data: { status: 'ok', database: 'unknown' },
121
+ };
122
+ }
123
+ }
124
+ } catch {
125
+ // ignore
126
+ }
127
+ }
128
+
129
+ return primary;
130
+ }
131
+
97
132
  function isHttpResponding(url, timeoutMs = 2000) {
98
133
  return new Promise((resolve) => {
99
134
  let parsed;