@cedarjs/cli 4.2.1-next.0 → 4.2.1-next.269
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.
- package/dist/cfw.js +8 -6
- package/dist/commands/build/buildHandler.js +43 -42
- package/dist/commands/build/buildPackagesTask.js +6 -6
- package/dist/commands/build.js +7 -1
- package/dist/commands/deploy/baremetal/SshExecutor.js +13 -4
- package/dist/commands/deploy/baremetal/baremetalHandler.js +117 -65
- package/dist/commands/deploy/baremetal.js +24 -3
- package/dist/commands/deploy/flightcontrolHandler.js +16 -14
- package/dist/commands/deploy/helpers/deployHandler.js +10 -5
- package/dist/commands/deploy/packing/nft.js +1 -2
- package/dist/commands/deploy/render.js +1 -1
- package/dist/commands/deploy/renderHandler.js +22 -12
- package/dist/commands/deploy/serverlessHandler.js +67 -25
- package/dist/commands/destroy/component/component.js +2 -3
- package/dist/commands/destroy/directive/directive.js +1 -3
- package/dist/commands/destroy/directive/directiveHandler.js +2 -4
- package/dist/commands/destroy/function/function.js +1 -3
- package/dist/commands/destroy/handlerHelpers.js +16 -16
- package/dist/commands/destroy/helpers.js +8 -2
- package/dist/commands/destroy/layout/layout.js +1 -2
- package/dist/commands/destroy/page/pageHandler.js +1 -1
- package/dist/commands/destroy/scaffold/scaffoldHandler.js +28 -9
- package/dist/commands/destroy/sdl/sdlHandler.js +1 -1
- package/dist/commands/dev/devHandler.js +25 -25
- package/dist/commands/dev.js +3 -0
- package/dist/commands/experimental/live-queries/liveQueriesHandler.js +110 -4
- package/dist/commands/experimental/setupInngest.js +1 -1
- package/dist/commands/experimental/setupInngestHandler.js +12 -11
- package/dist/commands/experimental/setupOpentelemetry.js +1 -1
- package/dist/commands/experimental/setupOpentelemetryHandler.js +11 -7
- package/dist/commands/experimental/setupReactCompiler.js +1 -1
- package/dist/commands/experimental/setupReactCompilerHandler.js +45 -30
- package/dist/commands/experimental/setupRscHandler.js +14 -11
- package/dist/commands/experimental/setupStreamingSsr.js +1 -1
- package/dist/commands/experimental/setupStreamingSsrHandler.js +46 -31
- package/dist/commands/experimental/templates/rsc/Document.tsx.template +1 -1
- package/dist/commands/experimental/templates/rsc/entry.client.tsx.template +8 -8
- package/dist/commands/experimental/templates/streamingSsr/Document.tsx.template +1 -1
- package/dist/commands/experimental/templates/streamingSsr/entry.client.tsx.template +6 -6
- package/dist/commands/experimental/util.js +3 -2
- package/dist/commands/generate/cell/cellHandler.js +22 -21
- package/dist/commands/generate/component/componentHandler.js +14 -16
- package/dist/commands/generate/dataMigration/dataMigration.js +24 -13
- package/dist/commands/generate/dbAuth/dbAuth.js +1 -0
- package/dist/commands/generate/dbAuth/dbAuthHandler.js +40 -30
- package/dist/commands/generate/directive/directiveHandler.js +12 -14
- package/dist/commands/generate/function/function.js +1 -0
- package/dist/commands/generate/function/functionHandler.js +12 -17
- package/dist/commands/generate/helpers.js +17 -17
- package/dist/commands/generate/job/job.js +1 -0
- package/dist/commands/generate/job/jobHandler.js +15 -17
- package/dist/commands/generate/layout/layoutHandler.js +13 -16
- package/dist/commands/generate/model/model.js +1 -0
- package/dist/commands/generate/model/modelHandler.js +9 -3
- package/dist/commands/generate/ogImage/ogImage.js +1 -0
- package/dist/commands/generate/ogImage/ogImageHandler.js +16 -9
- package/dist/commands/generate/package/packageHandler.js +32 -49
- package/dist/commands/generate/page/pageHandler.js +25 -22
- package/dist/commands/generate/realtime/realtime.js +1 -1
- package/dist/commands/generate/realtime/realtimeHandler.js +46 -20
- package/dist/commands/generate/scaffold/scaffold.js +1 -0
- package/dist/commands/generate/scaffold/scaffoldHandler.js +35 -27
- package/dist/commands/generate/script/script.js +1 -0
- package/dist/commands/generate/script/templates/tsconfig.json.template +14 -0
- package/dist/commands/generate/sdl/sdl.js +4 -3
- package/dist/commands/generate/sdl/sdlHandler.js +38 -18
- package/dist/commands/generate/secret/secret.js +19 -19
- package/dist/commands/generate/service/service.js +5 -5
- package/dist/commands/generate/service/serviceHandler.js +59 -22
- package/dist/commands/generate/yargsCommandHelpers.js +6 -1
- package/dist/commands/generate/yargsHandlerHelpers.js +18 -10
- package/dist/commands/generate.js +3 -10
- package/dist/commands/jobsHandler.js +3 -2
- package/dist/commands/prismaHandler.js +10 -9
- package/dist/commands/serve.js +84 -137
- package/dist/commands/serveApiHandler.js +5 -5
- package/dist/commands/serveBothHandler.js +10 -7
- package/dist/commands/serveWebHandler.js +2 -2
- package/dist/commands/setup/auth/auth.js +12 -6
- package/dist/commands/setup/cache/cacheHandler.js +11 -6
- package/dist/commands/setup/deploy/deploy.js +4 -3
- package/dist/commands/setup/deploy/helpers/helpers.js +5 -1
- package/dist/commands/setup/deploy/helpers/index.js +157 -5
- package/dist/commands/setup/deploy/providers/baremetalHandler.js +26 -4
- package/dist/commands/setup/deploy/providers/coherenceHandler.js +53 -25
- package/dist/commands/setup/deploy/providers/flightcontrolHandler.js +33 -23
- package/dist/commands/setup/deploy/providers/netlify.js +6 -0
- package/dist/commands/setup/deploy/providers/netlifyHandler.js +112 -11
- package/dist/commands/setup/deploy/providers/renderHandler.js +10 -5
- package/dist/commands/setup/deploy/providers/serverlessHandler.js +5 -3
- package/dist/commands/setup/deploy/providers/universal-deploy.js +11 -0
- package/dist/commands/setup/deploy/providers/universalDeployHandler.js +188 -0
- package/dist/commands/setup/deploy/providers/vercel.js +6 -0
- package/dist/commands/setup/deploy/providers/vercelHandler.js +113 -12
- package/dist/commands/setup/deploy/templates/baremetal.js +3 -2
- package/dist/commands/setup/deploy/templates/flightcontrol.js +60 -49
- package/dist/commands/setup/deploy/templates/netlify.js +2 -1
- package/dist/commands/setup/deploy/templates/netlifyUD.js +31 -0
- package/dist/commands/setup/docker/docker.js +1 -1
- package/dist/commands/setup/docker/dockerHandler.js +72 -37
- package/dist/commands/setup/docker/templates/Dockerfile.npm +119 -0
- package/dist/commands/setup/docker/templates/Dockerfile.pnpm +112 -0
- package/dist/commands/setup/docker/templates/{Dockerfile → Dockerfile.yarn} +1 -1
- package/dist/commands/setup/docker/templates/docker-compose.dev.yml +2 -2
- package/dist/commands/setup/generator/generatorHandler.js +4 -3
- package/dist/commands/setup/graphql/features/fragments/fragmentsHandler.js +2 -2
- package/dist/commands/setup/graphql/features/trustedDocuments/trustedDocumentsHandler.js +2 -2
- package/dist/commands/setup/i18n/i18nHandler.js +18 -15
- package/dist/commands/setup/jobs/jobsHandler.js +10 -5
- package/dist/commands/setup/mailer/mailerHandler.js +11 -9
- package/dist/commands/setup/package/packageHandler.js +14 -10
- package/dist/commands/setup/realtime/realtimeHandler.js +22 -20
- package/dist/commands/setup/server-file/serverFileHandler.js +16 -8
- package/dist/commands/setup/tsconfig/tsconfigHandler.js +5 -3
- package/dist/commands/setup/ui/helpers/helpers.js +5 -1
- package/dist/commands/setup/ui/libraries/chakra-uiHandler.js +11 -5
- package/dist/commands/setup/ui/libraries/mantineHandler.js +21 -13
- package/dist/commands/setup/ui/libraries/tailwindcssHandler.js +38 -26
- package/dist/commands/setup/uploads/uploadsHandler.js +7 -4
- package/dist/commands/setup.js +1 -2
- package/dist/commands/test/testHandler.js +2 -1
- package/dist/commands/test/testHandlerEsm.js +2 -2
- package/dist/commands/type-checkHandler.js +4 -6
- package/dist/commands/upgrade/upgradeHandler.js +2 -4
- package/dist/index.js +10 -4
- package/dist/lib/configureStorybook.js +2 -2
- package/dist/lib/exec.js +36 -24
- package/dist/lib/exit.js +19 -4
- package/dist/lib/extendFile.js +22 -12
- package/dist/lib/index.js +119 -85
- package/dist/lib/merge/algorithms.js +4 -1
- package/dist/lib/merge/index.js +76 -41
- package/dist/lib/merge/semanticIdentity.js +18 -6
- package/dist/lib/merge/strategy.js +86 -36
- package/dist/lib/packages.js +23 -13
- package/dist/lib/plugin.js +12 -5
- package/dist/lib/pluralHelpers.js +1 -1
- package/dist/lib/project.js +3 -1
- package/dist/lib/rollback.js +7 -7
- package/dist/lib/schemaHelpers.js +12 -12
- package/dist/lib/test.js +4 -0
- package/dist/lib/updateCheck.js +6 -4
- package/dist/middleware/checkNodeVersion.js +5 -0
- package/dist/plugin.js +18 -12
- package/dist/telemetry/exporter.js +12 -5
- package/dist/telemetry/index.js +4 -3
- package/dist/telemetry/resource.js +9 -5
- package/dist/telemetry/send.js +14 -10
- package/package.json +15 -13
- package/dist/commands/setup/vite/templates/vite.config.ts.template +0 -19
- package/dist/commands/setup/vite/vite.js +0 -38
- package/dist/commands/setup/vite/viteHandler.js +0 -82
- /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
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
80
|
+
if (idField?.default) {
|
|
78
81
|
ignoredFields.push(idField.name);
|
|
79
82
|
}
|
|
80
|
-
return ignoredFields.
|
|
83
|
+
return !ignoredFields.includes(field.name) && field.kind !== "object";
|
|
81
84
|
}).map((field) => modelFieldToSDL({ field, required, types, docs }));
|
|
82
85
|
};
|
|
83
|
-
|
|
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
|
-
|
|
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
|
|
125
|
-
|
|
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
|
|
128
|
-
return
|
|
136
|
+
const fieldModel = await getSchema(field.type);
|
|
137
|
+
return fieldModel && "fields" in fieldModel ? fieldModel : void 0;
|
|
129
138
|
})
|
|
130
|
-
)
|
|
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
|
-
|
|
241
|
-
|
|
242
|
-
process.
|
|
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
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}).option("raw", {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
)
|
|
25
|
-
|
|
26
|
-
|
|
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
|
|
9
|
-
|
|
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(
|
|
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
|
|
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
|
-
|
|
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(
|
|
130
|
-
acc
|
|
131
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
202
|
+
if (typeof value === "number") {
|
|
203
|
+
newValue = value + 1.1;
|
|
204
|
+
}
|
|
186
205
|
break;
|
|
187
206
|
}
|
|
188
207
|
case "Int": {
|
|
189
|
-
|
|
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
|
-
|
|
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
|
|
213
|
-
|
|
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
|
-
|
|
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 {
|
|
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
|
|
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
|
-
|
|
152
|
-
|
|
153
|
-
|
|
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
|
-
|
|
28
|
+
runBinSync("cedar-gen", [], { stdio: "inherit" });
|
|
36
29
|
} catch (error) {
|
|
37
|
-
process.exitCode =
|
|
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 =
|
|
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 +=
|
|
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(`$
|
|
63
|
+
console.log(c.underline(`$ <pm exec> prisma ${args.join(" ")}`));
|
|
61
64
|
console.log();
|
|
62
65
|
try {
|
|
63
|
-
|
|
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
|
-
|
|
85
|
-
|
|
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")
|