@orizm/cli 1.0.3 → 1.1.0
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/cli.cjs +1726 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +309 -73
- package/dist/cms/generate/command.d.ts +3 -0
- package/dist/cms/generate/command.d.ts.map +1 -0
- package/dist/cms/generate/generator.d.ts +8 -0
- package/dist/cms/generate/generator.d.ts.map +1 -0
- package/dist/cms/pull/action.d.ts +5 -0
- package/dist/cms/pull/action.d.ts.map +1 -0
- package/dist/cms/pull/command.d.ts +3 -0
- package/dist/cms/pull/command.d.ts.map +1 -0
- package/dist/config/functions.d.ts +38 -0
- package/dist/config/functions.d.ts.map +1 -0
- package/dist/config/functions.test.d.ts +2 -0
- package/dist/config/functions.test.d.ts.map +1 -0
- package/dist/config/generate-erd/command.d.ts +3 -0
- package/dist/config/generate-erd/command.d.ts.map +1 -0
- package/dist/config/generate-erd/convert-to-input.d.ts +23 -0
- package/dist/config/generate-erd/convert-to-input.d.ts.map +1 -0
- package/dist/config/generate-erd/convert-to-input.test.d.ts +2 -0
- package/dist/config/generate-erd/convert-to-input.test.d.ts.map +1 -0
- package/dist/config/generate-erd/generate.d.ts +3 -0
- package/dist/config/generate-erd/generate.d.ts.map +1 -0
- package/dist/config/index.cjs +107 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +80 -0
- package/dist/config/validate/command.d.ts +3 -0
- package/dist/config/validate/command.d.ts.map +1 -0
- package/dist/config/validate/watcher.d.ts +2 -0
- package/dist/config/validate/watcher.d.ts.map +1 -0
- package/dist/consumer/generate/action.d.ts +2 -0
- package/dist/consumer/generate/action.d.ts.map +1 -0
- package/dist/consumer/generate/command.d.ts +3 -0
- package/dist/consumer/generate/command.d.ts.map +1 -0
- package/dist/consumer/pull/action.d.ts +5 -0
- package/dist/consumer/pull/action.d.ts.map +1 -0
- package/dist/consumer/pull/command.d.ts +3 -0
- package/dist/consumer/pull/command.d.ts.map +1 -0
- package/dist/consumer/pull/generate.d.ts +7 -0
- package/dist/consumer/pull/generate.d.ts.map +1 -0
- package/dist/lib/cli-cursor.d.ts +3 -0
- package/dist/lib/cli-cursor.d.ts.map +1 -0
- package/dist/lib/cli-input.d.ts +2 -0
- package/dist/lib/cli-input.d.ts.map +1 -0
- package/dist/lib/cli-spinner.d.ts +13 -0
- package/dist/lib/cli-spinner.d.ts.map +1 -0
- package/dist/lib/cli-symbol.d.ts +3 -0
- package/dist/lib/cli-symbol.d.ts.map +1 -0
- package/dist/lib/cli-table.d.ts +16 -0
- package/dist/lib/cli-table.d.ts.map +1 -0
- package/dist/lib/developer-api.d.ts +7 -0
- package/dist/lib/developer-api.d.ts.map +1 -0
- package/dist/lib/display-change-events.d.ts +5 -0
- package/dist/lib/display-change-events.d.ts.map +1 -0
- package/dist/lib/display-valibot-error.d.ts +6 -0
- package/dist/lib/display-valibot-error.d.ts.map +1 -0
- package/dist/lib/display-valibot-error.test.d.ts +2 -0
- package/dist/lib/display-valibot-error.test.d.ts.map +1 -0
- package/dist/lib/fetch-current-definition.d.ts +7 -0
- package/dist/lib/fetch-current-definition.d.ts.map +1 -0
- package/dist/lib/handle-error.d.ts +2 -0
- package/dist/lib/handle-error.d.ts.map +1 -0
- package/dist/lib/load-config.d.ts +3 -0
- package/dist/lib/load-config.d.ts.map +1 -0
- package/dist/lib/load-env.d.ts +10 -0
- package/dist/lib/load-env.d.ts.map +1 -0
- package/dist/push/command.d.ts +3 -0
- package/dist/push/command.d.ts.map +1 -0
- package/dist/types.d.ts +22 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +19 -5
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/cli.ts
|
|
2
|
-
import { Command as
|
|
2
|
+
import { Command as Command8, program } from "commander";
|
|
3
3
|
|
|
4
4
|
// src/cms/generate/command.ts
|
|
5
5
|
import { Command } from "commander";
|
|
@@ -96,20 +96,75 @@ function createSpinner() {
|
|
|
96
96
|
}
|
|
97
97
|
|
|
98
98
|
// src/lib/handle-error.ts
|
|
99
|
+
import * as v3 from "valibot";
|
|
100
|
+
import cliColor3 from "cli-color";
|
|
101
|
+
|
|
102
|
+
// src/lib/display-valibot-error.ts
|
|
99
103
|
import * as v2 from "valibot";
|
|
100
104
|
import cliColor2 from "cli-color";
|
|
105
|
+
function displayValibotError(error2) {
|
|
106
|
+
if (!v2.isValiError(error2)) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
console.error(`Error: ${error2.issues.length} problem(s) found.`);
|
|
110
|
+
console.error(buildValiErrorMessage(error2));
|
|
111
|
+
}
|
|
112
|
+
function buildValiErrorMessage(e, options) {
|
|
113
|
+
const { color = true } = options ?? {};
|
|
114
|
+
return e.issues.map((issue) => {
|
|
115
|
+
const path3 = getPath(issue);
|
|
116
|
+
return ` ${getIssueMessage(issue.message, color)} (at ${getLocationPath(path3, color)})`;
|
|
117
|
+
}).join("\n");
|
|
118
|
+
}
|
|
119
|
+
function getIssueMessage(message, color) {
|
|
120
|
+
return color ? cliColor2.red(message) : message;
|
|
121
|
+
}
|
|
122
|
+
function getLocationPath(path3, color) {
|
|
123
|
+
return color ? cliColor2.yellow(path3) : path3;
|
|
124
|
+
}
|
|
125
|
+
function getPath(issue) {
|
|
126
|
+
const issueDotPath = v2.getDotPath(issue);
|
|
127
|
+
const pathInfo = issue.path;
|
|
128
|
+
if (!issueDotPath || !pathInfo) {
|
|
129
|
+
return "";
|
|
130
|
+
}
|
|
131
|
+
const pathParts = issueDotPath.split(".");
|
|
132
|
+
let pathInfoIndex = 0;
|
|
133
|
+
for (let i = 0; i < pathParts.length; i++) {
|
|
134
|
+
const part = pathParts[i];
|
|
135
|
+
if (!isNumberIndex(part)) {
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
const index = parseInt(part);
|
|
139
|
+
for (let j = pathInfoIndex; j < pathInfo.length; j++) {
|
|
140
|
+
const pathItem = pathInfo[j];
|
|
141
|
+
if (pathItem.type === "array" && pathItem.key === index) {
|
|
142
|
+
if (pathItem.value && typeof pathItem.value === "object" && "name" in pathItem.value) {
|
|
143
|
+
pathParts[i] = String(pathItem.value.name);
|
|
144
|
+
pathInfoIndex = j + 1;
|
|
145
|
+
break;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return pathParts.join(".");
|
|
151
|
+
}
|
|
152
|
+
function isNumberIndex(part) {
|
|
153
|
+
return /^\d+$/.test(part);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// src/lib/handle-error.ts
|
|
101
157
|
function handleError(error2) {
|
|
102
158
|
show();
|
|
103
|
-
if (
|
|
159
|
+
if (v3.isValiError(error2)) {
|
|
104
160
|
console.error();
|
|
105
|
-
|
|
106
|
-
console.error(buildValiErrorMessage(error2));
|
|
161
|
+
displayValibotError(error2);
|
|
107
162
|
console.error();
|
|
108
163
|
process.exit(1);
|
|
109
164
|
}
|
|
110
165
|
console.error();
|
|
111
166
|
console.error(
|
|
112
|
-
|
|
167
|
+
cliColor3.red(
|
|
113
168
|
"Something went wrong. Please check the error below for more details."
|
|
114
169
|
)
|
|
115
170
|
);
|
|
@@ -118,11 +173,6 @@ function handleError(error2) {
|
|
|
118
173
|
console.error();
|
|
119
174
|
process.exit(1);
|
|
120
175
|
}
|
|
121
|
-
function buildValiErrorMessage(e) {
|
|
122
|
-
return e.issues.map((issue) => {
|
|
123
|
-
return ` ${cliColor2.red(issue.message)} (at ${cliColor2.yellow(v2.getDotPath(issue))})`;
|
|
124
|
-
}).join("\n");
|
|
125
|
-
}
|
|
126
176
|
|
|
127
177
|
// src/cms/generate/generator.ts
|
|
128
178
|
import { mkdir, writeFile } from "fs/promises";
|
|
@@ -144,24 +194,21 @@ function toCodeTypeName(str) {
|
|
|
144
194
|
return str.replace(/_([a-z])/g, (g) => g[1].toUpperCase());
|
|
145
195
|
}
|
|
146
196
|
Handlebars.registerHelper("toCodeTypeName", toCodeTypeName);
|
|
147
|
-
Handlebars.registerHelper(
|
|
148
|
-
"
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
} else {
|
|
161
|
-
return column.type;
|
|
162
|
-
}
|
|
197
|
+
Handlebars.registerHelper("typeName", (column) => {
|
|
198
|
+
if (column.type === "reference") {
|
|
199
|
+
return "string";
|
|
200
|
+
} else if (column.type === "module") {
|
|
201
|
+
return toCodeTypeName(column.moduleName);
|
|
202
|
+
} else if (column.type === "module-array") {
|
|
203
|
+
return toCodeTypeName(column.moduleName) + "[]";
|
|
204
|
+
} else if (column.type == "json") {
|
|
205
|
+
return "unknown";
|
|
206
|
+
} else if (column.type === "storage") {
|
|
207
|
+
return "StorageItemType";
|
|
208
|
+
} else {
|
|
209
|
+
return column.type;
|
|
163
210
|
}
|
|
164
|
-
);
|
|
211
|
+
});
|
|
165
212
|
Handlebars.registerHelper(
|
|
166
213
|
"filterRefColumn",
|
|
167
214
|
(columns) => {
|
|
@@ -541,7 +588,7 @@ function serializeArrayParam(name, value, options) {
|
|
|
541
588
|
}
|
|
542
589
|
if (options.explode === false) {
|
|
543
590
|
const joiner2 = { form: ",", spaceDelimited: "%20", pipeDelimited: "|" }[options.style] || ",";
|
|
544
|
-
const final = (options.allowReserved === true ? value : value.map((
|
|
591
|
+
const final = (options.allowReserved === true ? value : value.map((v6) => encodeURIComponent(v6))).join(joiner2);
|
|
545
592
|
switch (options.style) {
|
|
546
593
|
case "simple": {
|
|
547
594
|
return final;
|
|
@@ -561,11 +608,11 @@ function serializeArrayParam(name, value, options) {
|
|
|
561
608
|
}
|
|
562
609
|
const joiner = { simple: ",", label: ".", matrix: ";" }[options.style] || "&";
|
|
563
610
|
const values = [];
|
|
564
|
-
for (const
|
|
611
|
+
for (const v6 of value) {
|
|
565
612
|
if (options.style === "simple" || options.style === "label") {
|
|
566
|
-
values.push(options.allowReserved === true ?
|
|
613
|
+
values.push(options.allowReserved === true ? v6 : encodeURIComponent(v6));
|
|
567
614
|
} else {
|
|
568
|
-
values.push(serializePrimitiveParam(name,
|
|
615
|
+
values.push(serializePrimitiveParam(name, v6, options));
|
|
569
616
|
}
|
|
570
617
|
}
|
|
571
618
|
return options.style === "label" || options.style === "matrix" ? `${joiner}${values.join(joiner)}` : values.join(joiner);
|
|
@@ -674,15 +721,15 @@ function mergeHeaders(...allHeaders) {
|
|
|
674
721
|
continue;
|
|
675
722
|
}
|
|
676
723
|
const iterator = h instanceof Headers ? h.entries() : Object.entries(h);
|
|
677
|
-
for (const [k,
|
|
678
|
-
if (
|
|
724
|
+
for (const [k, v6] of iterator) {
|
|
725
|
+
if (v6 === null) {
|
|
679
726
|
finalHeaders.delete(k);
|
|
680
|
-
} else if (Array.isArray(
|
|
681
|
-
for (const v22 of
|
|
727
|
+
} else if (Array.isArray(v6)) {
|
|
728
|
+
for (const v22 of v6) {
|
|
682
729
|
finalHeaders.append(k, v22);
|
|
683
730
|
}
|
|
684
|
-
} else if (
|
|
685
|
-
finalHeaders.set(k,
|
|
731
|
+
} else if (v6 !== void 0) {
|
|
732
|
+
finalHeaders.set(k, v6);
|
|
686
733
|
}
|
|
687
734
|
}
|
|
688
735
|
}
|
|
@@ -761,26 +808,26 @@ async function fetchCurrentDefinition(options) {
|
|
|
761
808
|
|
|
762
809
|
// src/lib/load-env.ts
|
|
763
810
|
import fs from "fs/promises";
|
|
764
|
-
import * as
|
|
811
|
+
import * as v4 from "valibot";
|
|
765
812
|
import dotenv from "dotenv";
|
|
766
813
|
var DEFAULT_ENV_FILE_PATH = ".env";
|
|
767
|
-
var EnvSchema =
|
|
768
|
-
ORIZM_PROJECT:
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
814
|
+
var EnvSchema = v4.object({
|
|
815
|
+
ORIZM_PROJECT: v4.pipe(
|
|
816
|
+
v4.string(),
|
|
817
|
+
v4.minLength(1, "ORIZM_PROJECT is required"),
|
|
818
|
+
v4.brand("ORIZM_PROJECT")
|
|
772
819
|
),
|
|
773
|
-
ORIZM_BASE_URL:
|
|
774
|
-
|
|
820
|
+
ORIZM_BASE_URL: v4.pipe(
|
|
821
|
+
v4.optional(v4.string(), "https://app.orizm.com"),
|
|
775
822
|
// if null, use default value
|
|
776
|
-
|
|
823
|
+
v4.transform((v6) => v6.replace(/\/$/, "")),
|
|
777
824
|
// remove trailing slash
|
|
778
|
-
|
|
825
|
+
v4.brand("ORIZM_BASE_URL")
|
|
779
826
|
),
|
|
780
|
-
ORIZM_API_KEY:
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
827
|
+
ORIZM_API_KEY: v4.pipe(
|
|
828
|
+
v4.string(),
|
|
829
|
+
v4.minLength(1, "ORIZM_API_KEY is required"),
|
|
830
|
+
v4.brand("ORIZM_API_KEY")
|
|
784
831
|
)
|
|
785
832
|
});
|
|
786
833
|
async function loadEnv(envPath) {
|
|
@@ -795,7 +842,7 @@ async function loadEnv(envPath) {
|
|
|
795
842
|
}
|
|
796
843
|
if (envFileContent !== null) {
|
|
797
844
|
const dotenvParsed = dotenv.parse(envFileContent);
|
|
798
|
-
const envParseResult =
|
|
845
|
+
const envParseResult = v4.safeParse(EnvSchema, dotenvParsed);
|
|
799
846
|
if (!envParseResult.success) {
|
|
800
847
|
throw new Error(
|
|
801
848
|
`Environment variables are not valid.
|
|
@@ -804,7 +851,7 @@ async function loadEnv(envPath) {
|
|
|
804
851
|
}
|
|
805
852
|
return envParseResult.output;
|
|
806
853
|
}
|
|
807
|
-
const processEnvParseResult =
|
|
854
|
+
const processEnvParseResult = v4.safeParse(EnvSchema, process.env);
|
|
808
855
|
if (!processEnvParseResult.success) {
|
|
809
856
|
throw new Error(
|
|
810
857
|
"Environment variables are not valid. Put .env file or set environment variables in process.env.\n" + processEnvParseResult.issues.map((issue) => issue.message).join("\n")
|
|
@@ -819,13 +866,13 @@ async function pullAction(options) {
|
|
|
819
866
|
spinner2.start("Loading environment variables...");
|
|
820
867
|
const env = await loadEnv(options.envPath);
|
|
821
868
|
spinner2.succeed("Loaded environment variables.");
|
|
822
|
-
spinner2.start("Loading project
|
|
869
|
+
spinner2.start("Loading project config...");
|
|
823
870
|
const definitionReference = await fetchCurrentDefinition({
|
|
824
871
|
baseUrl: env.ORIZM_BASE_URL,
|
|
825
872
|
apiKey: env.ORIZM_API_KEY,
|
|
826
873
|
projectName: env.ORIZM_PROJECT
|
|
827
874
|
});
|
|
828
|
-
spinner2.succeed("Loaded project
|
|
875
|
+
spinner2.succeed("Loaded project config.");
|
|
829
876
|
spinner2.start("Generating code...");
|
|
830
877
|
await generate({
|
|
831
878
|
output: options.destination,
|
|
@@ -895,11 +942,14 @@ Handlebars2.registerHelper("typeName", (column) => {
|
|
|
895
942
|
return column.type;
|
|
896
943
|
}
|
|
897
944
|
});
|
|
898
|
-
Handlebars2.registerHelper(
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
945
|
+
Handlebars2.registerHelper(
|
|
946
|
+
"filterRefColumn",
|
|
947
|
+
(columns) => {
|
|
948
|
+
return (columns || []).filter(
|
|
949
|
+
(c) => c.type === "reference" && c.tableName && c.includeName || c.type === "module" && c.moduleName || c.type === "module-array" && c.moduleName
|
|
950
|
+
);
|
|
951
|
+
}
|
|
952
|
+
);
|
|
903
953
|
Handlebars2.registerHelper("includeName", (column) => {
|
|
904
954
|
return column.type === "reference" ? column.includeName : column.name;
|
|
905
955
|
});
|
|
@@ -943,9 +993,9 @@ async function renderClient2(config, output) {
|
|
|
943
993
|
// src/consumer/generate/action.ts
|
|
944
994
|
var spinner3 = createSpinner();
|
|
945
995
|
async function generateAction(orizmConfigTs, destination) {
|
|
946
|
-
spinner3.start("Loading project
|
|
996
|
+
spinner3.start("Loading project config...");
|
|
947
997
|
const definition = await loadConfig(orizmConfigTs);
|
|
948
|
-
spinner3.succeed("Loaded project
|
|
998
|
+
spinner3.succeed("Loaded project config.");
|
|
949
999
|
spinner3.start("Generating code...");
|
|
950
1000
|
await generate2({
|
|
951
1001
|
definition,
|
|
@@ -972,13 +1022,13 @@ async function pullAction2(options) {
|
|
|
972
1022
|
spinner4.start("Loading environment variables...");
|
|
973
1023
|
const config = await loadEnv(options.envPath);
|
|
974
1024
|
spinner4.succeed("Loaded environment variables.");
|
|
975
|
-
spinner4.start("Loading project
|
|
1025
|
+
spinner4.start("Loading project config...");
|
|
976
1026
|
const definition = await fetchCurrentDefinition({
|
|
977
1027
|
baseUrl: config.ORIZM_BASE_URL,
|
|
978
1028
|
apiKey: config.ORIZM_API_KEY,
|
|
979
1029
|
projectName: config.ORIZM_PROJECT
|
|
980
1030
|
});
|
|
981
|
-
spinner4.succeed("Loaded project
|
|
1031
|
+
spinner4.succeed("Loaded project config.");
|
|
982
1032
|
spinner4.start("Generating code...");
|
|
983
1033
|
await generate2({
|
|
984
1034
|
definition: definition.parsed,
|
|
@@ -1001,7 +1051,7 @@ var consumerPullCommand = new Command4("pull").description("pull orizm schema an
|
|
|
1001
1051
|
|
|
1002
1052
|
// src/push/command.ts
|
|
1003
1053
|
import { Command as Command5 } from "commander";
|
|
1004
|
-
import
|
|
1054
|
+
import cliColor5 from "cli-color";
|
|
1005
1055
|
|
|
1006
1056
|
// src/lib/developer-api.ts
|
|
1007
1057
|
async function applyDefinition(env, projectDef) {
|
|
@@ -1049,14 +1099,15 @@ var getChangeEvents = async (env, projectDef) => {
|
|
|
1049
1099
|
);
|
|
1050
1100
|
}
|
|
1051
1101
|
throw new Error(
|
|
1052
|
-
`${status} ${response.response.statusText}: Unexpected error occurred while fetching schema change events
|
|
1102
|
+
`${status} ${response.response.statusText}: Unexpected error occurred while fetching schema change events.
|
|
1103
|
+
${JSON.stringify(response.error, null, 2)}`
|
|
1053
1104
|
);
|
|
1054
1105
|
}
|
|
1055
1106
|
return response.data;
|
|
1056
1107
|
};
|
|
1057
1108
|
|
|
1058
1109
|
// src/lib/display-change-events.ts
|
|
1059
|
-
import
|
|
1110
|
+
import cliColor4 from "cli-color";
|
|
1060
1111
|
|
|
1061
1112
|
// src/lib/cli-table.ts
|
|
1062
1113
|
var COLORS = {
|
|
@@ -1165,7 +1216,7 @@ async function displayChangeEvents(changeEvents) {
|
|
|
1165
1216
|
} = changeEvents;
|
|
1166
1217
|
if (tableChangeEvents.length === 0 && bucketChangeEvents.length === 0 && authorityChangeEvents.length === 0) {
|
|
1167
1218
|
console.log();
|
|
1168
|
-
console.log(
|
|
1219
|
+
console.log(cliColor4.green("No changes."));
|
|
1169
1220
|
return;
|
|
1170
1221
|
}
|
|
1171
1222
|
displayTableChangeEvents(tableChangeEvents);
|
|
@@ -1422,9 +1473,9 @@ var pushCommand = new Command5("push").description("apply schema to project.").o
|
|
|
1422
1473
|
spinner5.start("Loading environment variables...");
|
|
1423
1474
|
const env = await loadEnv(options.env);
|
|
1424
1475
|
spinner5.succeed("Loaded environment variables.");
|
|
1425
|
-
spinner5.start("Loading project
|
|
1476
|
+
spinner5.start("Loading project config...");
|
|
1426
1477
|
const projectDef = await loadConfig(options.config);
|
|
1427
|
-
spinner5.succeed("Loaded project
|
|
1478
|
+
spinner5.succeed("Loaded project config.");
|
|
1428
1479
|
spinner5.start("Fetch schema change events...");
|
|
1429
1480
|
const changeEvents = await getChangeEvents(env, projectDef);
|
|
1430
1481
|
spinner5.succeed("Fetch schema change events.");
|
|
@@ -1438,7 +1489,7 @@ var pushCommand = new Command5("push").description("apply schema to project.").o
|
|
|
1438
1489
|
if (!options.yes) {
|
|
1439
1490
|
const confirm = await input("Do you want to apply schema? (y/N): ");
|
|
1440
1491
|
if (confirm !== "y") {
|
|
1441
|
-
console.log(
|
|
1492
|
+
console.log(cliColor5.red("Canceled."));
|
|
1442
1493
|
return;
|
|
1443
1494
|
}
|
|
1444
1495
|
}
|
|
@@ -1450,17 +1501,202 @@ var pushCommand = new Command5("push").description("apply schema to project.").o
|
|
|
1450
1501
|
}
|
|
1451
1502
|
});
|
|
1452
1503
|
|
|
1504
|
+
// src/config/validate/command.ts
|
|
1505
|
+
import { Command as Command6 } from "commander";
|
|
1506
|
+
import clc from "cli-color";
|
|
1507
|
+
import * as v5 from "valibot";
|
|
1508
|
+
|
|
1509
|
+
// src/config/validate/watcher.ts
|
|
1510
|
+
import chokidar from "chokidar";
|
|
1511
|
+
function watchConfigFile(configPath, onFileChange) {
|
|
1512
|
+
const watcher = chokidar.watch(configPath, {
|
|
1513
|
+
persistent: true,
|
|
1514
|
+
ignoreInitial: true
|
|
1515
|
+
});
|
|
1516
|
+
let isProcessing = false;
|
|
1517
|
+
let timeoutId = null;
|
|
1518
|
+
const debouncedOnChange = async () => {
|
|
1519
|
+
if (isProcessing) return;
|
|
1520
|
+
if (timeoutId) {
|
|
1521
|
+
clearTimeout(timeoutId);
|
|
1522
|
+
}
|
|
1523
|
+
timeoutId = setTimeout(async () => {
|
|
1524
|
+
isProcessing = true;
|
|
1525
|
+
try {
|
|
1526
|
+
await onFileChange();
|
|
1527
|
+
} catch (error2) {
|
|
1528
|
+
handleError(error2);
|
|
1529
|
+
} finally {
|
|
1530
|
+
isProcessing = false;
|
|
1531
|
+
}
|
|
1532
|
+
}, 300);
|
|
1533
|
+
};
|
|
1534
|
+
watcher.on("change", debouncedOnChange);
|
|
1535
|
+
watcher.on("add", debouncedOnChange);
|
|
1536
|
+
watcher.on("unlink", debouncedOnChange);
|
|
1537
|
+
const terminate = () => {
|
|
1538
|
+
watcher.close();
|
|
1539
|
+
process.exit(0);
|
|
1540
|
+
};
|
|
1541
|
+
process.on("SIGINT", terminate);
|
|
1542
|
+
process.on("SIGTERM", terminate);
|
|
1543
|
+
watcher.on("error", (error2) => {
|
|
1544
|
+
handleError(error2);
|
|
1545
|
+
});
|
|
1546
|
+
return watcher;
|
|
1547
|
+
}
|
|
1548
|
+
|
|
1549
|
+
// src/config/validate/command.ts
|
|
1550
|
+
var validateConfigCommand = new Command6("validate").description("validate orizm.config.ts for validation errors").option("-c, --config <path>", "Path to config file", "./orizm.config.ts").option("-w, --watch", "Watch for file changes and re-validate").action(async (options) => {
|
|
1551
|
+
try {
|
|
1552
|
+
const validateConfig = async () => {
|
|
1553
|
+
try {
|
|
1554
|
+
if (options.watch) {
|
|
1555
|
+
console.clear();
|
|
1556
|
+
console.log(
|
|
1557
|
+
`\u{1F440} Watching ${options.config} for changes... (Press Ctrl+C to stop)`
|
|
1558
|
+
);
|
|
1559
|
+
console.log();
|
|
1560
|
+
}
|
|
1561
|
+
await loadConfig(options.config);
|
|
1562
|
+
console.log(clc.green("\u2705 Config is valid."));
|
|
1563
|
+
} catch (error2) {
|
|
1564
|
+
if (v5.isValiError(error2)) {
|
|
1565
|
+
console.error(clc.red("\u274C Config validation failed:"));
|
|
1566
|
+
displayValibotError(error2);
|
|
1567
|
+
return;
|
|
1568
|
+
}
|
|
1569
|
+
throw error2;
|
|
1570
|
+
}
|
|
1571
|
+
};
|
|
1572
|
+
await validateConfig();
|
|
1573
|
+
if (options.watch) {
|
|
1574
|
+
watchConfigFile(options.config, validateConfig);
|
|
1575
|
+
}
|
|
1576
|
+
} catch (error2) {
|
|
1577
|
+
handleError(error2);
|
|
1578
|
+
}
|
|
1579
|
+
});
|
|
1580
|
+
|
|
1581
|
+
// src/config/generate-erd/command.ts
|
|
1582
|
+
import { Command as Command7 } from "commander";
|
|
1583
|
+
|
|
1584
|
+
// src/config/generate-erd/generate.ts
|
|
1585
|
+
import Handlebars3 from "handlebars";
|
|
1586
|
+
|
|
1587
|
+
// src/config/generate-erd/mermaid-erd.hbr
|
|
1588
|
+
var mermaid_erd_default = "generated by @orizm/cli\n\n```mermaid\nerDiagram\n{{#each tables}}\n {{name}} {\n id string PK\n{{#each columns}}\n {{name}} {{type}}{{#if isForeignKey}} FK{{/if}}\n{{/each}}\n }\n{{/each}}\n\n{{#each relations}}\n {{from}} {{type}} {{to}} : {{comment}}\n{{/each}}\n```";
|
|
1589
|
+
|
|
1590
|
+
// src/config/generate-erd/generate.ts
|
|
1591
|
+
function generate3(input2) {
|
|
1592
|
+
const template = Handlebars3.compile(mermaid_erd_default);
|
|
1593
|
+
return template(input2);
|
|
1594
|
+
}
|
|
1595
|
+
|
|
1596
|
+
// src/config/generate-erd/convert-to-input.ts
|
|
1597
|
+
function convertToInput(config) {
|
|
1598
|
+
if (!config.tables) {
|
|
1599
|
+
return {
|
|
1600
|
+
tables: [],
|
|
1601
|
+
relations: []
|
|
1602
|
+
};
|
|
1603
|
+
}
|
|
1604
|
+
const tables = [];
|
|
1605
|
+
const relations = [];
|
|
1606
|
+
for (const table of config.tables) {
|
|
1607
|
+
const modules = [];
|
|
1608
|
+
const erdTable = {
|
|
1609
|
+
name: table.name,
|
|
1610
|
+
columns: []
|
|
1611
|
+
};
|
|
1612
|
+
for (const column of table.columns) {
|
|
1613
|
+
erdTable.columns.push({
|
|
1614
|
+
name: column.name,
|
|
1615
|
+
type: column.type,
|
|
1616
|
+
isForeignKey: column.type === "reference"
|
|
1617
|
+
});
|
|
1618
|
+
if (column.type === "reference") {
|
|
1619
|
+
relations.push({
|
|
1620
|
+
from: column.tableName,
|
|
1621
|
+
to: table.name,
|
|
1622
|
+
type: RELATION.ONE_TO_MANY,
|
|
1623
|
+
comment: "reference"
|
|
1624
|
+
});
|
|
1625
|
+
}
|
|
1626
|
+
if (column.type === "module" || column.type === "module-array") {
|
|
1627
|
+
const module = config.tableModules?.find(
|
|
1628
|
+
(m) => m.name === column.moduleName
|
|
1629
|
+
);
|
|
1630
|
+
if (!module) {
|
|
1631
|
+
continue;
|
|
1632
|
+
}
|
|
1633
|
+
const moduleTableName = `${table.name}_${column.name}_${column.moduleName}`;
|
|
1634
|
+
modules.push({
|
|
1635
|
+
name: moduleTableName,
|
|
1636
|
+
columns: module?.columns.map((c) => ({
|
|
1637
|
+
name: c.name,
|
|
1638
|
+
type: c.type,
|
|
1639
|
+
isForeignKey: c.type === "reference"
|
|
1640
|
+
})) || []
|
|
1641
|
+
});
|
|
1642
|
+
relations.push({
|
|
1643
|
+
from: table.name,
|
|
1644
|
+
to: moduleTableName,
|
|
1645
|
+
type: column.type === "module" ? RELATION.ONE_TO_ONE : RELATION.ONE_TO_MANY,
|
|
1646
|
+
comment: column.type === "module" ? "module" : "module-array"
|
|
1647
|
+
});
|
|
1648
|
+
for (const moduleColumn of module.columns) {
|
|
1649
|
+
if (moduleColumn.type === "reference" && moduleColumn.tableName) {
|
|
1650
|
+
relations.push({
|
|
1651
|
+
from: moduleTableName,
|
|
1652
|
+
to: moduleColumn.tableName,
|
|
1653
|
+
type: RELATION.ONE_TO_MANY,
|
|
1654
|
+
comment: "reference"
|
|
1655
|
+
});
|
|
1656
|
+
}
|
|
1657
|
+
}
|
|
1658
|
+
}
|
|
1659
|
+
}
|
|
1660
|
+
tables.push(erdTable);
|
|
1661
|
+
tables.push(...modules);
|
|
1662
|
+
}
|
|
1663
|
+
return {
|
|
1664
|
+
tables,
|
|
1665
|
+
relations
|
|
1666
|
+
};
|
|
1667
|
+
}
|
|
1668
|
+
var RELATION = {
|
|
1669
|
+
ONE_TO_MANY: "||--o{",
|
|
1670
|
+
ONE_TO_ONE: "||--||"
|
|
1671
|
+
};
|
|
1672
|
+
|
|
1673
|
+
// src/config/generate-erd/command.ts
|
|
1674
|
+
var generateErdCommand = new Command7("generate-erd").description("generate er diagram in mermaid format from orizm.config.ts").option("-c, --config <path>", "orizm config file path.", "orizm.config.ts").action(async (options) => {
|
|
1675
|
+
try {
|
|
1676
|
+
const config = await loadConfig(options.config);
|
|
1677
|
+
const input2 = convertToInput(config);
|
|
1678
|
+
const mermaidText = generate3(input2);
|
|
1679
|
+
console.log(mermaidText);
|
|
1680
|
+
} catch (error2) {
|
|
1681
|
+
handleError(error2);
|
|
1682
|
+
}
|
|
1683
|
+
});
|
|
1684
|
+
|
|
1453
1685
|
// src/cli.ts
|
|
1454
1686
|
program.name("orizm CLI");
|
|
1455
1687
|
program.addCommand(pushCommand);
|
|
1456
|
-
var cmsCommands = new
|
|
1688
|
+
var cmsCommands = new Command8("cms").description("cms commands.");
|
|
1457
1689
|
cmsCommands.addCommand(cmsGenerateCommand);
|
|
1458
1690
|
cmsCommands.addCommand(cmsPullCommand);
|
|
1459
1691
|
program.addCommand(cmsCommands);
|
|
1460
|
-
var consumerCommands = new
|
|
1692
|
+
var consumerCommands = new Command8("consumer").description(
|
|
1461
1693
|
"consumer commands."
|
|
1462
1694
|
);
|
|
1463
1695
|
consumerCommands.addCommand(consumerGenerateCommand);
|
|
1464
1696
|
consumerCommands.addCommand(consumerPullCommand);
|
|
1465
1697
|
program.addCommand(consumerCommands);
|
|
1698
|
+
var configCommands = new Command8("config").description("config commands.");
|
|
1699
|
+
configCommands.addCommand(validateConfigCommand);
|
|
1700
|
+
configCommands.addCommand(generateErdCommand);
|
|
1701
|
+
program.addCommand(configCommands);
|
|
1466
1702
|
program.parse();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../src/cms/generate/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,kBAAkB,SAmB3B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../../src/cms/generate/generator.ts"],"names":[],"mappings":"AAKA,OAAO,EAML,iBAAiB,EAClB,MAAM,gBAAgB,CAAC;AA4ExB,KAAK,eAAe,GAAG;IACrB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,wBAAsB,QAAQ,CAAC,OAAO,EAAE,eAAe,iBAOtD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../../src/cms/pull/action.ts"],"names":[],"mappings":"AAOA,wBAAsB,UAAU,CAAC,OAAO,EAAE;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB,iBAmBA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../src/cms/pull/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,cAAc,SAavB,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { CommonAuthorityRulesDefinition, CommonBooleanColumnDefinition, CommonBucketDefinition, CommonJsonColumnDefinition, CommonModuleColumnDefinition, CommonNumberColumnDefinition, CommonOrizmConfig, CommonReferenceColumnDefinition, CommonStorageColumnDefinition, CommonStringColumnDefinition, CommonTableDefinition, CommonTableModuleDefinition } from "../types";
|
|
2
|
+
type DefineConfigInput = {
|
|
3
|
+
tables?: {
|
|
4
|
+
[tableName: string]: TableInput;
|
|
5
|
+
};
|
|
6
|
+
tableModules?: {
|
|
7
|
+
[moduleName: string]: TableModuleInput;
|
|
8
|
+
};
|
|
9
|
+
buckets?: {
|
|
10
|
+
[bucketName: string]: BucketInput;
|
|
11
|
+
};
|
|
12
|
+
authorities?: CommonAuthorityRulesDefinition;
|
|
13
|
+
};
|
|
14
|
+
export declare function defineConfig(config: DefineConfigInput): CommonOrizmConfig;
|
|
15
|
+
type TableInput = Omit<CommonTableDefinition, "name" | "columns" | "formOptions"> & {
|
|
16
|
+
columns: {
|
|
17
|
+
[columnName: string]: Column;
|
|
18
|
+
};
|
|
19
|
+
formOptions?: {
|
|
20
|
+
submissionColumns: {
|
|
21
|
+
[columnName: string]: Column;
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
type TableModuleInput = Omit<CommonTableModuleDefinition, "name" | "columns"> & {
|
|
26
|
+
columns: {
|
|
27
|
+
[columnName: string]: Column;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
type Column = StringColumn | Omit<CommonNumberColumnDefinition, "name"> | Omit<CommonBooleanColumnDefinition, "name"> | Omit<CommonJsonColumnDefinition, "name"> | Omit<CommonReferenceColumnDefinition, "name"> | Omit<CommonModuleColumnDefinition, "name"> | Omit<CommonStorageColumnDefinition, "name">;
|
|
31
|
+
type StringColumn = Omit<CommonStringColumnDefinition, "name" | "pattern"> & {
|
|
32
|
+
pattern?: string | RegExp;
|
|
33
|
+
};
|
|
34
|
+
type BucketInput = Omit<CommonBucketDefinition, "name" | "accessControl"> & {
|
|
35
|
+
accessControl: CommonBucketDefinition["accessControl"];
|
|
36
|
+
};
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=functions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"functions.d.ts","sourceRoot":"","sources":["../../src/config/functions.ts"],"names":[],"mappings":"AACA,OAAO,EACL,8BAA8B,EAC9B,6BAA6B,EAC7B,sBAAsB,EACtB,0BAA0B,EAC1B,4BAA4B,EAC5B,4BAA4B,EAC5B,iBAAiB,EACjB,+BAA+B,EAC/B,6BAA6B,EAC7B,4BAA4B,EAC5B,qBAAqB,EACrB,2BAA2B,EAC5B,MAAM,UAAU,CAAC;AAElB,KAAK,iBAAiB,GAAG;IACvB,MAAM,CAAC,EAAE;QAAE,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,CAAA;KAAE,CAAC;IAC7C,YAAY,CAAC,EAAE;QAAE,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,CAAA;KAAE,CAAC;IAC1D,OAAO,CAAC,EAAE;QAAE,CAAC,UAAU,EAAE,MAAM,GAAG,WAAW,CAAA;KAAE,CAAC;IAChD,WAAW,CAAC,EAAE,8BAA8B,CAAC;CAC9C,CAAC;AAEF,wBAAgB,YAAY,CAAC,MAAM,EAAE,iBAAiB,GAAG,iBAAiB,CAmBzE;AAED,KAAK,UAAU,GAAG,IAAI,CACpB,qBAAqB,EACrB,MAAM,GAAG,SAAS,GAAG,aAAa,CACnC,GAAG;IACF,OAAO,EAAE;QAAE,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IAC1C,WAAW,CAAC,EAAE;QACZ,iBAAiB,EAAE;YAAE,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAA;SAAE,CAAC;KACrD,CAAC;CACH,CAAC;AAEF,KAAK,gBAAgB,GAAG,IAAI,CAC1B,2BAA2B,EAC3B,MAAM,GAAG,SAAS,CACnB,GAAG;IACF,OAAO,EAAE;QAAE,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;CAC3C,CAAC;AAEF,KAAK,MAAM,GACP,YAAY,GACZ,IAAI,CAAC,4BAA4B,EAAE,MAAM,CAAC,GAC1C,IAAI,CAAC,6BAA6B,EAAE,MAAM,CAAC,GAC3C,IAAI,CAAC,0BAA0B,EAAE,MAAM,CAAC,GACxC,IAAI,CAAC,+BAA+B,EAAE,MAAM,CAAC,GAC7C,IAAI,CAAC,4BAA4B,EAAE,MAAM,CAAC,GAC1C,IAAI,CAAC,6BAA6B,EAAE,MAAM,CAAC,CAAC;AAEhD,KAAK,YAAY,GAAG,IAAI,CAAC,4BAA4B,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG;IAC3E,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC3B,CAAC;AAgEF,KAAK,WAAW,GAAG,IAAI,CAAC,sBAAsB,EAAE,MAAM,GAAG,eAAe,CAAC,GAAG;IAC1E,aAAa,EAAE,sBAAsB,CAAC,eAAe,CAAC,CAAC;CACxD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"functions.test.d.ts","sourceRoot":"","sources":["../../src/config/functions.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../src/config/generate-erd/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,kBAAkB,SAa3B,CAAC"}
|