@cedarjs/cli 9.0.0-canary.1784 → 9.0.0-canary.3124

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (277) hide show
  1. package/README.md +7 -10
  2. package/dist/cfw.js +10 -6
  3. package/dist/commands/build/buildHandler.js +220 -45
  4. package/dist/commands/build/buildPackagesTask.js +21 -20
  5. package/dist/commands/build.js +13 -2
  6. package/dist/commands/check.js +4 -6
  7. package/dist/commands/console.js +6 -4
  8. package/dist/commands/deploy/baremetal/SshExecutor.js +13 -4
  9. package/dist/commands/deploy/baremetal/baremetalHandler.js +116 -50
  10. package/dist/commands/deploy/baremetal.js +11 -4
  11. package/dist/commands/deploy/flightcontrolHandler.js +28 -15
  12. package/dist/commands/deploy/helpers/deployHandler.js +11 -6
  13. package/dist/commands/deploy/netlify.js +1 -1
  14. package/dist/commands/deploy/packing/nft.js +1 -2
  15. package/dist/commands/deploy/render.js +1 -1
  16. package/dist/commands/deploy/renderHandler.js +24 -13
  17. package/dist/commands/deploy/serverlessHandler.js +69 -27
  18. package/dist/commands/deploy/vercel.js +1 -1
  19. package/dist/commands/destroy/component/component.js +2 -3
  20. package/dist/commands/destroy/directive/directive.js +1 -3
  21. package/dist/commands/destroy/directive/directiveHandler.js +2 -4
  22. package/dist/commands/destroy/function/function.js +1 -3
  23. package/dist/commands/destroy/handlerHelpers.js +17 -17
  24. package/dist/commands/destroy/helpers.js +8 -2
  25. package/dist/commands/destroy/layout/layout.js +1 -2
  26. package/dist/commands/destroy/page/pageHandler.js +3 -3
  27. package/dist/commands/destroy/scaffold/scaffoldHandler.js +31 -12
  28. package/dist/commands/destroy/sdl/sdlHandler.js +3 -3
  29. package/dist/commands/dev/apiDebugFlag.js +5 -4
  30. package/dist/commands/dev/devHandler.js +219 -68
  31. package/dist/commands/dev/packageWatchCommands.js +8 -3
  32. package/dist/commands/dev.js +16 -6
  33. package/dist/commands/execHandler.js +49 -29
  34. package/dist/commands/experimental/live-queries/liveQueries.js +32 -0
  35. package/dist/commands/experimental/live-queries/liveQueriesHandler.js +448 -0
  36. package/dist/commands/experimental/live-queries/templates/liveQueriesListener.ts.template +153 -0
  37. package/dist/commands/experimental/live-queries/templates/migration.sql.template +100 -0
  38. package/dist/commands/experimental/setupInngest.js +2 -2
  39. package/dist/commands/experimental/setupInngestHandler.js +13 -12
  40. package/dist/commands/experimental/setupOpentelemetry.js +2 -2
  41. package/dist/commands/experimental/setupOpentelemetryHandler.js +14 -10
  42. package/dist/commands/experimental/setupReactCompiler.js +2 -2
  43. package/dist/commands/experimental/setupReactCompilerHandler.js +48 -33
  44. package/dist/commands/experimental/setupRsc.js +1 -1
  45. package/dist/commands/experimental/setupRscHandler.js +20 -16
  46. package/dist/commands/experimental/setupStreamingSsr.js +2 -2
  47. package/dist/commands/experimental/setupStreamingSsrHandler.js +49 -34
  48. package/dist/commands/experimental/templates/opentelemetry.ts.template +2 -1
  49. package/dist/commands/experimental/templates/rsc/Document.tsx.template +1 -1
  50. package/dist/commands/experimental/templates/rsc/entry.client.tsx.template +8 -8
  51. package/dist/commands/experimental/templates/streamingSsr/Document.tsx.template +1 -1
  52. package/dist/commands/experimental/templates/streamingSsr/entry.client.tsx.template +6 -6
  53. package/dist/commands/experimental/templates/streamingSsr/tsconfig.json.template +6 -6
  54. package/dist/commands/experimental/util.js +27 -25
  55. package/dist/commands/experimental.js +3 -2
  56. package/dist/commands/generate/cell/cell.js +20 -0
  57. package/dist/commands/generate/cell/cellHandler.js +89 -40
  58. package/dist/commands/generate/cell/templates/cell.tsx.template +21 -2
  59. package/dist/commands/generate/cell/templates/cellFragment.tsx.template +43 -0
  60. package/dist/commands/generate/cell/templates/cellList.tsx.template +21 -2
  61. package/dist/commands/generate/cell/templates/storiesFragment.tsx.template +23 -0
  62. package/dist/commands/generate/cell/templates/test.js.template +1 -1
  63. package/dist/commands/generate/cell/templates/testFragment.js.template +30 -0
  64. package/dist/commands/generate/component/componentHandler.js +14 -16
  65. package/dist/commands/generate/dataMigration/dataMigration.js +36 -18
  66. package/dist/commands/generate/dataMigration/templates/dataMigration.js.template +1 -1
  67. package/dist/commands/generate/dataMigration/templates/dataMigration.ts.template +1 -1
  68. package/dist/commands/generate/dbAuth/dbAuth.js +1 -0
  69. package/dist/commands/generate/dbAuth/dbAuthHandler.js +63 -34
  70. package/dist/commands/generate/dbAuth/templates/login.oauth.tsx.template +164 -0
  71. package/dist/commands/generate/dbAuth/templates/signup.oauth.tsx.template +147 -0
  72. package/dist/commands/generate/directive/directiveHandler.js +14 -16
  73. package/dist/commands/generate/function/function.js +1 -0
  74. package/dist/commands/generate/function/functionHandler.js +14 -19
  75. package/dist/commands/generate/helpers.js +34 -18
  76. package/dist/commands/generate/job/job.js +1 -0
  77. package/dist/commands/generate/job/jobHandler.js +20 -24
  78. package/dist/commands/generate/layout/layoutHandler.js +13 -16
  79. package/dist/commands/generate/model/model.js +1 -0
  80. package/dist/commands/generate/model/modelHandler.js +11 -5
  81. package/dist/commands/generate/ogImage/ogImage.js +1 -0
  82. package/dist/commands/generate/ogImage/ogImageHandler.js +18 -11
  83. package/dist/commands/generate/package/filesTask.js +9 -0
  84. package/dist/commands/generate/package/packageHandler.js +50 -61
  85. package/dist/commands/generate/package/templates/test.ts.template +2 -2
  86. package/dist/commands/generate/package/templates/vitest.config.ts.template +9 -0
  87. package/dist/commands/generate/page/pageHandler.js +27 -24
  88. package/dist/commands/generate/realtime/realtime.js +2 -2
  89. package/dist/commands/generate/realtime/realtimeHandler.js +51 -32
  90. package/dist/commands/generate/realtime/templates/subscriptions/blank/blank.ts.template +1 -1
  91. package/dist/commands/generate/scaffold/scaffold.js +1 -0
  92. package/dist/commands/generate/scaffold/scaffoldHandler.js +176 -49
  93. package/dist/commands/generate/scaffold/templates/lib/formatters.tsx.template +1 -1
  94. package/dist/commands/generate/script/script.js +1 -0
  95. package/dist/commands/generate/script/scriptHandler.js +10 -6
  96. package/dist/commands/generate/script/templates/script.ts.template +9 -4
  97. package/dist/commands/generate/script/templates/tsconfig.json.template +16 -2
  98. package/dist/commands/generate/sdl/sdl.js +4 -3
  99. package/dist/commands/generate/sdl/sdlHandler.js +135 -46
  100. package/dist/commands/generate/sdl/stubFiles.js +132 -0
  101. package/dist/commands/generate/sdl/templates/sdl.js.template +2 -1
  102. package/dist/commands/generate/sdl/templates/sdl.ts.template +2 -1
  103. package/dist/commands/generate/secret/secret.js +20 -20
  104. package/dist/commands/generate/service/service.js +5 -5
  105. package/dist/commands/generate/service/serviceHandler.js +126 -61
  106. package/dist/commands/generate/service/templates/scenarios.ts.template +4 -2
  107. package/dist/commands/generate/service/templates/service.ts.template +22 -8
  108. package/dist/commands/generate/service/templates/test.ts.template +2 -2
  109. package/dist/commands/generate/yargsCommandHelpers.js +7 -2
  110. package/dist/commands/generate/yargsHandlerHelpers.js +20 -18
  111. package/dist/commands/generate.js +4 -4
  112. package/dist/commands/info.js +2 -2
  113. package/dist/commands/jobsHandler.js +7 -4
  114. package/dist/commands/lint.js +26 -69
  115. package/dist/commands/prerenderHandler.js +95 -58
  116. package/dist/commands/prismaHandler.js +51 -26
  117. package/dist/commands/record/init.js +2 -2
  118. package/dist/commands/record.js +4 -3
  119. package/dist/commands/serve.js +245 -31
  120. package/dist/commands/serveApiHandler.js +7 -6
  121. package/dist/commands/serveBothHandler.js +22 -13
  122. package/dist/commands/serveWebHandler.js +3 -2
  123. package/dist/commands/setup/auth/auth.js +15 -11
  124. package/dist/commands/setup/cache/cache.js +1 -1
  125. package/dist/commands/setup/cache/cacheHandler.js +15 -9
  126. package/dist/commands/setup/database/database.js +15 -0
  127. package/dist/commands/setup/database/postgres.js +19 -0
  128. package/dist/commands/setup/database/postgresHandler.js +196 -0
  129. package/dist/commands/setup/database/templates/db.ts.template +32 -0
  130. package/dist/commands/setup/deploy/deploy.js +4 -3
  131. package/dist/commands/setup/deploy/helpers/helpers.js +5 -1
  132. package/dist/commands/setup/deploy/helpers/index.js +132 -6
  133. package/dist/commands/setup/deploy/providers/baremetalHandler.js +28 -6
  134. package/dist/commands/setup/deploy/providers/coherence.js +1 -1
  135. package/dist/commands/setup/deploy/providers/coherenceHandler.js +60 -31
  136. package/dist/commands/setup/deploy/providers/flightcontrolHandler.js +69 -51
  137. package/dist/commands/setup/deploy/providers/netlify.js +6 -0
  138. package/dist/commands/setup/deploy/providers/netlifyHandler.js +114 -13
  139. package/dist/commands/setup/deploy/providers/renderHandler.js +44 -41
  140. package/dist/commands/setup/deploy/providers/serverlessHandler.js +7 -5
  141. package/dist/commands/setup/deploy/providers/universal-deploy.js +11 -0
  142. package/dist/commands/setup/deploy/providers/universalDeployHandler.js +186 -0
  143. package/dist/commands/setup/deploy/providers/vercel.js +6 -0
  144. package/dist/commands/setup/deploy/providers/vercelHandler.js +115 -14
  145. package/dist/commands/setup/deploy/templates/baremetal.js +3 -2
  146. package/dist/commands/setup/deploy/templates/flightcontrol.js +60 -49
  147. package/dist/commands/setup/deploy/templates/netlify.js +2 -1
  148. package/dist/commands/setup/deploy/templates/netlifyUD.js +31 -0
  149. package/dist/commands/setup/deploy/templates/render.js +32 -17
  150. package/dist/commands/setup/docker/docker.js +2 -2
  151. package/dist/commands/setup/docker/dockerHandler.js +74 -39
  152. package/dist/commands/setup/docker/templates/Dockerfile.npm +119 -0
  153. package/dist/commands/setup/docker/templates/Dockerfile.pnpm +112 -0
  154. package/dist/commands/setup/docker/templates/{Dockerfile → Dockerfile.yarn} +4 -7
  155. package/dist/commands/setup/docker/templates/docker-compose.dev.yml +3 -3
  156. package/dist/commands/setup/docker/templates/docker-compose.prod.yml +2 -5
  157. package/dist/commands/setup/docker/templates/dockerignore +1 -0
  158. package/dist/commands/setup/generator/generator.js +1 -1
  159. package/dist/commands/setup/generator/generatorHandler.js +5 -4
  160. package/dist/commands/setup/graphql/features/fragments/appGqlConfigTransform.js +6 -3
  161. package/dist/commands/setup/graphql/features/fragments/fragments.js +1 -1
  162. package/dist/commands/setup/graphql/features/fragments/fragmentsHandler.js +5 -7
  163. package/dist/commands/setup/graphql/features/trustedDocuments/trustedDocuments.js +1 -1
  164. package/dist/commands/setup/graphql/features/trustedDocuments/trustedDocumentsHandler.js +4 -3
  165. package/dist/commands/setup/i18n/i18n.js +1 -1
  166. package/dist/commands/setup/i18n/i18nHandler.js +21 -17
  167. package/dist/commands/setup/jobs/jobs.js +1 -1
  168. package/dist/commands/setup/jobs/jobsHandler.js +17 -12
  169. package/dist/commands/setup/mailer/mailer.js +1 -1
  170. package/dist/commands/setup/mailer/mailerHandler.js +13 -11
  171. package/dist/commands/setup/middleware/ogImage/ogImage.js +1 -1
  172. package/dist/commands/setup/middleware/ogImage/ogImageHandler.js +2 -1
  173. package/dist/commands/setup/monitoring/sentry/sentry.js +1 -1
  174. package/dist/commands/setup/monitoring/sentry/sentryHandler.js +18 -12
  175. package/dist/commands/setup/neon/neon.js +35 -0
  176. package/dist/commands/setup/neon/neonHandler.js +264 -0
  177. package/dist/commands/setup/package/package.js +1 -1
  178. package/dist/commands/setup/package/packageHandler.js +18 -14
  179. package/dist/commands/setup/realtime/addRealtimeToGraphql.js +1 -1
  180. package/dist/commands/setup/realtime/realtime.js +1 -1
  181. package/dist/commands/setup/realtime/realtimeHandler.js +26 -37
  182. package/dist/commands/setup/realtime/templates/realtime.ts.template +1 -1
  183. package/dist/commands/setup/realtime/templates/subscriptions/countdown/countdown.ts.template +1 -1
  184. package/dist/commands/setup/realtime/templates/subscriptions/newMessage/newMessage.ts.template +1 -1
  185. package/dist/commands/setup/server-file/serverFile.js +1 -1
  186. package/dist/commands/setup/server-file/serverFileHandler.js +18 -10
  187. package/dist/commands/setup/tenancy/authCodemod.js +66 -0
  188. package/dist/commands/setup/tenancy/dbCodemod.js +64 -0
  189. package/dist/commands/setup/tenancy/graphqlCodemod.js +88 -0
  190. package/dist/commands/setup/tenancy/preflight.js +49 -0
  191. package/dist/commands/setup/tenancy/schemaPrisma.js +81 -0
  192. package/dist/commands/setup/tenancy/signupCodemod.js +153 -0
  193. package/dist/commands/setup/tenancy/templates/InvitePage.tsx.template +63 -0
  194. package/dist/commands/setup/tenancy/templates/OrgScope.tsx.template +40 -0
  195. package/dist/commands/setup/tenancy/templates/ensureDefaultOrganizations.dataMigration.ts.template +39 -0
  196. package/dist/commands/setup/tenancy/templates/organizations.scenarios.ts.template +59 -0
  197. package/dist/commands/setup/tenancy/templates/organizations.sdl.ts.template +89 -0
  198. package/dist/commands/setup/tenancy/templates/organizations.test.ts.template +389 -0
  199. package/dist/commands/setup/tenancy/templates/organizations.ts.template +394 -0
  200. package/dist/commands/setup/tenancy/templates/requireMembership.test.ts.template +35 -0
  201. package/dist/commands/setup/tenancy/templates/requireMembership.ts.template +25 -0
  202. package/dist/commands/setup/tenancy/tenancy.js +30 -0
  203. package/dist/commands/setup/tenancy/tenancyHandler.js +425 -0
  204. package/dist/commands/setup/ui/helpers/helpers.js +5 -1
  205. package/dist/commands/setup/ui/libraries/chakra-uiHandler.js +16 -8
  206. package/dist/commands/setup/ui/libraries/mantineHandler.js +26 -16
  207. package/dist/commands/setup/ui/libraries/tailwindcssHandler.js +40 -29
  208. package/dist/commands/setup/uploads/schemaPrisma.js +41 -0
  209. package/dist/commands/setup/uploads/serverFile.js +151 -0
  210. package/dist/commands/setup/uploads/templates/requireUploadToken.ts.template +15 -0
  211. package/dist/commands/setup/uploads/templates/srcLibUploads.ts.template +23 -24
  212. package/dist/commands/setup/uploads/templates/uploads.sdl.ts.template +79 -0
  213. package/dist/commands/setup/uploads/templates/uploads.ts.template +89 -0
  214. package/dist/commands/setup/uploads/templates/withDataUri.ts.template +14 -0
  215. package/dist/commands/setup/uploads/templates/withSignedUrl.ts.template +16 -0
  216. package/dist/commands/setup/uploads/uploads.js +49 -7
  217. package/dist/commands/setup/uploads/uploadsHandler.js +266 -72
  218. package/dist/commands/setup.js +5 -4
  219. package/dist/commands/studio.js +1 -1
  220. package/dist/commands/studioHandler.js +2 -2
  221. package/dist/commands/test/datasourceWarning.js +42 -0
  222. package/dist/commands/test/testHandler.js +104 -0
  223. package/dist/commands/test/viteVersionCheck.js +75 -0
  224. package/dist/commands/test.js +16 -19
  225. package/dist/commands/type-check.js +2 -1
  226. package/dist/commands/type-checkHandler.js +25 -18
  227. package/dist/commands/upgrade/preUpgradeScripts.js +11 -11
  228. package/dist/commands/upgrade/upgrade.js +4 -2
  229. package/dist/commands/upgrade/upgradeHandler.js +97 -73
  230. package/dist/index.js +15 -11
  231. package/dist/lib/background.js +22 -1
  232. package/dist/lib/configureStorybook.js +2 -2
  233. package/dist/lib/exec.js +68 -63
  234. package/dist/lib/exit.js +20 -5
  235. package/dist/lib/extendFile.js +23 -13
  236. package/dist/lib/generatePrismaClient.js +48 -12
  237. package/dist/lib/index.js +137 -106
  238. package/dist/lib/loadEnvFiles.js +1 -1
  239. package/dist/lib/locking.js +8 -4
  240. package/dist/lib/merge/algorithms.js +4 -1
  241. package/dist/lib/merge/index.js +78 -41
  242. package/dist/lib/merge/semanticIdentity.js +18 -6
  243. package/dist/lib/merge/strategy.js +86 -36
  244. package/dist/lib/packages.js +23 -13
  245. package/dist/lib/plugin.js +13 -7
  246. package/dist/lib/pluralHelpers.js +6 -2
  247. package/dist/lib/project.js +3 -1
  248. package/dist/lib/rollback.js +7 -7
  249. package/dist/lib/schemaHelpers.js +16 -19
  250. package/dist/lib/test.js +20 -5
  251. package/dist/lib/updateCheck.js +47 -18
  252. package/dist/middleware/checkNodeVersion.js +9 -4
  253. package/dist/middleware/{detectProjectRxVersion.js → detectProjectCedarVersion.js} +2 -2
  254. package/dist/plugin.js +18 -12
  255. package/dist/telemetry/exporter.js +12 -5
  256. package/dist/telemetry/index.js +4 -3
  257. package/dist/telemetry/resource.js +9 -12
  258. package/dist/telemetry/send.js +14 -10
  259. package/dist/testLib/cells.js +5 -3
  260. package/package.json +44 -41
  261. package/LICENSE +0 -21
  262. package/dist/commands/consoleHandler.js +0 -68
  263. package/dist/commands/setup/tsconfig/tsconfig.js +0 -25
  264. package/dist/commands/setup/tsconfig/tsconfigHandler.js +0 -59
  265. package/dist/commands/setup/uploads/dbCodemod.js +0 -28
  266. package/dist/commands/setup/uploads/templates/signedUrl.ts.template +0 -21
  267. package/dist/commands/setup/vite/templates/vite.config.ts.template +0 -19
  268. package/dist/commands/setup/vite/vite.js +0 -38
  269. package/dist/commands/setup/vite/viteHandler.js +0 -83
  270. package/dist/commands/testEsm.js +0 -36
  271. package/dist/commands/testHandler.js +0 -137
  272. package/dist/commands/testHandlerEsm.js +0 -85
  273. package/dist/commands/ts-to-js.js +0 -20
  274. package/dist/lib/cedarPluralize.js +0 -56
  275. package/dist/lib/colors.js +0 -18
  276. package/dist/testLib/getFilesWithPattern.js +0 -21
  277. /package/dist/{index.d.js → global.d.js} +0 -0
package/README.md CHANGED
@@ -238,12 +238,9 @@ export const builder = (yargs) => {
238
238
 
239
239
  ...
240
240
 
241
- .option('stats', {
242
- default: false,
243
- description: `Use ${terminalLink(
244
- 'Webpack Bundle Analyzer',
245
- 'https://github.com/webpack-contrib/webpack-bundle-analyzer'
246
- )}`,
241
+ .option('prerender', {
242
+ default: true,
243
+ description: 'Prerender after building web',
247
244
  type: 'boolean',
248
245
  })
249
246
  .option('verbose', {
@@ -258,11 +255,11 @@ export const builder = (yargs) => {
258
255
  }
259
256
  ```
260
257
 
261
- These two calls to `options` configure this command to have options `--stats` and `--verbose`:
258
+ These two calls to `options` configure this command to have options `--prerender` and `--verbose`:
262
259
 
263
260
  ```terminal
264
- yarn rw build --stats
265
- yarn rw build --verbose
261
+ yarn cedar build --no-prerender
262
+ yarn cedar build --verbose
266
263
  ```
267
264
 
268
265
  For the full list of what properties you can use to compose the options object, see [options(key, [opt])](https://yargs.js.org/docs/#api-optionskey-opt).
@@ -280,8 +277,8 @@ While `build`'s `handler` is too long to reproduce here in full, to get the poin
280
277
 
281
278
  export const handler = async ({
282
279
  side = ['api', 'web'],
280
+ prerender = true,
283
281
  verbose = false,
284
- stats = false,
285
282
  }) => {
286
283
 
287
284
  ...
package/dist/cfw.js CHANGED
@@ -2,11 +2,11 @@
2
2
  import fs from "node:fs";
3
3
  import path from "node:path";
4
4
  import Configstore from "configstore";
5
- import execa from "execa";
6
5
  import { terminalLink } from "termi-link";
6
+ import { runScriptSync } from "@cedarjs/cli-helpers/packageManager/exec";
7
7
  import { getConfigPath } from "@cedarjs/project-config";
8
8
  const config = new Configstore("@cedarjs/cli");
9
- const CFW_PATH = process.env.CFW_PATH || process.env.RWFW_PATH || process.env.RW_PATH || config.get("CFW_PATH") || config.get("RWFW_PATH");
9
+ const CFW_PATH = process.env.CFW_PATH || config.get("CFW_PATH");
10
10
  if (!CFW_PATH) {
11
11
  console.error("Error: You must specify the path to Cedar Framework");
12
12
  console.error("Usage: `CFW_PATH=~/gh/cedarjs/cedar yarn cfw <command>");
@@ -30,14 +30,18 @@ const helpCommands = ["help", "--help"];
30
30
  if (!command.length || command.some((cmd) => helpCommands.includes(cmd))) {
31
31
  command = ["run"];
32
32
  }
33
+ const script = command[0];
34
+ const args = command.slice(1);
33
35
  try {
34
- execa.sync("yarn", [...command], {
36
+ runScriptSync(script, args, {
35
37
  stdio: "inherit",
36
38
  cwd: absCfwPath,
37
- env: {
38
- CEDAR_CWD: projectPath
39
- }
39
+ // @ts-expect-error - testUtils.d.ts augments ProcessEnv with
40
+ // CEDAR_DISABLE_TELEMETRY
41
+ env: { CEDAR_CWD: projectPath }
40
42
  });
41
43
  } catch (e) {
42
44
  console.log();
45
+ const exitCode = e && typeof e === "object" && "exitCode" in e && typeof e.exitCode === "number" ? e.exitCode : 1;
46
+ process.exit(exitCode);
43
47
  }
@@ -4,39 +4,103 @@ import path from "node:path";
4
4
  import execa from "execa";
5
5
  import { Listr } from "listr2";
6
6
  import { terminalLink } from "termi-link";
7
- import { recordTelemetryAttributes } from "@cedarjs/cli-helpers";
8
- import { buildApi, cleanApiBuild } from "@cedarjs/internal/dist/build/api";
7
+ import { colors as c } from "@cedarjs/cli-helpers/colors";
8
+ import {
9
+ formatCedarCommand,
10
+ formatRunWorkspaceScriptCommand
11
+ } from "@cedarjs/cli-helpers/packageManager/display";
12
+ import { runBin } from "@cedarjs/cli-helpers/packageManager/exec";
13
+ import { recordTelemetryAttributes } from "@cedarjs/cli-helpers/telemetry";
14
+ import {
15
+ buildApi,
16
+ buildApiWithVite,
17
+ cleanApiBuild
18
+ } from "@cedarjs/internal/dist/build/api";
9
19
  import { generate } from "@cedarjs/internal/dist/generate/generate";
20
+ import { generateGqlormArtifacts } from "@cedarjs/internal/dist/generate/gqlormSchema";
10
21
  import { loadAndValidateSdls } from "@cedarjs/internal/dist/validateSchema";
11
22
  import { detectPrerenderRoutes } from "@cedarjs/prerender/detection";
12
23
  import { timedTelemetry } from "@cedarjs/telemetry";
24
+ import { buildCedarApp } from "@cedarjs/vite/build";
13
25
  import { generatePrismaCommand } from "../../lib/generatePrismaClient.js";
14
26
  import { getPaths, getConfig } from "../../lib/index.js";
15
27
  import { buildPackagesTask } from "./buildPackagesTask.js";
28
+ function checkWorkspacePackageEntryPoints(cedarPaths) {
29
+ const packagesDir = cedarPaths.packages;
30
+ if (!packagesDir || !fs.existsSync(packagesDir)) {
31
+ return [];
32
+ }
33
+ const problems = [];
34
+ const packageDirs = fs.readdirSync(packagesDir, { withFileTypes: true });
35
+ for (const entry of packageDirs) {
36
+ if (!entry.isDirectory()) {
37
+ continue;
38
+ }
39
+ const pkgJsonPath = path.join(packagesDir, entry.name, "package.json");
40
+ if (!fs.existsSync(pkgJsonPath)) {
41
+ continue;
42
+ }
43
+ const pkgJson = JSON.parse(
44
+ fs.readFileSync(pkgJsonPath, "utf8")
45
+ );
46
+ const pkgName = pkgJson.name || entry.name;
47
+ const pkgDir = path.join(packagesDir, entry.name);
48
+ const entryFiles = /* @__PURE__ */ new Set();
49
+ if (pkgJson.main) {
50
+ entryFiles.add(path.normalize(pkgJson.main));
51
+ }
52
+ if (pkgJson.exports) {
53
+ const collectPaths = (obj) => {
54
+ if (typeof obj === "string") {
55
+ if (!obj.endsWith(".d.ts")) {
56
+ entryFiles.add(path.normalize(obj));
57
+ }
58
+ } else if (obj && typeof obj === "object") {
59
+ for (const [key, value] of Object.entries(obj)) {
60
+ if (key !== "types") {
61
+ collectPaths(value);
62
+ }
63
+ }
64
+ }
65
+ };
66
+ collectPaths(pkgJson.exports);
67
+ }
68
+ for (const entryFile of entryFiles) {
69
+ const resolvedPath = path.resolve(pkgDir, entryFile);
70
+ if (!fs.existsSync(resolvedPath)) {
71
+ problems.push({ pkgName, entryFile, pkgDir });
72
+ }
73
+ }
74
+ }
75
+ return problems;
76
+ }
16
77
  const handler = async ({
17
78
  workspace = ["api", "web", "packages/*"],
18
79
  verbose = false,
19
80
  prisma = true,
20
- prerender = true
81
+ prerender = true,
82
+ ud = false,
83
+ apiRootPath
21
84
  }) => {
22
85
  recordTelemetryAttributes({
23
86
  command: "build",
24
87
  workspace: JSON.stringify(workspace),
25
88
  verbose,
26
89
  prisma,
27
- prerender
90
+ prerender,
91
+ apiRootPath
28
92
  });
29
93
  const cedarPaths = getPaths();
30
94
  const cedarConfig = getConfig();
31
95
  const useFragments = cedarConfig.graphql?.fragments;
32
96
  const useTrustedDocuments = cedarConfig.graphql?.trustedDocuments;
97
+ const usePackagesWorkspace = cedarConfig.experimental?.packagesWorkspace?.enabled;
33
98
  const prismaSchemaExists = fs.existsSync(cedarPaths.api.prismaConfig);
34
99
  const prerenderRoutes = prerender && workspace.includes("web") ? detectPrerenderRoutes() : [];
35
100
  const shouldGeneratePrismaClient = prisma && prismaSchemaExists && (workspace.includes("api") || prerenderRoutes.length > 0);
36
- const packageJsonPath = path.join(cedarPaths.base, "package.json");
37
- const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf8"));
38
- const packageJsonWorkspaces = packageJson.workspaces;
39
- const nonApiWebWorkspaces = Array.isArray(packageJsonWorkspaces) && packageJsonWorkspaces.length > 2 ? workspace.filter((w) => w !== "api" && w !== "web") : [];
101
+ const nonApiWebWorkspaces = workspace.filter(
102
+ (w) => w !== "api" && w !== "web"
103
+ );
40
104
  const gqlFeaturesTaskTitle = `Generating types needed for ${[
41
105
  useFragments && "GraphQL Fragments",
42
106
  useTrustedDocuments && "Trusted Documents"
@@ -52,10 +116,31 @@ const handler = async ({
52
116
  });
53
117
  }
54
118
  },
55
- nonApiWebWorkspaces.length > 0 && {
119
+ nonApiWebWorkspaces.length > 0 && usePackagesWorkspace && {
56
120
  title: "Building Packages...",
57
121
  task: (_ctx, task) => buildPackagesTask(task, nonApiWebWorkspaces)
58
122
  },
123
+ (workspace.includes("web") || workspace.includes("api")) && usePackagesWorkspace && {
124
+ title: "Checking workspace packages...",
125
+ task: () => {
126
+ const problems = checkWorkspacePackageEntryPoints(cedarPaths);
127
+ if (problems.length === 0) {
128
+ return;
129
+ }
130
+ const details = problems.map(
131
+ ({ pkgName, entryFile, pkgDir }) => ` \u2022 ${c.error(pkgName)}: missing "${entryFile}" (in ${pkgDir})`
132
+ ).join("\n");
133
+ throw new Error(
134
+ `The following workspace package entry points are missing:
135
+ ${details}
136
+
137
+ This usually means the package has not been built yet.
138
+ Run ` + c.info(formatCedarCommand(["build"])) + " (without specifying a workspace) to build everything,\nor build the package manually first, e.g. " + c.info(
139
+ formatRunWorkspaceScriptCommand(problems[0].pkgName, "build")
140
+ )
141
+ );
142
+ }
143
+ },
59
144
  // If using GraphQL Fragments or Trusted Documents, then we need to use
60
145
  // codegen to generate the types needed for possible types and the trusted
61
146
  // document store hashes
@@ -63,43 +148,125 @@ const handler = async ({
63
148
  title: gqlFeaturesTaskTitle,
64
149
  task: generate
65
150
  },
151
+ workspace.includes("web") && cedarConfig.experimental?.gqlorm?.enabled && {
152
+ title: "Generating gqlorm schema...",
153
+ task: async () => {
154
+ const { errors } = await generateGqlormArtifacts();
155
+ if (errors.length > 0) {
156
+ for (const { message } of errors) {
157
+ console.warn(`Warning: ${message}`);
158
+ }
159
+ }
160
+ }
161
+ },
66
162
  workspace.includes("api") && {
67
163
  title: "Verifying graphql schema...",
68
164
  task: loadAndValidateSdls
69
165
  },
70
- workspace.includes("api") && {
166
+ // When streaming SSR is enabled, fall back to the legacy separate build
167
+ // paths because streaming SSR has its own complex build orchestration.
168
+ // Phase 7 (SSR/RSC rebuild) will address unifying this path.
169
+ workspace.includes("api") && getConfig().experimental?.streamingSsr?.enabled && {
71
170
  title: "Building API...",
72
171
  task: async () => {
73
172
  await cleanApiBuild();
74
- const { errors, warnings } = await buildApi();
75
- if (errors.length) {
76
- console.error(errors);
173
+ await buildApiWithVite();
174
+ }
175
+ },
176
+ workspace.includes("web") && getConfig().experimental?.streamingSsr?.enabled && {
177
+ title: "Building Web...",
178
+ task: async () => {
179
+ process.env.VITE_CJS_IGNORE_WARNING = "true";
180
+ const createdRequire = createRequire(import.meta.url);
181
+ const buildBinPath = createdRequire.resolve(
182
+ "@cedarjs/vite/bins/cedar-vite-build.mjs"
183
+ );
184
+ await execa(
185
+ "node",
186
+ [
187
+ buildBinPath,
188
+ `--webDir=${cedarPaths.web.base}`,
189
+ `--verbose=${verbose}`
190
+ ],
191
+ {
192
+ stdio: verbose ? "inherit" : "pipe",
193
+ cwd: cedarPaths.web.base
194
+ }
195
+ );
196
+ if (!getConfig().experimental?.streamingSsr?.enabled) {
197
+ console.log("Creating 200.html...");
198
+ const indexHtmlPath = path.join(getPaths().web.dist, "index.html");
199
+ fs.copyFileSync(
200
+ indexHtmlPath,
201
+ path.join(getPaths().web.dist, "200.html")
202
+ );
77
203
  }
204
+ }
205
+ },
206
+ // Legacy separate build path (default when not --ud, non-streaming-SSR)
207
+ workspace.includes("api") && !ud && !getConfig().experimental?.streamingSsr?.enabled && {
208
+ title: "Building API...",
209
+ task: async () => {
210
+ await cleanApiBuild();
211
+ const { errors, warnings } = await buildApi();
78
212
  if (warnings.length) {
79
213
  console.warn(warnings);
80
214
  }
215
+ if (errors.length) {
216
+ throw new Error(
217
+ `API build failed with ${errors.length} error(s). See output above for details.`
218
+ );
219
+ }
81
220
  }
82
221
  },
83
- workspace.includes("web") && {
222
+ workspace.includes("web") && !ud && !getConfig().experimental?.streamingSsr?.enabled && {
84
223
  title: "Building Web...",
85
224
  task: async () => {
86
225
  process.env.VITE_CJS_IGNORE_WARNING = "true";
87
226
  const createdRequire = createRequire(import.meta.url);
88
227
  const buildBinPath = createdRequire.resolve(
89
- "@cedarjs/vite/bins/rw-vite-build.mjs"
228
+ "@cedarjs/vite/bins/cedar-vite-build.mjs"
90
229
  );
91
230
  await execa(
92
- `node ${buildBinPath} --webDir="${cedarPaths.web.base}" --verbose=${verbose}`,
231
+ "node",
232
+ [
233
+ buildBinPath,
234
+ `--webDir=${cedarPaths.web.base}`,
235
+ `--verbose=${verbose}`
236
+ ],
93
237
  {
94
238
  stdio: verbose ? "inherit" : "pipe",
95
- shell: true,
96
- // `cwd` is needed for yarn to find the rw-vite-build binary
239
+ // `cwd` makes postcss/tailwind config resolution work (see the
240
+ // @NOTE above)
97
241
  // It won't change process.cwd for anything else here, in this
98
242
  // process
99
243
  cwd: cedarPaths.web.base
100
244
  }
101
245
  );
102
- if (!getConfig().experimental?.streamingSsr?.enabled) {
246
+ console.log("Creating 200.html...");
247
+ const indexHtmlPath = path.join(getPaths().web.dist, "index.html");
248
+ fs.copyFileSync(
249
+ indexHtmlPath,
250
+ path.join(getPaths().web.dist, "200.html")
251
+ );
252
+ }
253
+ },
254
+ // Unified build path (experimental, non-streaming-SSR, --ud)
255
+ (workspace.includes("api") || workspace.includes("web")) && ud && !getConfig().experimental?.streamingSsr?.enabled && {
256
+ title: workspace.includes("api") && workspace.includes("web") ? "Building App..." : workspace.includes("api") ? "Building API..." : "Building Web...",
257
+ task: async () => {
258
+ process.env.VITE_CJS_IGNORE_WARNING = "true";
259
+ if (workspace.includes("api")) {
260
+ await cleanApiBuild();
261
+ }
262
+ const originalCwd = process.cwd();
263
+ process.chdir(cedarPaths.web.base);
264
+ try {
265
+ await buildCedarApp({ verbose, workspace, ud: true });
266
+ } finally {
267
+ process.chdir(originalCwd);
268
+ }
269
+ if (workspace.includes("web")) {
103
270
  console.log("Creating 200.html...");
104
271
  const indexHtmlPath = path.join(getPaths().web.dist, "index.html");
105
272
  fs.copyFileSync(
@@ -109,34 +276,42 @@ const handler = async ({
109
276
  }
110
277
  }
111
278
  }
112
- ].filter(Boolean);
113
- const triggerPrerender = async () => {
114
- console.log("Starting prerendering...");
115
- if (prerenderRoutes.length === 0) {
116
- console.log(
117
- `You have not marked any routes to "prerender" in your ${terminalLink(
118
- "Routes",
119
- "file://" + cedarPaths.web.routes
120
- )}.`
121
- );
122
- return;
123
- }
124
- await execa("yarn cedar prerender", {
125
- stdio: "inherit",
126
- shell: true,
127
- cwd: cedarPaths.web.base
279
+ ];
280
+ if (apiRootPath !== void 0) {
281
+ process.env.CEDAR_API_ROOT_PATH = apiRootPath;
282
+ }
283
+ try {
284
+ await timedTelemetry(process.argv, { type: "build" }, async () => {
285
+ const listrTasks = tasks.filter((t) => Boolean(t));
286
+ const jobs = new Listr(listrTasks, {
287
+ renderer: verbose ? "verbose" : void 0
288
+ });
289
+ await jobs.run();
290
+ if (workspace.includes("web") && prerender && prismaSchemaExists) {
291
+ await triggerPrerender(prerenderRoutes);
292
+ }
128
293
  });
129
- };
130
- const jobs = new Listr(tasks, {
131
- renderer: verbose ? "verbose" : void 0
132
- });
133
- await timedTelemetry(process.argv, { type: "build" }, async () => {
134
- await jobs.run();
135
- if (workspace.includes("web") && prerender && prismaSchemaExists) {
136
- await triggerPrerender();
137
- }
138
- });
294
+ } finally {
295
+ delete process.env.CEDAR_API_ROOT_PATH;
296
+ }
139
297
  };
298
+ async function triggerPrerender(prerenderRoutes) {
299
+ const cedarPaths = getPaths();
300
+ console.log("Starting prerendering...");
301
+ if (prerenderRoutes.length === 0) {
302
+ console.log(
303
+ `You have not marked any routes to "prerender" in your ${terminalLink(
304
+ "Routes",
305
+ "file://" + cedarPaths.web.routes
306
+ )}.`
307
+ );
308
+ return;
309
+ }
310
+ await runBin("cedar", ["prerender"], {
311
+ stdio: "inherit",
312
+ cwd: cedarPaths.web.base
313
+ });
314
+ }
140
315
  export {
141
316
  handler
142
317
  };
@@ -1,9 +1,8 @@
1
1
  import fs from "node:fs";
2
2
  import path from "node:path";
3
- import concurrently from "concurrently";
3
+ import { runScript } from "@cedarjs/cli-helpers/packageManager/exec";
4
4
  import { importStatementPath } from "@cedarjs/project-config";
5
5
  import { errorTelemetry } from "@cedarjs/telemetry";
6
- import { exitWithError } from "../../lib/exit.js";
7
6
  import { getPaths } from "../../lib/index.js";
8
7
  async function buildPackagesTask(task, nonApiWebWorkspaces) {
9
8
  const cedarPaths = getPaths();
@@ -11,7 +10,7 @@ async function buildPackagesTask(task, nonApiWebWorkspaces) {
11
10
  const workspacePaths = nonApiWebWorkspaces.some((w) => w === "packages/*") ? await Array.fromAsync(fs.promises.glob(globPattern)) : nonApiWebWorkspaces.map((w) => {
12
11
  const workspacePath = path.join(
13
12
  cedarPaths.packages,
14
- w.split("/").at(-1)
13
+ w.split("/").at(-1) ?? ""
15
14
  );
16
15
  if (!fs.existsSync(workspacePath)) {
17
16
  return "";
@@ -22,28 +21,30 @@ async function buildPackagesTask(task, nonApiWebWorkspaces) {
22
21
  task.skip("No packages to build at " + nonApiWebWorkspaces.join(", "));
23
22
  return;
24
23
  }
25
- const { result } = concurrently(
24
+ return task.newListr(
26
25
  workspacePaths.map((workspacePath) => {
26
+ const name = workspacePath.split("/").at(-1);
27
27
  return {
28
- command: `yarn build`,
29
- name: workspacePath.split("/").at(-1),
30
- cwd: workspacePath
28
+ title: name,
29
+ task: async () => {
30
+ try {
31
+ await runScript("build", [], { cwd: workspacePath });
32
+ } catch (e) {
33
+ const message = e instanceof Error ? e.message : String(e);
34
+ const stderr = e instanceof Error && "stderr" in e && typeof e.stderr === "string" ? e.stderr : void 0;
35
+ errorTelemetry(
36
+ process.argv,
37
+ `Error building package "${name}": ${message}`
38
+ );
39
+ throw new Error(`Building "${name}" failed
40
+
41
+ ${stderr || message}`);
42
+ }
43
+ }
31
44
  };
32
45
  }),
33
- {
34
- prefix: "{name} |",
35
- timestampFormat: "HH:mm:ss"
36
- }
46
+ { concurrent: true, rendererOptions: { collapseSubtasks: false } }
37
47
  );
38
- await result.catch((e) => {
39
- if (e?.message) {
40
- errorTelemetry(
41
- process.argv,
42
- `Error concurrently building sides: ${e.message}`
43
- );
44
- exitWithError(e);
45
- }
46
- });
47
48
  }
48
49
  export {
49
50
  buildPackagesTask
@@ -1,5 +1,5 @@
1
1
  import { terminalLink } from "termi-link";
2
- import c from "../lib/colors.js";
2
+ import { colors as c } from "@cedarjs/cli-helpers/colors";
3
3
  import { exitWithError } from "../lib/exit.js";
4
4
  import { workspaces } from "../lib/project.js";
5
5
  import { checkNodeVersion } from "../middleware/checkNodeVersion.js";
@@ -9,7 +9,8 @@ const builder = (yargs) => {
9
9
  yargs.positional("workspace", {
10
10
  default: ["api", "web", "packages/*"],
11
11
  description: "What workspace(s) to build. Valid values are: web, api, packages/*, <package-name>",
12
- type: "array"
12
+ type: "string",
13
+ array: true
13
14
  }).option("verbose", {
14
15
  alias: "v",
15
16
  default: false,
@@ -24,6 +25,13 @@ const builder = (yargs) => {
24
25
  alias: "db",
25
26
  default: true,
26
27
  description: "Generate the Prisma client"
28
+ }).option("ud", {
29
+ type: "boolean",
30
+ default: false,
31
+ description: "Build the Universal Deploy server entry (api/dist/ud/)."
32
+ }).option("apiRootPath", {
33
+ type: "string",
34
+ description: 'Root path where API functions are served. Overrides the apiRootPath option on cedarUniversalDeployPlugin() in your vite config. Defaults to "/".'
27
35
  }).middleware(() => {
28
36
  const check = checkNodeVersion();
29
37
  if (check.ok) {
@@ -38,6 +46,9 @@ const builder = (yargs) => {
38
46
  if (!Array.isArray(workspacesArg)) {
39
47
  return "Workspace must be an array";
40
48
  }
49
+ if (argv.apiRootPath && !argv.ud) {
50
+ return c.error("Error:") + " --apiRootPath requires --ud.\n Use --ud to build the Universal Deploy server entry.";
51
+ }
41
52
  const filtered = workspacesArg.filter(
42
53
  (item) => item !== "api" && item !== "web" && item !== "packages/*"
43
54
  );
@@ -1,14 +1,12 @@
1
- import { recordTelemetryAttributes } from "@cedarjs/cli-helpers";
2
- import c from "../lib/colors.js";
3
- import { getPaths } from "../lib/index.js";
1
+ import { colors as c } from "@cedarjs/cli-helpers/colors";
2
+ import { recordTelemetryAttributes } from "@cedarjs/cli-helpers/telemetry";
4
3
  const command = "check";
5
4
  const aliases = ["diagnostics"];
6
5
  const description = "Get structural diagnostics for a Redwood project (experimental)";
7
6
  const handler = async () => {
8
7
  recordTelemetryAttributes({ command: "check" });
9
- const { printDiagnostics, DiagnosticSeverity } = (await import("@cedarjs/structure")).default;
10
- console.log("DiagnosticServerity", DiagnosticSeverity);
11
- printDiagnostics(getPaths().base, {
8
+ const { printDiagnostics, DiagnosticSeverity } = await import("@cedarjs/structure");
9
+ printDiagnostics({
12
10
  getSeverityLabel: (severity) => {
13
11
  if (severity === DiagnosticSeverity.Error) {
14
12
  return c.error("error");
@@ -1,9 +1,11 @@
1
1
  const command = "console";
2
2
  const aliases = ["c"];
3
- const description = "Launch an interactive Redwood shell (experimental)";
4
- const handler = async (options) => {
5
- const { handler: handler2 } = await import("./consoleHandler.js");
6
- return handler2(options);
3
+ const description = "Launch an interactive Cedar shell";
4
+ const handler = async () => {
5
+ console.log(
6
+ "`cedar console` has been removed from the Cedar CLI.\nRun it as a standalone tool instead:\n\n yarn dlx @cedarjs/console\n npx @cedarjs/console\n pnpm dlx @cedarjs/console\n"
7
+ );
8
+ process.exit(1);
7
9
  };
8
10
  export {
9
11
  aliases,
@@ -1,5 +1,15 @@
1
1
  import { NodeSSH } from "node-ssh";
2
+ class ExecError extends Error {
3
+ exitCode;
4
+ constructor(message, exitCode) {
5
+ super(message);
6
+ this.name = "ExecError";
7
+ this.exitCode = exitCode;
8
+ }
9
+ }
2
10
  class SshExecutor {
11
+ ssh;
12
+ verbose;
3
13
  constructor(verbose) {
4
14
  this.ssh = new NodeSSH();
5
15
  this.verbose = verbose;
@@ -20,12 +30,11 @@ class SshExecutor {
20
30
  cwd: path
21
31
  });
22
32
  if (result.code !== 0) {
23
- const error = new Error(
33
+ throw new ExecError(
24
34
  `Error while running command \`${sshCommand}\` in ${path}
25
- ` + result.stderr
35
+ ` + result.stderr,
36
+ result.code
26
37
  );
27
- error.exitCode = result.code;
28
- throw error;
29
38
  }
30
39
  return result;
31
40
  }