@cedarjs/cli 4.2.1-next.0 → 4.2.1-next.258

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 (153) hide show
  1. package/dist/cfw.js +8 -6
  2. package/dist/commands/build/buildHandler.js +43 -42
  3. package/dist/commands/build/buildPackagesTask.js +6 -6
  4. package/dist/commands/build.js +7 -1
  5. package/dist/commands/deploy/baremetal/SshExecutor.js +13 -4
  6. package/dist/commands/deploy/baremetal/baremetalHandler.js +117 -65
  7. package/dist/commands/deploy/baremetal.js +24 -3
  8. package/dist/commands/deploy/flightcontrolHandler.js +16 -14
  9. package/dist/commands/deploy/helpers/deployHandler.js +10 -5
  10. package/dist/commands/deploy/packing/nft.js +1 -2
  11. package/dist/commands/deploy/render.js +1 -1
  12. package/dist/commands/deploy/renderHandler.js +22 -12
  13. package/dist/commands/deploy/serverlessHandler.js +67 -25
  14. package/dist/commands/destroy/component/component.js +2 -3
  15. package/dist/commands/destroy/directive/directive.js +1 -3
  16. package/dist/commands/destroy/directive/directiveHandler.js +2 -4
  17. package/dist/commands/destroy/function/function.js +1 -3
  18. package/dist/commands/destroy/handlerHelpers.js +16 -16
  19. package/dist/commands/destroy/helpers.js +8 -2
  20. package/dist/commands/destroy/layout/layout.js +1 -2
  21. package/dist/commands/destroy/page/pageHandler.js +1 -1
  22. package/dist/commands/destroy/scaffold/scaffoldHandler.js +28 -9
  23. package/dist/commands/destroy/sdl/sdlHandler.js +1 -1
  24. package/dist/commands/dev/devHandler.js +25 -25
  25. package/dist/commands/dev.js +3 -0
  26. package/dist/commands/experimental/live-queries/liveQueriesHandler.js +110 -4
  27. package/dist/commands/experimental/setupInngest.js +1 -1
  28. package/dist/commands/experimental/setupInngestHandler.js +12 -11
  29. package/dist/commands/experimental/setupOpentelemetry.js +1 -1
  30. package/dist/commands/experimental/setupOpentelemetryHandler.js +11 -7
  31. package/dist/commands/experimental/setupReactCompiler.js +1 -1
  32. package/dist/commands/experimental/setupReactCompilerHandler.js +45 -30
  33. package/dist/commands/experimental/setupRscHandler.js +14 -11
  34. package/dist/commands/experimental/setupStreamingSsr.js +1 -1
  35. package/dist/commands/experimental/setupStreamingSsrHandler.js +46 -31
  36. package/dist/commands/experimental/templates/rsc/Document.tsx.template +1 -1
  37. package/dist/commands/experimental/templates/rsc/entry.client.tsx.template +8 -8
  38. package/dist/commands/experimental/templates/streamingSsr/Document.tsx.template +1 -1
  39. package/dist/commands/experimental/templates/streamingSsr/entry.client.tsx.template +6 -6
  40. package/dist/commands/experimental/util.js +3 -2
  41. package/dist/commands/generate/cell/cellHandler.js +22 -21
  42. package/dist/commands/generate/component/componentHandler.js +14 -16
  43. package/dist/commands/generate/dataMigration/dataMigration.js +24 -13
  44. package/dist/commands/generate/dbAuth/dbAuth.js +1 -0
  45. package/dist/commands/generate/dbAuth/dbAuthHandler.js +40 -30
  46. package/dist/commands/generate/directive/directiveHandler.js +12 -14
  47. package/dist/commands/generate/function/function.js +1 -0
  48. package/dist/commands/generate/function/functionHandler.js +12 -17
  49. package/dist/commands/generate/helpers.js +17 -17
  50. package/dist/commands/generate/job/job.js +1 -0
  51. package/dist/commands/generate/job/jobHandler.js +15 -17
  52. package/dist/commands/generate/layout/layoutHandler.js +13 -16
  53. package/dist/commands/generate/model/model.js +1 -0
  54. package/dist/commands/generate/model/modelHandler.js +9 -3
  55. package/dist/commands/generate/ogImage/ogImage.js +1 -0
  56. package/dist/commands/generate/ogImage/ogImageHandler.js +16 -9
  57. package/dist/commands/generate/package/packageHandler.js +32 -49
  58. package/dist/commands/generate/page/pageHandler.js +25 -22
  59. package/dist/commands/generate/realtime/realtime.js +1 -1
  60. package/dist/commands/generate/realtime/realtimeHandler.js +46 -20
  61. package/dist/commands/generate/scaffold/scaffold.js +1 -0
  62. package/dist/commands/generate/scaffold/scaffoldHandler.js +35 -27
  63. package/dist/commands/generate/script/script.js +1 -0
  64. package/dist/commands/generate/script/templates/tsconfig.json.template +14 -0
  65. package/dist/commands/generate/sdl/sdl.js +4 -3
  66. package/dist/commands/generate/sdl/sdlHandler.js +38 -18
  67. package/dist/commands/generate/secret/secret.js +19 -19
  68. package/dist/commands/generate/service/service.js +5 -5
  69. package/dist/commands/generate/service/serviceHandler.js +59 -22
  70. package/dist/commands/generate/yargsCommandHelpers.js +6 -1
  71. package/dist/commands/generate/yargsHandlerHelpers.js +18 -10
  72. package/dist/commands/generate.js +3 -10
  73. package/dist/commands/jobsHandler.js +3 -2
  74. package/dist/commands/prismaHandler.js +10 -9
  75. package/dist/commands/serve.js +84 -137
  76. package/dist/commands/serveApiHandler.js +5 -5
  77. package/dist/commands/serveBothHandler.js +10 -7
  78. package/dist/commands/serveWebHandler.js +2 -2
  79. package/dist/commands/setup/auth/auth.js +12 -6
  80. package/dist/commands/setup/cache/cacheHandler.js +11 -6
  81. package/dist/commands/setup/deploy/deploy.js +4 -3
  82. package/dist/commands/setup/deploy/helpers/helpers.js +5 -1
  83. package/dist/commands/setup/deploy/helpers/index.js +157 -5
  84. package/dist/commands/setup/deploy/providers/baremetalHandler.js +26 -4
  85. package/dist/commands/setup/deploy/providers/coherenceHandler.js +53 -25
  86. package/dist/commands/setup/deploy/providers/flightcontrolHandler.js +33 -23
  87. package/dist/commands/setup/deploy/providers/netlify.js +6 -0
  88. package/dist/commands/setup/deploy/providers/netlifyHandler.js +112 -11
  89. package/dist/commands/setup/deploy/providers/renderHandler.js +10 -5
  90. package/dist/commands/setup/deploy/providers/serverlessHandler.js +5 -3
  91. package/dist/commands/setup/deploy/providers/universal-deploy.js +11 -0
  92. package/dist/commands/setup/deploy/providers/universalDeployHandler.js +188 -0
  93. package/dist/commands/setup/deploy/providers/vercel.js +6 -0
  94. package/dist/commands/setup/deploy/providers/vercelHandler.js +113 -12
  95. package/dist/commands/setup/deploy/templates/baremetal.js +3 -2
  96. package/dist/commands/setup/deploy/templates/flightcontrol.js +60 -49
  97. package/dist/commands/setup/deploy/templates/netlify.js +2 -1
  98. package/dist/commands/setup/deploy/templates/netlifyUD.js +31 -0
  99. package/dist/commands/setup/docker/docker.js +1 -1
  100. package/dist/commands/setup/docker/dockerHandler.js +72 -37
  101. package/dist/commands/setup/docker/templates/Dockerfile.npm +119 -0
  102. package/dist/commands/setup/docker/templates/Dockerfile.pnpm +112 -0
  103. package/dist/commands/setup/docker/templates/{Dockerfile → Dockerfile.yarn} +1 -1
  104. package/dist/commands/setup/docker/templates/docker-compose.dev.yml +2 -2
  105. package/dist/commands/setup/generator/generatorHandler.js +4 -3
  106. package/dist/commands/setup/graphql/features/fragments/fragmentsHandler.js +2 -2
  107. package/dist/commands/setup/graphql/features/trustedDocuments/trustedDocumentsHandler.js +2 -2
  108. package/dist/commands/setup/i18n/i18nHandler.js +18 -15
  109. package/dist/commands/setup/jobs/jobsHandler.js +10 -5
  110. package/dist/commands/setup/mailer/mailerHandler.js +11 -9
  111. package/dist/commands/setup/package/packageHandler.js +14 -10
  112. package/dist/commands/setup/realtime/realtimeHandler.js +22 -20
  113. package/dist/commands/setup/server-file/serverFileHandler.js +16 -8
  114. package/dist/commands/setup/tsconfig/tsconfigHandler.js +5 -3
  115. package/dist/commands/setup/ui/helpers/helpers.js +5 -1
  116. package/dist/commands/setup/ui/libraries/chakra-uiHandler.js +11 -5
  117. package/dist/commands/setup/ui/libraries/mantineHandler.js +21 -13
  118. package/dist/commands/setup/ui/libraries/tailwindcssHandler.js +38 -26
  119. package/dist/commands/setup/uploads/uploadsHandler.js +7 -4
  120. package/dist/commands/setup.js +1 -2
  121. package/dist/commands/test/testHandler.js +2 -1
  122. package/dist/commands/test/testHandlerEsm.js +2 -2
  123. package/dist/commands/type-checkHandler.js +4 -6
  124. package/dist/commands/upgrade/upgradeHandler.js +2 -4
  125. package/dist/index.js +10 -4
  126. package/dist/lib/configureStorybook.js +2 -2
  127. package/dist/lib/exec.js +36 -24
  128. package/dist/lib/exit.js +19 -4
  129. package/dist/lib/extendFile.js +22 -12
  130. package/dist/lib/index.js +119 -85
  131. package/dist/lib/merge/algorithms.js +4 -1
  132. package/dist/lib/merge/index.js +76 -41
  133. package/dist/lib/merge/semanticIdentity.js +18 -6
  134. package/dist/lib/merge/strategy.js +86 -36
  135. package/dist/lib/packages.js +23 -13
  136. package/dist/lib/plugin.js +12 -5
  137. package/dist/lib/pluralHelpers.js +1 -1
  138. package/dist/lib/project.js +3 -1
  139. package/dist/lib/rollback.js +7 -7
  140. package/dist/lib/schemaHelpers.js +12 -12
  141. package/dist/lib/test.js +4 -0
  142. package/dist/lib/updateCheck.js +6 -4
  143. package/dist/middleware/checkNodeVersion.js +5 -0
  144. package/dist/plugin.js +18 -12
  145. package/dist/telemetry/exporter.js +12 -5
  146. package/dist/telemetry/index.js +4 -3
  147. package/dist/telemetry/resource.js +9 -5
  148. package/dist/telemetry/send.js +14 -10
  149. package/package.json +15 -12
  150. package/dist/commands/setup/vite/templates/vite.config.ts.template +0 -19
  151. package/dist/commands/setup/vite/vite.js +0 -38
  152. package/dist/commands/setup/vite/viteHandler.js +0 -82
  153. /package/dist/{index.d.js → global.d.js} +0 -0
@@ -1,6 +1,6 @@
1
1
  import { terminalLink } from "termi-link";
2
2
  import { createHandler, getYargsDefaults } from "../yargsCommandHelpers.js";
3
- const getDefaults = () => {
3
+ const getDefaultOptions = () => {
4
4
  return {
5
5
  ...getYargsDefaults(),
6
6
  crud: {
@@ -34,15 +34,16 @@ const builder = (yargs) => {
34
34
  "https://cedarjs.com/docs/cli-commands#generate-sdl"
35
35
  )}`
36
36
  );
37
- Object.entries(getDefaults()).forEach(([option, config]) => {
37
+ Object.entries(getDefaultOptions()).forEach(([option, config]) => {
38
38
  yargs.option(option, config);
39
39
  });
40
+ return yargs;
40
41
  };
41
42
  const handler = createHandler("sdl");
42
43
  export {
43
44
  builder,
44
45
  command,
45
46
  description,
46
- getDefaults,
47
+ getDefaultOptions,
47
48
  handler
48
49
  };
@@ -49,8 +49,11 @@ const modelFieldToSDL = ({
49
49
  types = {},
50
50
  docs = false
51
51
  }) => {
52
- if (Object.entries(types).length) {
53
- field.type = field.kind === "object" ? idType(types[field.type]) : field.type;
52
+ if (Object.entries(types).length && field.kind === "object") {
53
+ const resolvedType = idType(types[field.type]);
54
+ if (typeof resolvedType === "string") {
55
+ field.type = resolvedType;
56
+ }
54
57
  }
55
58
  const prismaTypeToGraphqlType = {
56
59
  Json: "JSON",
@@ -74,33 +77,33 @@ const inputSDL = (model, required, types = {}, docs = false) => {
74
77
  const ignoredFields = DEFAULT_IGNORE_FIELDS_FOR_INPUT;
75
78
  return model.fields.filter((field) => {
76
79
  const idField = model.fields.find((field2) => field2.isId);
77
- if (idField && idField.default) {
80
+ if (idField?.default) {
78
81
  ignoredFields.push(idField.name);
79
82
  }
80
- return ignoredFields.indexOf(field.name) === -1 && field.kind !== "object";
83
+ return !ignoredFields.includes(field.name) && field.kind !== "object";
81
84
  }).map((field) => modelFieldToSDL({ field, required, types, docs }));
82
85
  };
83
- const idInputSDL = (idType2, docs) => {
86
+ function idInputSDL(idType2, docs) {
84
87
  if (!Array.isArray(idType2)) {
85
88
  return [];
86
89
  }
87
90
  return idType2.map(
88
91
  (field) => modelFieldToSDL({ field, required: true, types: {}, docs })
89
92
  );
90
- };
93
+ }
91
94
  const createInputSDL = (model, types = {}, docs = false) => {
92
95
  return inputSDL(model, true, types, docs);
93
96
  };
94
97
  const updateInputSDL = (model, types = {}, docs = false) => {
95
98
  return inputSDL(model, false, types, docs);
96
99
  };
97
- const idType = (model, crud) => {
98
- if (!crud) {
100
+ function idType(model, crud) {
101
+ if (!crud || !model) {
99
102
  return void 0;
100
103
  }
101
104
  if (model.primaryKey?.fields.length) {
102
105
  const { fields: fieldNames } = model.primaryKey;
103
- return fieldNames.map((name) => model.fields.find((f) => f.name === name));
106
+ return fieldNames.map((name) => model.fields.find((f) => f.name === name)).filter((f) => f !== void 0);
104
107
  }
105
108
  const idField = model.fields.find((field) => field.isId);
106
109
  if (!idField) {
@@ -108,7 +111,7 @@ const idType = (model, crud) => {
108
111
  throw new Error("Failed: Could not generate SDL");
109
112
  }
110
113
  return idField.type;
111
- };
114
+ }
112
115
  const idName = (model, crud) => {
113
116
  if (!crud) {
114
117
  return void 0;
@@ -121,13 +124,28 @@ const idName = (model, crud) => {
121
124
  return idField.name;
122
125
  };
123
126
  const sdlFromSchemaModel = async (name, crud, docs = false) => {
124
- const model = await getSchema(name);
125
- const types = (await Promise.all(
127
+ const schemaResult = await getSchema(name);
128
+ if (!schemaResult || !("fields" in schemaResult)) {
129
+ throw new Error(
130
+ `No schema definition found for \`${name}\` in schema.prisma file`
131
+ );
132
+ }
133
+ const model = schemaResult;
134
+ const resolvedTypes = await Promise.all(
126
135
  model.fields.filter((field) => field.kind === "object").map(async (field) => {
127
- const model2 = await getSchema(field.type);
128
- return model2;
136
+ const fieldModel = await getSchema(field.type);
137
+ return fieldModel && "fields" in fieldModel ? fieldModel : void 0;
129
138
  })
130
- )).reduce((acc, cur) => ({ ...acc, [cur.name]: cur }), {});
139
+ );
140
+ const types = resolvedTypes.reduce(
141
+ (acc, cur) => {
142
+ if (!cur) {
143
+ return acc;
144
+ }
145
+ return { ...acc, [cur.name]: cur };
146
+ },
147
+ {}
148
+ );
131
149
  const enums = (await Promise.all(
132
150
  model.fields.filter((field) => field.kind === "enum").map(async (field) => {
133
151
  const enumDef = await getEnum(field.type);
@@ -237,9 +255,11 @@ const handler = async ({
237
255
  }
238
256
  await tasks.run();
239
257
  } catch (e) {
240
- errorTelemetry(process.argv, e.message);
241
- console.error(c.error(e.message));
242
- process.exit(e?.exitCode || 1);
258
+ const message = e instanceof Error ? e.message : String(e);
259
+ const exitCode = e instanceof Error && "exitCode" in e && typeof e.exitCode === "number" ? e.exitCode : 1;
260
+ errorTelemetry(process.argv, message);
261
+ console.error(c.error(message));
262
+ process.exit(exitCode);
243
263
  }
244
264
  };
245
265
  export {
@@ -3,27 +3,27 @@ import { terminalLink } from "termi-link";
3
3
  import { recordTelemetryAttributes } from "@cedarjs/cli-helpers";
4
4
  const DEFAULT_LENGTH = 32;
5
5
  const generateSecret = (length = DEFAULT_LENGTH) => {
6
- return crypto.randomBytes(length).toString("base64");
6
+ return crypto.randomBytes(Math.trunc(length)).toString("base64");
7
7
  };
8
8
  const command = "secret";
9
9
  const description = "Generates a secret key using a cryptographically-secure source of entropy";
10
- const builder = (yargs) => yargs.option("length", {
11
- description: "Length of the generated secret",
12
- type: "integer",
13
- required: false,
14
- default: DEFAULT_LENGTH
15
- }).option("raw", {
16
- description: "Prints just the raw secret",
17
- type: "boolean",
18
- required: false,
19
- default: false
20
- }).epilogue(
21
- `Also see the ${terminalLink(
22
- "CedarJS CLI Reference",
23
- "https://cedarjs.com/docs/cli-commands#generate-secret"
24
- )}`
25
- );
26
- const handler = ({ length, raw }) => {
10
+ function builder(yargs) {
11
+ return yargs.option("length", {
12
+ description: "Length of the generated secret",
13
+ type: "number",
14
+ default: DEFAULT_LENGTH
15
+ }).option("raw", {
16
+ description: "Prints just the raw secret",
17
+ type: "boolean",
18
+ default: false
19
+ }).epilogue(
20
+ `Also see the ${terminalLink(
21
+ "CedarJS CLI Reference",
22
+ "https://cedarjs.com/docs/cli-commands#generate-secret"
23
+ )}`
24
+ );
25
+ }
26
+ function handler({ length, raw }) {
27
27
  recordTelemetryAttributes({
28
28
  command: "generate secret",
29
29
  length,
@@ -41,7 +41,7 @@ const handler = ({ length, raw }) => {
41
41
  );
42
42
  console.info("");
43
43
  console.info("Keep it secret, keep it safe!");
44
- };
44
+ }
45
45
  export {
46
46
  DEFAULT_LENGTH,
47
47
  builder,
@@ -5,8 +5,8 @@ import {
5
5
  createHandler,
6
6
  getYargsDefaults
7
7
  } from "../yargsCommandHelpers.js";
8
- const defaults = () => {
9
- const defaults2 = {
8
+ const getDefaultOptions = () => {
9
+ return {
10
10
  ...getYargsDefaults(),
11
11
  tests: {
12
12
  description: "Generate test files",
@@ -18,7 +18,6 @@ const defaults = () => {
18
18
  type: "boolean"
19
19
  }
20
20
  };
21
- return defaults2;
22
21
  };
23
22
  const command = createCommand("service");
24
23
  const description = createDescription("service");
@@ -36,15 +35,16 @@ const builder = (yargs) => {
36
35
  "https://cedarjs.com/docs/cli-commands#generate-service"
37
36
  )}`
38
37
  );
39
- Object.entries(defaults()).forEach(([option, config]) => {
38
+ Object.entries(getDefaultOptions()).forEach(([option, config]) => {
40
39
  yargs.option(option, config);
41
40
  });
41
+ return yargs;
42
42
  };
43
43
  const handler = createHandler("service");
44
44
  export {
45
45
  builder,
46
46
  command,
47
- defaults,
48
47
  description,
48
+ getDefaultOptions,
49
49
  handler
50
50
  };
@@ -5,12 +5,21 @@ import { transformTSToJS } from "../../../lib/index.js";
5
5
  import { getSchema, verifyModelName } from "../../../lib/schemaHelpers.js";
6
6
  import { relationsForModel } from "../helpers.js";
7
7
  import { createHandler, templateForFile } from "../yargsHandlerHelpers.js";
8
+ function isServiceModel(schema) {
9
+ return typeof schema === "object" && schema !== null && "fields" in schema && "name" in schema;
10
+ }
8
11
  const DEFAULT_SCENARIO_NAMES = ["one", "two"];
9
12
  const parseSchema = async (model) => {
10
- const schema = await getSchema(model);
13
+ const schemaResult = await getSchema(model);
14
+ if (!isServiceModel(schemaResult)) {
15
+ throw new Error(
16
+ `No schema definition found for \`${model}\` in schema.prisma file`
17
+ );
18
+ }
19
+ const schema = schemaResult;
11
20
  const relations = {};
12
21
  let foreignKeys = [];
13
- let scalarFields = schema.fields.filter((field) => {
22
+ const scalarFields = schema.fields.filter((field) => {
14
23
  if (field.relationFromFields) {
15
24
  if (field.isRequired && field.relationFromFields.length !== 0) {
16
25
  relations[field.name] = {
@@ -27,11 +36,11 @@ const parseSchema = async (model) => {
27
36
  };
28
37
  function scenarioFieldValue(field) {
29
38
  const randFloat = Math.random() * 1e7;
30
- const randInt = parseInt(Math.random() * 1e7);
39
+ const randInt = parseInt(String(Math.random() * 1e7));
31
40
  const randIntArray = [
32
- parseInt(Math.random() * 300),
33
- parseInt(Math.random() * 300),
34
- parseInt(Math.random() * 300)
41
+ parseInt(String(Math.random() * 300)),
42
+ parseInt(String(Math.random() * 300)),
43
+ parseInt(String(Math.random() * 300))
35
44
  ];
36
45
  switch (field.type) {
37
46
  case "BigInt":
@@ -55,11 +64,12 @@ function scenarioFieldValue(field) {
55
64
  case "Bytes":
56
65
  return `new Uint8Array([${randIntArray}])`;
57
66
  default: {
58
- if (field.kind === "enum" && field.enumValues[0]) {
67
+ if (field.kind === "enum" && field.enumValues?.[0]) {
59
68
  return field.enumValues[0].dbName || field.enumValues[0].name;
60
69
  }
61
70
  }
62
71
  }
72
+ return void 0;
63
73
  }
64
74
  const fieldsToScenario = async (scalarFields, relations, foreignKeys) => {
65
75
  const data = {};
@@ -126,15 +136,18 @@ const buildStringifiedScenario = async (model) => {
126
136
  };
127
137
  const fieldTypes = async (model) => {
128
138
  const { scalarFields } = await parseSchema(model);
129
- return scalarFields.reduce((acc, value) => {
130
- acc[value.name] = value.type;
131
- return acc;
132
- }, {});
139
+ return scalarFields.reduce(
140
+ (acc, value) => {
141
+ acc[value.name] = value.type;
142
+ return acc;
143
+ },
144
+ {}
145
+ );
133
146
  };
134
147
  const fieldsToInput = async (model) => {
135
148
  const { scalarFields, foreignKeys } = await parseSchema(model);
136
149
  const modelName = camelcase(singularize(model));
137
- let inputObj = {};
150
+ const inputObj = {};
138
151
  scalarFields.forEach((field) => {
139
152
  if (foreignKeys.includes(field.name)) {
140
153
  inputObj[field.name] = `scenario.${modelName}.two.${field.name}`;
@@ -152,7 +165,9 @@ const fieldsToUpdate = async (model) => {
152
165
  const { scalarFields, relations, foreignKeys } = await parseSchema(model);
153
166
  const modelName = camelcase(singularize(model));
154
167
  let field, newValue, fieldName;
155
- field = scalarFields.find((scalar) => !foreignKeys.includes(scalar.name));
168
+ field = scalarFields.find(
169
+ (scalar) => !foreignKeys.includes(scalar.name)
170
+ );
156
171
  if (!field) {
157
172
  field = scalarFields[0];
158
173
  }
@@ -168,25 +183,31 @@ const fieldsToUpdate = async (model) => {
168
183
  newValue = value;
169
184
  switch (field.type) {
170
185
  case "BigInt":
171
- newValue = `${newValue + 1n}`;
186
+ if (typeof value === "bigint") {
187
+ newValue = `${value + 1n}`;
188
+ }
172
189
  break;
173
190
  case "Boolean": {
174
191
  newValue = !value;
175
192
  break;
176
193
  }
177
194
  case "DateTime": {
178
- let date = /* @__PURE__ */ new Date();
195
+ const date = /* @__PURE__ */ new Date();
179
196
  date.setDate(date.getDate() + 1);
180
197
  newValue = date;
181
198
  break;
182
199
  }
183
200
  case "Decimal":
184
201
  case "Float": {
185
- newValue = newValue + 1.1;
202
+ if (typeof value === "number") {
203
+ newValue = value + 1.1;
204
+ }
186
205
  break;
187
206
  }
188
207
  case "Int": {
189
- newValue = newValue + 1;
208
+ if (typeof value === "number") {
209
+ newValue = value + 1;
210
+ }
190
211
  break;
191
212
  }
192
213
  case "Json": {
@@ -194,11 +215,13 @@ const fieldsToUpdate = async (model) => {
194
215
  break;
195
216
  }
196
217
  case "String": {
197
- newValue = newValue + "2";
218
+ if (typeof value === "string") {
219
+ newValue = value + "2";
220
+ }
198
221
  break;
199
222
  }
200
223
  default: {
201
- if (field.kind === "enum" && field.enumValues[field.enumValues.length - 1]) {
224
+ if (field.kind === "enum" && field.enumValues?.[field.enumValues.length - 1]) {
202
225
  const enumVal = field.enumValues[field.enumValues.length - 1];
203
226
  newValue = enumVal.dbName || enumVal.name;
204
227
  }
@@ -206,11 +229,17 @@ const fieldsToUpdate = async (model) => {
206
229
  }
207
230
  }
208
231
  }
232
+ if (Array.isArray(fieldName)) {
233
+ return Object.fromEntries(fieldName.map((key) => [key, newValue]));
234
+ }
209
235
  return { [fieldName]: newValue };
210
236
  };
211
237
  const getIdName = async (model) => {
212
- const schema = await getSchema(model);
213
- return schema.fields.find((field) => field.isId)?.name;
238
+ const schemaResult = await getSchema(model);
239
+ if (!isServiceModel(schemaResult)) {
240
+ return void 0;
241
+ }
242
+ return schemaResult.fields.find((field) => field.isId)?.name;
214
243
  };
215
244
  const files = async ({
216
245
  name,
@@ -223,7 +252,15 @@ const files = async ({
223
252
  const model = name;
224
253
  const idName = await getIdName(model);
225
254
  const prismaImportSource = "src/lib/db";
226
- const modelRelations = relations || relationsForModel(await getSchema(model));
255
+ let modelRelations;
256
+ if (relations) {
257
+ modelRelations = relations;
258
+ } else {
259
+ const schemaResult = await getSchema(model);
260
+ if (isServiceModel(schemaResult)) {
261
+ modelRelations = relationsForModel(schemaResult);
262
+ }
263
+ }
227
264
  const serviceFile = await templateForFile({
228
265
  name,
229
266
  side: "api",
@@ -70,11 +70,16 @@ function createBuilder({
70
70
  Object.entries(opts).forEach(([option, config]) => {
71
71
  yargs.option(option, config);
72
72
  });
73
+ return yargs;
73
74
  };
74
75
  }
75
76
  function createHandler(componentName) {
76
77
  return async function handler(argv) {
77
- const { handler: importedHandler } = await import(`./${componentName}/${componentName}Handler.js`);
78
+ const { existsSync } = await import("node:fs");
79
+ const tsPath = `./${componentName}/${componentName}Handler.ts`;
80
+ const jsPath = `./${componentName}/${componentName}Handler.js`;
81
+ const resolvedPath = existsSync(new URL(tsPath, import.meta.url)) ? tsPath : jsPath;
82
+ const { handler: importedHandler } = await import(resolvedPath);
78
83
  return importedHandler(argv);
79
84
  };
80
85
  }
@@ -51,7 +51,11 @@ const templateForFile = async ({
51
51
  templatePath,
52
52
  templateVars
53
53
  }) => {
54
- const basePath = sidePathSection ? getPaths()[side][sidePathSection] : getPaths()[side];
54
+ const paths = getPaths();
55
+ const basePath = side === "scripts" ? paths.scripts : side === "web" ? sidePathSection ? paths.web[sidePathSection] : paths.web.base : side === "packages" ? paths.packages : sidePathSection ? paths.api[sidePathSection] : paths.api.base;
56
+ if (typeof basePath !== "string") {
57
+ throw new Error(`Invalid path section: "${sidePathSection}"`);
58
+ }
55
59
  const fullOutputPath = path.join(basePath, outputPath);
56
60
  const fullTemplatePath = customOrDefaultTemplatePath({
57
61
  generator,
@@ -126,6 +130,10 @@ function createHandler({
126
130
  validateName(argv.name);
127
131
  try {
128
132
  argv = await preTasksFn(argv);
133
+ const listrOptions = {
134
+ exitOnError: true,
135
+ ...argv.verbose ? { renderer: "verbose" } : { rendererOptions: { collapseSubtasks: false } }
136
+ };
129
137
  const tasks = new Listr(
130
138
  [
131
139
  {
@@ -137,28 +145,28 @@ function createHandler({
137
145
  },
138
146
  ...includeAdditionalTasks(argv)
139
147
  ],
140
- {
141
- rendererOptions: { collapseSubtasks: false },
142
- exitOnError: true,
143
- renderer: argv.verbose && "verbose"
144
- }
148
+ listrOptions
145
149
  );
146
150
  if (argv.rollback && !argv.force) {
147
151
  prepareForRollback(tasks);
148
152
  }
149
153
  await tasks.run();
150
154
  } catch (e) {
151
- errorTelemetry(process.argv, e.message);
152
- console.error(c.error(e.message));
153
- process.exit(e?.exitCode || 1);
155
+ const message = e instanceof Error ? e.message : String(e);
156
+ errorTelemetry(process.argv, message);
157
+ console.error(c.error(message));
158
+ process.exit(errorExitCode(e));
154
159
  }
155
160
  };
156
161
  }
162
+ function errorExitCode(e) {
163
+ return typeof e === "object" && e !== null && "exitCode" in e && typeof e.exitCode === "number" ? e.exitCode : 1;
164
+ }
157
165
  const createYargsForComponentGeneration = ({
158
166
  componentName,
159
167
  preTasksFn = (options) => options,
160
168
  /** filesFn is not used if generator implements its own `handler` */
161
- filesFn = () => ({}),
169
+ filesFn = async () => ({}),
162
170
  optionsObj,
163
171
  positionalsObj = {},
164
172
  /** function that takes the options object and returns an array of listr tasks */
@@ -1,6 +1,6 @@
1
- import execa from "execa";
2
1
  import { terminalLink } from "termi-link";
3
2
  import { recordTelemetryAttributes } from "@cedarjs/cli-helpers";
3
+ import { runBinSync } from "@cedarjs/cli-helpers/packageManager/exec";
4
4
  import * as generateCell from "./generate/cell/cell.js";
5
5
  import * as generateComponent from "./generate/component/component.js";
6
6
  import * as generateDataMigration from "./generate/dataMigration/dataMigration.js";
@@ -22,19 +22,12 @@ import * as generateService from "./generate/service/service.js";
22
22
  const command = "generate <type>";
23
23
  const aliases = ["g"];
24
24
  const description = "Generate boilerplate code and type definitions";
25
- const getExitCode = (error) => {
26
- if (typeof error !== "object" || error === null) {
27
- return void 0;
28
- }
29
- const exitCode = Reflect.get(error, "exitCode");
30
- return typeof exitCode === "number" ? exitCode : void 0;
31
- };
32
25
  const builder = (yargs) => yargs.command("types", "Generate supplementary code", {}, () => {
33
26
  recordTelemetryAttributes({ command: "generate types" });
34
27
  try {
35
- execa.sync("yarn", ["cedar-gen"], { stdio: "inherit" });
28
+ runBinSync("cedar-gen", [], { stdio: "inherit" });
36
29
  } catch (error) {
37
- process.exitCode = getExitCode(error) ?? 1;
30
+ process.exitCode = typeof error === "object" && error !== null && "exitCode" in error && typeof error.exitCode === "number" ? error.exitCode : 1;
38
31
  }
39
32
  }).command(generateCell).command(generateComponent).command(generateDataMigration).command(generateDbAuth).command(generateDirective).command(generateFunction).command(generateJob).command(generateLayout).command(generateModel).command(generateOgImage).command(generatePackage).command(generatePage).command(generateRealtime).command(generateScaffold).command(generateScript).command(generateSdl).command(generateSecret).command(generateService).demandCommand().epilogue(
40
33
  `Also see the ${terminalLink(
@@ -1,4 +1,5 @@
1
1
  import execa from "execa";
2
+ import { formatRunBinCommand } from "@cedarjs/cli-helpers/packageManager/display";
2
3
  import { getPaths } from "../lib/index.js";
3
4
  const handler = async ({
4
5
  _,
@@ -13,11 +14,11 @@ const handler = async ({
13
14
  args.push(name.length > 1 ? `--${name}` : `-${name}`);
14
15
  args.push(String(value));
15
16
  }
16
- let command = `yarn cedar-jobs ${args.join(" ")}`;
17
+ let command = formatRunBinCommand("cedar-jobs", args);
17
18
  const originalLogLevel = process.env.LOG_LEVEL;
18
19
  process.env.LOG_LEVEL = originalLogLevel || "warn";
19
20
  if (process.env.NODE_ENV !== "production") {
20
- command += " | yarn cedar-log-formatter";
21
+ command += ` | ${formatRunBinCommand("cedar-log-formatter")}`;
21
22
  process.env.LOG_LEVEL = originalLogLevel || "debug";
22
23
  }
23
24
  execa.commandSync(command, {
@@ -1,8 +1,11 @@
1
1
  import fs from "node:fs";
2
- import path from "node:path";
3
2
  import boxen from "boxen";
4
- import execa from "execa";
5
3
  import { recordTelemetryAttributes, colors as c } from "@cedarjs/cli-helpers";
4
+ import {
5
+ formatCedarCommand,
6
+ formatRunBinCommand
7
+ } from "@cedarjs/cli-helpers/packageManager/display";
8
+ import { runTransitiveBinSync } from "@cedarjs/cli-helpers/packageManager/exec";
6
9
  import { errorTelemetry } from "@cedarjs/telemetry";
7
10
  import { getPaths } from "../lib/index.js";
8
11
  const getErrorMessage = (error) => {
@@ -57,14 +60,12 @@ const handler = async ({
57
60
  }
58
61
  console.log();
59
62
  console.log(c.note("Running Prisma CLI..."));
60
- console.log(c.underline(`$ yarn prisma ${args.join(" ")}`));
63
+ console.log(c.underline(`$ <pm exec> prisma ${args.join(" ")}`));
61
64
  console.log();
62
65
  try {
63
- const prismaBin = path.join(cedarPaths.base, "node_modules/.bin/prisma");
64
- execa.sync(prismaBin, args, {
66
+ runTransitiveBinSync("prisma", args, {
65
67
  cwd: cedarPaths.base,
66
- stdio: "inherit",
67
- cleanup: true
68
+ stdio: "inherit"
68
69
  });
69
70
  if (hasHelpOption || args.length === 0) {
70
71
  printWrapInfo();
@@ -81,8 +82,8 @@ const printWrapInfo = () => {
81
82
  const message = [
82
83
  c.bold("Cedar CLI wraps Prisma CLI"),
83
84
  "",
84
- "Use `yarn cedar prisma` to automatically pass `--config` and `--preview-feature` options.",
85
- "Use `yarn prisma` to skip Cedar's automatic CLI options.",
85
+ `Use \`${formatCedarCommand(["prisma"])}\` to automatically pass \`--config\` and \`--preview-feature\` options.`,
86
+ `Use \`${formatRunBinCommand("prisma")}\` to skip Cedar's automatic CLI options.`,
86
87
  "",
87
88
  "Find more information in our docs:",
88
89
  c.underline("https://cedarjs.com/docs/cli-commands#prisma")