@cedarjs/cli 5.0.0-canary.2522 → 5.0.0-canary.2523

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.
@@ -12,7 +12,6 @@ import {
12
12
  } from "../../../lib/index.js";
13
13
  import { prepareForRollback } from "../../../lib/rollback.js";
14
14
  import { validateName } from "../helpers.js";
15
- import { getYargsDefaults } from "../yargsCommandHelpers.js";
16
15
  function getPostRunInstructions() {
17
16
  const text = c.warning("After writing your migration, you can run it with:");
18
17
  const command2 = formatCedarCommand(["dataMigrate", "up"]);
@@ -57,22 +56,30 @@ const command = "data-migration <name>";
57
56
  const aliases = ["dataMigration", "dm"];
58
57
  const description = "Generate a data migration";
59
58
  const builder = (yargs) => {
60
- yargs.positional("name", {
59
+ return yargs.positional("name", {
61
60
  description: "A descriptor of what this data migration does",
62
- type: "string"
61
+ type: "string",
62
+ demandOption: true
63
63
  }).option("rollback", {
64
64
  description: "Revert all generator actions if an error occurs",
65
65
  type: "boolean",
66
66
  default: true
67
+ }).option("force", {
68
+ alias: "f",
69
+ default: false,
70
+ description: "Overwrite existing files",
71
+ type: "boolean"
72
+ }).option("typescript", {
73
+ alias: "ts",
74
+ default: false,
75
+ description: "Generate TypeScript files",
76
+ type: "boolean"
67
77
  }).epilogue(
68
78
  `Also see the ${terminalLink(
69
79
  "CedarJS CLI Reference",
70
80
  "https://cedarjs.com/docs/cli-commands#generate-datamigration"
71
81
  )}`
72
82
  );
73
- Object.entries(getYargsDefaults()).forEach(([option, config]) => {
74
- yargs.option(option, config);
75
- });
76
83
  };
77
84
  const handler = async (args) => {
78
85
  recordTelemetryAttributes({
@@ -45,6 +45,7 @@ const builder = (yargs) => {
45
45
  Object.entries(getYargsDefaults()).forEach(([option, config]) => {
46
46
  yargs.option(option, config);
47
47
  });
48
+ return yargs;
48
49
  };
49
50
  const handler = createHandler("dbAuth");
50
51
  export {
@@ -19,6 +19,7 @@ const builder = (yargs) => {
19
19
  Object.entries(getYargsDefaults()).forEach(([option, config]) => {
20
20
  yargs.option(option, config);
21
21
  });
22
+ return yargs;
22
23
  };
23
24
  const handler = createHandler("function");
24
25
  export {
@@ -29,6 +29,7 @@ const builder = (yargs) => {
29
29
  Object.entries(getYargsDefaults()).forEach(([option, config]) => {
30
30
  yargs.option(option, config);
31
31
  });
32
+ return yargs;
32
33
  };
33
34
  const handler = createHandler("job");
34
35
  export {
@@ -19,6 +19,7 @@ const builder = (yargs) => {
19
19
  Object.entries(getYargsDefaults()).forEach(([option, config]) => {
20
20
  yargs.option(option, config);
21
21
  });
22
+ return yargs;
22
23
  };
23
24
  const handler = createHandler("model");
24
25
  export {
@@ -32,6 +32,7 @@ const builder = (yargs) => {
32
32
  type: "boolean",
33
33
  default: true
34
34
  });
35
+ return yargs;
35
36
  };
36
37
  const handler = createHandler("ogImage");
37
38
  export {
@@ -2,7 +2,7 @@ import { recordTelemetryAttributes } from "@cedarjs/cli-helpers";
2
2
  const command = "realtime <name>";
3
3
  const description = "Generate a subscription or live query used with RedwoodJS Realtime";
4
4
  function builder(yargs) {
5
- yargs.positional("name", {
5
+ return yargs.positional("name", {
6
6
  type: "string",
7
7
  description: "Name of the realtime event to setup. This should be a type or model name like: Widget, Sprocket, etc.",
8
8
  demandOption: true
@@ -28,6 +28,7 @@ const builder = (yargs) => {
28
28
  Object.entries(getYargsDefaults()).forEach(([option, config]) => {
29
29
  yargs.option(option, config);
30
30
  });
31
+ return yargs;
31
32
  };
32
33
  const handler = createHandler("scaffold");
33
34
  export {
@@ -19,6 +19,7 @@ const builder = (yargs) => {
19
19
  Object.entries(getYargsDefaults()).forEach(([option, config]) => {
20
20
  yargs.option(option, config);
21
21
  });
22
+ return yargs;
22
23
  };
23
24
  const handler = createHandler("script");
24
25
  export {
@@ -37,6 +37,7 @@ const builder = (yargs) => {
37
37
  Object.entries(getDefaults()).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 {
@@ -7,23 +7,24 @@ const generateSecret = (length = DEFAULT_LENGTH) => {
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: "number",
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(options) {
27
+ const { length, raw } = options;
27
28
  recordTelemetryAttributes({
28
29
  command: "generate secret",
29
30
  length,
@@ -41,7 +42,7 @@ const handler = ({ length, raw }) => {
41
42
  );
42
43
  console.info("");
43
44
  console.info("Keep it secret, keep it safe!");
44
- };
45
+ }
45
46
  export {
46
47
  DEFAULT_LENGTH,
47
48
  builder,
@@ -39,6 +39,7 @@ const builder = (yargs) => {
39
39
  Object.entries(defaults()).forEach(([option, config]) => {
40
40
  yargs.option(option, config);
41
41
  });
42
+ return yargs;
42
43
  };
43
44
  const handler = createHandler("service");
44
45
  export {
@@ -70,6 +70,7 @@ 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) {
@@ -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
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(
@@ -14,15 +14,18 @@ const CLIENT_HOST_MAP = {
14
14
  memcached: "localhost:11211",
15
15
  redis: "redis://localhost:6379"
16
16
  };
17
- const handler = async ({ client, force }) => {
18
- const extension = isTypeScriptProject ? "ts" : "js";
17
+ const handler = async ({
18
+ client,
19
+ force
20
+ }) => {
21
+ const extension = isTypeScriptProject() ? "ts" : "js";
19
22
  const tasks = new Listr([
20
23
  await addPackagesTask({
21
24
  packages: [CLIENT_PACKAGE_MAP[client]],
22
25
  side: "api"
23
26
  }),
24
27
  {
25
- title: `Writing api/src/lib/cache.js`,
28
+ title: `Writing api/src/lib/cache.${extension}`,
26
29
  task: () => {
27
30
  const template = fs.readFileSync(
28
31
  path.join(
@@ -59,9 +62,11 @@ const handler = async ({ client, force }) => {
59
62
  try {
60
63
  await tasks.run();
61
64
  } catch (e) {
62
- errorTelemetry(process.argv, e.message);
63
- console.error(c.error(e.message));
64
- process.exit(e?.exitCode || 1);
65
+ const message = e instanceof Error ? e.message : String(e);
66
+ errorTelemetry(process.argv, message);
67
+ console.error(c.error(message));
68
+ const exitCode = e instanceof Error && "exitCode" in e && typeof e.exitCode === "number" ? e.exitCode : 1;
69
+ process.exit(exitCode);
65
70
  }
66
71
  };
67
72
  export {
@@ -123,15 +123,17 @@ const handler = async ({ force, ud }) => {
123
123
  !ud && updateApiURLTask("/.netlify/functions"),
124
124
  addFilesTask({ files: ud ? filesUd : files, force }),
125
125
  printSetupNotes(ud ? udNotes : notes)
126
- ].filter(Boolean),
126
+ ].filter((task) => Boolean(task)),
127
127
  { rendererOptions: { collapseSubtasks: false } }
128
128
  );
129
129
  try {
130
130
  await tasks.run();
131
131
  } catch (e) {
132
- errorTelemetry(process.argv, e.message);
133
- console.error(c.error(e.message));
134
- process.exit(e?.exitCode || 1);
132
+ const message = e instanceof Error ? e.message : String(e);
133
+ errorTelemetry(process.argv, message);
134
+ console.error(c.error(message));
135
+ const exitCode = e instanceof Error && "exitCode" in e && typeof e.exitCode === "number" ? e.exitCode : 1;
136
+ process.exit(exitCode);
135
137
  }
136
138
  };
137
139
  export {
@@ -63,7 +63,10 @@ const additionalFiles = [
63
63
  content: RENDER_HEALTH_CHECK
64
64
  }
65
65
  ];
66
- const handler = async ({ force, database }) => {
66
+ const handler = async ({
67
+ force,
68
+ database
69
+ }) => {
67
70
  recordTelemetryAttributes({
68
71
  command: "setup deploy render",
69
72
  force,
@@ -75,7 +78,7 @@ const handler = async ({ force, database }) => {
75
78
  title: "Adding render.yaml",
76
79
  task: async () => {
77
80
  const fileData = await getRenderYamlContent(database);
78
- let files = {};
81
+ const files = {};
79
82
  files[fileData.path] = fileData.content;
80
83
  return writeFilesTask(files, { overwriteExisting: force });
81
84
  }
@@ -92,9 +95,11 @@ const handler = async ({ force, database }) => {
92
95
  try {
93
96
  await tasks.run();
94
97
  } catch (e) {
95
- errorTelemetry(process.argv, e.message);
96
- console.error(c.error(e.message));
97
- process.exit(e?.exitCode || 1);
98
+ const message = e instanceof Error ? e.message : String(e);
99
+ errorTelemetry(process.argv, message);
100
+ console.error(c.error(message));
101
+ const exitCode = e instanceof Error && "exitCode" in e && typeof e.exitCode === "number" ? e.exitCode : 1;
102
+ process.exit(exitCode);
98
103
  }
99
104
  };
100
105
  export {
@@ -28,7 +28,7 @@ async function handler({ force, ud }) {
28
28
  !ud && updateApiURLTask("/api"),
29
29
  ud ? writeVercelUDConfigTask({ overwriteExisting: force }) : writeVercelConfigTask({ overwriteExisting: force }),
30
30
  printSetupNotes(ud ? udNotes : notes)
31
- ].filter(Boolean),
31
+ ].filter((task) => Boolean(task)),
32
32
  {
33
33
  rendererOptions: { collapseSubtasks: false }
34
34
  }
@@ -36,9 +36,11 @@ async function handler({ force, ud }) {
36
36
  try {
37
37
  await tasks.run();
38
38
  } catch (e) {
39
- errorTelemetry(process.argv, e.message);
40
- console.error(c.error(e.message));
41
- process.exit(e?.exitCode || 1);
39
+ const message = e instanceof Error ? e.message : String(e);
40
+ errorTelemetry(process.argv, message);
41
+ console.error(c.error(message));
42
+ const exitCode = e instanceof Error && "exitCode" in e && typeof e.exitCode === "number" ? e.exitCode : 1;
43
+ process.exit(exitCode);
42
44
  }
43
45
  }
44
46
  function addVercelPluginToViteConfigTask() {
@@ -89,7 +91,9 @@ function installVercelPackagesTask() {
89
91
  devDependency: true
90
92
  });
91
93
  }
92
- function writeVercelConfigTask({ overwriteExisting = false } = {}) {
94
+ function writeVercelConfigTask({
95
+ overwriteExisting = false
96
+ } = {}) {
93
97
  return {
94
98
  title: "Writing vercel.json...",
95
99
  task: (_ctx, task) => {
@@ -126,7 +130,9 @@ const udNotes = [
126
130
  "Build with: yarn cedar build --ud",
127
131
  "See: https://cedarjs.com/docs/deploy#vercel-deploy"
128
132
  ];
129
- function writeVercelUDConfigTask({ overwriteExisting = false } = {}) {
133
+ function writeVercelUDConfigTask({
134
+ overwriteExisting = false
135
+ } = {}) {
130
136
  return {
131
137
  title: "Writing vercel.json for Universal Deploy...",
132
138
  task: (_ctx, task) => {
@@ -36,7 +36,7 @@ const tasks = ({ name, force }) => {
36
36
  },
37
37
  {
38
38
  title: "Destination:",
39
- task: (ctx, task) => {
39
+ task: (_ctx, task) => {
40
40
  task.title = ` Wrote templates to ${destination.replace(
41
41
  getPaths().base,
42
42
  ""
@@ -44,7 +44,7 @@ const tasks = ({ name, force }) => {
44
44
  }
45
45
  }
46
46
  ],
47
- { rendererOptions: { collapseSubtasks: false }, errorOnExist: true }
47
+ { rendererOptions: { collapseSubtasks: false } }
48
48
  );
49
49
  };
50
50
  const handler = async ({ name, force }) => {
@@ -52,7 +52,8 @@ const handler = async ({ name, force }) => {
52
52
  try {
53
53
  await t.run();
54
54
  } catch (e) {
55
- console.log(c.error(e.message));
55
+ const message = e instanceof Error ? e.message : String(e);
56
+ console.log(c.error(message));
56
57
  }
57
58
  };
58
59
  export {
@@ -10,13 +10,13 @@ import { fileIncludes } from "../../../lib/extendFile.js";
10
10
  import { getPaths, writeFile } from "../../../lib/index.js";
11
11
  const APP_JS_PATH = getPaths().web.app;
12
12
  const i18nImportExist = (appJS) => {
13
- let content = appJS.toString();
13
+ const content = appJS.toString();
14
14
  const hasBaseImport = () => /import '.\/i18n'/.test(content);
15
15
  return hasBaseImport();
16
16
  };
17
17
  const addI18nImport = (appJS) => {
18
- var content = appJS.toString().split("\n").reverse();
19
- const index = content.findIndex((value) => /import/.test(value));
18
+ const content = appJS.toString().split("\n").reverse();
19
+ const index = content.findIndex((value) => value.includes("import"));
20
20
  content.splice(index, 0, "import './i18n'");
21
21
  return content.reverse().join(`
22
22
  `);
@@ -124,7 +124,7 @@ const handler = async ({ force }) => {
124
124
  {
125
125
  title: "Adding import to App.{jsx,tsx}...",
126
126
  task: (_ctx, task) => {
127
- let appJS = fs.readFileSync(APP_JS_PATH);
127
+ const appJS = fs.readFileSync(APP_JS_PATH);
128
128
  if (i18nImportExist(appJS)) {
129
129
  task.skip("Import already exists in App.js");
130
130
  } else {
@@ -161,9 +161,11 @@ const handler = async ({ force }) => {
161
161
  try {
162
162
  await tasks.run();
163
163
  } catch (e) {
164
- errorTelemetry(process.argv, e.message);
165
- console.error(c.error(e.message));
166
- process.exit(e?.exitCode || 1);
164
+ const message = e instanceof Error ? e.message : String(e);
165
+ errorTelemetry(process.argv, message);
166
+ console.error(c.error(message));
167
+ const exitCode = e instanceof Error && "exitCode" in e && typeof e.exitCode === "number" ? e.exitCode : 1;
168
+ process.exit(exitCode);
167
169
  }
168
170
  };
169
171
  export {
@@ -1,18 +1,18 @@
1
1
  import fs from "node:fs";
2
2
  import path from "node:path";
3
- import { pathToFileURL } from "node:url";
4
3
  import { Listr } from "listr2";
5
4
  import { addApiPackages, colors as c } from "@cedarjs/cli-helpers";
6
5
  import { errorTelemetry } from "@cedarjs/telemetry";
7
6
  import { getPaths, transformTSToJS, writeFile } from "../../../lib/index.js";
8
7
  import { isTypeScriptProject } from "../../../lib/project.js";
9
- const handler = async ({ force, skipExamples }) => {
8
+ const handler = async ({
9
+ force,
10
+ skipExamples
11
+ }) => {
10
12
  const projectIsTypescript = isTypeScriptProject();
11
13
  const pkgJsonPath = path.join(getPaths().base, "package.json");
12
- const { default: pkgJson } = await import(pathToFileURL(pkgJsonPath), {
13
- with: { type: "json" }
14
- });
15
- const cedarVersion = pkgJson.devDependencies["@cedarjs/core"] ?? "latest";
14
+ const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, "utf-8"));
15
+ const cedarVersion = pkgJson.devDependencies?.["@cedarjs/core"] ?? "latest";
16
16
  const extension = projectIsTypescript ? "ts" : "js";
17
17
  const tasks = new Listr(
18
18
  [
@@ -99,9 +99,11 @@ const handler = async ({ force, skipExamples }) => {
99
99
  try {
100
100
  await tasks.run();
101
101
  } catch (e) {
102
- errorTelemetry(process.argv, e.message);
103
- console.error(c.error(e.message));
104
- process.exit(e?.exitCode || 1);
102
+ const message = e instanceof Error ? e.message : String(e);
103
+ errorTelemetry(process.argv, message);
104
+ console.error(c.error(message));
105
+ const exitCode = e instanceof Error && "exitCode" in e && typeof e.exitCode === "number" ? e.exitCode : 1;
106
+ process.exit(exitCode);
105
107
  }
106
108
  };
107
109
  export {
@@ -50,9 +50,11 @@ const handler = async ({ force }) => {
50
50
  try {
51
51
  await tasks.run();
52
52
  } catch (e) {
53
- errorTelemetry(process.argv, e.message);
54
- console.error(c.error(e.message));
55
- process.exit(e?.exitCode || 1);
53
+ const message = e instanceof Error ? e.message : String(e);
54
+ errorTelemetry(process.argv, message);
55
+ console.error(c.error(message));
56
+ const exitCode = e instanceof Error && "exitCode" in e && typeof e.exitCode === "number" ? e.exitCode : 1;
57
+ process.exit(exitCode);
56
58
  }
57
59
  };
58
60
  export {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cedarjs/cli",
3
- "version": "5.0.0-canary.2522",
3
+ "version": "5.0.0-canary.2523",
4
4
  "description": "The CedarJS Command Line",
5
5
  "repository": {
6
6
  "type": "git",
@@ -33,17 +33,17 @@
33
33
  "dependencies": {
34
34
  "@babel/parser": "7.29.7",
35
35
  "@babel/preset-typescript": "7.29.7",
36
- "@cedarjs/api-server": "5.0.0-canary.2522",
37
- "@cedarjs/cli-helpers": "5.0.0-canary.2522",
38
- "@cedarjs/fastify-web": "5.0.0-canary.2522",
39
- "@cedarjs/internal": "5.0.0-canary.2522",
40
- "@cedarjs/prerender": "5.0.0-canary.2522",
41
- "@cedarjs/project-config": "5.0.0-canary.2522",
42
- "@cedarjs/structure": "5.0.0-canary.2522",
43
- "@cedarjs/telemetry": "5.0.0-canary.2522",
44
- "@cedarjs/utils": "5.0.0-canary.2522",
45
- "@cedarjs/vite": "5.0.0-canary.2522",
46
- "@cedarjs/web-server": "5.0.0-canary.2522",
36
+ "@cedarjs/api-server": "5.0.0-canary.2523",
37
+ "@cedarjs/cli-helpers": "5.0.0-canary.2523",
38
+ "@cedarjs/fastify-web": "5.0.0-canary.2523",
39
+ "@cedarjs/internal": "5.0.0-canary.2523",
40
+ "@cedarjs/prerender": "5.0.0-canary.2523",
41
+ "@cedarjs/project-config": "5.0.0-canary.2523",
42
+ "@cedarjs/structure": "5.0.0-canary.2523",
43
+ "@cedarjs/telemetry": "5.0.0-canary.2523",
44
+ "@cedarjs/utils": "5.0.0-canary.2523",
45
+ "@cedarjs/vite": "5.0.0-canary.2523",
46
+ "@cedarjs/web-server": "5.0.0-canary.2523",
47
47
  "@listr2/prompt-adapter-enquirer": "4.2.1",
48
48
  "@opentelemetry/api": "1.9.1",
49
49
  "@opentelemetry/core": "1.30.1",