@orizm/cli 1.1.1 → 2.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.
Files changed (78) hide show
  1. package/dist/cli.cjs +85 -52
  2. package/dist/cli.cjs.map +1 -0
  3. package/dist/cli.d.cts +2 -0
  4. package/dist/cli.d.ts +2 -2
  5. package/dist/cli.js +72 -39
  6. package/dist/cli.js.map +1 -0
  7. package/dist/config/index.cjs +1 -0
  8. package/dist/config/index.cjs.map +1 -0
  9. package/dist/config/{functions.d.ts → index.d.cts} +19 -4
  10. package/dist/config/index.d.ts +53 -2
  11. package/dist/config/index.js +1 -0
  12. package/dist/config/index.js.map +1 -0
  13. package/package.json +14 -17
  14. package/dist/cli.d.ts.map +0 -1
  15. package/dist/cms/generate/command.d.ts +0 -3
  16. package/dist/cms/generate/command.d.ts.map +0 -1
  17. package/dist/cms/generate/generator.d.ts +0 -8
  18. package/dist/cms/generate/generator.d.ts.map +0 -1
  19. package/dist/cms/pull/action.d.ts +0 -5
  20. package/dist/cms/pull/action.d.ts.map +0 -1
  21. package/dist/cms/pull/command.d.ts +0 -3
  22. package/dist/cms/pull/command.d.ts.map +0 -1
  23. package/dist/config/functions.d.ts.map +0 -1
  24. package/dist/config/functions.test.d.ts +0 -2
  25. package/dist/config/functions.test.d.ts.map +0 -1
  26. package/dist/config/generate-erd/command.d.ts +0 -3
  27. package/dist/config/generate-erd/command.d.ts.map +0 -1
  28. package/dist/config/generate-erd/convert-to-input.d.ts +0 -23
  29. package/dist/config/generate-erd/convert-to-input.d.ts.map +0 -1
  30. package/dist/config/generate-erd/convert-to-input.test.d.ts +0 -2
  31. package/dist/config/generate-erd/convert-to-input.test.d.ts.map +0 -1
  32. package/dist/config/generate-erd/generate.d.ts +0 -3
  33. package/dist/config/generate-erd/generate.d.ts.map +0 -1
  34. package/dist/config/index.d.ts.map +0 -1
  35. package/dist/config/validate/command.d.ts +0 -3
  36. package/dist/config/validate/command.d.ts.map +0 -1
  37. package/dist/config/validate/watcher.d.ts +0 -2
  38. package/dist/config/validate/watcher.d.ts.map +0 -1
  39. package/dist/consumer/generate/action.d.ts +0 -2
  40. package/dist/consumer/generate/action.d.ts.map +0 -1
  41. package/dist/consumer/generate/command.d.ts +0 -3
  42. package/dist/consumer/generate/command.d.ts.map +0 -1
  43. package/dist/consumer/pull/action.d.ts +0 -5
  44. package/dist/consumer/pull/action.d.ts.map +0 -1
  45. package/dist/consumer/pull/command.d.ts +0 -3
  46. package/dist/consumer/pull/command.d.ts.map +0 -1
  47. package/dist/consumer/pull/generate.d.ts +0 -7
  48. package/dist/consumer/pull/generate.d.ts.map +0 -1
  49. package/dist/lib/cli-cursor.d.ts +0 -3
  50. package/dist/lib/cli-cursor.d.ts.map +0 -1
  51. package/dist/lib/cli-input.d.ts +0 -2
  52. package/dist/lib/cli-input.d.ts.map +0 -1
  53. package/dist/lib/cli-spinner.d.ts +0 -13
  54. package/dist/lib/cli-spinner.d.ts.map +0 -1
  55. package/dist/lib/cli-symbol.d.ts +0 -3
  56. package/dist/lib/cli-symbol.d.ts.map +0 -1
  57. package/dist/lib/cli-table.d.ts +0 -16
  58. package/dist/lib/cli-table.d.ts.map +0 -1
  59. package/dist/lib/developer-api.d.ts +0 -7
  60. package/dist/lib/developer-api.d.ts.map +0 -1
  61. package/dist/lib/display-change-events.d.ts +0 -5
  62. package/dist/lib/display-change-events.d.ts.map +0 -1
  63. package/dist/lib/display-valibot-error.d.ts +0 -6
  64. package/dist/lib/display-valibot-error.d.ts.map +0 -1
  65. package/dist/lib/display-valibot-error.test.d.ts +0 -2
  66. package/dist/lib/display-valibot-error.test.d.ts.map +0 -1
  67. package/dist/lib/fetch-current-definition.d.ts +0 -7
  68. package/dist/lib/fetch-current-definition.d.ts.map +0 -1
  69. package/dist/lib/handle-error.d.ts +0 -2
  70. package/dist/lib/handle-error.d.ts.map +0 -1
  71. package/dist/lib/load-config.d.ts +0 -3
  72. package/dist/lib/load-config.d.ts.map +0 -1
  73. package/dist/lib/load-env.d.ts +0 -10
  74. package/dist/lib/load-env.d.ts.map +0 -1
  75. package/dist/push/command.d.ts +0 -3
  76. package/dist/push/command.d.ts.map +0 -1
  77. package/dist/types.d.ts +0 -22
  78. package/dist/types.d.ts.map +0 -1
package/dist/cli.js CHANGED
@@ -177,15 +177,27 @@ function handleError(error2) {
177
177
  // src/cms/generate/generator.ts
178
178
  import { mkdir, writeFile } from "fs/promises";
179
179
  import path from "path";
180
- import Handlebars from "handlebars";
180
+ import _Handlebars from "handlebars";
181
181
 
182
182
  // src/cms/templates/types.ts.hbr
183
- var types_ts_default = '// This file was automatically generated and should not be edited.\n\nimport { FormValidationRules, StorageItemType } from "@orizm/common";\n\n// Utilities\ntype _ModuleRef<T> = T & _ModuleDescriptor;\ntype _ModuleDescriptor = {\n isModule: true;\n};\ntype _ArrayModuleRef<T> = T & _ArrayModuleDescriptor;\ntype _ArrayModuleDescriptor = {\n isModuleArray: true;\n};\n\n// Tables\n{{#each tables}}\nexport type {{toCodeTypeName this.name}} = {\n id: string;\n createdAt: string;\n updatedAt: string;\n {{#unless this.isSubmissions}}\n group?: string;\n publishedAt?: string;\n _draft?: boolean;\n _published?: boolean;\n scheduledPublishAt?: string | null;\n scheduledUnpublishAt?: string | null;\n {{else}}\n _formId: string;\n _content: unknown;\n _formSchema: unknown;\n _attachments: StorageItemType[];\n {{/unless}}\n {{#each this.columns}}\n {{this.name}}{{#unless this.required}}?{{/unless}}: {{typeName this}};\n {{/each}}\n {{#if this.enableForm}}\n formSchema: FormValidationRules;\n {{/if}}\n};\n\nexport type {{toCodeTypeName this.name}}CreateInput = {\n {{#unless this.isSubmissions}}\n group?: string;\n publishedAt?: string;\n scheduledPublishAt?: string | null;\n scheduledUnpublishAt?: string | null;\n createdAt?: string;\n {{/unless}}\n {{#each this.columns}}\n {{this.name}}{{#unless this.required}}?{{/unless}}: {{typeName this}};\n {{/each}}\n {{#if this.enableForm}}\n formSchema: FormValidationRules;\n {{/if}}\n};\n\nexport type {{toCodeTypeName this.name}}UpdateInput = {\n {{#each this.columns}}\n {{#unless this.readOnly}}{{this.name}}?: {{typeName this}}{{#unless this.required}} | null{{/unless}};{{/unless}}\n {{/each}}\n {{#unless this.isSubmissions}}\n publishedAt?: string;\n scheduledPublishAt?: string | null;\n scheduledUnpublishAt?: string | null;\n createdAt?: string;\n {{/unless}}\n {{#if this.enableForm}}\n formSchema: FormValidationRules;\n {{/if}}\n};\n{{/each}}\n\n// Module types\n{{#each tableModules}}\nexport type {{toCodeTypeName this.name}} = {\n id?: string;\n {{#each this.columns}}\n {{this.name}}{{#unless this.required}}?{{/unless}}: {{typeName this}};\n {{/each}}\n};\n{{/each}}\n\n\n// Descriptor types\n{{#each tables}}\nexport type {{toCodeTypeName this.name}}__Descriptor = {\n row: {{toCodeTypeName this.name}};\n create: {{toCodeTypeName this.name}}CreateInput;\n update: {{toCodeTypeName this.name}}UpdateInput;\n {{#if (filterRefColumn this.columns)}}\n refs: {\n {{#each (filterRefColumn this.columns)}}\n {{includeName this}}: {{{includeType this}}};\n {{/each}}\n }\n {{/if}}\n {{#unless (filterRefColumn this.columns)}}\n refs: object;\n {{/unless}}\n {{#if (filterUniqueIndexes this.indexes)}}\n unique: [\n {{#each (filterUniqueIndexes this.indexes)}}\n { {{#each (getIndexColumns ../this this)}}{{this.name}}:{{typeName this}},{{/each}} },\n {{/each}}\n ]\n {{/if}}\n {{#unless (filterUniqueIndexes this.indexes)}}\n unique: [];\n {{/unless}}\n {{#if this.enableDrafts}}\n enableDrafts: true;\n {{/if}}\n {{#if this.enableForm}}\n submissionDescriptor: {{toCodeTypeName this.name}}_Submission__Descriptor;\n {{else}}\n submissionDescriptor: never;\n {{/if}}\n};\n{{/each}}\n\n\n{{#each tableModules}}\nexport type {{toCodeTypeName this.name}}__Descriptor = {\n row: {{toCodeTypeName this.name}};\n {{#if (filterRefColumn this.columns)}}\n refs: {\n {{#each (filterRefColumn this.columns)}}\n {{includeName this}}: {{{includeType this}}};\n {{/each}}\n }\n {{/if}}\n {{#unless (filterRefColumn this.columns)}}\n refs: object;\n {{/unless}}\n unique:[]\n};\n{{/each}}\n\n\n// Webhook types\nexport type WebhookEvent = "content.create" | "content.update" | "content.delete";\ntype WebhookPayloadBase = {\n event: WebhookEvent;\n timestamp: string;\n project: string;\n};\n{{#if tables}}\nexport type WebhookPayload = WebhookPayloadBase & (\n {{#each tables}}\n | {\n table: "{{this.name}}";\n content: {{toCodeTypeName this.name}};\n old?: {{toCodeTypeName this.name}};\n }\n {{/each}}\n);\n{{else}}\nexport type WebhookPayload = WebhookPayloadBase;\n{{/if}}\n';
183
+ var types_ts_default = '// This file was automatically generated and should not be edited.\n\nimport { FormValidationRules, StorageItemType } from "@orizm/cms-sdk/common";\n\n// Utilities\ntype _ModuleRef<T> = T & _ModuleDescriptor;\ntype _ModuleDescriptor = {\n isModule: true;\n};\ntype _ArrayModuleRef<T> = T & _ArrayModuleDescriptor;\ntype _ArrayModuleDescriptor = {\n isModuleArray: true;\n};\n\n// Tables\n{{#each tables}}\nexport type {{toCodeTypeName this.name}} = {\n id: string;\n createdAt: string;\n updatedAt: string;\n {{#unless this.isSubmissions}}\n group: string | null;\n publishedAt: string | null;\n _draft: boolean | null;\n _published: boolean | null;\n scheduledPublishAt: string | null;\n scheduledUnpublishAt: string | null;\n {{else}}\n _formId: string;\n _content: unknown;\n _formSchema: unknown;\n _attachments: StorageItemType[];\n {{/unless}}\n {{#each this.columns}}\n {{this.name}}: {{typeName this}}{{#unless this.required}}{{#if_equal this.type "module-array"}}{{else}} | null{{/if_equal}}{{/unless}};\n {{/each}}\n {{#if this.enableForm}}\n formSchema: FormValidationRules;\n {{/if}}\n};\n\nexport type {{toCodeTypeName this.name}}CreateInput = {\n {{#unless this.isSubmissions}}\n group?: string | null;\n publishedAt?: string | null;\n scheduledPublishAt?: string | null;\n scheduledUnpublishAt?: string | null;\n createdAt?: string;\n {{/unless}}\n {{#each this.columns}}\n {{this.name}}{{#unless this.required}}?{{/unless}}: {{typeName this "CreateInput"}}{{#unless this.required}}{{#if_equal this.type "module-array"}}{{else}} | null{{/if_equal}}{{/unless}};\n {{/each}}\n {{#if this.enableForm}}\n formSchema: FormValidationRules;\n {{/if}}\n};\n\nexport type {{toCodeTypeName this.name}}UpdateInput = {\n {{#each this.columns}}\n {{#unless this.readOnly}}{{this.name}}?: {{typeName this "UpdateInput"}}{{#unless this.required}}{{#if_equal this.type "module-array"}}{{else}} | null{{/if_equal}}{{/unless}};{{/unless}}\n {{/each}}\n {{#unless this.isSubmissions}}\n publishedAt?: string | null;\n scheduledPublishAt?: string | null;\n scheduledUnpublishAt?: string | null;\n createdAt?: string;\n {{/unless}}\n {{#if this.enableForm}}\n formSchema: FormValidationRules;\n {{/if}}\n};\n\n{{/each}}\n\n\n// Module types\n{{#each tableModules}}\nexport type {{toCodeTypeName this.name}} = {\n id: string;\n {{#each this.columns}}\n {{this.name}}: {{typeName this}}{{#unless this.required}}{{#if_equal this.type "module-array"}}{{else}} | null{{/if_equal}}{{/unless}};\n {{/each}}\n};\n\nexport type {{toCodeTypeName this.name}}CreateInput = {\n {{#each this.columns}}\n {{this.name}}{{#unless this.required}}?{{/unless}}: {{typeName this "CreateInput"}}{{#unless this.required}}{{#if_equal this.type "module-array"}}{{else}} | null{{/if_equal}}{{/unless}};\n {{/each}}\n};\n\nexport type {{toCodeTypeName this.name}}UpdateInput = {\n id?: string;\n {{#each this.columns}}\n {{this.name}}{{#unless this.required}}?{{/unless}}: {{typeName this}}{{#unless this.required}}{{#if_equal this.type "module-array"}}{{else}} | null{{/if_equal}}{{/unless}};\n {{/each}}\n};\n\n{{/each}}\n\n\n// Descriptor types\n{{#each tables}}\nexport type {{toCodeTypeName this.name}}__Descriptor = {\n row: {{toCodeTypeName this.name}};\n create: {{toCodeTypeName this.name}}CreateInput;\n update: {{toCodeTypeName this.name}}UpdateInput;\n {{#if (filterRefColumn this.columns)}}\n refs: {\n {{#each (filterRefColumn this.columns)}}\n {{includeName this}}: {{{includeType this}}};\n {{/each}}\n }\n {{/if}}\n {{#unless (filterRefColumn this.columns)}}\n refs: object;\n {{/unless}}\n {{#if (filterUniqueIndexes this.indexes)}}\n unique: [\n {{#each (filterUniqueIndexes this.indexes)}}\n { {{#each (getIndexColumns ../this this)}}{{this.name}}:{{typeName this}}{{#unless this.required}}{{#if ../this.nullsNotDistinct}} | null{{/if}}{{/unless}},{{/each}} },\n {{/each}}\n ]\n {{/if}}\n {{#unless (filterUniqueIndexes this.indexes)}}\n unique: [];\n {{/unless}}\n {{#if this.enableDrafts}}\n enableDrafts: true;\n {{/if}}\n {{#if this.enableForm}}\n submissionDescriptor: {{toCodeTypeName this.name}}_Submission__Descriptor;\n {{else}}\n submissionDescriptor: never;\n {{/if}}\n};\n\n{{/each}}\n\n\n{{#each tableModules}}\nexport type {{toCodeTypeName this.name}}__Descriptor = {\n row: {{toCodeTypeName this.name}};\n {{#if (filterRefColumn this.columns)}}\n refs: {\n {{#each (filterRefColumn this.columns)}}\n {{includeName this}}: {{{includeType this}}};\n {{/each}}\n }\n {{/if}}\n {{#unless (filterRefColumn this.columns)}}\n refs: object;\n {{/unless}}\n unique:[]\n};\n{{/each}}\n\n\n// Webhook types\nexport type WebhookEvent = "content.create" | "content.update" | "content.delete";\n\ntype WebhookPayloadBase = {\n event: WebhookEvent;\n timestamp: string;\n project: string;\n};\n\n{{#if tables}}\nexport type WebhookPayload = WebhookPayloadBase & (\n {{#each tables}}\n | {\n table: "{{this.name}}";\n content: {{toCodeTypeName this.name}};\n old?: {{toCodeTypeName this.name}};\n }\n {{/each}}\n);\n{{else}}\nexport type WebhookPayload = WebhookPayloadBase;\n{{/if}}\n';
184
184
 
185
185
  // src/cms/templates/client.ts.hbr
186
186
  var client_ts_default = '// This file was automatically generated and should not be edited.\n\nimport { OrizmCMSClient } from "@orizm/cms-sdk";\n\nimport * as Models from "./types";\n\nexport class CMSClient {\n constructor(protected client: OrizmCMSClient) {\n this.tables = {\n {{#each tables}}\n {{toEndpointName this.name}}: this.client.getTableClient<Models.{{toCodeTypeName this.name}}__Descriptor>("{{toEndpointName this.name}}"),\n {{/each}}\n };\n\n this.buckets = {\n {{#each buckets}}\n {{toEndpointName this.name}}: this.client.getBucketClient("{{toEndpointName this.name}}"),\n {{/each}}\n };\n\n this.userManagement = this.client.userManagement;\n \n this.userinfo = this.client.userinfo;\n \n this.auth = this.client.auth;\n }\n\n readonly tables;\n readonly buckets;\n readonly userManagement;\n readonly userinfo;\n readonly auth;\n}\n';
187
187
 
188
+ // src/lib/format-ts-with-prettier.ts
189
+ import * as prettier from "prettier/standalone";
190
+ import prettierPluginEstree from "prettier/plugins/estree.js";
191
+ import prettierPluginTypeScript from "prettier/plugins/typescript.js";
192
+ async function formatTsWithPrettier(code) {
193
+ return prettier.format(code, {
194
+ parser: "typescript",
195
+ plugins: [prettierPluginEstree, prettierPluginTypeScript]
196
+ });
197
+ }
198
+
188
199
  // src/cms/generate/generator.ts
200
+ var Handlebars = _Handlebars.create();
189
201
  Handlebars.registerHelper("toEndpointName", (str) => {
190
202
  return str;
191
203
  });
@@ -194,21 +206,25 @@ function toCodeTypeName(str) {
194
206
  return str.replace(/_([a-z])/g, (g) => g[1].toUpperCase());
195
207
  }
196
208
  Handlebars.registerHelper("toCodeTypeName", toCodeTypeName);
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;
209
+ Handlebars.registerHelper(
210
+ "typeName",
211
+ (column, _moduleSuffix) => {
212
+ const moduleSuffix = typeof _moduleSuffix === "string" ? _moduleSuffix : "";
213
+ if (column.type === "reference") {
214
+ return "string";
215
+ } else if (column.type === "module") {
216
+ return toCodeTypeName(column.moduleName) + moduleSuffix;
217
+ } else if (column.type === "module-array") {
218
+ return toCodeTypeName(column.moduleName) + moduleSuffix + "[]";
219
+ } else if (column.type == "json") {
220
+ return "unknown";
221
+ } else if (column.type === "storage") {
222
+ return "StorageItemType";
223
+ } else {
224
+ return column.type;
225
+ }
210
226
  }
211
- });
227
+ );
212
228
  Handlebars.registerHelper(
213
229
  "filterRefColumn",
214
230
  (columns) => {
@@ -254,13 +270,26 @@ Handlebars.registerHelper(
254
270
  });
255
271
  }
256
272
  );
273
+ Handlebars.registerHelper("if_equal", function(a, b, options) {
274
+ return a === b ? options.fn(this) : options.inverse(this);
275
+ });
257
276
  async function generate(options) {
258
277
  const config = options.config;
259
278
  await mkdir(options.output, { recursive: true });
260
- await renderTypes(config, options.output);
261
- await renderClient(config, options.output);
279
+ const renderedTypes = await renderTypes(config);
280
+ await writeFile(
281
+ path.join(options.output, "types.ts"),
282
+ renderedTypes,
283
+ "utf-8"
284
+ );
285
+ const renderedClient = await renderClient(config);
286
+ await writeFile(
287
+ path.join(options.output, "client.ts"),
288
+ renderedClient,
289
+ "utf-8"
290
+ );
262
291
  }
263
- async function renderTypes(config, output) {
292
+ async function renderTypes(config) {
264
293
  const submissionTables = config.tables.filter((t) => t.enableForm).map((t) => ({
265
294
  name: t.name + "__submission",
266
295
  columns: t.formOptions?.submissionColumns || [],
@@ -270,14 +299,12 @@ async function renderTypes(config, output) {
270
299
  ...config,
271
300
  tables: [...config.tables, ...submissionTables]
272
301
  };
273
- const rendered = Handlebars.compile(types_ts_default)(renderParams);
274
- const targetPath = path.join(output, "types.ts");
275
- await writeFile(targetPath, rendered, "utf-8");
302
+ return await formatTsWithPrettier(
303
+ Handlebars.compile(types_ts_default)(renderParams)
304
+ );
276
305
  }
277
- async function renderClient(config, output) {
278
- const rendered = Handlebars.compile(client_ts_default)(config);
279
- const targetPath = path.join(output, "client.ts");
280
- await writeFile(targetPath, rendered, "utf-8");
306
+ async function renderClient(config) {
307
+ return await formatTsWithPrettier(Handlebars.compile(client_ts_default)(config));
281
308
  }
282
309
 
283
310
  // src/cms/generate/command.ts
@@ -899,19 +926,24 @@ import { Command as Command3 } from "commander";
899
926
  // src/consumer/pull/generate.ts
900
927
  import { mkdir as mkdir2, writeFile as writeFile2 } from "fs/promises";
901
928
  import path2 from "path";
902
- import Handlebars2 from "handlebars";
929
+ import _Handlebars2 from "handlebars";
903
930
 
904
931
  // src/consumer/templates/client.ts.hbr
905
932
  var client_ts_default2 = '// This file was automatically generated and should not be edited.\n\nimport { ConsumerClientOptions, OrizmConsumerClientBase } from "@orizm/consumer-sdk";\nimport * as Models from "./types";\n\nexport class OrizmClient extends OrizmConsumerClientBase {\n constructor(options: ConsumerClientOptions) {\n super(options);\n }\n\n readonly tables = {\n {{#each tables}}\n {{toEndpointName this.name}}: this.getTableClient<Models.{{toCodeTypeName this.name}}__Descriptor>("{{toEndpointName this.name}}"),\n {{/each}}\n };\n}\n';
906
933
 
907
934
  // src/consumer/templates/types.ts.hbr
908
- var types_ts_default2 = '// This file was automatically generated and should not be edited.\n\nimport { FormValidationRules, StorageItemType } from "@orizm/common";\n\n// Utilities\ntype _ModuleRef<T> = T & _ModuleDescriptor;\ntype _ModuleDescriptor = {\n isModule: true;\n};\ntype _ArrayModuleRef<T> = T & _ArrayModuleDescriptor;\ntype _ArrayModuleDescriptor = {\n isModuleArray: true;\n};\n\n\n// Tables\n{{#each tables}}\nexport type {{toCodeTypeName this.name}} = {\n id: string;\n createdAt: string;\n updatedAt: string;\n group?: string;\n publishedAt?: string;\n _draft?: boolean;\n _published?: boolean;\n {{#each this.columns}}\n {{this.name}}{{#unless this.required}}?{{/unless}}: {{typeName this}};\n {{/each}}\n {{#if this.enableForm}}\n formSchema: FormValidationRules;\n {{/if}}\n}\n\n{{/each}}\n\n{{#each tableModules}}\nexport type {{toCodeTypeName this.name}} = {\n {{#each this.columns}}\n {{this.name}}{{#unless this.required}}?{{/unless}}: {{typeName this}};\n {{/each}}\n};\n{{/each}}\n\n// Descriptor types\n{{#each tables}}\nexport type {{toCodeTypeName this.name}}__Descriptor = {\n row: {{toCodeTypeName this.name}};\n {{#if (filterRefColumn this.columns)}}\n refs: {\n {{#each (filterRefColumn this.columns)}}\n {{includeName this}}: {{{includeType this}}};\n {{/each}}\n }\n {{/if}}\n {{#unless (filterRefColumn this.columns)}}\n refs: object;\n {{/unless}}\n {{#if (filterUniqueIndexes this.indexes)}}\n unique: [\n {{#each (filterUniqueIndexes this.indexes)}}\n { {{#each (getIndexColumns ../this this)}}{{this.name}}:{{typeName this}},{{/each}} },\n {{/each}}\n ]\n {{/if}}\n {{#unless (filterUniqueIndexes this.indexes)}}\n unique: [];\n {{/unless}}\n {{#if this.enableDrafts}}\n enableDrafts: true;\n {{/if}}\n};\n{{/each}}\n\n\n{{#each tableModules}}\nexport type {{toCodeTypeName this.name}}__Descriptor = {\n row: {{toCodeTypeName this.name}};\n {{#if (filterRefColumn this.columns)}}\n refs: {\n {{#each (filterRefColumn this.columns)}}\n {{includeName this}}: {{{includeType this}}};\n {{/each}}\n }\n {{/if}}\n {{#unless (filterRefColumn this.columns)}}\n refs: object;\n {{/unless}}\n unique:[]\n};\n{{/each}}\n\n\n// Webhook types\nexport type WebhookEvent = "content.create" | "content.update" | "content.delete";\ntype WebhookPayloadBase = {\n event: WebhookEvent;\n timestamp: string;\n project: string;\n};\n{{#if tables}}\nexport type WebhookPayload = WebhookPayloadBase & (\n {{#each tables}}\n | {\n table: "{{this.name}}";\n content: {{toCodeTypeName this.name}};\n old?: {{toCodeTypeName this.name}};\n }\n {{/each}}\n);\n{{else}}\nexport type WebhookPayload = WebhookPayloadBase;\n{{/if}}\n';
935
+ var types_ts_default2 = '// This file was automatically generated and should not be edited.\n\nimport { FormValidationRules, StorageItemType } from "@orizm/consumer-sdk/common";\n\n// Utilities\ntype _ModuleRef<T> = T & _ModuleDescriptor;\ntype _ModuleDescriptor = {\n isModule: true;\n};\ntype _ArrayModuleRef<T> = T & _ArrayModuleDescriptor;\ntype _ArrayModuleDescriptor = {\n isModuleArray: true;\n};\n\n\n// Tables\n{{#each tables}}\nexport type {{toCodeTypeName this.name}} = {\n id: string;\n createdAt: string;\n updatedAt: string;\n group: string | null;\n publishedAt: string | null;\n _draft: boolean | null;\n _published: boolean | null;\n {{#each this.columns}}\n {{this.name}}: {{typeName this}}{{#unless this.required}}{{#if_equal this.type "module-array"}}{{else}} | null{{/if_equal}}{{/unless}};\n {{/each}}\n {{#if this.enableForm}}\n formSchema: FormValidationRules;\n {{/if}}\n}\n\n{{/each}}\n\n{{#each tableModules}}\nexport type {{toCodeTypeName this.name}} = {\n id: string;\n {{#each this.columns}}\n {{this.name}}: {{typeName this}}{{#unless this.required}}{{#if_equal this.type "module-array"}}{{else}} | null{{/if_equal}}{{/unless}};\n {{/each}}\n};\n\n{{/each}}\n\n// Descriptor types\n{{#each tables}}\nexport type {{toCodeTypeName this.name}}__Descriptor = {\n row: {{toCodeTypeName this.name}};\n {{#if (filterRefColumn this.columns)}}\n refs: {\n {{#each (filterRefColumn this.columns)}}\n {{includeName this}}: {{{includeType this}}};\n {{/each}}\n }\n {{/if}}\n {{#unless (filterRefColumn this.columns)}}\n refs: object;\n {{/unless}}\n {{#if (filterUniqueIndexes this.indexes)}}\n unique: [\n {{#each (filterUniqueIndexes this.indexes)}}\n { {{#each (getIndexColumns ../this this)}}{{this.name}}:{{typeName this}}{{#unless this.required}}{{#if ../this.nullsNotDistinct}} | null{{/if}}{{/unless}},{{/each}} },\n {{/each}}\n ]\n {{/if}}\n {{#unless (filterUniqueIndexes this.indexes)}}\n unique: [];\n {{/unless}}\n {{#if this.enableDrafts}}\n enableDrafts: true;\n {{/if}}\n};\n\n{{/each}}\n\n\n{{#each tableModules}}\nexport type {{toCodeTypeName this.name}}__Descriptor = {\n row: {{toCodeTypeName this.name}};\n {{#if (filterRefColumn this.columns)}}\n refs: {\n {{#each (filterRefColumn this.columns)}}\n {{includeName this}}: {{{includeType this}}};\n {{/each}}\n }\n {{/if}}\n {{#unless (filterRefColumn this.columns)}}\n refs: object;\n {{/unless}}\n unique:[]\n};\n\n{{/each}}\n\n\n// Webhook types\nexport type WebhookEvent = "content.create" | "content.update" | "content.delete";\n\ntype WebhookPayloadBase = {\n event: WebhookEvent;\n timestamp: string;\n project: string;\n};\n\n{{#if tables}}\nexport type WebhookPayload = WebhookPayloadBase & (\n {{#each tables}}\n | {\n table: "{{this.name}}";\n content: {{toCodeTypeName this.name}};\n old?: {{toCodeTypeName this.name}};\n }\n {{/each}}\n);\n{{else}}\nexport type WebhookPayload = WebhookPayloadBase;\n{{/if}}\n';
909
936
 
910
937
  // src/consumer/pull/generate.ts
938
+ var Handlebars2 = _Handlebars2.create();
911
939
  async function generate2(options) {
912
940
  await mkdir2(options.output, { recursive: true });
913
- await renderTypes2(options.definition, options.output);
914
- await renderClient2(options.definition, options.output);
941
+ const renderedTypes = await renderTypes2(options.definition);
942
+ const targetTypesPath = path2.join(options.output, "types.ts");
943
+ await writeFile2(targetTypesPath, renderedTypes, "utf-8");
944
+ const renderedClient = await renderClient2(options.definition);
945
+ const targetClientPath = path2.join(options.output, "client.ts");
946
+ await writeFile2(targetClientPath, renderedClient, "utf-8");
915
947
  }
916
948
  Handlebars2.registerHelper("toEndpointName", (str) => {
917
949
  return str;
@@ -979,15 +1011,14 @@ Handlebars2.registerHelper(
979
1011
  });
980
1012
  }
981
1013
  );
982
- async function renderTypes2(config, output) {
983
- const rendered = Handlebars2.compile(types_ts_default2)(config);
984
- const targetPath = path2.join(output, "types.ts");
985
- await writeFile2(targetPath, rendered, "utf-8");
1014
+ Handlebars2.registerHelper("if_equal", function(a, b, options) {
1015
+ return a === b ? options.fn(this) : options.inverse(this);
1016
+ });
1017
+ async function renderTypes2(config) {
1018
+ return await formatTsWithPrettier(Handlebars2.compile(types_ts_default2)(config));
986
1019
  }
987
- async function renderClient2(config, output) {
988
- const rendered = Handlebars2.compile(client_ts_default2)(config);
989
- const targetPath = path2.join(output, "client.ts");
990
- await writeFile2(targetPath, rendered, "utf-8");
1020
+ async function renderClient2(config) {
1021
+ return await formatTsWithPrettier(Handlebars2.compile(client_ts_default2)(config));
991
1022
  }
992
1023
 
993
1024
  // src/consumer/generate/action.ts
@@ -1582,12 +1613,13 @@ var validateConfigCommand = new Command6("validate").description("validate orizm
1582
1613
  import { Command as Command7 } from "commander";
1583
1614
 
1584
1615
  // src/config/generate-erd/generate.ts
1585
- import Handlebars3 from "handlebars";
1616
+ import _Handlebars3 from "handlebars";
1586
1617
 
1587
1618
  // src/config/generate-erd/mermaid-erd.hbr
1588
1619
  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
1620
 
1590
1621
  // src/config/generate-erd/generate.ts
1622
+ var Handlebars3 = _Handlebars3.create();
1591
1623
  function generate3(input2) {
1592
1624
  const template = Handlebars3.compile(mermaid_erd_default);
1593
1625
  return template(input2);
@@ -1700,3 +1732,4 @@ configCommands.addCommand(validateConfigCommand);
1700
1732
  configCommands.addCommand(generateErdCommand);
1701
1733
  program.addCommand(configCommands);
1702
1734
  program.parse();
1735
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli.ts","../src/cms/generate/command.ts","../src/lib/load-config.ts","../src/lib/cli-spinner.ts","../src/lib/cli-symbol.ts","../src/lib/cli-cursor.ts","../src/lib/handle-error.ts","../src/lib/display-valibot-error.ts","../src/cms/generate/generator.ts","../src/cms/templates/types.ts.hbr","../src/cms/templates/client.ts.hbr","../src/lib/format-ts-with-prettier.ts","../src/cms/pull/command.ts","../../../node_modules/.pnpm/openapi-fetch@0.13.5/node_modules/openapi-fetch/dist/index.js","../../private-api-clients/src/assert-valid-url-origin.ts","../../private-api-clients/src/dev-v2-api-client.ts","../src/lib/fetch-current-definition.ts","../src/lib/load-env.ts","../src/cms/pull/action.ts","../src/consumer/generate/command.ts","../src/consumer/pull/generate.ts","../src/consumer/templates/client.ts.hbr","../src/consumer/templates/types.ts.hbr","../src/consumer/generate/action.ts","../src/consumer/pull/command.ts","../src/consumer/pull/action.ts","../src/push/command.ts","../src/lib/developer-api.ts","../src/lib/display-change-events.ts","../src/lib/cli-table.ts","../src/lib/cli-input.ts","../src/config/validate/command.ts","../src/config/validate/watcher.ts","../src/config/generate-erd/command.ts","../src/config/generate-erd/generate.ts","../src/config/generate-erd/mermaid-erd.hbr","../src/config/generate-erd/convert-to-input.ts"],"sourcesContent":["import { Command, program } from \"commander\";\nimport { cmsGenerateCommand } from \"./cms/generate/command.js\";\nimport { cmsPullCommand } from \"./cms/pull/command.js\";\nimport { consumerGenerateCommand } from \"./consumer/generate/command.js\";\nimport { consumerPullCommand } from \"./consumer/pull/command.js\";\nimport { pushCommand } from \"./push/command.js\";\nimport { validateConfigCommand } from \"./config/validate/command.js\";\nimport { generateErdCommand } from \"./config/generate-erd/command.js\";\n\nprogram.name(\"orizm CLI\");\n\nprogram.addCommand(pushCommand);\n\nconst cmsCommands = new Command(\"cms\").description(\"cms commands.\");\n\ncmsCommands.addCommand(cmsGenerateCommand);\ncmsCommands.addCommand(cmsPullCommand);\nprogram.addCommand(cmsCommands);\n\nconst consumerCommands = new Command(\"consumer\").description(\n \"consumer commands.\",\n);\n\nconsumerCommands.addCommand(consumerGenerateCommand);\nconsumerCommands.addCommand(consumerPullCommand);\nprogram.addCommand(consumerCommands);\n\nconst configCommands = new Command(\"config\").description(\"config commands.\");\n\nconfigCommands.addCommand(validateConfigCommand);\nconfigCommands.addCommand(generateErdCommand);\nprogram.addCommand(configCommands);\n\nprogram.parse();\n","import { Command } from \"commander\";\nimport { loadConfig } from \"../../lib/load-config.js\";\nimport { createSpinner } from \"../../lib/cli-spinner.js\";\nimport { handleError } from \"../../lib/handle-error.js\";\nimport { generate as generateCode } from \"./generator.js\";\n\nconst spinner = createSpinner();\n\nexport const cmsGenerateCommand = new Command(\"generate\")\n .description(\"generate orizm client and types.\")\n .option(\"-c, --config <path>\", \"orizm config file path.\", \"orizm.config.ts\")\n .option(\"-o, --output <path>\", \"output directory.\", \"./src/orizm\")\n .action(async (options) => {\n try {\n spinner.start(\"Loading project schema...\");\n const config = await loadConfig(options.config);\n spinner.succeed(\"Loaded project schema.\");\n\n spinner.start(\"Generating code...\");\n await generateCode({\n config,\n output: options.output,\n });\n spinner.succeed(`Generated code to '${options.output}'`);\n } catch (error) {\n handleError(error);\n }\n });\n","import esbuild from \"esbuild\";\nimport { OrizmConfigDef } from \"@orizm/common/config-validator\";\nimport * as v from \"valibot\";\nimport { CommonOrizmConfig } from \"../types.js\";\n\nexport async function loadConfig(\n configFile: string,\n): Promise<CommonOrizmConfig> {\n const buildResult = await esbuild.build({\n entryPoints: [configFile],\n bundle: true,\n write: false,\n format: \"esm\",\n target: \"node16\",\n platform: \"node\",\n });\n\n const moduleURL = `data:text/javascript,${encodeURIComponent(\n buildResult.outputFiles[0].text,\n )}`;\n\n const { default: orizmConfigRaw } = await import(moduleURL);\n\n return v.parse(OrizmConfigDef, orizmConfigRaw);\n}\n","import readline from \"readline\";\nimport * as symbol from \"./cli-symbol.js\";\nimport * as cursor from \"./cli-cursor.js\";\n\nconst FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\nconst FRAME_INTERVAL = 80;\n\nclass Spinner {\n private text: string = \"\";\n private currentFrame: number = 0;\n private timer: NodeJS.Timeout | null = null;\n private isSpinning: boolean = false;\n\n start(text?: string): Spinner {\n if (text) {\n this.text = text;\n }\n\n if (this.isSpinning) {\n return this;\n }\n\n this.isSpinning = true;\n this.currentFrame = 0;\n\n cursor.hide();\n\n this.render();\n this.timer = setInterval(() => {\n this.render();\n }, FRAME_INTERVAL);\n\n return this;\n }\n\n stop(): Spinner {\n if (!this.isSpinning) {\n return this;\n }\n\n this.isSpinning = false;\n\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n\n readline.clearLine(process.stdout, 0);\n readline.cursorTo(process.stdout, 0);\n\n cursor.show();\n\n return this;\n }\n\n succeed(text?: string): void {\n this.stop();\n const finalText = text || this.text;\n console.log(`${symbol.success} ${finalText}`);\n }\n\n private render(): void {\n const frame = FRAMES[this.currentFrame];\n this.currentFrame = (this.currentFrame + 1) % FRAMES.length;\n\n readline.clearLine(process.stdout, 0);\n readline.cursorTo(process.stdout, 0);\n\n process.stdout.write(`${frame} ${this.text}`);\n }\n}\n\nexport function createSpinner(): Spinner {\n return new Spinner();\n}\n","import cliColor from \"cli-color\";\n\nexport const success = cliColor.green(\"✓\");\nexport const error = cliColor.red(\"✗\");\n","export function hide(): void {\n process.stdout.write(\"\\u001B[?25l\");\n}\n\nexport function show(): void {\n process.stdout.write(\"\\u001B[?25h\");\n}\n","import * as v from \"valibot\";\nimport cliColor from \"cli-color\";\nimport * as cursor from \"./cli-cursor.js\";\nimport { displayValibotError } from \"./display-valibot-error.js\";\n\nexport function handleError(error: unknown): void {\n cursor.show();\n\n if (v.isValiError(error)) {\n console.error();\n displayValibotError(error);\n console.error();\n\n process.exit(1);\n }\n\n console.error();\n console.error(\n cliColor.red(\n \"Something went wrong. Please check the error below for more details.\",\n ),\n );\n console.error();\n console.error(error);\n console.error();\n\n process.exit(1);\n}\n","import * as v from \"valibot\";\nimport cliColor from \"cli-color\";\n\nexport function displayValibotError(error: unknown): void {\n if (!v.isValiError(error)) {\n return;\n }\n\n console.error(`Error: ${error.issues.length} problem(s) found.`);\n console.error(buildValiErrorMessage(error));\n}\n\nexport function buildValiErrorMessage(\n e: v.ValiError<v.GenericSchema | v.GenericSchemaAsync>,\n options?: { color?: boolean },\n): string {\n const { color = true } = options ?? {};\n\n return e.issues\n .map((issue) => {\n const path = getPath(issue);\n return ` ${getIssueMessage(issue.message, color)} (at ${getLocationPath(path, color)})`;\n })\n .join(\"\\n\");\n}\n\nfunction getIssueMessage(message: string, color: boolean): string {\n return color ? cliColor.red(message) : message;\n}\n\nfunction getLocationPath(path: string, color: boolean): string {\n return color ? cliColor.yellow(path) : path;\n}\n\nfunction getPath(issue: v.BaseIssue<unknown>): string {\n const issueDotPath = v.getDotPath(issue);\n const pathInfo = issue.path;\n if (!issueDotPath || !pathInfo) {\n return \"\";\n }\n\n const pathParts = issueDotPath.split(\".\");\n\n // pathInfoの要素を順番に処理して、pathの位置に対応するname値を探す\n let pathInfoIndex = 0;\n\n for (let i = 0; i < pathParts.length; i++) {\n const part = pathParts[i];\n\n if (!isNumberIndex(part)) {\n continue;\n }\n\n const index = parseInt(part);\n\n // pathInfo から該当するインデックスの情報を取得\n // pathInfoIndex以降で、type=arrayかつkey=indexの要素を探す\n for (let j = pathInfoIndex; j < pathInfo.length; j++) {\n const pathItem = pathInfo[j];\n if (pathItem.type === \"array\" && pathItem.key === index) {\n if (\n pathItem.value &&\n typeof pathItem.value === \"object\" &&\n \"name\" in pathItem.value\n ) {\n pathParts[i] = String(pathItem.value.name);\n pathInfoIndex = j + 1;\n break;\n }\n }\n }\n }\n\n return pathParts.join(\".\");\n}\n\nfunction isNumberIndex(part: string): boolean {\n return /^\\d+$/.test(part);\n}\n","import { mkdir, writeFile } from \"fs/promises\";\nimport path from \"path\";\nimport _Handlebars from \"handlebars\";\nimport typesTemplate from \"../templates/types.ts.hbr\";\nimport clientTemplate from \"../templates/client.ts.hbr\";\nimport {\n CommonColumnDefinition,\n CommonIndexDefinition,\n CommonModuleColumnDefinition,\n CommonOrizmConfig,\n CommonReferenceColumnDefinition,\n CommonTableDefinition,\n ServerOrizmConfig,\n} from \"../../types.js\";\nimport { formatTsWithPrettier } from \"../../lib/format-ts-with-prettier\";\n\nconst Handlebars = _Handlebars.create();\n\nHandlebars.registerHelper(\"toEndpointName\", (str: string) => {\n return str;\n});\nfunction toCodeTypeName(str: string) {\n str = str.charAt(0).toUpperCase() + str.slice(1);\n return str.replace(/_([a-z])/g, (g) => g[1].toUpperCase());\n}\nHandlebars.registerHelper(\"toCodeTypeName\", toCodeTypeName);\nHandlebars.registerHelper(\n \"typeName\",\n (column: CommonColumnDefinition, _moduleSuffix: string) => {\n const moduleSuffix = typeof _moduleSuffix === \"string\" ? _moduleSuffix : \"\";\n\n if (column.type === \"reference\") {\n return \"string\";\n } else if (column.type === \"module\") {\n return toCodeTypeName(column.moduleName) + moduleSuffix;\n } else if (column.type === \"module-array\") {\n return toCodeTypeName(column.moduleName) + moduleSuffix + \"[]\";\n } else if (column.type == \"json\") {\n return \"unknown\";\n } else if (column.type === \"storage\") {\n return \"StorageItemType\";\n } else {\n return column.type;\n }\n },\n);\nHandlebars.registerHelper(\n \"filterRefColumn\",\n (\n columns: (CommonReferenceColumnDefinition | CommonModuleColumnDefinition)[],\n ) => {\n return (columns || []).filter(\n (c) =>\n (c.type === \"reference\" && c.tableName && c.includeName) ||\n (c.type === \"module\" && c.moduleName) ||\n (c.type === \"module-array\" && c.moduleName),\n );\n },\n);\nHandlebars.registerHelper(\n \"includeName\",\n (column: CommonReferenceColumnDefinition | CommonModuleColumnDefinition) => {\n return column.type === \"reference\" ? column.includeName : column.name;\n },\n);\nHandlebars.registerHelper(\n \"includeType\",\n (column: CommonReferenceColumnDefinition | CommonModuleColumnDefinition) => {\n if (column.type === \"reference\")\n return toCodeTypeName(column.tableName) + \"__Descriptor\";\n if (column.type === \"module\")\n return `_ModuleRef<${toCodeTypeName(column.moduleName)}__Descriptor>`;\n if (column.type === \"module-array\")\n return `_ArrayModuleRef<${toCodeTypeName(\n column.moduleName,\n )}__Descriptor>`;\n },\n);\nHandlebars.registerHelper(\n \"filterUniqueIndexes\",\n (indexes: CommonIndexDefinition[]) => {\n return (indexes || []).filter((i) => i.unique);\n },\n);\nHandlebars.registerHelper(\n \"getIndexColumns\",\n (table: CommonTableDefinition, index: CommonIndexDefinition) => {\n return index.columns.map((i) => {\n const column = table.columns.find((c) => c.name === i);\n if (!column) {\n throw new Error(`column ${i} not found`);\n }\n return column;\n });\n },\n);\n\nHandlebars.registerHelper(\"if_equal\", function (a, b, options) {\n // @ts-expect-error Handlebars の作りが悪い\n return a === b ? options.fn(this) : options.inverse(this);\n});\n\ntype GenerateOptions = {\n config: CommonOrizmConfig | ServerOrizmConfig;\n output: string;\n};\n\nexport async function generate(options: GenerateOptions) {\n const config = options.config;\n\n // generate api client\n await mkdir(options.output, { recursive: true });\n const renderedTypes = await renderTypes(config);\n await writeFile(\n path.join(options.output, \"types.ts\"),\n renderedTypes,\n \"utf-8\",\n );\n const renderedClient = await renderClient(config);\n await writeFile(\n path.join(options.output, \"client.ts\"),\n renderedClient,\n \"utf-8\",\n );\n}\n\nexport async function renderTypes(\n config: CommonOrizmConfig | ServerOrizmConfig,\n) {\n const submissionTables = config.tables\n .filter((t) => t.enableForm)\n .map((t) => ({\n name: t.name + \"__submission\",\n columns: t.formOptions?.submissionColumns || [],\n isSubmissions: true,\n }));\n const renderParams = {\n ...config,\n tables: [...config.tables, ...submissionTables],\n };\n return await formatTsWithPrettier(\n Handlebars.compile(typesTemplate)(renderParams),\n );\n}\n\nexport async function renderClient(\n config: CommonOrizmConfig | ServerOrizmConfig,\n) {\n return await formatTsWithPrettier(Handlebars.compile(clientTemplate)(config));\n}\n","// This file was automatically generated and should not be edited.\n\nimport { FormValidationRules, StorageItemType } from \"@orizm/cms-sdk/common\";\n\n// Utilities\ntype _ModuleRef<T> = T & _ModuleDescriptor;\ntype _ModuleDescriptor = {\n isModule: true;\n};\ntype _ArrayModuleRef<T> = T & _ArrayModuleDescriptor;\ntype _ArrayModuleDescriptor = {\n isModuleArray: true;\n};\n\n// Tables\n{{#each tables}}\nexport type {{toCodeTypeName this.name}} = {\n id: string;\n createdAt: string;\n updatedAt: string;\n {{#unless this.isSubmissions}}\n group: string | null;\n publishedAt: string | null;\n _draft: boolean | null;\n _published: boolean | null;\n scheduledPublishAt: string | null;\n scheduledUnpublishAt: string | null;\n {{else}}\n _formId: string;\n _content: unknown;\n _formSchema: unknown;\n _attachments: StorageItemType[];\n {{/unless}}\n {{#each this.columns}}\n {{this.name}}: {{typeName this}}{{#unless this.required}}{{#if_equal this.type \"module-array\"}}{{else}} | null{{/if_equal}}{{/unless}};\n {{/each}}\n {{#if this.enableForm}}\n formSchema: FormValidationRules;\n {{/if}}\n};\n\nexport type {{toCodeTypeName this.name}}CreateInput = {\n {{#unless this.isSubmissions}}\n group?: string | null;\n publishedAt?: string | null;\n scheduledPublishAt?: string | null;\n scheduledUnpublishAt?: string | null;\n createdAt?: string;\n {{/unless}}\n {{#each this.columns}}\n {{this.name}}{{#unless this.required}}?{{/unless}}: {{typeName this \"CreateInput\"}}{{#unless this.required}}{{#if_equal this.type \"module-array\"}}{{else}} | null{{/if_equal}}{{/unless}};\n {{/each}}\n {{#if this.enableForm}}\n formSchema: FormValidationRules;\n {{/if}}\n};\n\nexport type {{toCodeTypeName this.name}}UpdateInput = {\n {{#each this.columns}}\n {{#unless this.readOnly}}{{this.name}}?: {{typeName this \"UpdateInput\"}}{{#unless this.required}}{{#if_equal this.type \"module-array\"}}{{else}} | null{{/if_equal}}{{/unless}};{{/unless}}\n {{/each}}\n {{#unless this.isSubmissions}}\n publishedAt?: string | null;\n scheduledPublishAt?: string | null;\n scheduledUnpublishAt?: string | null;\n createdAt?: string;\n {{/unless}}\n {{#if this.enableForm}}\n formSchema: FormValidationRules;\n {{/if}}\n};\n\n{{/each}}\n\n\n// Module types\n{{#each tableModules}}\nexport type {{toCodeTypeName this.name}} = {\n id: string;\n {{#each this.columns}}\n {{this.name}}: {{typeName this}}{{#unless this.required}}{{#if_equal this.type \"module-array\"}}{{else}} | null{{/if_equal}}{{/unless}};\n {{/each}}\n};\n\nexport type {{toCodeTypeName this.name}}CreateInput = {\n {{#each this.columns}}\n {{this.name}}{{#unless this.required}}?{{/unless}}: {{typeName this \"CreateInput\"}}{{#unless this.required}}{{#if_equal this.type \"module-array\"}}{{else}} | null{{/if_equal}}{{/unless}};\n {{/each}}\n};\n\nexport type {{toCodeTypeName this.name}}UpdateInput = {\n id?: string;\n {{#each this.columns}}\n {{this.name}}{{#unless this.required}}?{{/unless}}: {{typeName this}}{{#unless this.required}}{{#if_equal this.type \"module-array\"}}{{else}} | null{{/if_equal}}{{/unless}};\n {{/each}}\n};\n\n{{/each}}\n\n\n// Descriptor types\n{{#each tables}}\nexport type {{toCodeTypeName this.name}}__Descriptor = {\n row: {{toCodeTypeName this.name}};\n create: {{toCodeTypeName this.name}}CreateInput;\n update: {{toCodeTypeName this.name}}UpdateInput;\n {{#if (filterRefColumn this.columns)}}\n refs: {\n {{#each (filterRefColumn this.columns)}}\n {{includeName this}}: {{{includeType this}}};\n {{/each}}\n }\n {{/if}}\n {{#unless (filterRefColumn this.columns)}}\n refs: object;\n {{/unless}}\n {{#if (filterUniqueIndexes this.indexes)}}\n unique: [\n {{#each (filterUniqueIndexes this.indexes)}}\n { {{#each (getIndexColumns ../this this)}}{{this.name}}:{{typeName this}}{{#unless this.required}}{{#if ../this.nullsNotDistinct}} | null{{/if}}{{/unless}},{{/each}} },\n {{/each}}\n ]\n {{/if}}\n {{#unless (filterUniqueIndexes this.indexes)}}\n unique: [];\n {{/unless}}\n {{#if this.enableDrafts}}\n enableDrafts: true;\n {{/if}}\n {{#if this.enableForm}}\n submissionDescriptor: {{toCodeTypeName this.name}}_Submission__Descriptor;\n {{else}}\n submissionDescriptor: never;\n {{/if}}\n};\n\n{{/each}}\n\n\n{{#each tableModules}}\nexport type {{toCodeTypeName this.name}}__Descriptor = {\n row: {{toCodeTypeName this.name}};\n {{#if (filterRefColumn this.columns)}}\n refs: {\n {{#each (filterRefColumn this.columns)}}\n {{includeName this}}: {{{includeType this}}};\n {{/each}}\n }\n {{/if}}\n {{#unless (filterRefColumn this.columns)}}\n refs: object;\n {{/unless}}\n unique:[]\n};\n{{/each}}\n\n\n// Webhook types\nexport type WebhookEvent = \"content.create\" | \"content.update\" | \"content.delete\";\n\ntype WebhookPayloadBase = {\n event: WebhookEvent;\n timestamp: string;\n project: string;\n};\n\n{{#if tables}}\nexport type WebhookPayload = WebhookPayloadBase & (\n {{#each tables}}\n | {\n table: \"{{this.name}}\";\n content: {{toCodeTypeName this.name}};\n old?: {{toCodeTypeName this.name}};\n }\n {{/each}}\n);\n{{else}}\nexport type WebhookPayload = WebhookPayloadBase;\n{{/if}}\n","// This file was automatically generated and should not be edited.\n\nimport { OrizmCMSClient } from \"@orizm/cms-sdk\";\n\nimport * as Models from \"./types\";\n\nexport class CMSClient {\n constructor(protected client: OrizmCMSClient) {\n this.tables = {\n {{#each tables}}\n {{toEndpointName this.name}}: this.client.getTableClient<Models.{{toCodeTypeName this.name}}__Descriptor>(\"{{toEndpointName this.name}}\"),\n {{/each}}\n };\n\n this.buckets = {\n {{#each buckets}}\n {{toEndpointName this.name}}: this.client.getBucketClient(\"{{toEndpointName this.name}}\"),\n {{/each}}\n };\n\n this.userManagement = this.client.userManagement;\n \n this.userinfo = this.client.userinfo;\n \n this.auth = this.client.auth;\n }\n\n readonly tables;\n readonly buckets;\n readonly userManagement;\n readonly userinfo;\n readonly auth;\n}\n","import * as prettier from \"prettier/standalone\";\nimport prettierPluginEstree from \"prettier/plugins/estree.js\";\nimport prettierPluginTypeScript from \"prettier/plugins/typescript.js\";\n\nexport async function formatTsWithPrettier(code: string) {\n return prettier.format(code, {\n parser: \"typescript\",\n plugins: [prettierPluginEstree, prettierPluginTypeScript],\n });\n}\n","import { Command } from \"commander\";\nimport { handleError } from \"../../lib/handle-error.js\";\nimport { pullAction } from \"./action.js\";\n\nexport const cmsPullCommand = new Command(\"pull\")\n .description(\"pull orizm schema and generate client and types.\")\n .option(\"-e, --env [path]\", \"env file path.\")\n .option(\"-o, --output <path>\", \"output directory.\", \"./src/orizm\")\n .action(async (options) => {\n try {\n await pullAction({\n destination: options.output,\n envPath: options.env,\n });\n } catch (error) {\n handleError(error);\n }\n });\n","// settings & const\nconst PATH_PARAM_RE = /\\{[^{}]+\\}/g;\n\nconst supportsRequestInitExt = () => {\n return (\n typeof process === \"object\" &&\n Number.parseInt(process?.versions?.node?.substring(0, 2)) >= 18 &&\n process.versions.undici\n );\n};\n\n/**\n * Returns a cheap, non-cryptographically-secure random ID\n * Courtesy of @imranbarbhuiya (https://github.com/imranbarbhuiya)\n */\nexport function randomID() {\n return Math.random().toString(36).slice(2, 11);\n}\n\n/**\n * Create an openapi-fetch client.\n * @type {import(\"./index.js\").default}\n */\nexport default function createClient(clientOptions) {\n let {\n baseUrl = \"\",\n Request: CustomRequest = globalThis.Request,\n fetch: baseFetch = globalThis.fetch,\n querySerializer: globalQuerySerializer,\n bodySerializer: globalBodySerializer,\n headers: baseHeaders,\n requestInitExt = undefined,\n ...baseOptions\n } = { ...clientOptions };\n requestInitExt = supportsRequestInitExt() ? requestInitExt : undefined;\n baseUrl = removeTrailingSlash(baseUrl);\n const middlewares = [];\n\n /**\n * Per-request fetch (keeps settings created in createClient()\n * @param {T} url\n * @param {import('./index.js').FetchOptions<T>} fetchOptions\n */\n async function coreFetch(schemaPath, fetchOptions) {\n const {\n baseUrl: localBaseUrl,\n fetch = baseFetch,\n Request = CustomRequest,\n headers,\n params = {},\n parseAs = \"json\",\n querySerializer: requestQuerySerializer,\n bodySerializer = globalBodySerializer ?? defaultBodySerializer,\n body,\n ...init\n } = fetchOptions || {};\n if (localBaseUrl) {\n baseUrl = removeTrailingSlash(localBaseUrl);\n }\n\n let querySerializer =\n typeof globalQuerySerializer === \"function\"\n ? globalQuerySerializer\n : createQuerySerializer(globalQuerySerializer);\n if (requestQuerySerializer) {\n querySerializer =\n typeof requestQuerySerializer === \"function\"\n ? requestQuerySerializer\n : createQuerySerializer({\n ...(typeof globalQuerySerializer === \"object\" ? globalQuerySerializer : {}),\n ...requestQuerySerializer,\n });\n }\n\n const serializedBody = body === undefined ? undefined : bodySerializer(body);\n\n const defaultHeaders =\n // with no body, we should not to set Content-Type\n serializedBody === undefined ||\n // if serialized body is FormData; browser will correctly set Content-Type & boundary expression\n serializedBody instanceof FormData\n ? {}\n : {\n \"Content-Type\": \"application/json\",\n };\n\n const requestInit = {\n redirect: \"follow\",\n ...baseOptions,\n ...init,\n body: serializedBody,\n headers: mergeHeaders(defaultHeaders, baseHeaders, headers, params.header),\n };\n\n let id;\n let options;\n let request = new CustomRequest(createFinalURL(schemaPath, { baseUrl, params, querySerializer }), requestInit);\n let response;\n\n /** Add custom parameters to Request object */\n for (const key in init) {\n if (!(key in request)) {\n request[key] = init[key];\n }\n }\n\n if (middlewares.length) {\n id = randomID();\n\n // middleware (request)\n options = Object.freeze({\n baseUrl,\n fetch,\n parseAs,\n querySerializer,\n bodySerializer,\n });\n for (const m of middlewares) {\n if (m && typeof m === \"object\" && typeof m.onRequest === \"function\") {\n const result = await m.onRequest({\n request,\n schemaPath,\n params,\n options,\n id,\n });\n if (result) {\n if (result instanceof CustomRequest) {\n request = result;\n } else if (result instanceof Response) {\n response = result;\n break;\n } else {\n throw new Error(\"onRequest: must return new Request() or Response() when modifying the request\");\n }\n }\n }\n }\n }\n\n if (!response) {\n // fetch!\n try {\n response = await fetch(request, requestInitExt);\n } catch (error) {\n let errorAfterMiddleware = error;\n // middleware (error)\n // execute in reverse-array order (first priority gets last transform)\n if (middlewares.length) {\n for (let i = middlewares.length - 1; i >= 0; i--) {\n const m = middlewares[i];\n if (m && typeof m === \"object\" && typeof m.onError === \"function\") {\n const result = await m.onError({\n request,\n error: errorAfterMiddleware,\n schemaPath,\n params,\n options,\n id,\n });\n if (result) {\n // if error is handled by returning a response, skip remaining middleware\n if (result instanceof Response) {\n errorAfterMiddleware = undefined;\n response = result;\n break;\n }\n\n if (result instanceof Error) {\n errorAfterMiddleware = result;\n continue;\n }\n\n throw new Error(\"onError: must return new Response() or instance of Error\");\n }\n }\n }\n }\n\n // rethrow error if not handled by middleware\n if (errorAfterMiddleware) {\n throw errorAfterMiddleware;\n }\n }\n\n // middleware (response)\n // execute in reverse-array order (first priority gets last transform)\n if (middlewares.length) {\n for (let i = middlewares.length - 1; i >= 0; i--) {\n const m = middlewares[i];\n if (m && typeof m === \"object\" && typeof m.onResponse === \"function\") {\n const result = await m.onResponse({\n request,\n response,\n schemaPath,\n params,\n options,\n id,\n });\n if (result) {\n if (!(result instanceof Response)) {\n throw new Error(\"onResponse: must return new Response() when modifying the response\");\n }\n response = result;\n }\n }\n }\n }\n }\n\n // handle empty content\n if (response.status === 204 || response.headers.get(\"Content-Length\") === \"0\") {\n return response.ok ? { data: undefined, response } : { error: undefined, response };\n }\n\n // parse response (falling back to .text() when necessary)\n if (response.ok) {\n // if \"stream\", skip parsing entirely\n if (parseAs === \"stream\") {\n return { data: response.body, response };\n }\n return { data: await response[parseAs](), response };\n }\n\n // handle errors\n let error = await response.text();\n try {\n error = JSON.parse(error); // attempt to parse as JSON\n } catch {\n // noop\n }\n return { error, response };\n }\n\n return {\n request(method, url, init) {\n return coreFetch(url, { ...init, method: method.toUpperCase() });\n },\n /** Call a GET endpoint */\n GET(url, init) {\n return coreFetch(url, { ...init, method: \"GET\" });\n },\n /** Call a PUT endpoint */\n PUT(url, init) {\n return coreFetch(url, { ...init, method: \"PUT\" });\n },\n /** Call a POST endpoint */\n POST(url, init) {\n return coreFetch(url, { ...init, method: \"POST\" });\n },\n /** Call a DELETE endpoint */\n DELETE(url, init) {\n return coreFetch(url, { ...init, method: \"DELETE\" });\n },\n /** Call a OPTIONS endpoint */\n OPTIONS(url, init) {\n return coreFetch(url, { ...init, method: \"OPTIONS\" });\n },\n /** Call a HEAD endpoint */\n HEAD(url, init) {\n return coreFetch(url, { ...init, method: \"HEAD\" });\n },\n /** Call a PATCH endpoint */\n PATCH(url, init) {\n return coreFetch(url, { ...init, method: \"PATCH\" });\n },\n /** Call a TRACE endpoint */\n TRACE(url, init) {\n return coreFetch(url, { ...init, method: \"TRACE\" });\n },\n /** Register middleware */\n use(...middleware) {\n for (const m of middleware) {\n if (!m) {\n continue;\n }\n if (typeof m !== \"object\" || !(\"onRequest\" in m || \"onResponse\" in m || \"onError\" in m)) {\n throw new Error(\"Middleware must be an object with one of `onRequest()`, `onResponse() or `onError()`\");\n }\n middlewares.push(m);\n }\n },\n /** Unregister middleware */\n eject(...middleware) {\n for (const m of middleware) {\n const i = middlewares.indexOf(m);\n if (i !== -1) {\n middlewares.splice(i, 1);\n }\n }\n },\n };\n}\n\nclass PathCallForwarder {\n constructor(client, url) {\n this.client = client;\n this.url = url;\n }\n\n GET(init) {\n return this.client.GET(this.url, init);\n }\n PUT(init) {\n return this.client.PUT(this.url, init);\n }\n POST(init) {\n return this.client.POST(this.url, init);\n }\n DELETE(init) {\n return this.client.DELETE(this.url, init);\n }\n OPTIONS(init) {\n return this.client.OPTIONS(this.url, init);\n }\n HEAD(init) {\n return this.client.HEAD(this.url, init);\n }\n PATCH(init) {\n return this.client.PATCH(this.url, init);\n }\n TRACE(init) {\n return this.client.TRACE(this.url, init);\n }\n}\n\nclass PathClientProxyHandler {\n constructor() {\n this.client = null;\n }\n\n // Assume the property is an URL.\n get(coreClient, url) {\n const forwarder = new PathCallForwarder(coreClient, url);\n this.client[url] = forwarder;\n return forwarder;\n }\n}\n\n/**\n * Wrap openapi-fetch client to support a path based API.\n * @type {import(\"./index.js\").wrapAsPathBasedClient}\n */\nexport function wrapAsPathBasedClient(coreClient) {\n const handler = new PathClientProxyHandler();\n const proxy = new Proxy(coreClient, handler);\n\n // Put the proxy on the prototype chain of the actual client.\n // This means if we do not have a memoized PathCallForwarder,\n // we fall back to the proxy to synthesize it.\n // However, the proxy itself is not on the hot-path (if we fetch the same\n // endpoint multiple times, only the first call will hit the proxy).\n function Client() {}\n Client.prototype = proxy;\n\n const client = new Client();\n\n // Feed the client back to the proxy handler so it can store the generated\n // PathCallForwarder.\n handler.client = client;\n\n return client;\n}\n\n/**\n * Convenience method to an openapi-fetch path based client.\n * Strictly equivalent to `wrapAsPathBasedClient(createClient(...))`.\n * @type {import(\"./index.js\").createPathBasedClient}\n */\nexport function createPathBasedClient(clientOptions) {\n return wrapAsPathBasedClient(createClient(clientOptions));\n}\n\n// utils\n\n/**\n * Serialize primitive param values\n * @type {import(\"./index.js\").serializePrimitiveParam}\n */\nexport function serializePrimitiveParam(name, value, options) {\n if (value === undefined || value === null) {\n return \"\";\n }\n if (typeof value === \"object\") {\n throw new Error(\n \"Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.\",\n );\n }\n return `${name}=${options?.allowReserved === true ? value : encodeURIComponent(value)}`;\n}\n\n/**\n * Serialize object param (shallow only)\n * @type {import(\"./index.js\").serializeObjectParam}\n */\nexport function serializeObjectParam(name, value, options) {\n if (!value || typeof value !== \"object\") {\n return \"\";\n }\n const values = [];\n const joiner =\n {\n simple: \",\",\n label: \".\",\n matrix: \";\",\n }[options.style] || \"&\";\n\n // explode: false\n if (options.style !== \"deepObject\" && options.explode === false) {\n for (const k in value) {\n values.push(k, options.allowReserved === true ? value[k] : encodeURIComponent(value[k]));\n }\n const final = values.join(\",\"); // note: values are always joined by comma in explode: false (but joiner can prefix)\n switch (options.style) {\n case \"form\": {\n return `${name}=${final}`;\n }\n case \"label\": {\n return `.${final}`;\n }\n case \"matrix\": {\n return `;${name}=${final}`;\n }\n default: {\n return final;\n }\n }\n }\n\n // explode: true\n for (const k in value) {\n const finalName = options.style === \"deepObject\" ? `${name}[${k}]` : k;\n values.push(serializePrimitiveParam(finalName, value[k], options));\n }\n const final = values.join(joiner);\n return options.style === \"label\" || options.style === \"matrix\" ? `${joiner}${final}` : final;\n}\n\n/**\n * Serialize array param (shallow only)\n * @type {import(\"./index.js\").serializeArrayParam}\n */\nexport function serializeArrayParam(name, value, options) {\n if (!Array.isArray(value)) {\n return \"\";\n }\n\n // explode: false\n if (options.explode === false) {\n const joiner = { form: \",\", spaceDelimited: \"%20\", pipeDelimited: \"|\" }[options.style] || \",\"; // note: for arrays, joiners vary wildly based on style + explode behavior\n const final = (options.allowReserved === true ? value : value.map((v) => encodeURIComponent(v))).join(joiner);\n switch (options.style) {\n case \"simple\": {\n return final;\n }\n case \"label\": {\n return `.${final}`;\n }\n case \"matrix\": {\n return `;${name}=${final}`;\n }\n // case \"spaceDelimited\":\n // case \"pipeDelimited\":\n default: {\n return `${name}=${final}`;\n }\n }\n }\n\n // explode: true\n const joiner = { simple: \",\", label: \".\", matrix: \";\" }[options.style] || \"&\";\n const values = [];\n for (const v of value) {\n if (options.style === \"simple\" || options.style === \"label\") {\n values.push(options.allowReserved === true ? v : encodeURIComponent(v));\n } else {\n values.push(serializePrimitiveParam(name, v, options));\n }\n }\n return options.style === \"label\" || options.style === \"matrix\"\n ? `${joiner}${values.join(joiner)}`\n : values.join(joiner);\n}\n\n/**\n * Serialize query params to string\n * @type {import(\"./index.js\").createQuerySerializer}\n */\nexport function createQuerySerializer(options) {\n return function querySerializer(queryParams) {\n const search = [];\n if (queryParams && typeof queryParams === \"object\") {\n for (const name in queryParams) {\n const value = queryParams[name];\n if (value === undefined || value === null) {\n continue;\n }\n if (Array.isArray(value)) {\n if (value.length === 0) {\n continue;\n }\n search.push(\n serializeArrayParam(name, value, {\n style: \"form\",\n explode: true,\n ...options?.array,\n allowReserved: options?.allowReserved || false,\n }),\n );\n continue;\n }\n if (typeof value === \"object\") {\n search.push(\n serializeObjectParam(name, value, {\n style: \"deepObject\",\n explode: true,\n ...options?.object,\n allowReserved: options?.allowReserved || false,\n }),\n );\n continue;\n }\n search.push(serializePrimitiveParam(name, value, options));\n }\n }\n return search.join(\"&\");\n };\n}\n\n/**\n * Handle different OpenAPI 3.x serialization styles\n * @type {import(\"./index.js\").defaultPathSerializer}\n * @see https://swagger.io/docs/specification/serialization/#path\n */\nexport function defaultPathSerializer(pathname, pathParams) {\n let nextURL = pathname;\n for (const match of pathname.match(PATH_PARAM_RE) ?? []) {\n let name = match.substring(1, match.length - 1);\n let explode = false;\n let style = \"simple\";\n if (name.endsWith(\"*\")) {\n explode = true;\n name = name.substring(0, name.length - 1);\n }\n if (name.startsWith(\".\")) {\n style = \"label\";\n name = name.substring(1);\n } else if (name.startsWith(\";\")) {\n style = \"matrix\";\n name = name.substring(1);\n }\n if (!pathParams || pathParams[name] === undefined || pathParams[name] === null) {\n continue;\n }\n const value = pathParams[name];\n if (Array.isArray(value)) {\n nextURL = nextURL.replace(match, serializeArrayParam(name, value, { style, explode }));\n continue;\n }\n if (typeof value === \"object\") {\n nextURL = nextURL.replace(match, serializeObjectParam(name, value, { style, explode }));\n continue;\n }\n if (style === \"matrix\") {\n nextURL = nextURL.replace(match, `;${serializePrimitiveParam(name, value)}`);\n continue;\n }\n nextURL = nextURL.replace(match, style === \"label\" ? `.${encodeURIComponent(value)}` : encodeURIComponent(value));\n }\n return nextURL;\n}\n\n/**\n * Serialize body object to string\n * @type {import(\"./index.js\").defaultBodySerializer}\n */\nexport function defaultBodySerializer(body) {\n if (body instanceof FormData) {\n return body;\n }\n return JSON.stringify(body);\n}\n\n/**\n * Construct URL string from baseUrl and handle path and query params\n * @type {import(\"./index.js\").createFinalURL}\n */\nexport function createFinalURL(pathname, options) {\n let finalURL = `${options.baseUrl}${pathname}`;\n if (options.params?.path) {\n finalURL = defaultPathSerializer(finalURL, options.params.path);\n }\n let search = options.querySerializer(options.params.query ?? {});\n if (search.startsWith(\"?\")) {\n search = search.substring(1);\n }\n if (search) {\n finalURL += `?${search}`;\n }\n return finalURL;\n}\n\n/**\n * Merge headers a and b, with b taking priority\n * @type {import(\"./index.js\").mergeHeaders}\n */\nexport function mergeHeaders(...allHeaders) {\n const finalHeaders = new Headers();\n for (const h of allHeaders) {\n if (!h || typeof h !== \"object\") {\n continue;\n }\n const iterator = h instanceof Headers ? h.entries() : Object.entries(h);\n for (const [k, v] of iterator) {\n if (v === null) {\n finalHeaders.delete(k);\n } else if (Array.isArray(v)) {\n for (const v2 of v) {\n finalHeaders.append(k, v2);\n }\n } else if (v !== undefined) {\n finalHeaders.set(k, v);\n }\n }\n }\n return finalHeaders;\n}\n\n/**\n * Remove trailing slash from url\n * @type {import(\"./index.js\").removeTrailingSlash}\n */\nexport function removeTrailingSlash(url) {\n if (url.endsWith(\"/\")) {\n return url.substring(0, url.length - 1);\n }\n return url;\n}\n","export function assertValidUrlOrigin(origin: string) {\n const url = new URL(origin);\n if (url.origin !== origin) {\n throw new Error(`${origin} is not a valid URL origin`);\n }\n}\n","import createClient, {\n HeadersOptions,\n createPathBasedClient,\n} from \"openapi-fetch\";\nimport type { paths, components } from \"./generated/dev-v2-api-types\";\nimport { assertValidUrlOrigin } from \"./assert-valid-url-origin\";\n\nexport type { paths, components };\n\ntype DeveloperAPIv2ClientParams = {\n serverOrigin?: string;\n fetch?: typeof fetch;\n headers?: HeadersOptions;\n};\nexport function createDeveloperAPIv2Client({\n serverOrigin = \"\",\n fetch,\n headers,\n}: DeveloperAPIv2ClientParams) {\n if (serverOrigin) assertValidUrlOrigin(serverOrigin);\n\n return createClient<paths>({\n baseUrl: `${serverOrigin}/api/dev/v2`,\n fetch,\n headers,\n });\n}\n\nexport function createPathBasedDeveloperAPIv2Client({\n serverOrigin = \"\",\n fetch,\n headers,\n}: DeveloperAPIv2ClientParams) {\n if (serverOrigin) assertValidUrlOrigin(serverOrigin);\n\n return createPathBasedClient<paths>({\n baseUrl: `${serverOrigin}/api/dev/v2`,\n fetch,\n headers,\n });\n}\n","import { createDeveloperAPIv2Client } from \"@orizm/private-api-clients/dev-v2\";\nimport { ServerProjectDefinition } from \"../types\";\n\nexport async function fetchCurrentDefinition(options: {\n baseUrl: string;\n apiKey: string;\n projectName: string;\n}): Promise<ServerProjectDefinition> {\n const client = createDeveloperAPIv2Client({\n serverOrigin: options.baseUrl,\n headers: {\n \"x-api-key\": options.apiKey,\n },\n });\n\n const abortController = new AbortController();\n const timeout = setTimeout(() => {\n abortController.abort();\n }, 10000);\n\n try {\n const response = await client.GET(\n \"/projects/{projectName}/definitions/current\",\n {\n params: { path: { projectName: options.projectName } },\n signal: abortController.signal,\n },\n );\n if (response.data) {\n return response.data;\n }\n\n if (response.response.status === 404) {\n throw new Error(`Project ${options.projectName} not found.`);\n }\n\n if (response.response.status === 401) {\n throw new Error(`API Key is invalid.`);\n }\n\n throw new Error(\n `Unknown error occurred when fetching definitions for project ${options.projectName}.`,\n );\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new Error(\"Request timed out.\");\n }\n throw error;\n } finally {\n clearTimeout(timeout);\n }\n}\n","import fs from \"fs/promises\";\nimport * as v from \"valibot\";\nimport dotenv from \"dotenv\";\n\nconst DEFAULT_ENV_FILE_PATH = \".env\";\n\nconst EnvSchema = v.object({\n ORIZM_PROJECT: v.pipe(\n v.string(),\n v.minLength(1, \"ORIZM_PROJECT is required\"),\n v.brand(\"ORIZM_PROJECT\"),\n ),\n ORIZM_BASE_URL: v.pipe(\n v.optional(v.string(), \"https://app.orizm.com\"), // if null, use default value\n v.transform((v) => v.replace(/\\/$/, \"\")), // remove trailing slash\n v.brand(\"ORIZM_BASE_URL\"),\n ),\n ORIZM_API_KEY: v.pipe(\n v.string(),\n v.minLength(1, \"ORIZM_API_KEY is required\"),\n v.brand(\"ORIZM_API_KEY\"),\n ),\n});\n\nexport type DevAPIEnv = v.InferOutput<typeof EnvSchema>;\n\nexport async function loadEnv(envPath?: string): Promise<DevAPIEnv> {\n let envFileContent: string | null;\n\n if (envPath) {\n envFileContent = await fs.readFile(envPath, \"utf-8\").catch(() => null);\n\n // envPathが指定されているにもかかわらず、存在しない場合エラーとする\n if (!envFileContent) {\n throw new Error(`Environment variables file: '${envPath}' is not found.`);\n }\n } else {\n envFileContent = await fs\n .readFile(DEFAULT_ENV_FILE_PATH, \"utf-8\")\n .catch(() => null);\n }\n\n if (envFileContent !== null) {\n const dotenvParsed = dotenv.parse(envFileContent);\n const envParseResult = v.safeParse(EnvSchema, dotenvParsed);\n if (!envParseResult.success) {\n throw new Error(\n `Environment variables are not valid.\\n` +\n envParseResult.issues.map((issue) => issue.message).join(\"\\n\"),\n );\n }\n return envParseResult.output;\n }\n\n // デフォルトの.envファイルも存在しない場合は、process.envからの読み込みを試みる\n const processEnvParseResult = v.safeParse(EnvSchema, process.env);\n if (!processEnvParseResult.success) {\n throw new Error(\n \"Environment variables are not valid. Put .env file or set environment variables in process.env.\\n\" +\n processEnvParseResult.issues.map((issue) => issue.message).join(\"\\n\"),\n );\n }\n\n return processEnvParseResult.output;\n}\n","import { createSpinner } from \"../../lib/cli-spinner.js\";\nimport { fetchCurrentDefinition } from \"../../lib/fetch-current-definition.js\";\nimport { loadEnv } from \"../../lib/load-env.js\";\nimport { generate } from \"../generate/generator.js\";\n\nconst spinner = createSpinner();\n\nexport async function pullAction(options: {\n destination: string;\n envPath: string;\n}) {\n spinner.start(\"Loading environment variables...\");\n const env = await loadEnv(options.envPath);\n spinner.succeed(\"Loaded environment variables.\");\n\n spinner.start(\"Loading project config...\");\n const definitionReference = await fetchCurrentDefinition({\n baseUrl: env.ORIZM_BASE_URL,\n apiKey: env.ORIZM_API_KEY,\n projectName: env.ORIZM_PROJECT,\n });\n spinner.succeed(\"Loaded project config.\");\n\n spinner.start(\"Generating code...\");\n await generate({\n output: options.destination,\n config: definitionReference.parsed,\n });\n spinner.succeed(`Generated code to '${options.destination}'`);\n}\n","import { Command } from \"commander\";\nimport { handleError } from \"../../lib/handle-error.js\";\nimport { generateAction } from \"./action.js\";\n\nexport const consumerGenerateCommand = new Command(\"generate\")\n .description(\"generate orizm client and types.\")\n .option(\"-c, --config <path>\", \"orizm config file path.\", \"orizm.config.ts\")\n .option(\"-o, --output <path>\", \"output directory.\", \"./src/orizm\")\n .action(async (options) => {\n try {\n await generateAction(options.config, options.output);\n } catch (error) {\n handleError(error);\n }\n });\n","import { mkdir, writeFile } from \"fs/promises\";\nimport path from \"path\";\nimport _Handlebars from \"handlebars\";\nimport clientTemplate from \"../templates/client.ts.hbr\";\nimport typesTemplate from \"../templates/types.ts.hbr\";\nimport {\n CommonColumnDefinition,\n CommonIndexDefinition,\n CommonOrizmConfig,\n CommonTableDefinition,\n ServerOrizmConfig,\n} from \"../../types.js\";\nimport { formatTsWithPrettier } from \"../../lib/format-ts-with-prettier\";\n\nconst Handlebars = _Handlebars.create();\n\nexport type GenerateOption = {\n definition: CommonOrizmConfig | ServerOrizmConfig;\n output: string;\n};\n\nexport async function generate(options: GenerateOption) {\n // generate api client\n await mkdir(options.output, { recursive: true });\n const renderedTypes = await renderTypes(options.definition);\n const targetTypesPath = path.join(options.output, \"types.ts\");\n await writeFile(targetTypesPath, renderedTypes, \"utf-8\");\n const renderedClient = await renderClient(options.definition);\n const targetClientPath = path.join(options.output, \"client.ts\");\n await writeFile(targetClientPath, renderedClient, \"utf-8\");\n}\n\nHandlebars.registerHelper(\"toEndpointName\", (str: string) => {\n return str;\n});\n\nfunction toCodeTypeName(str: string) {\n str = str.charAt(0).toUpperCase() + str.slice(1);\n return str.replace(/_([a-z])/g, (g) => g[1].toUpperCase());\n}\n\nHandlebars.registerHelper(\"toCodeTypeName\", toCodeTypeName);\n\nHandlebars.registerHelper(\"typeName\", (column: CommonColumnDefinition) => {\n if (column.type === \"reference\") {\n return \"string\";\n } else if (column.type == \"json\") {\n return \"unknown\";\n } else if (column.type === \"module\") {\n if (!column.moduleName) {\n console.warn(\"moduleName is not defined\", column.name);\n }\n return toCodeTypeName(column.moduleName || \"unknown\");\n } else if (column.type === \"module-array\") {\n if (!column.moduleName) {\n console.warn(\"moduleName is not defined\", column.name);\n }\n return toCodeTypeName(column.moduleName || \"unknown\") + \"[]\";\n } else if (column.type === \"storage\") {\n return \"StorageItemType\";\n } else {\n return column.type;\n }\n});\n\nHandlebars.registerHelper(\n \"filterRefColumn\",\n (columns: CommonColumnDefinition[]) => {\n return (columns || []).filter(\n (c) =>\n (c.type === \"reference\" && c.tableName && c.includeName) ||\n (c.type === \"module\" && c.moduleName) ||\n (c.type === \"module-array\" && c.moduleName),\n );\n },\n);\nHandlebars.registerHelper(\"includeName\", (column: CommonColumnDefinition) => {\n return column.type === \"reference\" ? column.includeName : column.name;\n});\nHandlebars.registerHelper(\"includeType\", (column: CommonColumnDefinition) => {\n if (column.type === \"reference\" && column.tableName)\n return toCodeTypeName(column.tableName) + \"__Descriptor\";\n if (column.type === \"module\" && column.moduleName)\n return `_ModuleRef<${toCodeTypeName(column.moduleName)}__Descriptor>`;\n if (column.type === \"module-array\" && column.moduleName)\n return `_ArrayModuleRef<${toCodeTypeName(column.moduleName)}__Descriptor>`;\n});\nHandlebars.registerHelper(\n \"filterUniqueIndexes\",\n (indexes: CommonIndexDefinition[]) => {\n return (indexes || []).filter((i) => i.unique);\n },\n);\nHandlebars.registerHelper(\n \"getIndexColumns\",\n (table: CommonTableDefinition, index: CommonIndexDefinition) => {\n return index.columns.map((i) => {\n const column = table.columns.find((c) => c.name === i);\n if (!column) {\n throw new Error(`column ${i} not found`);\n }\n return column;\n });\n },\n);\n\nHandlebars.registerHelper(\"if_equal\", function (a, b, options) {\n // @ts-expect-error Handlebars の作りが悪い\n return a === b ? options.fn(this) : options.inverse(this);\n});\n\nexport async function renderTypes(\n config: CommonOrizmConfig | ServerOrizmConfig,\n) {\n return await formatTsWithPrettier(Handlebars.compile(typesTemplate)(config));\n}\n\nexport async function renderClient(\n config: CommonOrizmConfig | ServerOrizmConfig,\n) {\n return await formatTsWithPrettier(Handlebars.compile(clientTemplate)(config));\n}\n","// This file was automatically generated and should not be edited.\n\nimport { ConsumerClientOptions, OrizmConsumerClientBase } from \"@orizm/consumer-sdk\";\nimport * as Models from \"./types\";\n\nexport class OrizmClient extends OrizmConsumerClientBase {\n constructor(options: ConsumerClientOptions) {\n super(options);\n }\n\n readonly tables = {\n {{#each tables}}\n {{toEndpointName this.name}}: this.getTableClient<Models.{{toCodeTypeName this.name}}__Descriptor>(\"{{toEndpointName this.name}}\"),\n {{/each}}\n };\n}\n","// This file was automatically generated and should not be edited.\n\nimport { FormValidationRules, StorageItemType } from \"@orizm/consumer-sdk/common\";\n\n// Utilities\ntype _ModuleRef<T> = T & _ModuleDescriptor;\ntype _ModuleDescriptor = {\n isModule: true;\n};\ntype _ArrayModuleRef<T> = T & _ArrayModuleDescriptor;\ntype _ArrayModuleDescriptor = {\n isModuleArray: true;\n};\n\n\n// Tables\n{{#each tables}}\nexport type {{toCodeTypeName this.name}} = {\n id: string;\n createdAt: string;\n updatedAt: string;\n group: string | null;\n publishedAt: string | null;\n _draft: boolean | null;\n _published: boolean | null;\n {{#each this.columns}}\n {{this.name}}: {{typeName this}}{{#unless this.required}}{{#if_equal this.type \"module-array\"}}{{else}} | null{{/if_equal}}{{/unless}};\n {{/each}}\n {{#if this.enableForm}}\n formSchema: FormValidationRules;\n {{/if}}\n}\n\n{{/each}}\n\n{{#each tableModules}}\nexport type {{toCodeTypeName this.name}} = {\n id: string;\n {{#each this.columns}}\n {{this.name}}: {{typeName this}}{{#unless this.required}}{{#if_equal this.type \"module-array\"}}{{else}} | null{{/if_equal}}{{/unless}};\n {{/each}}\n};\n\n{{/each}}\n\n// Descriptor types\n{{#each tables}}\nexport type {{toCodeTypeName this.name}}__Descriptor = {\n row: {{toCodeTypeName this.name}};\n {{#if (filterRefColumn this.columns)}}\n refs: {\n {{#each (filterRefColumn this.columns)}}\n {{includeName this}}: {{{includeType this}}};\n {{/each}}\n }\n {{/if}}\n {{#unless (filterRefColumn this.columns)}}\n refs: object;\n {{/unless}}\n {{#if (filterUniqueIndexes this.indexes)}}\n unique: [\n {{#each (filterUniqueIndexes this.indexes)}}\n { {{#each (getIndexColumns ../this this)}}{{this.name}}:{{typeName this}}{{#unless this.required}}{{#if ../this.nullsNotDistinct}} | null{{/if}}{{/unless}},{{/each}} },\n {{/each}}\n ]\n {{/if}}\n {{#unless (filterUniqueIndexes this.indexes)}}\n unique: [];\n {{/unless}}\n {{#if this.enableDrafts}}\n enableDrafts: true;\n {{/if}}\n};\n\n{{/each}}\n\n\n{{#each tableModules}}\nexport type {{toCodeTypeName this.name}}__Descriptor = {\n row: {{toCodeTypeName this.name}};\n {{#if (filterRefColumn this.columns)}}\n refs: {\n {{#each (filterRefColumn this.columns)}}\n {{includeName this}}: {{{includeType this}}};\n {{/each}}\n }\n {{/if}}\n {{#unless (filterRefColumn this.columns)}}\n refs: object;\n {{/unless}}\n unique:[]\n};\n\n{{/each}}\n\n\n// Webhook types\nexport type WebhookEvent = \"content.create\" | \"content.update\" | \"content.delete\";\n\ntype WebhookPayloadBase = {\n event: WebhookEvent;\n timestamp: string;\n project: string;\n};\n\n{{#if tables}}\nexport type WebhookPayload = WebhookPayloadBase & (\n {{#each tables}}\n | {\n table: \"{{this.name}}\";\n content: {{toCodeTypeName this.name}};\n old?: {{toCodeTypeName this.name}};\n }\n {{/each}}\n);\n{{else}}\nexport type WebhookPayload = WebhookPayloadBase;\n{{/if}}\n","import { generate } from \"../pull/generate.js\";\nimport { loadConfig } from \"../../lib/load-config.js\";\nimport { createSpinner } from \"../../lib/cli-spinner.js\";\n\nconst spinner = createSpinner();\n\nexport async function generateAction(\n orizmConfigTs: string,\n destination: string,\n) {\n spinner.start(\"Loading project config...\");\n const definition = await loadConfig(orizmConfigTs);\n spinner.succeed(\"Loaded project config.\");\n\n spinner.start(\"Generating code...\");\n await generate({\n definition,\n output: destination,\n });\n spinner.succeed(`Generated code to '${destination}'`);\n}\n","import { Command } from \"commander\";\nimport { handleError } from \"../../lib/handle-error.js\";\nimport { pullAction } from \"./action.js\";\n\nexport const consumerPullCommand = new Command(\"pull\")\n .description(\"pull orizm schema and generate client and types.\")\n .option(\"-e, --env [path]\", \"env file path.\")\n .option(\"-o, --output <path>\", \"output directory.\", \"./src/orizm\")\n .action(async (options) => {\n try {\n await pullAction({\n destination: options.output,\n envPath: options.env,\n });\n } catch (error) {\n handleError(error);\n }\n });\n","import { fetchCurrentDefinition } from \"../../lib/fetch-current-definition.js\";\nimport { loadEnv } from \"../../lib/load-env.js\";\nimport { createSpinner } from \"../../lib/cli-spinner.js\";\nimport { generate } from \"./generate.js\";\n\nconst spinner = createSpinner();\n\nexport async function pullAction(options: {\n destination: string;\n envPath: string;\n}) {\n spinner.start(\"Loading environment variables...\");\n const config = await loadEnv(options.envPath);\n spinner.succeed(\"Loaded environment variables.\");\n\n spinner.start(\"Loading project config...\");\n const definition = await fetchCurrentDefinition({\n baseUrl: config.ORIZM_BASE_URL,\n apiKey: config.ORIZM_API_KEY,\n projectName: config.ORIZM_PROJECT,\n });\n spinner.succeed(\"Loaded project config.\");\n\n spinner.start(\"Generating code...\");\n await generate({\n definition: definition.parsed,\n output: options.destination,\n });\n spinner.succeed(`Generated code to '${options.destination}'`);\n}\n","import { Command } from \"commander\";\nimport cliColor from \"cli-color\";\nimport { createSpinner } from \"../lib/cli-spinner.js\";\nimport { applyDefinition, getChangeEvents } from \"../lib/developer-api.js\";\nimport { displayChangeEvents } from \"../lib/display-change-events.js\";\nimport { handleError } from \"../lib/handle-error.js\";\nimport { input } from \"../lib/cli-input.js\";\nimport { loadConfig } from \"../lib/load-config.js\";\nimport { loadEnv } from \"../lib/load-env.js\";\n\nconst spinner = createSpinner();\n\nexport const pushCommand = new Command(\"push\")\n .description(\"apply schema to project.\")\n .option(\"-e, --env <path>\", \"env file path.\")\n .option(\"-c, --config <path>\", \"orizm config file path.\", \"orizm.config.ts\")\n .option(\"--dry-run\", \"display change-events without applying schema.\", false)\n .option(\"-y, --yes\", \"apply schema without confirmation.\", false)\n .action(async (options) => {\n try {\n spinner.start(\"Loading environment variables...\");\n const env = await loadEnv(options.env);\n spinner.succeed(\"Loaded environment variables.\");\n\n spinner.start(\"Loading project config...\");\n const projectDef = await loadConfig(options.config);\n spinner.succeed(\"Loaded project config.\");\n\n spinner.start(\"Fetch schema change events...\");\n const changeEvents = await getChangeEvents(env, projectDef);\n spinner.succeed(\"Fetch schema change events.\");\n\n await displayChangeEvents(changeEvents);\n\n if (\n changeEvents.tableChangeEvents.length === 0 &&\n changeEvents.bucketChangeEvents.length === 0 &&\n changeEvents.authorityChangeEvents.length === 0\n ) {\n return;\n }\n\n if (options.dryRun) {\n return;\n }\n\n if (!options.yes) {\n const confirm = await input(\"Do you want to apply schema? (y/N): \");\n if (confirm !== \"y\") {\n console.log(cliColor.red(\"Canceled.\"));\n return;\n }\n }\n\n spinner.start(\"Applying schema...\");\n await applyDefinition(env, projectDef);\n spinner.succeed(\"Schema applied.\");\n } catch (error) {\n handleError(error);\n }\n });\n","import {\n createDeveloperAPIv2Client,\n components,\n} from \"@orizm/private-api-clients/dev-v2\";\nimport { DevAPIEnv } from \"./load-env.js\";\n\ntype ProjectDefinitionChangeEvent =\n components[\"schemas\"][\"OrizmConfigChangeEvents\"];\n\nexport async function applyDefinition(\n env: DevAPIEnv,\n projectDef: components[\"schemas\"][\"OrizmConfig\"],\n): Promise<void> {\n const client = createDeveloperAPIv2Client({\n serverOrigin: env.ORIZM_BASE_URL,\n headers: {\n \"x-api-key\": env.ORIZM_API_KEY,\n },\n });\n\n const response = await client.POST(\"/projects/{projectName}/definitions\", {\n params: { path: { projectName: env.ORIZM_PROJECT } },\n body: { definition: projectDef },\n });\n\n if (!response.data) {\n const status = response.response.status;\n\n if (status === 401) {\n throw new Error(\n \"401 Unauthorized. Please check your Developer API key and try again.\",\n );\n }\n\n throw new Error(\n `${status} ${response.response.statusText}: Unexpected error occurred while applying schema.`,\n );\n }\n}\n\nexport const getChangeEvents = async (\n env: DevAPIEnv,\n projectDef: components[\"schemas\"][\"OrizmConfig\"],\n): Promise<ProjectDefinitionChangeEvent> => {\n const client = createDeveloperAPIv2Client({\n serverOrigin: env.ORIZM_BASE_URL,\n headers: {\n \"x-api-key\": env.ORIZM_API_KEY,\n },\n });\n\n const response = await client.POST(\n \"/projects/{projectName}/definitions/dry-run\",\n {\n params: { path: { projectName: env.ORIZM_PROJECT } },\n body: { definition: projectDef },\n },\n );\n if (!response.data) {\n const status = response.response.status;\n if (status === 401) {\n throw new Error(\n \"401 Unauthorized. Please check your Developer API key and try again.\",\n );\n }\n throw new Error(\n `${status} ${response.response.statusText}: Unexpected error occurred while fetching schema change events.\n ${JSON.stringify(response.error, null, 2)}`,\n );\n }\n return response.data;\n};\n","import cliColor from \"cli-color\";\nimport { components } from \"@orizm/private-api-clients/dev-v2\";\nimport { CliTable } from \"./cli-table.js\";\n\ntype ProjectDefinitionChangeEvent =\n components[\"schemas\"][\"OrizmConfigChangeEvents\"];\ntype TableChangeEvent =\n components[\"schemas\"][\"OrizmConfigChangeEvents\"][\"tableChangeEvents\"][number];\ntype BucketChangeEvent =\n components[\"schemas\"][\"OrizmConfigChangeEvents\"][\"bucketChangeEvents\"][number];\n\nexport async function displayChangeEvents(\n changeEvents: ProjectDefinitionChangeEvent,\n): Promise<void> {\n const {\n tableChangeEvents = [],\n bucketChangeEvents = [],\n authorityChangeEvents = [],\n } = changeEvents;\n\n if (\n tableChangeEvents.length === 0 &&\n bucketChangeEvents.length === 0 &&\n authorityChangeEvents.length === 0\n ) {\n console.log();\n console.log(cliColor.green(\"No changes.\"));\n return;\n }\n\n displayTableChangeEvents(tableChangeEvents);\n displayBucketChangeEvents(bucketChangeEvents);\n displayAuthorityChangeEvents(authorityChangeEvents);\n console.log();\n}\n\nfunction displayTableChangeEvents(tableChangeEvents: TableChangeEvent[]): void {\n if (tableChangeEvents.length === 0) {\n return;\n }\n\n const eventsByTable = new Map<string, TableChangeEvent[]>();\n\n for (const event of tableChangeEvents) {\n const tableName = event.tableDef.name;\n const tableEvents = eventsByTable.get(tableName) ?? [];\n tableEvents.push(event);\n eventsByTable.set(tableName, tableEvents);\n }\n\n for (const [tableName, events] of eventsByTable.entries()) {\n console.log();\n console.log(`⚫︎Table: ${tableName}`);\n\n const table = new CliTable([\"Type\", \"Name\", \"Event\", \"Detail\"]);\n\n for (const event of events) {\n const eventName = event.event;\n\n switch (eventName) {\n case \"table:create\":\n case \"table:update\": {\n table.addRow([\"table\", event.tableDef.name, eventName, \"\"], {\n color: \"green\",\n });\n break;\n }\n case \"table:delete\": {\n table.addRow([\"table\", event.tableDef.name, eventName, \"\"], {\n color: \"red\",\n });\n break;\n }\n case \"column:create\":\n case \"column:update\": {\n table.addRow(\n [\n \"column\",\n event.columnDef.name,\n eventName,\n JSON.stringify(event.columnDef),\n ],\n { color: \"green\" },\n );\n break;\n }\n case \"column:delete\": {\n table.addRow(\n [\n \"column\",\n event.columnDef.name,\n eventName,\n JSON.stringify(event.columnDef),\n ],\n {\n color: \"red\",\n },\n );\n break;\n }\n case \"index:create\":\n case \"index:update\": {\n table.addRow(\n [\n \"index\",\n event.indexDef.columns.join(\", \"),\n eventName,\n JSON.stringify(event.indexDef),\n ],\n { color: \"green\" },\n );\n break;\n }\n case \"index:delete\": {\n table.addRow(\n [\n \"index\",\n event.indexDef.columns.join(\", \"),\n eventName,\n JSON.stringify(event.indexDef),\n ],\n { color: \"red\" },\n );\n break;\n }\n case \"module:create\":\n case \"module:update\": {\n table.addRow(\n [\n \"module\",\n event.columnDef.name,\n eventName,\n JSON.stringify(event.columnDef),\n ],\n {\n color: \"green\",\n },\n );\n break;\n }\n case \"module:delete\": {\n table.addRow(\n [\n \"module\",\n event.columnDef.name,\n eventName,\n JSON.stringify(event.columnDef),\n ],\n {\n color: \"red\",\n },\n );\n break;\n }\n case \"search:enable\":\n case \"search:update\": {\n table.addRow([\"table\", event.tableDef.name, eventName, \"\"], {\n color: \"green\",\n });\n break;\n }\n case \"search:disable\": {\n table.addRow([\"table\", event.tableDef.name, eventName, \"\"], {\n color: \"red\",\n });\n break;\n }\n case \"history:enable\": {\n table.addRow([\"table\", event.tableDef.name, eventName, \"\"], {\n color: \"green\",\n });\n break;\n }\n case \"history:disable\": {\n table.addRow([\"table\", event.tableDef.name, eventName, \"\"], {\n color: \"red\",\n });\n break;\n }\n case \"formSubmissions:create\":\n case \"formSubmissions:update\": {\n table.addRow([\"table\", event.tableDef.name, eventName, \"\"], {\n color: \"green\",\n });\n break;\n }\n case \"formSubmissions:delete\": {\n table.addRow([\"table\", event.tableDef.name, eventName, \"\"], {\n color: \"red\",\n });\n break;\n }\n }\n }\n\n table.print();\n }\n}\n\nfunction displayBucketChangeEvents(\n bucketChangeEvents: ProjectDefinitionChangeEvent[\"bucketChangeEvents\"],\n): void {\n if (bucketChangeEvents.length === 0) {\n return;\n }\n\n const eventsByBucket = new Map<string, BucketChangeEvent[]>();\n\n for (const event of bucketChangeEvents) {\n const bucketName = event.bucketDef.name;\n const bucketEvents = eventsByBucket.get(bucketName) ?? [];\n bucketEvents.push(event);\n eventsByBucket.set(bucketName, bucketEvents);\n }\n\n const table = new CliTable([\"Type\", \"Name\", \"Event\", \"Detail\"]);\n\n console.log();\n console.log(\"⚫︎Buckets\");\n\n for (const [_, events] of eventsByBucket.entries()) {\n for (const event of events) {\n const eventName = event.event;\n\n switch (eventName) {\n case \"bucket:create\":\n case \"bucket:update\": {\n table.addRow(\n [\n \"bucket\",\n event.bucketDef.name,\n eventName,\n JSON.stringify(event.bucketDef),\n ],\n {\n color: \"green\",\n },\n );\n break;\n }\n case \"bucket:delete\": {\n table.addRow(\n [\n \"bucket\",\n event.bucketDef.name,\n eventName,\n JSON.stringify(event.bucketDef),\n ],\n {\n color: \"red\",\n },\n );\n break;\n }\n }\n }\n }\n\n table.print();\n}\n\nfunction displayAuthorityChangeEvents(\n authorityChangeEvents: ProjectDefinitionChangeEvent[\"authorityChangeEvents\"],\n): void {\n if (authorityChangeEvents.length === 0) {\n return;\n }\n\n const table = new CliTable([\"Type\", \"Event\", \"Detail\"]);\n\n console.log();\n console.log(\"⚫︎Authorities\");\n\n for (const event of authorityChangeEvents) {\n const eventName = event.event;\n\n switch (eventName) {\n case \"authority:update\": {\n table.addRow(\n [\"authority\", eventName, JSON.stringify(event.authorityDef)],\n { color: \"green\" },\n );\n break;\n }\n }\n }\n\n table.print();\n}\n","// generated by vscode copilot gpt-4o\n\n// ANSIカラーコード\nconst COLORS: { [key: string]: string } = {\n reset: \"\\x1b[0m\",\n green: \"\\x1b[32m\",\n red: \"\\x1b[31m\",\n};\n\nexport class CliTable {\n private headers: string[] = [];\n private rows: string[][] = [];\n private columnWidths: number[] = [];\n private rowColors: (string | null)[] = []; // 各行の色を保持する配列\n\n constructor(headers: string[]) {\n this.headers = headers;\n this.updateColumnWidths(headers);\n }\n\n // データ行を追加\n public addRow(row: string[], options?: { color?: \"green\" | \"red\" }): void {\n if (row.length !== this.headers.length) {\n throw new Error(\n `The length of the row (${row.length}) does not match the length of the header (${this.headers.length})`,\n );\n }\n this.rows.push(row);\n\n // オプションで色が指定されている場合は設定\n if (options?.color) {\n this.rowColors.push(COLORS[options.color]);\n } else {\n this.rowColors.push(null); // 色指定なし\n }\n\n this.updateColumnWidths(row);\n }\n\n // 列幅を更新\n private updateColumnWidths(row: string[]): void {\n for (let i = 0; i < row.length; i++) {\n const cellLength = row[i].length;\n if (!this.columnWidths[i] || cellLength > this.columnWidths[i]) {\n this.columnWidths[i] = cellLength;\n }\n }\n }\n\n // 水平線を生成\n private createHorizontalLine(position: \"top\" | \"middle\" | \"bottom\"): string {\n let line = \"\";\n\n // 左端の文字を決定\n if (position === \"top\") line += \"┌\";\n else if (position === \"middle\") line += \"├\";\n else if (position === \"bottom\") line += \"└\";\n\n // 各列の横線\n for (let i = 0; i < this.columnWidths.length; i++) {\n line += \"─\".repeat(this.columnWidths[i] + 2);\n\n // 右端または列の交差点の文字を決定\n if (i < this.columnWidths.length - 1) {\n if (position === \"top\") line += \"┬\";\n else if (position === \"middle\") line += \"┼\";\n else if (position === \"bottom\") line += \"┴\";\n } else {\n if (position === \"top\") line += \"┐\";\n else if (position === \"middle\") line += \"┤\";\n else if (position === \"bottom\") line += \"┘\";\n }\n }\n\n return line;\n }\n\n // 行を整形\n private formatRow(row: string[], color: string | null): string {\n let formattedRow = \"│\";\n for (let i = 0; i < row.length; i++) {\n const cell = row[i];\n const padding = \" \".repeat(this.columnWidths[i] - cell.length);\n if (color) {\n formattedRow += ` ${color}${cell}${COLORS.reset}${padding} │`;\n } else {\n formattedRow += ` ${cell}${padding} │`;\n }\n }\n return formattedRow;\n }\n\n // テーブルを文字列として取得\n public toString(): string {\n if (this.headers.length === 0) {\n return \"\";\n }\n\n const topLine = this.createHorizontalLine(\"top\");\n const middleLine = this.createHorizontalLine(\"middle\");\n const bottomLine = this.createHorizontalLine(\"bottom\");\n\n let table = topLine + \"\\n\";\n\n // ヘッダー行\n table += this.formatRow(this.headers, null) + \"\\n\";\n table += middleLine + \"\\n\";\n\n // データ行\n for (let i = 0; i < this.rows.length; i++) {\n const color = this.rowColors[i] || null;\n table += this.formatRow(this.rows[i], color) + \"\\n\";\n }\n\n table += bottomLine;\n return table;\n }\n\n // テーブルを出力\n public print(): void {\n console.log(this.toString());\n }\n}\n","import { createInterface } from \"node:readline/promises\";\n\nexport async function input(prompt: string): Promise<string> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n const input = await rl.question(prompt).finally(() => {\n rl.close();\n });\n\n return input.trim();\n}\n","import { Command } from \"commander\";\nimport clc from \"cli-color\";\nimport * as v from \"valibot\";\nimport { loadConfig } from \"../../lib/load-config.js\";\nimport { displayValibotError } from \"../../lib/display-valibot-error.js\";\nimport { handleError } from \"../../lib/handle-error.js\";\nimport { watchConfigFile } from \"./watcher.js\";\n\nexport const validateConfigCommand = new Command(\"validate\")\n .description(\"validate orizm.config.ts for validation errors\")\n .option(\"-c, --config <path>\", \"Path to config file\", \"./orizm.config.ts\")\n .option(\"-w, --watch\", \"Watch for file changes and re-validate\")\n .action(async (options) => {\n try {\n const validateConfig = async () => {\n try {\n if (options.watch) {\n console.clear();\n\n console.log(\n `👀 Watching ${options.config} for changes... (Press Ctrl+C to stop)`,\n );\n console.log();\n }\n\n await loadConfig(options.config);\n console.log(clc.green(\"✅ Config is valid.\"));\n } catch (error) {\n if (v.isValiError(error)) {\n console.error(clc.red(\"❌ Config validation failed:\"));\n displayValibotError(error);\n return;\n }\n throw error;\n }\n };\n\n await validateConfig();\n\n if (options.watch) {\n watchConfigFile(options.config, validateConfig);\n }\n } catch (error) {\n handleError(error);\n }\n });\n","import chokidar from \"chokidar\";\nimport { handleError } from \"../../lib/handle-error\";\n\nexport function watchConfigFile(\n configPath: string,\n onFileChange: () => Promise<void>,\n) {\n const watcher = chokidar.watch(configPath, {\n persistent: true,\n ignoreInitial: true,\n });\n\n let isProcessing = false;\n let timeoutId: NodeJS.Timeout | null = null;\n\n const debouncedOnChange = async () => {\n if (isProcessing) return;\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n\n timeoutId = setTimeout(async () => {\n isProcessing = true;\n\n try {\n await onFileChange();\n } catch (error) {\n handleError(error);\n } finally {\n isProcessing = false;\n }\n }, 300); // 300ms debounce\n };\n watcher.on(\"change\", debouncedOnChange);\n watcher.on(\"add\", debouncedOnChange);\n watcher.on(\"unlink\", debouncedOnChange);\n\n const terminate = () => {\n watcher.close();\n process.exit(0);\n };\n process.on(\"SIGINT\", terminate);\n process.on(\"SIGTERM\", terminate);\n\n watcher.on(\"error\", (error) => {\n handleError(error);\n });\n\n return watcher;\n}\n","import { Command } from \"commander\";\nimport { loadConfig } from \"../../lib/load-config.js\";\nimport { handleError } from \"../../lib/handle-error.js\";\nimport { generate } from \"./generate.js\";\nimport { convertToInput } from \"./convert-to-input.js\";\n\nexport const generateErdCommand = new Command(\"generate-erd\")\n .description(\"generate er diagram in mermaid format from orizm.config.ts\")\n .option(\"-c, --config <path>\", \"orizm config file path.\", \"orizm.config.ts\")\n .action(async (options) => {\n try {\n const config = await loadConfig(options.config);\n const input = convertToInput(config);\n const mermaidText = generate(input);\n\n console.log(mermaidText);\n } catch (error) {\n handleError(error);\n }\n });\n","import _Handlebars from \"handlebars\";\nimport mermaidTemplate from \"./mermaid-erd.hbr\";\nimport { TemplateInput } from \"./convert-to-input.js\";\n\nconst Handlebars = _Handlebars.create();\n\nexport function generate(input: TemplateInput): string {\n const template = Handlebars.compile(mermaidTemplate);\n return template(input);\n}\n","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```","import { ServerOrizmConfig } from \"../../types\";\n\nexport type TemplateInput = {\n tables: TableInput[];\n relations: RelationInput[];\n};\n\ntype TableInput = {\n name: string;\n columns: ColumnInput[];\n};\n\ntype ColumnInput = {\n name: string;\n type: string;\n isForeignKey: boolean;\n};\n\ntype RelationInput = {\n from: string;\n to: string;\n type: string;\n comment: string;\n};\n\nexport function convertToInput(config: ServerOrizmConfig): TemplateInput {\n if (!config.tables) {\n return {\n tables: [],\n relations: [],\n };\n }\n\n const tables: TableInput[] = [];\n const relations: RelationInput[] = [];\n\n for (const table of config.tables) {\n const modules: TableInput[] = [];\n\n const erdTable: TableInput = {\n name: table.name,\n columns: [],\n };\n\n for (const column of table.columns) {\n erdTable.columns.push({\n name: column.name,\n type: column.type,\n isForeignKey: column.type === \"reference\",\n });\n\n if (column.type === \"reference\") {\n relations.push({\n from: column.tableName,\n to: table.name,\n type: RELATION.ONE_TO_MANY,\n comment: \"reference\",\n });\n }\n\n if (column.type === \"module\" || column.type === \"module-array\") {\n const module = config.tableModules?.find(\n (m) => m.name === column.moduleName,\n );\n\n if (!module) {\n continue;\n }\n\n const moduleTableName = `${table.name}_${column.name}_${column.moduleName}`;\n\n modules.push({\n name: moduleTableName,\n columns:\n module?.columns.map((c) => ({\n name: c.name,\n type: c.type,\n isForeignKey: c.type === \"reference\",\n })) || [],\n });\n\n relations.push({\n from: table.name,\n to: moduleTableName,\n type:\n column.type === \"module\"\n ? RELATION.ONE_TO_ONE\n : RELATION.ONE_TO_MANY,\n comment: column.type === \"module\" ? \"module\" : \"module-array\",\n });\n\n for (const moduleColumn of module.columns) {\n if (moduleColumn.type === \"reference\" && moduleColumn.tableName) {\n relations.push({\n from: moduleTableName,\n to: moduleColumn.tableName,\n type: RELATION.ONE_TO_MANY,\n comment: \"reference\",\n });\n }\n }\n }\n }\n\n tables.push(erdTable);\n tables.push(...modules);\n }\n\n return {\n tables,\n relations,\n };\n}\n\nconst RELATION = {\n ONE_TO_MANY: \"||--o{\",\n ONE_TO_ONE: \"||--||\",\n} as const;\n"],"mappings":"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","names":["Command","v","cliColor","v","cliColor","error","path","error","cliColor","error","Command","error","final","joiner","v","v2","error","v","spinner","Command","error","Command","mkdir","writeFile","path","_Handlebars","client_ts_default","types_ts_default","Handlebars","_Handlebars","generate","mkdir","renderTypes","path","writeFile","renderClient","toCodeTypeName","types_ts_default","client_ts_default","spinner","generate","Command","error","Command","spinner","pullAction","generate","Command","pullAction","error","Command","cliColor","cliColor","cliColor","input","spinner","Command","cliColor","error","Command","v","error","Command","error","Command","_Handlebars","Handlebars","_Handlebars","generate","input","Command","input","generate","error","Command"]}
@@ -105,3 +105,4 @@ function bucket(name, input) {
105
105
  0 && (module.exports = {
106
106
  defineConfig
107
107
  });
108
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/config/index.ts","../../src/config/functions.ts"],"sourcesContent":["export * from \"./functions.js\";\nexport type { OrizmConfigDef as OrizmConfig } from \"@orizm/common/config-validator\";\n","import { TableColumnDef } from \"@orizm/common/config-validator\";\nimport {\n CommonAuthorityRulesDefinition,\n CommonBooleanColumnDefinition,\n CommonBucketDefinition,\n CommonJsonColumnDefinition,\n CommonModuleColumnDefinition,\n CommonNumberColumnDefinition,\n CommonOrizmConfig,\n CommonReferenceColumnDefinition,\n CommonStorageColumnDefinition,\n CommonStringColumnDefinition,\n CommonTableDefinition,\n CommonTableModuleDefinition,\n} from \"../types\";\n\ntype DefineConfigInput = {\n tables?: { [tableName: string]: TableInput };\n tableModules?: { [moduleName: string]: TableModuleInput };\n buckets?: { [bucketName: string]: BucketInput };\n authorities?: CommonAuthorityRulesDefinition;\n};\n\nexport function defineConfig(config: DefineConfigInput): CommonOrizmConfig {\n const {\n tables = {},\n tableModules = {},\n buckets = {},\n authorities = [],\n } = config;\n return {\n tables: Object.entries(tables).map(([tableName, tableInput]) =>\n table(tableName, tableInput),\n ),\n tableModules: Object.entries(tableModules).map(\n ([moduleName, moduleInput]) => module(moduleName, moduleInput),\n ),\n buckets: Object.entries(buckets).map(([bucketName, bucketInput]) =>\n bucket(bucketName, bucketInput),\n ),\n authorities,\n };\n}\n\ntype TableInput = Omit<\n CommonTableDefinition,\n \"name\" | \"columns\" | \"formOptions\"\n> & {\n columns: { [columnName: string]: Column };\n formOptions?: {\n submissionColumns: { [columnName: string]: Column };\n };\n};\n\ntype TableModuleInput = Omit<\n CommonTableModuleDefinition,\n \"name\" | \"columns\"\n> & {\n columns: { [columnName: string]: Column };\n};\n\ntype Column =\n | StringColumn\n | Omit<CommonNumberColumnDefinition, \"name\">\n | Omit<CommonBooleanColumnDefinition, \"name\">\n | Omit<CommonJsonColumnDefinition, \"name\">\n | Omit<CommonReferenceColumnDefinition, \"name\">\n | Omit<CommonModuleColumnDefinition, \"name\">\n | Omit<CommonStorageColumnDefinition, \"name\">;\n\ntype StringColumn = Omit<CommonStringColumnDefinition, \"name\" | \"pattern\"> & {\n pattern?: string | RegExp;\n};\n\nfunction table(name: string, input: TableInput): CommonTableDefinition {\n const { columns, indexes, formOptions, ...rest } = input;\n\n const definition: CommonTableDefinition = {\n ...rest,\n name,\n columns: Object.entries(columns).map(([columnName, columnInput]) =>\n column(columnName, columnInput),\n ),\n };\n\n if (indexes) {\n definition.indexes = indexes.map((index) => ({\n ...index,\n columns: index.columns.map((columnName) => columnName),\n }));\n }\n\n if (formOptions) {\n definition.formOptions = {\n submissionColumns: Object.entries(formOptions.submissionColumns).map(\n ([columnName, columnInput]) => column(columnName, columnInput),\n ),\n };\n }\n\n return definition;\n}\n\nfunction module(\n name: string,\n input: TableModuleInput,\n): CommonTableModuleDefinition {\n return {\n ...input,\n name,\n columns: Object.entries(input.columns).map(([columnName, columnInput]) =>\n column(columnName, columnInput),\n ),\n };\n}\n\nfunction column(name: string, input: Column): TableColumnDef {\n if (isStringColumn(input)) {\n const { pattern, ...rest } = input;\n const definition: CommonStringColumnDefinition = { ...rest, name };\n if (pattern) {\n definition.pattern = pattern instanceof RegExp ? pattern.source : pattern;\n }\n return definition;\n }\n\n return {\n ...input,\n name,\n };\n}\n\nfunction isStringColumn(column: Column): column is StringColumn {\n return column.type === \"string\";\n}\n\ntype BucketInput = Omit<CommonBucketDefinition, \"name\" | \"accessControl\"> & {\n accessControl: CommonBucketDefinition[\"accessControl\"];\n};\n\nfunction bucket(name: string, input: BucketInput): CommonBucketDefinition {\n return {\n ...input,\n name,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACuBO,SAAS,aAAa,QAA8C;AACzE,QAAM;AAAA,IACJ,SAAS,CAAC;AAAA,IACV,eAAe,CAAC;AAAA,IAChB,UAAU,CAAC;AAAA,IACX,cAAc,CAAC;AAAA,EACjB,IAAI;AACJ,SAAO;AAAA,IACL,QAAQ,OAAO,QAAQ,MAAM,EAAE;AAAA,MAAI,CAAC,CAAC,WAAW,UAAU,MACxD,MAAM,WAAW,UAAU;AAAA,IAC7B;AAAA,IACA,cAAc,OAAO,QAAQ,YAAY,EAAE;AAAA,MACzC,CAAC,CAAC,YAAY,WAAW,MAAMA,QAAO,YAAY,WAAW;AAAA,IAC/D;AAAA,IACA,SAAS,OAAO,QAAQ,OAAO,EAAE;AAAA,MAAI,CAAC,CAAC,YAAY,WAAW,MAC5D,OAAO,YAAY,WAAW;AAAA,IAChC;AAAA,IACA;AAAA,EACF;AACF;AAgCA,SAAS,MAAM,MAAc,OAA0C;AACrE,QAAM,EAAE,SAAS,SAAS,aAAa,GAAG,KAAK,IAAI;AAEnD,QAAM,aAAoC;AAAA,IACxC,GAAG;AAAA,IACH;AAAA,IACA,SAAS,OAAO,QAAQ,OAAO,EAAE;AAAA,MAAI,CAAC,CAAC,YAAY,WAAW,MAC5D,OAAO,YAAY,WAAW;AAAA,IAChC;AAAA,EACF;AAEA,MAAI,SAAS;AACX,eAAW,UAAU,QAAQ,IAAI,CAAC,WAAW;AAAA,MAC3C,GAAG;AAAA,MACH,SAAS,MAAM,QAAQ,IAAI,CAAC,eAAe,UAAU;AAAA,IACvD,EAAE;AAAA,EACJ;AAEA,MAAI,aAAa;AACf,eAAW,cAAc;AAAA,MACvB,mBAAmB,OAAO,QAAQ,YAAY,iBAAiB,EAAE;AAAA,QAC/D,CAAC,CAAC,YAAY,WAAW,MAAM,OAAO,YAAY,WAAW;AAAA,MAC/D;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAASA,QACP,MACA,OAC6B;AAC7B,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA,SAAS,OAAO,QAAQ,MAAM,OAAO,EAAE;AAAA,MAAI,CAAC,CAAC,YAAY,WAAW,MAClE,OAAO,YAAY,WAAW;AAAA,IAChC;AAAA,EACF;AACF;AAEA,SAAS,OAAO,MAAc,OAA+B;AAC3D,MAAI,eAAe,KAAK,GAAG;AACzB,UAAM,EAAE,SAAS,GAAG,KAAK,IAAI;AAC7B,UAAM,aAA2C,EAAE,GAAG,MAAM,KAAK;AACjE,QAAI,SAAS;AACX,iBAAW,UAAU,mBAAmB,SAAS,QAAQ,SAAS;AAAA,IACpE;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,eAAeC,SAAwC;AAC9D,SAAOA,QAAO,SAAS;AACzB;AAMA,SAAS,OAAO,MAAc,OAA4C;AACxE,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,EACF;AACF;","names":["module","column"]}
@@ -1,4 +1,19 @@
1
- import { CommonAuthorityRulesDefinition, CommonBooleanColumnDefinition, CommonBucketDefinition, CommonJsonColumnDefinition, CommonModuleColumnDefinition, CommonNumberColumnDefinition, CommonOrizmConfig, CommonReferenceColumnDefinition, CommonStorageColumnDefinition, CommonStringColumnDefinition, CommonTableDefinition, CommonTableModuleDefinition } from "../types";
1
+ import { TableDef, StringColumnDef, NumberColumnDef, BooleanColumnDef, JsonColumnDef, ReferenceColumnDef, ModuleColumnDef, StorageColumnDef, TableModuleDef, BucketDef, AuthorityRulesDef, OrizmConfigDef } from '@orizm/common/config-validator';
2
+ export { OrizmConfigDef as OrizmConfig } from '@orizm/common/config-validator';
3
+
4
+ type CommonOrizmConfig = OrizmConfigDef;
5
+ type CommonTableDefinition = TableDef;
6
+ type CommonStringColumnDefinition = StringColumnDef;
7
+ type CommonNumberColumnDefinition = NumberColumnDef;
8
+ type CommonBooleanColumnDefinition = BooleanColumnDef;
9
+ type CommonJsonColumnDefinition = JsonColumnDef;
10
+ type CommonStorageColumnDefinition = StorageColumnDef;
11
+ type CommonReferenceColumnDefinition = ReferenceColumnDef;
12
+ type CommonModuleColumnDefinition = ModuleColumnDef;
13
+ type CommonTableModuleDefinition = TableModuleDef;
14
+ type CommonBucketDefinition = BucketDef;
15
+ type CommonAuthorityRulesDefinition = AuthorityRulesDef;
16
+
2
17
  type DefineConfigInput = {
3
18
  tables?: {
4
19
  [tableName: string]: TableInput;
@@ -11,7 +26,7 @@ type DefineConfigInput = {
11
26
  };
12
27
  authorities?: CommonAuthorityRulesDefinition;
13
28
  };
14
- export declare function defineConfig(config: DefineConfigInput): CommonOrizmConfig;
29
+ declare function defineConfig(config: DefineConfigInput): CommonOrizmConfig;
15
30
  type TableInput = Omit<CommonTableDefinition, "name" | "columns" | "formOptions"> & {
16
31
  columns: {
17
32
  [columnName: string]: Column;
@@ -34,5 +49,5 @@ type StringColumn = Omit<CommonStringColumnDefinition, "name" | "pattern"> & {
34
49
  type BucketInput = Omit<CommonBucketDefinition, "name" | "accessControl"> & {
35
50
  accessControl: CommonBucketDefinition["accessControl"];
36
51
  };
37
- export {};
38
- //# sourceMappingURL=functions.d.ts.map
52
+
53
+ export { defineConfig };