@cedarjs/cli 0.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 (360) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +706 -0
  3. package/dist/commands/build.js +54 -0
  4. package/dist/commands/buildHandler.js +134 -0
  5. package/dist/commands/check.js +28 -0
  6. package/dist/commands/console.js +13 -0
  7. package/dist/commands/consoleHandler.js +68 -0
  8. package/dist/commands/deploy/baremetal/SshExecutor.js +41 -0
  9. package/dist/commands/deploy/baremetal/baremetalHandler.js +558 -0
  10. package/dist/commands/deploy/baremetal.js +89 -0
  11. package/dist/commands/deploy/flightcontrol.js +40 -0
  12. package/dist/commands/deploy/flightcontrolHandler.js +58 -0
  13. package/dist/commands/deploy/helpers/deployBuilder.js +25 -0
  14. package/dist/commands/deploy/helpers/deployHandler.js +31 -0
  15. package/dist/commands/deploy/netlify.js +21 -0
  16. package/dist/commands/deploy/packing/nft.js +61 -0
  17. package/dist/commands/deploy/render.js +37 -0
  18. package/dist/commands/deploy/renderHandler.js +70 -0
  19. package/dist/commands/deploy/serverless.js +51 -0
  20. package/dist/commands/deploy/serverlessHandler.js +211 -0
  21. package/dist/commands/deploy/vercel.js +21 -0
  22. package/dist/commands/deploy.js +21 -0
  23. package/dist/commands/destroy/cell/cell.js +12 -0
  24. package/dist/commands/destroy/cell/cellHandler.js +10 -0
  25. package/dist/commands/destroy/component/component.js +15 -0
  26. package/dist/commands/destroy/component/componentHandler.js +10 -0
  27. package/dist/commands/destroy/directive/directive.js +14 -0
  28. package/dist/commands/destroy/directive/directiveHandler.js +12 -0
  29. package/dist/commands/destroy/function/function.js +20 -0
  30. package/dist/commands/destroy/function/functionHandler.js +10 -0
  31. package/dist/commands/destroy/handlerHelpers.js +34 -0
  32. package/dist/commands/destroy/helpers.js +22 -0
  33. package/dist/commands/destroy/layout/layout.js +12 -0
  34. package/dist/commands/destroy/layout/layoutHandler.js +10 -0
  35. package/dist/commands/destroy/page/page.js +20 -0
  36. package/dist/commands/destroy/page/pageHandler.js +51 -0
  37. package/dist/commands/destroy/scaffold/scaffold.js +16 -0
  38. package/dist/commands/destroy/scaffold/scaffoldHandler.js +105 -0
  39. package/dist/commands/destroy/sdl/sdl.js +16 -0
  40. package/dist/commands/destroy/sdl/sdlHandler.js +33 -0
  41. package/dist/commands/destroy/service/service.js +10 -0
  42. package/dist/commands/destroy/service/serviceHandler.js +17 -0
  43. package/dist/commands/destroy.js +25 -0
  44. package/dist/commands/dev.js +47 -0
  45. package/dist/commands/devHandler.js +202 -0
  46. package/dist/commands/exec.js +38 -0
  47. package/dist/commands/execHandler.js +180 -0
  48. package/dist/commands/experimental/setupInngest.js +28 -0
  49. package/dist/commands/experimental/setupInngestHandler.js +46 -0
  50. package/dist/commands/experimental/setupOpentelemetry.js +34 -0
  51. package/dist/commands/experimental/setupOpentelemetryHandler.js +215 -0
  52. package/dist/commands/experimental/setupReactCompiler.js +28 -0
  53. package/dist/commands/experimental/setupReactCompilerHandler.js +124 -0
  54. package/dist/commands/experimental/setupRsc.js +28 -0
  55. package/dist/commands/experimental/setupRscHandler.js +408 -0
  56. package/dist/commands/experimental/setupStreamingSsr.js +28 -0
  57. package/dist/commands/experimental/setupStreamingSsrHandler.js +208 -0
  58. package/dist/commands/experimental/templates/opentelemetry.ts.template +55 -0
  59. package/dist/commands/experimental/templates/rsc/AboutCounter.tsx.template +20 -0
  60. package/dist/commands/experimental/templates/rsc/AboutPage.css.template +2 -0
  61. package/dist/commands/experimental/templates/rsc/AboutPage.tsx.template +17 -0
  62. package/dist/commands/experimental/templates/rsc/Counter.css.template +7 -0
  63. package/dist/commands/experimental/templates/rsc/Counter.module.css.template +3 -0
  64. package/dist/commands/experimental/templates/rsc/Counter.tsx.template +18 -0
  65. package/dist/commands/experimental/templates/rsc/Document.tsx.template +27 -0
  66. package/dist/commands/experimental/templates/rsc/HomePage.css.template +2 -0
  67. package/dist/commands/experimental/templates/rsc/HomePage.module.css.template +3 -0
  68. package/dist/commands/experimental/templates/rsc/HomePage.tsx.template +19 -0
  69. package/dist/commands/experimental/templates/rsc/NavigationLayout.css.template +32 -0
  70. package/dist/commands/experimental/templates/rsc/NavigationLayout.tsx.template +31 -0
  71. package/dist/commands/experimental/templates/rsc/Routes.tsx.template +29 -0
  72. package/dist/commands/experimental/templates/rsc/entry.client.tsx.template +35 -0
  73. package/dist/commands/experimental/templates/rsc/entry.server.tsx.template +20 -0
  74. package/dist/commands/experimental/templates/rsc/index.css.template +4 -0
  75. package/dist/commands/experimental/templates/streamingSsr/Document.tsx.template +27 -0
  76. package/dist/commands/experimental/templates/streamingSsr/entry.client.tsx.template +40 -0
  77. package/dist/commands/experimental/templates/streamingSsr/entry.server.tsx.template +20 -0
  78. package/dist/commands/experimental/templates/streamingSsr/tsconfig.json.template +54 -0
  79. package/dist/commands/experimental/util.js +69 -0
  80. package/dist/commands/experimental.js +22 -0
  81. package/dist/commands/generate/cell/cell.js +35 -0
  82. package/dist/commands/generate/cell/cellHandler.js +153 -0
  83. package/dist/commands/generate/cell/templates/cell.tsx.template +34 -0
  84. package/dist/commands/generate/cell/templates/cellList.tsx.template +40 -0
  85. package/dist/commands/generate/cell/templates/mock.ts.template +7 -0
  86. package/dist/commands/generate/cell/templates/mockList.ts.template +14 -0
  87. package/dist/commands/generate/cell/templates/stories.tsx.template +35 -0
  88. package/dist/commands/generate/cell/templates/test.js.template +42 -0
  89. package/dist/commands/generate/cell/utils/utils.js +43 -0
  90. package/dist/commands/generate/component/component.js +15 -0
  91. package/dist/commands/generate/component/componentHandler.js +55 -0
  92. package/dist/commands/generate/component/templates/component.tsx.template +10 -0
  93. package/dist/commands/generate/component/templates/stories.jsx.template +17 -0
  94. package/dist/commands/generate/component/templates/stories.tsx.template +26 -0
  95. package/dist/commands/generate/component/templates/test.tsx.template +14 -0
  96. package/dist/commands/generate/dataMigration/dataMigration.js +105 -0
  97. package/dist/commands/generate/dataMigration/templates/dataMigration.js.template +7 -0
  98. package/dist/commands/generate/dataMigration/templates/dataMigration.ts.template +5 -0
  99. package/dist/commands/generate/dbAuth/dbAuth.js +55 -0
  100. package/dist/commands/generate/dbAuth/dbAuthHandler.js +375 -0
  101. package/dist/commands/generate/dbAuth/templates/forgotPassword.tsx.template +94 -0
  102. package/dist/commands/generate/dbAuth/templates/login.tsx.template +130 -0
  103. package/dist/commands/generate/dbAuth/templates/login.webAuthn.tsx.template +264 -0
  104. package/dist/commands/generate/dbAuth/templates/resetPassword.tsx.template +121 -0
  105. package/dist/commands/generate/dbAuth/templates/signup.tsx.template +123 -0
  106. package/dist/commands/generate/directive/directive.js +15 -0
  107. package/dist/commands/generate/directive/directiveHandler.js +159 -0
  108. package/dist/commands/generate/directive/templates/transformer.directive.test.ts.template +18 -0
  109. package/dist/commands/generate/directive/templates/transformer.directive.ts.template +38 -0
  110. package/dist/commands/generate/directive/templates/validator.directive.test.ts.template +17 -0
  111. package/dist/commands/generate/directive/templates/validator.directive.ts.template +39 -0
  112. package/dist/commands/generate/function/function.js +29 -0
  113. package/dist/commands/generate/function/functionHandler.js +131 -0
  114. package/dist/commands/generate/function/templates/function.ts.template +33 -0
  115. package/dist/commands/generate/function/templates/scenarios.ts.template +8 -0
  116. package/dist/commands/generate/function/templates/test.ts.template +30 -0
  117. package/dist/commands/generate/helpers.js +71 -0
  118. package/dist/commands/generate/job/job.js +39 -0
  119. package/dist/commands/generate/job/jobHandler.js +138 -0
  120. package/dist/commands/generate/job/templates/job.ts.template +8 -0
  121. package/dist/commands/generate/job/templates/scenarios.ts.template +8 -0
  122. package/dist/commands/generate/job/templates/test.ts.template +7 -0
  123. package/dist/commands/generate/layout/layout.js +25 -0
  124. package/dist/commands/generate/layout/layoutHandler.js +59 -0
  125. package/dist/commands/generate/layout/templates/layout.tsx.a11y.template +27 -0
  126. package/dist/commands/generate/layout/templates/layout.tsx.template +9 -0
  127. package/dist/commands/generate/layout/templates/stories.tsx.template +13 -0
  128. package/dist/commands/generate/layout/templates/test.tsx.template +14 -0
  129. package/dist/commands/generate/model/model.js +29 -0
  130. package/dist/commands/generate/model/modelHandler.js +63 -0
  131. package/dist/commands/generate/model/templates/model.js.template +3 -0
  132. package/dist/commands/generate/ogImage/ogImage.js +43 -0
  133. package/dist/commands/generate/ogImage/ogImageHandler.js +111 -0
  134. package/dist/commands/generate/ogImage/templates/ogImage.og.tsx.template +13 -0
  135. package/dist/commands/generate/page/page.js +22 -0
  136. package/dist/commands/generate/page/pageHandler.js +227 -0
  137. package/dist/commands/generate/page/templates/page.tsx.template +35 -0
  138. package/dist/commands/generate/page/templates/stories.tsx.parameters.template +13 -0
  139. package/dist/commands/generate/page/templates/stories.tsx.template +13 -0
  140. package/dist/commands/generate/page/templates/test.tsx.template +14 -0
  141. package/dist/commands/generate/realtime/realtime.js +41 -0
  142. package/dist/commands/generate/realtime/realtimeHandler.js +215 -0
  143. package/dist/commands/generate/realtime/templates/liveQueries/blank/blank.sdl.ts.template +27 -0
  144. package/dist/commands/generate/realtime/templates/liveQueries/blank/blank.service.ts.template +73 -0
  145. package/dist/commands/generate/realtime/templates/realtime.ts.template +42 -0
  146. package/dist/commands/generate/realtime/templates/subscriptions/blank/blank.sdl.ts.template +20 -0
  147. package/dist/commands/generate/realtime/templates/subscriptions/blank/blank.service.ts.template +19 -0
  148. package/dist/commands/generate/realtime/templates/subscriptions/blank/blank.ts.template +58 -0
  149. package/dist/commands/generate/scaffold/scaffold.js +38 -0
  150. package/dist/commands/generate/scaffold/scaffoldHandler.js +663 -0
  151. package/dist/commands/generate/scaffold/templates/assets/scaffold.css.template +398 -0
  152. package/dist/commands/generate/scaffold/templates/assets/scaffold.tailwind.css.template +243 -0
  153. package/dist/commands/generate/scaffold/templates/components/EditNameCell.tsx.template +74 -0
  154. package/dist/commands/generate/scaffold/templates/components/Name.tsx.template +79 -0
  155. package/dist/commands/generate/scaffold/templates/components/NameCell.tsx.template +32 -0
  156. package/dist/commands/generate/scaffold/templates/components/NameForm.tsx.template +123 -0
  157. package/dist/commands/generate/scaffold/templates/components/Names.tsx.template +88 -0
  158. package/dist/commands/generate/scaffold/templates/components/NamesCell.tsx.template +45 -0
  159. package/dist/commands/generate/scaffold/templates/components/NewName.tsx.template +55 -0
  160. package/dist/commands/generate/scaffold/templates/layouts/ScaffoldLayout.tsx.template +37 -0
  161. package/dist/commands/generate/scaffold/templates/lib/formatters.test.tsx.template +192 -0
  162. package/dist/commands/generate/scaffold/templates/lib/formatters.tsx.template +58 -0
  163. package/dist/commands/generate/scaffold/templates/pages/EditNamePage.tsx.template +11 -0
  164. package/dist/commands/generate/scaffold/templates/pages/NamePage.tsx.template +11 -0
  165. package/dist/commands/generate/scaffold/templates/pages/NamesPage.tsx.template +7 -0
  166. package/dist/commands/generate/scaffold/templates/pages/NewNamePage.tsx.template +7 -0
  167. package/dist/commands/generate/script/script.js +29 -0
  168. package/dist/commands/generate/script/scriptHandler.js +85 -0
  169. package/dist/commands/generate/script/templates/script.ts.template +15 -0
  170. package/dist/commands/generate/script/templates/tsconfig.json.template +33 -0
  171. package/dist/commands/generate/sdl/sdl.js +48 -0
  172. package/dist/commands/generate/sdl/sdlHandler.js +282 -0
  173. package/dist/commands/generate/sdl/templates/sdl.js.template +70 -0
  174. package/dist/commands/generate/sdl/templates/sdl.ts.template +70 -0
  175. package/dist/commands/generate/secret/secret.js +52 -0
  176. package/dist/commands/generate/service/service.js +50 -0
  177. package/dist/commands/generate/service/serviceHandler.js +301 -0
  178. package/dist/commands/generate/service/templates/scenarios.ts.template +7 -0
  179. package/dist/commands/generate/service/templates/service.ts.template +38 -0
  180. package/dist/commands/generate/service/templates/test.ts.template +84 -0
  181. package/dist/commands/generate/yargsCommandHelpers.js +77 -0
  182. package/dist/commands/generate/yargsHandlerHelpers.js +155 -0
  183. package/dist/commands/generate.js +44 -0
  184. package/dist/commands/info.js +36 -0
  185. package/dist/commands/jobs.js +17 -0
  186. package/dist/commands/jobsHandler.js +30 -0
  187. package/dist/commands/lint.js +57 -0
  188. package/dist/commands/prerender.js +34 -0
  189. package/dist/commands/prerenderHandler.js +282 -0
  190. package/dist/commands/prisma.js +17 -0
  191. package/dist/commands/prismaHandler.js +90 -0
  192. package/dist/commands/record/init.js +11 -0
  193. package/dist/commands/record.js +19 -0
  194. package/dist/commands/serve.js +139 -0
  195. package/dist/commands/serveApiHandler.js +15 -0
  196. package/dist/commands/serveBothHandler.js +95 -0
  197. package/dist/commands/serveWebHandler.js +17 -0
  198. package/dist/commands/setup/auth/auth.js +265 -0
  199. package/dist/commands/setup/cache/cache.js +37 -0
  200. package/dist/commands/setup/cache/cacheHandler.js +69 -0
  201. package/dist/commands/setup/cache/templates/memcached.ts.template +30 -0
  202. package/dist/commands/setup/cache/templates/redis.ts.template +24 -0
  203. package/dist/commands/setup/deploy/deploy.js +26 -0
  204. package/dist/commands/setup/deploy/helpers/helpers.js +9 -0
  205. package/dist/commands/setup/deploy/helpers/index.js +110 -0
  206. package/dist/commands/setup/deploy/providers/baremetal.js +9 -0
  207. package/dist/commands/setup/deploy/providers/baremetalHandler.js +64 -0
  208. package/dist/commands/setup/deploy/providers/coherence.js +24 -0
  209. package/dist/commands/setup/deploy/providers/coherenceHandler.js +203 -0
  210. package/dist/commands/setup/deploy/providers/flightcontrol.js +19 -0
  211. package/dist/commands/setup/deploy/providers/flightcontrolHandler.js +294 -0
  212. package/dist/commands/setup/deploy/providers/netlify.js +9 -0
  213. package/dist/commands/setup/deploy/providers/netlifyHandler.js +42 -0
  214. package/dist/commands/setup/deploy/providers/render.js +17 -0
  215. package/dist/commands/setup/deploy/providers/renderHandler.js +111 -0
  216. package/dist/commands/setup/deploy/providers/serverless.js +11 -0
  217. package/dist/commands/setup/deploy/providers/serverlessHandler.js +141 -0
  218. package/dist/commands/setup/deploy/providers/vercel.js +9 -0
  219. package/dist/commands/setup/deploy/providers/vercelHandler.js +56 -0
  220. package/dist/commands/setup/deploy/templates/baremetal.js +128 -0
  221. package/dist/commands/setup/deploy/templates/flightcontrol.js +85 -0
  222. package/dist/commands/setup/deploy/templates/netlify.js +32 -0
  223. package/dist/commands/setup/deploy/templates/render.js +72 -0
  224. package/dist/commands/setup/deploy/templates/serverless/api.js +78 -0
  225. package/dist/commands/setup/deploy/templates/serverless/web.js +32 -0
  226. package/dist/commands/setup/docker/docker.js +26 -0
  227. package/dist/commands/setup/docker/dockerHandler.js +265 -0
  228. package/dist/commands/setup/docker/templates/Dockerfile +154 -0
  229. package/dist/commands/setup/docker/templates/docker-compose.dev.yml +58 -0
  230. package/dist/commands/setup/docker/templates/docker-compose.prod.yml +63 -0
  231. package/dist/commands/setup/docker/templates/dockerignore +18 -0
  232. package/dist/commands/setup/generator/generator.js +49 -0
  233. package/dist/commands/setup/generator/generatorHandler.js +55 -0
  234. package/dist/commands/setup/graphql/features/fragments/appGqlConfigTransform.js +117 -0
  235. package/dist/commands/setup/graphql/features/fragments/appImportTransform.js +20 -0
  236. package/dist/commands/setup/graphql/features/fragments/fragments.js +25 -0
  237. package/dist/commands/setup/graphql/features/fragments/fragmentsHandler.js +89 -0
  238. package/dist/commands/setup/graphql/features/trustedDocuments/graphqlTransform.js +51 -0
  239. package/dist/commands/setup/graphql/features/trustedDocuments/trustedDocuments.js +25 -0
  240. package/dist/commands/setup/graphql/features/trustedDocuments/trustedDocumentsHandler.js +74 -0
  241. package/dist/commands/setup/graphql/graphql.js +18 -0
  242. package/dist/commands/setup/i18n/i18n.js +25 -0
  243. package/dist/commands/setup/i18n/i18nHandler.js +169 -0
  244. package/dist/commands/setup/i18n/templates/en.json.template +11 -0
  245. package/dist/commands/setup/i18n/templates/fr.json.template +11 -0
  246. package/dist/commands/setup/i18n/templates/i18n.js.template +52 -0
  247. package/dist/commands/setup/i18n/templates/storybook.preview.tsx.template +43 -0
  248. package/dist/commands/setup/jobs/jobs.js +31 -0
  249. package/dist/commands/setup/jobs/jobsHandler.js +122 -0
  250. package/dist/commands/setup/jobs/templates/jobs.ts.template +32 -0
  251. package/dist/commands/setup/mailer/mailer.js +30 -0
  252. package/dist/commands/setup/mailer/mailerHandler.js +106 -0
  253. package/dist/commands/setup/mailer/templates/mailer.ts.template +30 -0
  254. package/dist/commands/setup/mailer/templates/re-example.tsx.template +40 -0
  255. package/dist/commands/setup/middleware/middleware.js +17 -0
  256. package/dist/commands/setup/middleware/ogImage/__codemod_tests__/middleware.js +15 -0
  257. package/dist/commands/setup/middleware/ogImage/__codemod_tests__/vitePlugin.js +6 -0
  258. package/dist/commands/setup/middleware/ogImage/codemodMiddleware.js +97 -0
  259. package/dist/commands/setup/middleware/ogImage/codemodVitePlugin.js +65 -0
  260. package/dist/commands/setup/middleware/ogImage/ogImage.js +27 -0
  261. package/dist/commands/setup/middleware/ogImage/ogImageHandler.js +121 -0
  262. package/dist/commands/setup/monitoring/monitoring.js +17 -0
  263. package/dist/commands/setup/monitoring/sentry/sentry.js +25 -0
  264. package/dist/commands/setup/monitoring/sentry/sentryHandler.js +163 -0
  265. package/dist/commands/setup/monitoring/sentry/templates/sentryApi.ts.template +15 -0
  266. package/dist/commands/setup/monitoring/sentry/templates/sentryWeb.ts.template +31 -0
  267. package/dist/commands/setup/package/package.js +33 -0
  268. package/dist/commands/setup/package/packageHandler.js +134 -0
  269. package/dist/commands/setup/realtime/realtime.js +37 -0
  270. package/dist/commands/setup/realtime/realtimeHandler.js +309 -0
  271. package/dist/commands/setup/realtime/templates/defer/fastAndSlowFields/fastAndSlowFields.sdl.template +14 -0
  272. package/dist/commands/setup/realtime/templates/defer/fastAndSlowFields/fastAndSlowFields.ts.template +14 -0
  273. package/dist/commands/setup/realtime/templates/liveQueries/auctions/auctions.sdl.ts.template +27 -0
  274. package/dist/commands/setup/realtime/templates/liveQueries/auctions/auctions.ts.template +73 -0
  275. package/dist/commands/setup/realtime/templates/realtime.ts.template +46 -0
  276. package/dist/commands/setup/realtime/templates/stream/alphabet/alphabet.sdl.template +9 -0
  277. package/dist/commands/setup/realtime/templates/stream/alphabet/alphabet.ts.template +31 -0
  278. package/dist/commands/setup/realtime/templates/subscriptions/countdown/countdown.ts.template +58 -0
  279. package/dist/commands/setup/realtime/templates/subscriptions/newMessage/newMessage.ts.template +57 -0
  280. package/dist/commands/setup/realtime/templates/subscriptions/newMessage/rooms.sdl.ts.template +20 -0
  281. package/dist/commands/setup/realtime/templates/subscriptions/newMessage/rooms.ts.template +20 -0
  282. package/dist/commands/setup/server-file/serverFile.js +31 -0
  283. package/dist/commands/setup/server-file/serverFileHandler.js +56 -0
  284. package/dist/commands/setup/server-file/templates/server.ts.template +13 -0
  285. package/dist/commands/setup/tsconfig/tsconfig.js +25 -0
  286. package/dist/commands/setup/tsconfig/tsconfigHandler.js +59 -0
  287. package/dist/commands/setup/ui/helpers/helpers.js +9 -0
  288. package/dist/commands/setup/ui/libraries/chakra-ui.js +24 -0
  289. package/dist/commands/setup/ui/libraries/chakra-uiHandler.js +98 -0
  290. package/dist/commands/setup/ui/libraries/mantine.js +32 -0
  291. package/dist/commands/setup/ui/libraries/mantineHandler.js +138 -0
  292. package/dist/commands/setup/ui/libraries/tailwindcss.js +26 -0
  293. package/dist/commands/setup/ui/libraries/tailwindcssHandler.js +386 -0
  294. package/dist/commands/setup/ui/templates/chakra.storybook.preview.tsx.template +20 -0
  295. package/dist/commands/setup/ui/templates/mantine-postcss.config.js.template +35 -0
  296. package/dist/commands/setup/ui/templates/mantine.storybook.preview.tsx.template +18 -0
  297. package/dist/commands/setup/ui/templates/postcss.config.js.template +9 -0
  298. package/dist/commands/setup/ui/ui.js +17 -0
  299. package/dist/commands/setup/uploads/dbCodemod.js +28 -0
  300. package/dist/commands/setup/uploads/templates/signedUrl.ts.template +21 -0
  301. package/dist/commands/setup/uploads/templates/srcLibUploads.ts.template +25 -0
  302. package/dist/commands/setup/uploads/uploads.js +26 -0
  303. package/dist/commands/setup/uploads/uploadsHandler.js +147 -0
  304. package/dist/commands/setup/vite/templates/vite.config.ts.template +19 -0
  305. package/dist/commands/setup/vite/vite.js +38 -0
  306. package/dist/commands/setup/vite/viteHandler.js +83 -0
  307. package/dist/commands/setup.js +33 -0
  308. package/dist/commands/studio.js +23 -0
  309. package/dist/commands/studioHandler.js +61 -0
  310. package/dist/commands/test.js +44 -0
  311. package/dist/commands/testHandler.js +138 -0
  312. package/dist/commands/ts-to-js.js +20 -0
  313. package/dist/commands/type-check.js +41 -0
  314. package/dist/commands/type-checkHandler.js +71 -0
  315. package/dist/commands/upgrade.js +441 -0
  316. package/dist/index.d.js +0 -0
  317. package/dist/index.js +146 -0
  318. package/dist/lib/background.js +45 -0
  319. package/dist/lib/colors.js +18 -0
  320. package/dist/lib/configureStorybook.js +50 -0
  321. package/dist/lib/exec.js +85 -0
  322. package/dist/lib/exit.js +44 -0
  323. package/dist/lib/extendFile.js +114 -0
  324. package/dist/lib/generatePrismaClient.js +60 -0
  325. package/dist/lib/index.js +485 -0
  326. package/dist/lib/loadEnvFiles.js +12 -0
  327. package/dist/lib/locking.js +60 -0
  328. package/dist/lib/merge/algorithms.js +30 -0
  329. package/dist/lib/merge/index.js +163 -0
  330. package/dist/lib/merge/semanticIdentity.js +18 -0
  331. package/dist/lib/merge/strategy.js +136 -0
  332. package/dist/lib/mockTelemetry.js +7 -0
  333. package/dist/lib/packages.js +77 -0
  334. package/dist/lib/plugin.js +206 -0
  335. package/dist/lib/pluralHelpers.js +50 -0
  336. package/dist/lib/ports.js +17 -0
  337. package/dist/lib/project.js +30 -0
  338. package/dist/lib/rollback.js +72 -0
  339. package/dist/lib/runTransform.js +66 -0
  340. package/dist/lib/rwPluralize.js +56 -0
  341. package/dist/lib/schemaHelpers.js +95 -0
  342. package/dist/lib/templates/storybook.preview.tsx.template +19 -0
  343. package/dist/lib/test.js +106 -0
  344. package/dist/lib/updateCheck.js +202 -0
  345. package/dist/lib/updateCheckExecute.js +2 -0
  346. package/dist/middleware/checkNodeVersion.js +23 -0
  347. package/dist/middleware/detectProjectRxVersion.js +12 -0
  348. package/dist/plugin.js +223 -0
  349. package/dist/rwfw.js +47 -0
  350. package/dist/telemetry/exporter.js +63 -0
  351. package/dist/telemetry/index.js +84 -0
  352. package/dist/telemetry/resource.js +98 -0
  353. package/dist/telemetry/send.js +80 -0
  354. package/dist/testLib/cells.js +188 -0
  355. package/dist/testLib/fetchFileFromTemplate.js +9 -0
  356. package/dist/testLib/getFilesWithPattern.js +21 -0
  357. package/dist/testLib/getRootPackageJSON.js +14 -0
  358. package/dist/testLib/isTSProject.js +9 -0
  359. package/dist/testLib/runTransform.js +42 -0
  360. package/package.json +102 -0
@@ -0,0 +1,663 @@
1
+ import path from "path";
2
+ import camelcase from "camelcase";
3
+ import { paramCase } from "change-case";
4
+ import execa from "execa";
5
+ import fs from "fs-extra";
6
+ import humanize from "humanize-string";
7
+ import { Listr } from "listr2";
8
+ import pascalcase from "pascalcase";
9
+ import { recordTelemetryAttributes } from "@cedarjs/cli-helpers";
10
+ import { generate as generateTypes } from "@cedarjs/internal/dist/generate/generate";
11
+ import { getConfig } from "@cedarjs/project-config";
12
+ import c from "../../../lib/colors.js";
13
+ import {
14
+ generateTemplate,
15
+ readFile,
16
+ writeFile,
17
+ getDefaultArgs,
18
+ getPaths,
19
+ writeFilesTask,
20
+ addRoutesToRouterTask,
21
+ addScaffoldImport,
22
+ transformTSToJS,
23
+ nameVariants
24
+ } from "../../../lib/index.js";
25
+ import {
26
+ prepareForRollback,
27
+ addFunctionToRollback
28
+ } from "../../../lib/rollback.js";
29
+ import { pluralize, singularize } from "../../../lib/rwPluralize.js";
30
+ import { getSchema, verifyModelName } from "../../../lib/schemaHelpers.js";
31
+ import {
32
+ relationsForModel,
33
+ intForeignKeysForModel,
34
+ mapPrismaScalarToPagePropTsType
35
+ } from "../helpers.js";
36
+ import { builder as sdlBuilder } from "../sdl/sdl.js";
37
+ import { files as sdlFiles } from "../sdl/sdlHandler.js";
38
+ import { builder as serviceBuilder } from "../service/service.js";
39
+ import { files as serviceFiles } from "../service/serviceHandler.js";
40
+ import { customOrDefaultTemplatePath } from "../yargsHandlerHelpers.js";
41
+ const SKIPPABLE_ASSETS = ["scaffold.css"];
42
+ const PACKAGE_SET = "Set";
43
+ const getIdType = (model) => {
44
+ return model.fields.find((field) => field.isId)?.type;
45
+ };
46
+ const getIdName = (model) => {
47
+ return model.fields.find((field) => field.isId)?.name;
48
+ };
49
+ const isAutoGeneratedColumnForScaffold = (column) => {
50
+ const autoGeneratedFunctions = ["now", "autoincrement"];
51
+ const columnDefaultFunction = typeof column.default === "object" && "name" in column.default ? column.default?.name : "";
52
+ return column.isId || column.isUpdatedAt || column.name === "createdAt" || autoGeneratedFunctions.includes(columnDefaultFunction);
53
+ };
54
+ const getImportComponentNames = (name, scaffoldPath, nestScaffoldByModel = true) => {
55
+ const pluralName = pascalcase(pluralize(name));
56
+ const singularName = pascalcase(singularize(name));
57
+ let componentPath;
58
+ if (scaffoldPath === "") {
59
+ componentPath = nestScaffoldByModel ? `src/components/${singularName}` : `src/components`;
60
+ } else {
61
+ const sP = scaffoldPath.split("/").map(pascalcase).join("/");
62
+ componentPath = nestScaffoldByModel ? `src/components/${sP}/${singularName}` : `src/components/${sP}`;
63
+ }
64
+ return {
65
+ importComponentName: `${componentPath}/${singularName}`,
66
+ importComponentNameCell: `${componentPath}/${singularName}Cell`,
67
+ importComponentEditNameCell: `${componentPath}/Edit${singularName}Cell`,
68
+ importComponentNameForm: `${componentPath}/${singularName}Form`,
69
+ importComponentNewName: `${componentPath}/New${singularName}`,
70
+ importComponentNames: `${componentPath}/${pluralName}`,
71
+ importComponentNamesCell: `${componentPath}/${pluralName}Cell`,
72
+ importLayoutNames: `src/layouts/ScaffoldLayout`
73
+ };
74
+ };
75
+ const getTemplateStrings = (name, scaffoldPath, nestScaffoldByModel = true) => {
76
+ const nameVars = nameVariants(name);
77
+ const camelScaffoldPath = camelcase(pascalcase(scaffoldPath));
78
+ return {
79
+ pluralRouteName: scaffoldPath === "" ? nameVars.pluralCamelName : `${camelScaffoldPath}${nameVars.pluralPascalName}`,
80
+ editRouteName: scaffoldPath === "" ? `edit${nameVars.singularPascalName}` : `${camelScaffoldPath}Edit${nameVars.singularPascalName}`,
81
+ singularRouteName: scaffoldPath === "" ? nameVars.singularCamelName : `${camelScaffoldPath}${nameVars.singularPascalName}`,
82
+ newRouteName: scaffoldPath === "" ? `new${nameVars.singularPascalName}` : `${camelScaffoldPath}New${nameVars.singularPascalName}`,
83
+ ...getImportComponentNames(name, scaffoldPath, nestScaffoldByModel)
84
+ };
85
+ };
86
+ const shouldUseTailwindCSS = (flag) => {
87
+ if (flag === void 0) {
88
+ return fs.existsSync(path.join(getPaths().web.config, "tailwind.config.js"));
89
+ } else {
90
+ return flag;
91
+ }
92
+ };
93
+ const files = async ({
94
+ docs,
95
+ model: name,
96
+ path: scaffoldPath = "",
97
+ tests = true,
98
+ typescript = false,
99
+ tailwind = false,
100
+ force = false,
101
+ nestScaffoldByModel
102
+ }) => {
103
+ const model = await getSchema(name);
104
+ if (typeof nestScaffoldByModel === "undefined") {
105
+ nestScaffoldByModel = getConfig().generate.nestScaffoldByModel;
106
+ }
107
+ const templateStrings = getTemplateStrings(
108
+ name,
109
+ scaffoldPath,
110
+ nestScaffoldByModel
111
+ );
112
+ const pascalScaffoldPath = scaffoldPath === "" ? scaffoldPath : scaffoldPath.split("/").map(pascalcase).join("/") + "/";
113
+ return {
114
+ ...await componentFiles(
115
+ name,
116
+ pascalScaffoldPath,
117
+ typescript,
118
+ nestScaffoldByModel,
119
+ templateStrings
120
+ ),
121
+ ...await sdlFiles({
122
+ ...getDefaultArgs(sdlBuilder),
123
+ docs,
124
+ name,
125
+ typescript
126
+ }),
127
+ ...await serviceFiles({
128
+ ...getDefaultArgs(serviceBuilder),
129
+ name,
130
+ crud: true,
131
+ relations: relationsForModel(model),
132
+ tests,
133
+ typescript
134
+ }),
135
+ ...await assetFiles(name, tailwind),
136
+ ...await formatters(name, typescript),
137
+ ...await layoutFiles(name, force, typescript, templateStrings),
138
+ ...await pageFiles(
139
+ name,
140
+ pascalScaffoldPath,
141
+ typescript,
142
+ nestScaffoldByModel,
143
+ templateStrings
144
+ )
145
+ };
146
+ };
147
+ const assetFiles = async (name, tailwind) => {
148
+ let fileList = {};
149
+ const assets = fs.readdirSync(
150
+ customOrDefaultTemplatePath({
151
+ side: "web",
152
+ generator: "scaffold",
153
+ templatePath: "assets"
154
+ })
155
+ );
156
+ for (const asset of assets) {
157
+ if (tailwind && asset.match(/tailwind/) || !tailwind && !asset.match(/tailwind/)) {
158
+ const outputAssetName = asset.replace(/\.template/, "").replace(/\.tailwind/, "");
159
+ const outputPath = path.join(getPaths().web.src, outputAssetName);
160
+ if (!SKIPPABLE_ASSETS.includes(path.basename(outputPath)) || !fs.existsSync(outputPath)) {
161
+ const template = await generateTemplate(
162
+ customOrDefaultTemplatePath({
163
+ side: "web",
164
+ generator: "scaffold",
165
+ templatePath: path.join("assets", asset)
166
+ }),
167
+ {
168
+ name
169
+ }
170
+ );
171
+ fileList[outputPath] = template;
172
+ }
173
+ }
174
+ }
175
+ return fileList;
176
+ };
177
+ const formatters = async (name, isTypescript) => {
178
+ const outputPath = path.join(
179
+ getPaths().web.src,
180
+ "lib",
181
+ isTypescript ? "formatters.tsx" : "formatters.jsx"
182
+ );
183
+ const outputPathTest = path.join(
184
+ getPaths().web.src,
185
+ "lib",
186
+ isTypescript ? "formatters.test.tsx" : "formatters.test.jsx"
187
+ );
188
+ if (fs.existsSync(outputPath)) {
189
+ return;
190
+ }
191
+ const template = await generateTemplate(
192
+ customOrDefaultTemplatePath({
193
+ side: "web",
194
+ generator: "scaffold",
195
+ templatePath: path.join("lib", "formatters.tsx.template")
196
+ }),
197
+ {
198
+ name
199
+ }
200
+ );
201
+ const templateTest = await generateTemplate(
202
+ customOrDefaultTemplatePath({
203
+ side: "web",
204
+ generator: "scaffold",
205
+ templatePath: path.join("lib", "formatters.test.tsx.template")
206
+ }),
207
+ {
208
+ name
209
+ }
210
+ );
211
+ return {
212
+ [outputPath]: isTypescript ? template : await transformTSToJS(outputPath, template),
213
+ [outputPathTest]: isTypescript ? templateTest : await transformTSToJS(outputPathTest, templateTest)
214
+ };
215
+ };
216
+ const modelRelatedVariables = (model) => {
217
+ const componentMetadata = {
218
+ Enum: {
219
+ componentName: "RadioField",
220
+ defaultProp: "defaultChecked",
221
+ validation: () => false,
222
+ listDisplayFunction: "formatEnum",
223
+ displayFunction: "formatEnum"
224
+ },
225
+ EnumList: {
226
+ componentName: "CheckboxField",
227
+ defaultProp: "defaultChecked",
228
+ validation: () => false,
229
+ listDisplayFunction: "formatEnum",
230
+ displayFunction: "formatEnum"
231
+ },
232
+ Boolean: {
233
+ componentName: "CheckboxField",
234
+ defaultProp: "defaultChecked",
235
+ validation: () => false,
236
+ listDisplayFunction: "checkboxInputTag",
237
+ displayFunction: "checkboxInputTag"
238
+ },
239
+ DateTime: {
240
+ componentName: "DatetimeLocalField",
241
+ deserializeFunction: "formatDatetime",
242
+ listDisplayFunction: "timeTag",
243
+ displayFunction: "timeTag"
244
+ },
245
+ Int: {
246
+ componentName: "NumberField"
247
+ },
248
+ Json: {
249
+ componentName: "TextAreaField",
250
+ validation: (isRequired) => `{{ valueAsJSON: true${isRequired ? ", required: true" : ""} }}`,
251
+ displayFunction: "jsonDisplay",
252
+ listDisplayFunction: "jsonTruncate",
253
+ deserializeFunction: "JSON.stringify"
254
+ },
255
+ Float: {
256
+ validation: (isRequired) => `{{ valueAsNumber: true${isRequired ? ", required: true" : ""} }}`
257
+ },
258
+ Decimal: {
259
+ validation: (isRequired) => `{{ valueAsNumber: true${isRequired ? ", required: true" : ""} }}`
260
+ },
261
+ default: {
262
+ componentName: "TextField",
263
+ defaultProp: "defaultValue",
264
+ deserializeFunction: "",
265
+ validation: "{{ required: true }}",
266
+ displayFunction: void 0,
267
+ listDisplayFunction: "truncate"
268
+ }
269
+ };
270
+ const relations = relationsForModel(model).map((relation) => relation);
271
+ const columns = model.fields.filter((field) => field.kind !== "object").map((column) => {
272
+ let validation;
273
+ if (componentMetadata[column.type]?.validation) {
274
+ validation = componentMetadata[column.type]?.validation(
275
+ column?.isRequired
276
+ );
277
+ } else {
278
+ validation = column?.isRequired ? componentMetadata.default.validation : null;
279
+ }
280
+ const isRelationalField = column.name.endsWith("Id") && relations.some((relation) => column.name.includes(relation));
281
+ const isRequired = column.isRequired;
282
+ const isEnum = column.kind === "enum";
283
+ const isList = column.isList;
284
+ const enumType = isEnum && isList ? "EnumList" : "Enum";
285
+ const metadataKey = isEnum ? enumType : column.type;
286
+ return {
287
+ ...column,
288
+ label: humanize(column.name),
289
+ component: componentMetadata[metadataKey]?.componentName || componentMetadata.default.componentName,
290
+ defaultProp: componentMetadata[metadataKey]?.defaultProp || componentMetadata.default.defaultProp,
291
+ deserializeFunction: componentMetadata[metadataKey]?.deserializeFunction || componentMetadata.default.deserializeFunction,
292
+ validation,
293
+ listDisplayFunction: componentMetadata[metadataKey]?.listDisplayFunction || componentMetadata.default.listDisplayFunction,
294
+ displayFunction: componentMetadata[metadataKey]?.displayFunction || componentMetadata.default.displayFunction,
295
+ values: column.enumValues || [],
296
+ isList,
297
+ isEnum,
298
+ isRequired,
299
+ isRelationalField
300
+ };
301
+ });
302
+ const editableColumns = columns.filter(
303
+ (column) => !isAutoGeneratedColumnForScaffold(column)
304
+ );
305
+ const fieldsToImport = Object.keys(
306
+ editableColumns.reduce((accumulator, column) => {
307
+ accumulator[column.component] = true;
308
+ return accumulator;
309
+ }, {})
310
+ );
311
+ if (!fieldsToImport.length) {
312
+ throw new Error(`There are no editable fields in the ${model.name} model`);
313
+ }
314
+ const formattersImports = columns.map((column) => column.displayFunction).sort().filter((name, index, array) => array.indexOf(name) === index).join(", ");
315
+ const listFormattersImports = columns.map((column) => column.listDisplayFunction).sort().filter((name, index, array) => array.indexOf(name) === index).join(", ");
316
+ return {
317
+ columns,
318
+ fieldsToImport,
319
+ editableColumns,
320
+ listFormattersImports,
321
+ formattersImports
322
+ };
323
+ };
324
+ const layoutFiles = async (name, force, generateTypescript, templateStrings) => {
325
+ let fileList = {};
326
+ const layouts = fs.readdirSync(
327
+ customOrDefaultTemplatePath({
328
+ side: "web",
329
+ generator: "scaffold",
330
+ templatePath: "layouts"
331
+ })
332
+ );
333
+ for (const layout of layouts) {
334
+ const outputLayoutName = layout.replace(
335
+ /\.tsx\.template/,
336
+ generateTypescript ? ".tsx" : ".jsx"
337
+ );
338
+ const outputPath = path.join(
339
+ getPaths().web.layouts,
340
+ "ScaffoldLayout",
341
+ outputLayoutName
342
+ );
343
+ if (!fs.existsSync(outputPath) || force) {
344
+ const template = await generateTemplate(
345
+ customOrDefaultTemplatePath({
346
+ side: "web",
347
+ generator: "scaffold",
348
+ templatePath: path.join("layouts", layout)
349
+ }),
350
+ {
351
+ name,
352
+ pascalScaffoldPath: "",
353
+ ...templateStrings
354
+ }
355
+ );
356
+ fileList[outputPath] = generateTypescript ? template : await transformTSToJS(outputPath, template);
357
+ }
358
+ }
359
+ return fileList;
360
+ };
361
+ const pageFiles = async (name, pascalScaffoldPath = "", generateTypescript, nestScaffoldByModel = true, templateStrings) => {
362
+ const pluralName = pascalcase(pluralize(name));
363
+ const singularName = pascalcase(singularize(name));
364
+ const model = await getSchema(singularName);
365
+ const idType = getIdType(model);
366
+ const idTsType = mapPrismaScalarToPagePropTsType(idType);
367
+ const idName = getIdName(model);
368
+ let fileList = {};
369
+ const pages = fs.readdirSync(
370
+ customOrDefaultTemplatePath({
371
+ side: "web",
372
+ generator: "scaffold",
373
+ templatePath: "pages"
374
+ })
375
+ );
376
+ for (const page of pages) {
377
+ const outputPageName = page.replace(/Names/, pluralName).replace(/Name/, singularName).replace(/\.tsx\.template/, generateTypescript ? ".tsx" : ".jsx");
378
+ const finalFolder = (nestScaffoldByModel ? singularName + "/" : "") + outputPageName.replace(/\.[jt]sx?/, "");
379
+ const outputPath = path.join(
380
+ getPaths().web.pages,
381
+ pascalScaffoldPath,
382
+ finalFolder,
383
+ outputPageName
384
+ );
385
+ const template = await generateTemplate(
386
+ customOrDefaultTemplatePath({
387
+ side: "web",
388
+ generator: "scaffold",
389
+ templatePath: path.join("pages", page)
390
+ }),
391
+ {
392
+ idTsType,
393
+ idName,
394
+ name,
395
+ pascalScaffoldPath,
396
+ ...templateStrings,
397
+ ...modelRelatedVariables(model)
398
+ }
399
+ );
400
+ fileList[outputPath] = generateTypescript ? template : await transformTSToJS(outputPath, template);
401
+ }
402
+ return fileList;
403
+ };
404
+ const componentFiles = async (name, pascalScaffoldPath = "", generateTypescript, nestScaffoldByModel = true, templateStrings) => {
405
+ const pluralName = pascalcase(pluralize(name));
406
+ const singularName = pascalcase(singularize(name));
407
+ const model = await getSchema(singularName);
408
+ const idType = getIdType(model);
409
+ const idName = getIdName(model);
410
+ const pascalIdName = pascalcase(idName);
411
+ const intForeignKeys = intForeignKeysForModel(model);
412
+ let fileList = {};
413
+ const components = fs.readdirSync(
414
+ customOrDefaultTemplatePath({
415
+ side: "web",
416
+ generator: "scaffold",
417
+ templatePath: "components"
418
+ })
419
+ );
420
+ for (const component of components) {
421
+ const outputComponentName = component.replace(/Names/, pluralName).replace(/Name/, singularName).replace(/\.tsx\.template/, generateTypescript ? ".tsx" : ".jsx");
422
+ const finalFolder = (nestScaffoldByModel ? singularName + "/" : "") + outputComponentName.replace(/\.[jt]sx?/, "");
423
+ const outputPath = path.join(
424
+ getPaths().web.components,
425
+ pascalScaffoldPath,
426
+ finalFolder,
427
+ outputComponentName
428
+ );
429
+ const useClientDirective = getConfig().experimental?.rsc?.enabled ? "'use client'\n\n" : "";
430
+ const template = await generateTemplate(
431
+ customOrDefaultTemplatePath({
432
+ side: "web",
433
+ generator: "scaffold",
434
+ templatePath: path.join("components", component)
435
+ }),
436
+ {
437
+ name,
438
+ idType,
439
+ idName,
440
+ pascalIdName,
441
+ intForeignKeys,
442
+ pascalScaffoldPath,
443
+ useClientDirective,
444
+ ...templateStrings,
445
+ ...modelRelatedVariables(model)
446
+ }
447
+ );
448
+ fileList[outputPath] = generateTypescript ? template : await transformTSToJS(outputPath, template);
449
+ }
450
+ return fileList;
451
+ };
452
+ const routes = async ({
453
+ model: name,
454
+ path: scaffoldPath = "",
455
+ nestScaffoldByModel
456
+ }) => {
457
+ if (typeof nestScaffoldByModel === "undefined") {
458
+ nestScaffoldByModel = getConfig().generate.nestScaffoldByModel;
459
+ }
460
+ const templateNames = getTemplateStrings(name, scaffoldPath);
461
+ const nameVars = nameVariants(name);
462
+ const model = await getSchema(nameVars.singularPascalName);
463
+ const idRouteParam = getIdType(model) === "Int" ? ":Int" : "";
464
+ const idName = getIdName(model);
465
+ const paramScaffoldPath = scaffoldPath === "" ? scaffoldPath : scaffoldPath.split("/").map(paramCase).join("/") + "/";
466
+ const pascalScaffoldPath = pascalcase(scaffoldPath);
467
+ const pageRoot = pascalScaffoldPath + (nestScaffoldByModel ? nameVars.singularPascalName : "");
468
+ return [
469
+ // new
470
+ `<Route path="/${paramScaffoldPath}${nameVars.pluralParamName}/new" page={${pageRoot}New${nameVars.singularPascalName}Page} name="${templateNames.newRouteName}" />`,
471
+ // edit
472
+ `<Route path="/${paramScaffoldPath}${nameVars.pluralParamName}/{${idName}${idRouteParam}}/edit" page={${pageRoot}Edit${nameVars.singularPascalName}Page} name="${templateNames.editRouteName}" />`,
473
+ // singular
474
+ `<Route path="/${paramScaffoldPath}${nameVars.pluralParamName}/{${idName}${idRouteParam}}" page={${pageRoot}${nameVars.singularPascalName}Page} name="${templateNames.singularRouteName}" />`,
475
+ // plural
476
+ `<Route path="/${paramScaffoldPath}${nameVars.pluralParamName}" page={${pageRoot}${nameVars.pluralPascalName}Page} name="${templateNames.pluralRouteName}" />`
477
+ ];
478
+ };
479
+ const addLayoutImport = () => {
480
+ const importLayout = `import ScaffoldLayout from 'src/layouts/ScaffoldLayout'`;
481
+ const routesPath = getPaths().web.routes;
482
+ const routesContent = readFile(routesPath).toString();
483
+ if (!routesContent.match(importLayout)) {
484
+ const newRoutesContent = routesContent.replace(
485
+ /['"]@cedarjs\/router['"](\s*)/,
486
+ `'@cedarjs/router'
487
+
488
+ ${importLayout}$1`
489
+ );
490
+ writeFile(routesPath, newRoutesContent, { overwriteExisting: true });
491
+ return "Added layout import to Routes.{jsx,tsx}";
492
+ } else {
493
+ return "Layout import already exists in Routes.{jsx,tsx}";
494
+ }
495
+ };
496
+ const addHelperPackages = async (task) => {
497
+ const packageJsonPath = path.join(getPaths().web.base, "package.json");
498
+ const packageJson = await import(packageJsonPath, { with: { type: "json" } });
499
+ if (packageJson.default.dependencies["humanize-string"]) {
500
+ return task.skip("Skipping. Already installed");
501
+ }
502
+ await execa("yarn", ["workspace", "web", "add", "humanize-string@2.1.0"]);
503
+ addFunctionToRollback(async () => {
504
+ await execa("yarn", ["workspace", "web", "remove", "humanize-string"]);
505
+ });
506
+ };
507
+ const addSetImport = (task) => {
508
+ const routesPath = getPaths().web.routes;
509
+ const routesContent = readFile(routesPath).toString();
510
+ const [redwoodRouterImport, importStart, spacing, importContent, importEnd] = routesContent.match(
511
+ /(import {)(\s*)([^]*)(} from ['"]@cedarjs\/router['"])/
512
+ ) || [];
513
+ if (!redwoodRouterImport) {
514
+ task.skip(
515
+ "Couldn't add Set import from @cedarjs/router to Routes.{jsx,tsx}"
516
+ );
517
+ return void 0;
518
+ }
519
+ const routerImports = importContent.replace(/\s/g, "").split(",");
520
+ if (routerImports.includes(PACKAGE_SET)) {
521
+ return "Skipping Set import";
522
+ }
523
+ const newRoutesContent = routesContent.replace(
524
+ redwoodRouterImport,
525
+ importStart + spacing + PACKAGE_SET + `,` + spacing + importContent + importEnd
526
+ );
527
+ writeFile(routesPath, newRoutesContent, { overwriteExisting: true });
528
+ return "Added Set import to Routes.{jsx,tsx}";
529
+ };
530
+ const addScaffoldSetToRouter = async (model, path2) => {
531
+ const templateNames = getTemplateStrings(model, path2);
532
+ const nameVars = nameVariants(model);
533
+ const title = nameVars.pluralPascalName;
534
+ const titleTo = templateNames.pluralRouteName;
535
+ const buttonLabel = `New ${nameVars.singularPascalName}`;
536
+ const buttonTo = templateNames.newRouteName;
537
+ return addRoutesToRouterTask(
538
+ await routes({ model, path: path2 }),
539
+ "ScaffoldLayout",
540
+ { title, titleTo, buttonLabel, buttonTo }
541
+ );
542
+ };
543
+ const tasks = ({
544
+ docs,
545
+ model,
546
+ path: path2,
547
+ force,
548
+ tests,
549
+ typescript,
550
+ javascript,
551
+ tailwind
552
+ }) => {
553
+ return new Listr(
554
+ [
555
+ {
556
+ title: "Generating scaffold files...",
557
+ task: async () => {
558
+ const f = await files({
559
+ docs,
560
+ model,
561
+ path: path2,
562
+ tests,
563
+ typescript,
564
+ javascript,
565
+ tailwind,
566
+ force
567
+ });
568
+ return writeFilesTask(f, { overwriteExisting: force });
569
+ }
570
+ },
571
+ {
572
+ title: "Install helper packages",
573
+ task: (_, task) => addHelperPackages(task)
574
+ },
575
+ {
576
+ title: "Adding layout import...",
577
+ task: async () => addLayoutImport()
578
+ },
579
+ {
580
+ title: "Adding set import...",
581
+ task: async (_, task) => addSetImport(task)
582
+ },
583
+ {
584
+ title: "Adding scaffold routes...",
585
+ task: async () => addScaffoldSetToRouter(model, path2)
586
+ },
587
+ {
588
+ title: "Adding scaffold asset imports...",
589
+ task: () => addScaffoldImport()
590
+ },
591
+ {
592
+ title: `Generating types ...`,
593
+ task: async () => {
594
+ const { errors } = await generateTypes();
595
+ for (const { message, error } of errors) {
596
+ console.error(message);
597
+ console.log();
598
+ console.error(error);
599
+ console.log();
600
+ }
601
+ addFunctionToRollback(generateTypes, true);
602
+ }
603
+ }
604
+ ],
605
+ { rendererOptions: { collapseSubtasks: false }, exitOnError: true }
606
+ );
607
+ };
608
+ const handler = async ({
609
+ model: modelArg,
610
+ force,
611
+ tests,
612
+ typescript,
613
+ tailwind,
614
+ docs = false,
615
+ rollback
616
+ }) => {
617
+ if (tests === void 0) {
618
+ tests = getConfig().generate.tests;
619
+ }
620
+ recordTelemetryAttributes({
621
+ command: "generate scaffold",
622
+ force,
623
+ tests,
624
+ typescript,
625
+ tailwind,
626
+ docs,
627
+ rollback
628
+ });
629
+ const { model, path: path2 } = splitPathAndModel(modelArg);
630
+ tailwind = shouldUseTailwindCSS(tailwind);
631
+ try {
632
+ const { name } = await verifyModelName({ name: model });
633
+ const t = tasks({
634
+ docs,
635
+ model: name,
636
+ path: path2,
637
+ force,
638
+ tests,
639
+ typescript,
640
+ tailwind
641
+ });
642
+ if (rollback && !force) {
643
+ prepareForRollback(t);
644
+ }
645
+ await t.run();
646
+ } catch (e) {
647
+ console.log(c.error(e.message));
648
+ process.exit(e?.existCode || 1);
649
+ }
650
+ };
651
+ const splitPathAndModel = (pathSlashModel) => {
652
+ const path2 = pathSlashModel.split("/").slice(0, -1).join("/");
653
+ const model = pathSlashModel.split("/").pop();
654
+ return { model, path: path2 };
655
+ };
656
+ export {
657
+ files,
658
+ handler,
659
+ routes,
660
+ shouldUseTailwindCSS,
661
+ splitPathAndModel,
662
+ tasks
663
+ };