@orizm/cli 1.0.3 → 1.1.1

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 (73) hide show
  1. package/dist/cli.cjs +1726 -0
  2. package/dist/cli.d.ts +2 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +309 -73
  5. package/dist/cms/generate/command.d.ts +3 -0
  6. package/dist/cms/generate/command.d.ts.map +1 -0
  7. package/dist/cms/generate/generator.d.ts +8 -0
  8. package/dist/cms/generate/generator.d.ts.map +1 -0
  9. package/dist/cms/pull/action.d.ts +5 -0
  10. package/dist/cms/pull/action.d.ts.map +1 -0
  11. package/dist/cms/pull/command.d.ts +3 -0
  12. package/dist/cms/pull/command.d.ts.map +1 -0
  13. package/dist/config/functions.d.ts +38 -0
  14. package/dist/config/functions.d.ts.map +1 -0
  15. package/dist/config/functions.test.d.ts +2 -0
  16. package/dist/config/functions.test.d.ts.map +1 -0
  17. package/dist/config/generate-erd/command.d.ts +3 -0
  18. package/dist/config/generate-erd/command.d.ts.map +1 -0
  19. package/dist/config/generate-erd/convert-to-input.d.ts +23 -0
  20. package/dist/config/generate-erd/convert-to-input.d.ts.map +1 -0
  21. package/dist/config/generate-erd/convert-to-input.test.d.ts +2 -0
  22. package/dist/config/generate-erd/convert-to-input.test.d.ts.map +1 -0
  23. package/dist/config/generate-erd/generate.d.ts +3 -0
  24. package/dist/config/generate-erd/generate.d.ts.map +1 -0
  25. package/dist/config/index.cjs +107 -0
  26. package/dist/config/index.d.ts +2 -0
  27. package/dist/config/index.d.ts.map +1 -0
  28. package/dist/config/index.js +80 -0
  29. package/dist/config/validate/command.d.ts +3 -0
  30. package/dist/config/validate/command.d.ts.map +1 -0
  31. package/dist/config/validate/watcher.d.ts +2 -0
  32. package/dist/config/validate/watcher.d.ts.map +1 -0
  33. package/dist/consumer/generate/action.d.ts +2 -0
  34. package/dist/consumer/generate/action.d.ts.map +1 -0
  35. package/dist/consumer/generate/command.d.ts +3 -0
  36. package/dist/consumer/generate/command.d.ts.map +1 -0
  37. package/dist/consumer/pull/action.d.ts +5 -0
  38. package/dist/consumer/pull/action.d.ts.map +1 -0
  39. package/dist/consumer/pull/command.d.ts +3 -0
  40. package/dist/consumer/pull/command.d.ts.map +1 -0
  41. package/dist/consumer/pull/generate.d.ts +7 -0
  42. package/dist/consumer/pull/generate.d.ts.map +1 -0
  43. package/dist/lib/cli-cursor.d.ts +3 -0
  44. package/dist/lib/cli-cursor.d.ts.map +1 -0
  45. package/dist/lib/cli-input.d.ts +2 -0
  46. package/dist/lib/cli-input.d.ts.map +1 -0
  47. package/dist/lib/cli-spinner.d.ts +13 -0
  48. package/dist/lib/cli-spinner.d.ts.map +1 -0
  49. package/dist/lib/cli-symbol.d.ts +3 -0
  50. package/dist/lib/cli-symbol.d.ts.map +1 -0
  51. package/dist/lib/cli-table.d.ts +16 -0
  52. package/dist/lib/cli-table.d.ts.map +1 -0
  53. package/dist/lib/developer-api.d.ts +7 -0
  54. package/dist/lib/developer-api.d.ts.map +1 -0
  55. package/dist/lib/display-change-events.d.ts +5 -0
  56. package/dist/lib/display-change-events.d.ts.map +1 -0
  57. package/dist/lib/display-valibot-error.d.ts +6 -0
  58. package/dist/lib/display-valibot-error.d.ts.map +1 -0
  59. package/dist/lib/display-valibot-error.test.d.ts +2 -0
  60. package/dist/lib/display-valibot-error.test.d.ts.map +1 -0
  61. package/dist/lib/fetch-current-definition.d.ts +7 -0
  62. package/dist/lib/fetch-current-definition.d.ts.map +1 -0
  63. package/dist/lib/handle-error.d.ts +2 -0
  64. package/dist/lib/handle-error.d.ts.map +1 -0
  65. package/dist/lib/load-config.d.ts +3 -0
  66. package/dist/lib/load-config.d.ts.map +1 -0
  67. package/dist/lib/load-env.d.ts +10 -0
  68. package/dist/lib/load-env.d.ts.map +1 -0
  69. package/dist/push/command.d.ts +3 -0
  70. package/dist/push/command.d.ts.map +1 -0
  71. package/dist/types.d.ts +22 -0
  72. package/dist/types.d.ts.map +1 -0
  73. package/package.json +19 -5
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cli.d.ts.map
@@ -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 Command6, program } from "commander";
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 (v2.isValiError(error2)) {
159
+ if (v3.isValiError(error2)) {
104
160
  console.error();
105
- console.error(`Error: ${error2.issues.length} problem(s) found.`);
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
- cliColor2.red(
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
- "typeName",
149
- (column) => {
150
- if (column.type === "reference") {
151
- return "string";
152
- } else if (column.type === "module") {
153
- return toCodeTypeName(column.moduleName);
154
- } else if (column.type === "module-array") {
155
- return toCodeTypeName(column.moduleName) + "[]";
156
- } else if (column.type == "json") {
157
- return "unknown";
158
- } else if (column.type === "storage") {
159
- return "StorageItemType";
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((v4) => encodeURIComponent(v4))).join(joiner2);
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 v4 of value) {
611
+ for (const v6 of value) {
565
612
  if (options.style === "simple" || options.style === "label") {
566
- values.push(options.allowReserved === true ? v4 : encodeURIComponent(v4));
613
+ values.push(options.allowReserved === true ? v6 : encodeURIComponent(v6));
567
614
  } else {
568
- values.push(serializePrimitiveParam(name, v4, options));
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, v4] of iterator) {
678
- if (v4 === null) {
724
+ for (const [k, v6] of iterator) {
725
+ if (v6 === null) {
679
726
  finalHeaders.delete(k);
680
- } else if (Array.isArray(v4)) {
681
- for (const v22 of v4) {
727
+ } else if (Array.isArray(v6)) {
728
+ for (const v22 of v6) {
682
729
  finalHeaders.append(k, v22);
683
730
  }
684
- } else if (v4 !== void 0) {
685
- finalHeaders.set(k, v4);
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 v3 from "valibot";
811
+ import * as v4 from "valibot";
765
812
  import dotenv from "dotenv";
766
813
  var DEFAULT_ENV_FILE_PATH = ".env";
767
- var EnvSchema = v3.object({
768
- ORIZM_PROJECT: v3.pipe(
769
- v3.string(),
770
- v3.minLength(1, "ORIZM_PROJECT is required"),
771
- v3.brand("ORIZM_PROJECT")
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: v3.pipe(
774
- v3.optional(v3.string(), "https://app.orizm.com"),
820
+ ORIZM_BASE_URL: v4.pipe(
821
+ v4.optional(v4.string(), "https://app.orizm.com"),
775
822
  // if null, use default value
776
- v3.transform((v4) => v4.replace(/\/$/, "")),
823
+ v4.transform((v6) => v6.replace(/\/$/, "")),
777
824
  // remove trailing slash
778
- v3.brand("ORIZM_BASE_URL")
825
+ v4.brand("ORIZM_BASE_URL")
779
826
  ),
780
- ORIZM_API_KEY: v3.pipe(
781
- v3.string(),
782
- v3.minLength(1, "ORIZM_API_KEY is required"),
783
- v3.brand("ORIZM_API_KEY")
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 = v3.safeParse(EnvSchema, dotenvParsed);
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 = v3.safeParse(EnvSchema, process.env);
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 schema...");
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 schema.");
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("filterRefColumn", (columns) => {
899
- return (columns || []).filter(
900
- (c) => c.type === "reference" && c.tableName && c.includeName || c.type === "module" && c.moduleName || c.type === "module-array" && c.moduleName
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 schema...");
996
+ spinner3.start("Loading project config...");
947
997
  const definition = await loadConfig(orizmConfigTs);
948
- spinner3.succeed("Loaded project schema.");
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 schema...");
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 schema.");
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 cliColor4 from "cli-color";
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 cliColor3 from "cli-color";
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(cliColor3.green("No changes."));
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 schema...");
1476
+ spinner5.start("Loading project config...");
1426
1477
  const projectDef = await loadConfig(options.config);
1427
- spinner5.succeed("Loaded project schema.");
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(cliColor4.red("Canceled."));
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 Command6("cms").description("cms commands.");
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 Command6("consumer").description(
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,3 @@
1
+ import { Command } from "commander";
2
+ export declare const cmsGenerateCommand: Command;
3
+ //# sourceMappingURL=command.d.ts.map
@@ -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,8 @@
1
+ import { ServerOrizmConfig } from "../../types.js";
2
+ type GenerateOptions = {
3
+ config: ServerOrizmConfig;
4
+ output: string;
5
+ };
6
+ export declare function generate(options: GenerateOptions): Promise<void>;
7
+ export {};
8
+ //# sourceMappingURL=generator.d.ts.map
@@ -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,5 @@
1
+ export declare function pullAction(options: {
2
+ destination: string;
3
+ envPath: string;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=action.d.ts.map
@@ -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,3 @@
1
+ import { Command } from "commander";
2
+ export declare const cmsPullCommand: Command;
3
+ //# sourceMappingURL=command.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=functions.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"functions.test.d.ts","sourceRoot":"","sources":["../../src/config/functions.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const generateErdCommand: Command;
3
+ //# sourceMappingURL=command.d.ts.map
@@ -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"}