@rebasepro/server-postgresql 0.4.0 → 0.6.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 (168) hide show
  1. package/README.md +69 -89
  2. package/dist/{server-postgresql/src/PostgresAdapter.d.ts → PostgresAdapter.d.ts} +1 -1
  3. package/dist/{server-postgresql/src/PostgresBackendDriver.d.ts → PostgresBackendDriver.d.ts} +2 -2
  4. package/dist/{server-postgresql/src/PostgresBootstrapper.d.ts → PostgresBootstrapper.d.ts} +11 -1
  5. package/dist/{server-postgresql/src/auth → auth}/services.d.ts +11 -11
  6. package/dist/{server-postgresql/src/collections → collections}/PostgresCollectionRegistry.d.ts +4 -0
  7. package/dist/{server-postgresql/src/data-transformer.d.ts → data-transformer.d.ts} +0 -3
  8. package/dist/{server-postgresql/src/databasePoolManager.d.ts → databasePoolManager.d.ts} +1 -1
  9. package/dist/index.es.js +10174 -11184
  10. package/dist/index.es.js.map +1 -1
  11. package/dist/index.umd.js +10735 -11462
  12. package/dist/index.umd.js.map +1 -1
  13. package/dist/{server-postgresql/src/services → services}/EntityPersistService.d.ts +0 -14
  14. package/dist/types.d.ts +3 -0
  15. package/dist/utils/pg-error-utils.d.ts +55 -0
  16. package/dist/{server-postgresql/src/websocket.d.ts → websocket.d.ts} +8 -3
  17. package/package.json +24 -21
  18. package/src/PostgresAdapter.ts +9 -10
  19. package/src/PostgresBackendDriver.ts +135 -122
  20. package/src/PostgresBootstrapper.ts +90 -16
  21. package/src/auth/ensure-tables.ts +28 -5
  22. package/src/auth/services.ts +56 -45
  23. package/src/cli.ts +140 -110
  24. package/src/collections/PostgresCollectionRegistry.ts +7 -0
  25. package/src/connection.ts +11 -6
  26. package/src/data-transformer.ts +73 -109
  27. package/src/databasePoolManager.ts +5 -3
  28. package/src/history/HistoryService.ts +3 -2
  29. package/src/history/ensure-history-table.ts +5 -4
  30. package/src/schema/auth-schema.ts +1 -2
  31. package/src/schema/doctor-cli.ts +2 -1
  32. package/src/schema/doctor.ts +40 -37
  33. package/src/schema/generate-drizzle-schema-logic.ts +56 -18
  34. package/src/schema/generate-drizzle-schema.ts +11 -11
  35. package/src/schema/introspect-db-inference.ts +25 -25
  36. package/src/schema/introspect-db-logic.ts +38 -38
  37. package/src/schema/introspect-db.ts +28 -27
  38. package/src/services/BranchService.ts +14 -0
  39. package/src/services/EntityFetchService.ts +28 -25
  40. package/src/services/EntityPersistService.ts +11 -124
  41. package/src/services/RelationService.ts +57 -37
  42. package/src/services/entity-helpers.ts +6 -2
  43. package/src/services/realtimeService.ts +45 -32
  44. package/src/types.ts +4 -0
  45. package/src/utils/drizzle-conditions.ts +31 -15
  46. package/src/utils/pg-error-utils.ts +211 -0
  47. package/src/websocket.ts +51 -33
  48. package/test/auth-services.test.ts +36 -19
  49. package/test/batch-many-to-many-regression.test.ts +119 -39
  50. package/test/data-transformer-hardening.test.ts +67 -33
  51. package/test/data-transformer.test.ts +4 -2
  52. package/test/doctor.test.ts +10 -5
  53. package/test/drizzle-conditions.test.ts +59 -6
  54. package/test/generate-drizzle-schema.test.ts +65 -40
  55. package/test/introspect-db-generation.test.ts +179 -81
  56. package/test/introspect-db-utils.test.ts +92 -37
  57. package/test/mocks/chalk.cjs +7 -0
  58. package/test/pg-error-utils.test.ts +221 -0
  59. package/test/postgresDataDriver.test.ts +14 -5
  60. package/test/property-ordering.test.ts +126 -79
  61. package/test/realtimeService.test.ts +6 -2
  62. package/test/relation-pipeline-gaps.test.ts +84 -36
  63. package/test/relations.test.ts +247 -0
  64. package/test/unmapped-tables-safety.test.ts +14 -6
  65. package/test/websocket.test.ts +1 -1
  66. package/tsconfig.json +5 -0
  67. package/tsconfig.prod.json +3 -0
  68. package/vite.config.ts +5 -5
  69. package/dist/common/src/collections/CollectionRegistry.d.ts +0 -56
  70. package/dist/common/src/collections/default-collections.d.ts +0 -9
  71. package/dist/common/src/collections/index.d.ts +0 -2
  72. package/dist/common/src/data/buildRebaseData.d.ts +0 -14
  73. package/dist/common/src/data/query_builder.d.ts +0 -55
  74. package/dist/common/src/index.d.ts +0 -4
  75. package/dist/common/src/util/builders.d.ts +0 -57
  76. package/dist/common/src/util/callbacks.d.ts +0 -6
  77. package/dist/common/src/util/collections.d.ts +0 -11
  78. package/dist/common/src/util/common.d.ts +0 -2
  79. package/dist/common/src/util/conditions.d.ts +0 -26
  80. package/dist/common/src/util/entities.d.ts +0 -58
  81. package/dist/common/src/util/enums.d.ts +0 -3
  82. package/dist/common/src/util/index.d.ts +0 -16
  83. package/dist/common/src/util/navigation_from_path.d.ts +0 -34
  84. package/dist/common/src/util/navigation_utils.d.ts +0 -20
  85. package/dist/common/src/util/parent_references_from_path.d.ts +0 -6
  86. package/dist/common/src/util/paths.d.ts +0 -14
  87. package/dist/common/src/util/permissions.d.ts +0 -6
  88. package/dist/common/src/util/references.d.ts +0 -2
  89. package/dist/common/src/util/relations.d.ts +0 -22
  90. package/dist/common/src/util/resolutions.d.ts +0 -72
  91. package/dist/common/src/util/storage.d.ts +0 -24
  92. package/dist/types/src/controllers/analytics_controller.d.ts +0 -7
  93. package/dist/types/src/controllers/auth.d.ts +0 -104
  94. package/dist/types/src/controllers/client.d.ts +0 -168
  95. package/dist/types/src/controllers/collection_registry.d.ts +0 -46
  96. package/dist/types/src/controllers/customization_controller.d.ts +0 -60
  97. package/dist/types/src/controllers/data.d.ts +0 -207
  98. package/dist/types/src/controllers/data_driver.d.ts +0 -218
  99. package/dist/types/src/controllers/database_admin.d.ts +0 -11
  100. package/dist/types/src/controllers/dialogs_controller.d.ts +0 -36
  101. package/dist/types/src/controllers/effective_role.d.ts +0 -4
  102. package/dist/types/src/controllers/email.d.ts +0 -36
  103. package/dist/types/src/controllers/index.d.ts +0 -18
  104. package/dist/types/src/controllers/local_config_persistence.d.ts +0 -20
  105. package/dist/types/src/controllers/navigation.d.ts +0 -225
  106. package/dist/types/src/controllers/registry.d.ts +0 -63
  107. package/dist/types/src/controllers/side_dialogs_controller.d.ts +0 -67
  108. package/dist/types/src/controllers/side_entity_controller.d.ts +0 -97
  109. package/dist/types/src/controllers/snackbar.d.ts +0 -24
  110. package/dist/types/src/controllers/storage.d.ts +0 -171
  111. package/dist/types/src/index.d.ts +0 -4
  112. package/dist/types/src/rebase_context.d.ts +0 -122
  113. package/dist/types/src/types/auth_adapter.d.ts +0 -301
  114. package/dist/types/src/types/backend.d.ts +0 -536
  115. package/dist/types/src/types/backend_hooks.d.ts +0 -172
  116. package/dist/types/src/types/builders.d.ts +0 -15
  117. package/dist/types/src/types/chips.d.ts +0 -5
  118. package/dist/types/src/types/collections.d.ts +0 -941
  119. package/dist/types/src/types/component_ref.d.ts +0 -47
  120. package/dist/types/src/types/cron.d.ts +0 -102
  121. package/dist/types/src/types/data_source.d.ts +0 -64
  122. package/dist/types/src/types/database_adapter.d.ts +0 -94
  123. package/dist/types/src/types/entities.d.ts +0 -145
  124. package/dist/types/src/types/entity_actions.d.ts +0 -104
  125. package/dist/types/src/types/entity_callbacks.d.ts +0 -173
  126. package/dist/types/src/types/entity_link_builder.d.ts +0 -7
  127. package/dist/types/src/types/entity_overrides.d.ts +0 -10
  128. package/dist/types/src/types/entity_views.d.ts +0 -87
  129. package/dist/types/src/types/export_import.d.ts +0 -21
  130. package/dist/types/src/types/formex.d.ts +0 -40
  131. package/dist/types/src/types/index.d.ts +0 -28
  132. package/dist/types/src/types/locales.d.ts +0 -4
  133. package/dist/types/src/types/modify_collections.d.ts +0 -5
  134. package/dist/types/src/types/plugins.d.ts +0 -282
  135. package/dist/types/src/types/properties.d.ts +0 -1181
  136. package/dist/types/src/types/property_config.d.ts +0 -74
  137. package/dist/types/src/types/relations.d.ts +0 -336
  138. package/dist/types/src/types/slots.d.ts +0 -262
  139. package/dist/types/src/types/translations.d.ts +0 -900
  140. package/dist/types/src/types/user_management_delegate.d.ts +0 -86
  141. package/dist/types/src/types/websockets.d.ts +0 -78
  142. package/dist/types/src/users/index.d.ts +0 -1
  143. package/dist/types/src/users/user.d.ts +0 -50
  144. package/drizzle.test.config.ts +0 -10
  145. /package/dist/{server-postgresql/src/auth → auth}/ensure-tables.d.ts +0 -0
  146. /package/dist/{server-postgresql/src/cli.d.ts → cli.d.ts} +0 -0
  147. /package/dist/{server-postgresql/src/connection.d.ts → connection.d.ts} +0 -0
  148. /package/dist/{server-postgresql/src/history → history}/HistoryService.d.ts +0 -0
  149. /package/dist/{server-postgresql/src/history → history}/ensure-history-table.d.ts +0 -0
  150. /package/dist/{server-postgresql/src/index.d.ts → index.d.ts} +0 -0
  151. /package/dist/{server-postgresql/src/interfaces.d.ts → interfaces.d.ts} +0 -0
  152. /package/dist/{server-postgresql/src/schema → schema}/auth-schema.d.ts +0 -0
  153. /package/dist/{server-postgresql/src/schema → schema}/doctor-cli.d.ts +0 -0
  154. /package/dist/{server-postgresql/src/schema → schema}/doctor.d.ts +0 -0
  155. /package/dist/{server-postgresql/src/schema → schema}/generate-drizzle-schema-logic.d.ts +0 -0
  156. /package/dist/{server-postgresql/src/schema → schema}/generate-drizzle-schema.d.ts +0 -0
  157. /package/dist/{server-postgresql/src/schema → schema}/introspect-db-inference.d.ts +0 -0
  158. /package/dist/{server-postgresql/src/schema → schema}/introspect-db-logic.d.ts +0 -0
  159. /package/dist/{server-postgresql/src/schema → schema}/introspect-db.d.ts +0 -0
  160. /package/dist/{server-postgresql/src/schema → schema}/test-schema.d.ts +0 -0
  161. /package/dist/{server-postgresql/src/services → services}/BranchService.d.ts +0 -0
  162. /package/dist/{server-postgresql/src/services → services}/EntityFetchService.d.ts +0 -0
  163. /package/dist/{server-postgresql/src/services → services}/RelationService.d.ts +0 -0
  164. /package/dist/{server-postgresql/src/services → services}/entity-helpers.d.ts +0 -0
  165. /package/dist/{server-postgresql/src/services → services}/entityService.d.ts +0 -0
  166. /package/dist/{server-postgresql/src/services → services}/index.d.ts +0 -0
  167. /package/dist/{server-postgresql/src/services → services}/realtimeService.d.ts +0 -0
  168. /package/dist/{server-postgresql/src/utils → utils}/drizzle-conditions.d.ts +0 -0
@@ -1,9 +1,10 @@
1
1
  import { beforeEach, describe, expect, it, jest } from "@jest/globals";
2
2
  import { eq } from "drizzle-orm";
3
- import { integer, pgTable, primaryKey, serial, varchar } from "drizzle-orm/pg-core";
3
+ import { integer, pgTable, primaryKey, serial, varchar, text } from "drizzle-orm/pg-core";
4
4
  import { EntityCollection, Relation } from "@rebasepro/types";
5
5
  import { PostgresCollectionRegistry } from "../src/collections/PostgresCollectionRegistry";
6
6
  import { DrizzleConditionBuilder } from "../src/utils/drizzle-conditions";
7
+ import { getColumnMeta } from "../src/services/entity-helpers";
7
8
 
8
9
  // Mock tables for testing
9
10
  const mockAuthorsTable = pgTable("authors", {
@@ -900,37 +901,89 @@ describe("DrizzleConditionBuilder - Filter Operators", () => {
900
901
  id: serial("id").primaryKey(),
901
902
  name: varchar("name").notNull(),
902
903
  email: varchar("email").notNull(),
903
- age: integer("age")
904
+ age: integer("age"),
905
+ tags: text("tags").array()
904
906
  });
905
907
 
906
908
  describe("buildSingleFilterCondition - array-contains", () => {
907
- it("should generate a non-null condition for a single value", () => {
909
+ const { PgDialect } = require("drizzle-orm/pg-core");
910
+ const pgDialect = new PgDialect();
911
+
912
+ it("should generate a native array condition for native array columns", () => {
913
+ const condition = DrizzleConditionBuilder.buildSingleFilterCondition(
914
+ mockUsersTable.tags,
915
+ "array-contains",
916
+ "featured"
917
+ );
918
+ expect(condition).not.toBeNull();
919
+ const query = pgDialect.sqlToQuery(condition!);
920
+ expect(query.sql).toBe('"users"."tags" @> ARRAY[$1]');
921
+ expect(query.params).toEqual(["featured"]);
922
+ });
923
+
924
+ it("should generate a JSONB condition for non-native array columns", () => {
908
925
  const condition = DrizzleConditionBuilder.buildSingleFilterCondition(
909
926
  mockUsersTable.name,
910
927
  "array-contains",
911
928
  "featured"
912
929
  );
913
930
  expect(condition).not.toBeNull();
931
+ const query = pgDialect.sqlToQuery(condition!);
932
+ expect(query.sql).toBe('"users"."name" @> $1');
933
+ expect(query.params).toEqual(['["featured"]']);
914
934
  });
915
935
  });
916
936
 
917
937
  describe("buildSingleFilterCondition - array-contains-any", () => {
918
- it("should generate a non-null condition for an array of values", () => {
938
+ const { PgDialect } = require("drizzle-orm/pg-core");
939
+ const pgDialect = new PgDialect();
940
+
941
+ it("should generate a native array overlap condition for native array columns", () => {
942
+ const condition = DrizzleConditionBuilder.buildSingleFilterCondition(
943
+ mockUsersTable.tags,
944
+ "array-contains-any",
945
+ ["featured", "popular", "trending"]
946
+ );
947
+ expect(condition).not.toBeNull();
948
+ const query = pgDialect.sqlToQuery(condition!);
949
+ expect(query.sql).toBe('"users"."tags" && ARRAY[$1, $2, $3]');
950
+ expect(query.params).toEqual(["featured", "popular", "trending"]);
951
+ });
952
+
953
+ it("should generate a JSONB overlap (?|) condition for non-native array columns", () => {
919
954
  const condition = DrizzleConditionBuilder.buildSingleFilterCondition(
920
955
  mockUsersTable.name,
921
956
  "array-contains-any",
922
957
  ["featured", "popular", "trending"]
923
958
  );
924
959
  expect(condition).not.toBeNull();
960
+ const query = pgDialect.sqlToQuery(condition!);
961
+ expect(query.sql).toBe('"users"."name" ?| array[$1, $2, $3]');
962
+ expect(query.params).toEqual(["featured", "popular", "trending"]);
963
+ });
964
+
965
+ it("should fallback to native array-contains for native array columns with single value", () => {
966
+ const condition = DrizzleConditionBuilder.buildSingleFilterCondition(
967
+ mockUsersTable.tags,
968
+ "array-contains-any",
969
+ "featured"
970
+ );
971
+ expect(condition).not.toBeNull();
972
+ const query = pgDialect.sqlToQuery(condition!);
973
+ expect(query.sql).toBe('"users"."tags" @> ARRAY[$1]');
974
+ expect(query.params).toEqual(["featured"]);
925
975
  });
926
976
 
927
- it("should fallback to array-contains for a single (non-array) value", () => {
977
+ it("should fallback to JSONB array-contains for non-native array columns with single value", () => {
928
978
  const condition = DrizzleConditionBuilder.buildSingleFilterCondition(
929
979
  mockUsersTable.name,
930
980
  "array-contains-any",
931
981
  "featured"
932
982
  );
933
983
  expect(condition).not.toBeNull();
984
+ const query = pgDialect.sqlToQuery(condition!);
985
+ expect(query.sql).toBe('"users"."name" @> $1');
986
+ expect(query.params).toEqual(['["featured"]']);
934
987
  });
935
988
  });
936
989
 
@@ -1017,7 +1070,7 @@ describe("DrizzleConditionBuilder - Filter Operators", () => {
1017
1070
  42
1018
1071
  );
1019
1072
  expect(condition).toBeNull();
1020
- expect(warnSpy).toHaveBeenCalledWith("Unsupported filter operation: unknown-op");
1073
+ expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining("Unsupported filter operation: unknown-op"));
1021
1074
  warnSpy.mockRestore();
1022
1075
  });
1023
1076
  });
@@ -471,7 +471,7 @@ roles: ["admin"] }
471
471
  }];
472
472
 
473
473
  const result = await generateSchema(collections);
474
- expect(result).toContain("string_to_array(auth.roles(), ',') @> ARRAY['admin']");
474
+ expect(result).toContain("string_to_array(auth.roles(), ',') && ARRAY['admin']");
475
475
  });
476
476
 
477
477
  it("should safely handle complex sub-string roles overlapping like 'view' and 'viewer'", async () => {
@@ -489,7 +489,7 @@ roles: ["view"] } // Should not match 'viewer'
489
489
  const result = await generateSchema(collections);
490
490
  // Before array change: auth.roles() ~ 'view' would match 'viewer'
491
491
  // Now: array intersection prevents this
492
- expect(result).toContain("string_to_array(auth.roles(), ',') @> ARRAY['view']");
492
+ expect(result).toContain("string_to_array(auth.roles(), ',') && ARRAY['view']");
493
493
  });
494
494
 
495
495
  it("should securely handle multiple allowed roles", async () => {
@@ -505,7 +505,7 @@ roles: ["admin", "editor", "super-admin"] }
505
505
  }];
506
506
 
507
507
  const result = await generateSchema(collections);
508
- expect(result).toContain("string_to_array(auth.roles(), ',') @> ARRAY['admin','editor','super-admin']");
508
+ expect(result).toContain("string_to_array(auth.roles(), ',') && ARRAY['admin','editor','super-admin']");
509
509
  });
510
510
 
511
511
  it("should combine roles with access: public", async () => {
@@ -523,7 +523,7 @@ access: "public" }
523
523
 
524
524
  const result = await generateSchema(collections);
525
525
  // Should be (true) AND (role check)
526
- expect(result).toContain("(true) AND (string_to_array(auth.roles(), ',') @> ARRAY['admin','manager'])");
526
+ expect(result).toContain("(true) AND (string_to_array(auth.roles(), ',') && ARRAY['admin','manager'])");
527
527
  });
528
528
 
529
529
  it("should combine roles with ownerField", async () => {
@@ -545,7 +545,7 @@ ownerField: "user_id" }
545
545
  const result = await generateSchema(collections);
546
546
  // Should combine owner check AND role check
547
547
  expect(result).toContain("auth.uid()");
548
- expect(result).toContain("string_to_array(auth.roles(), ',') @> ARRAY['editor']");
548
+ expect(result).toContain("string_to_array(auth.roles(), ',') && ARRAY['editor']");
549
549
  expect(result).toContain("AND");
550
550
  });
551
551
 
@@ -690,7 +690,8 @@ using: "{is_locked} = false" }
690
690
  name: "Secure Data",
691
691
  properties: { title: { type: "string" } },
692
692
  securityRules: [
693
- { operation: "select", access: "public" }
693
+ { operation: "select",
694
+ access: "public" }
694
695
  ]
695
696
  }];
696
697
 
@@ -731,7 +732,7 @@ roles: ["admin"] }
731
732
  ]
732
733
  }];
733
734
  const result = await generateSchema(collections);
734
- expect(result).toContain("string_to_array(auth.roles(), ',') @> ARRAY['admin']");
735
+ expect(result).toContain("string_to_array(auth.roles(), ',') && ARRAY['admin']");
735
736
  });
736
737
  it("should generate multiple policies from operations array", async () => {
737
738
  const collections: EntityCollection[] = [{
@@ -845,7 +846,7 @@ using: "true" }
845
846
  }];
846
847
  const result = await generateSchema(collections);
847
848
  // Should be (true) AND (role check) — same effect as access: "public" + roles
848
- expect(result).toContain("(true) AND (string_to_array(auth.roles(), ',') @> ARRAY['admin'])");
849
+ expect(result).toContain("(true) AND (string_to_array(auth.roles(), ',') && ARRAY['admin'])");
849
850
  });
850
851
  it("should use pgRoles instead of default 'public' when specified", async () => {
851
852
  const collections: EntityCollection[] = [{
@@ -956,7 +957,7 @@ roles: ["admin", "user"] }
956
957
  expect(matchUnsorted![1]).toEqual(matchSorted![1]);
957
958
 
958
959
  // The actual generated sql bodies should also be identical due to sorting
959
- expect(resultUnsorted).toContain("string_to_array(auth.roles(), ',') @> ARRAY['admin','manager','user']");
960
+ expect(resultUnsorted).toContain("string_to_array(auth.roles(), ',') && ARRAY['admin','manager','user']");
960
961
  expect(resultUnsorted).toContain('to: ["app_role", "service_role"]');
961
962
  });
962
963
  });
@@ -1056,14 +1057,14 @@ describe("generateDrizzleSchema columnName support", () => {
1056
1057
  employee_number_140a: {
1057
1058
  type: "string",
1058
1059
  name: "Employee Number 140a",
1059
- columnName: "employee_number_140a",
1060
+ columnName: "employee_number_140a"
1060
1061
  },
1061
1062
  contract_number_140a: {
1062
1063
  type: "string",
1063
1064
  name: "Contract Number 140a",
1064
- columnName: "contract_number_140a",
1065
- },
1066
- },
1065
+ columnName: "contract_number_140a"
1066
+ }
1067
+ }
1067
1068
  }];
1068
1069
 
1069
1070
  const result = await generateSchema(collections);
@@ -1086,10 +1087,10 @@ describe("generateDrizzleSchema columnName support", () => {
1086
1087
  properties: {
1087
1088
  productName: {
1088
1089
  type: "string",
1089
- name: "Product Name",
1090
+ name: "Product Name"
1090
1091
  // No columnName — should derive from key
1091
- },
1092
- },
1092
+ }
1093
+ }
1093
1094
  }];
1094
1095
 
1095
1096
  const result = await generateSchema(collections);
@@ -1109,14 +1110,14 @@ describe("generateDrizzleSchema columnName support", () => {
1109
1110
  fee_number_140a: {
1110
1111
  type: "string",
1111
1112
  name: "Fee Number",
1112
- columnName: "fee_number_140a",
1113
+ columnName: "fee_number_140a"
1113
1114
  },
1114
1115
  // Manually added: no columnName
1115
1116
  displayName: {
1116
1117
  type: "string",
1117
- name: "Display Name",
1118
- },
1119
- },
1118
+ name: "Display Name"
1119
+ }
1120
+ }
1120
1121
  }];
1121
1122
 
1122
1123
  const result = await generateSchema(collections);
@@ -1137,24 +1138,24 @@ describe("generateDrizzleSchema columnName support", () => {
1137
1138
  count_v2: {
1138
1139
  type: "number",
1139
1140
  name: "Count V2",
1140
- columnName: "count_v2",
1141
+ columnName: "count_v2"
1141
1142
  },
1142
1143
  is_active_v2: {
1143
1144
  type: "boolean",
1144
1145
  name: "Is Active V2",
1145
- columnName: "is_active_v2",
1146
+ columnName: "is_active_v2"
1146
1147
  },
1147
1148
  created_at_v2: {
1148
1149
  type: "date",
1149
1150
  name: "Created At V2",
1150
- columnName: "created_at_v2",
1151
+ columnName: "created_at_v2"
1151
1152
  },
1152
1153
  metadata_v2: {
1153
1154
  type: "map",
1154
1155
  name: "Metadata V2",
1155
- columnName: "metadata_v2",
1156
- },
1157
- },
1156
+ columnName: "metadata_v2"
1157
+ }
1158
+ }
1158
1159
  }];
1159
1160
 
1160
1161
  const result = await generateSchema(collections);
@@ -1173,20 +1174,44 @@ describe("generateDrizzleSchema columnName support", () => {
1173
1174
  table: "company_billing_config",
1174
1175
  name: "Company Billing Config",
1175
1176
  properties: {
1176
- employee_number_140a: { type: "string", name: "Employee Number", columnName: "employee_number_140a" },
1177
- contract_number_140a: { type: "string", name: "Contract Number", columnName: "contract_number_140a" },
1178
- amount: { type: "number", name: "Amount" },
1179
- id: { type: "number", name: "ID", isId: "increment" },
1180
- service_provider_140a: { type: "string", name: "Service Provider", columnName: "service_provider_140a" },
1181
- internal_area_code_140a: { type: "string", name: "Internal Area Code", columnName: "internal_area_code_140a" },
1182
- fee_number_140a: { type: "string", name: "Fee Number", columnName: "fee_number_140a" },
1183
- receiver_market_participant_140a: { type: "string", name: "Receiver Market Participant", columnName: "receiver_market_participant_140a" },
1184
- employee_value_number_140a: { type: "string", name: "Employee Value Number", columnName: "employee_value_number_140a" },
1185
- sender_market_participant_140a: { type: "string", name: "Sender Market Participant", columnName: "sender_market_participant_140a" },
1186
- processing_indicator_140a: { type: "string", name: "Processing Indicator", columnName: "processing_indicator_140a" },
1187
- insurance_id_140a: { type: "string", name: "Insurance ID", columnName: "insurance_id_140a" },
1188
- company_id: { type: "number", name: "Company ID" },
1189
- },
1177
+ employee_number_140a: { type: "string",
1178
+ name: "Employee Number",
1179
+ columnName: "employee_number_140a" },
1180
+ contract_number_140a: { type: "string",
1181
+ name: "Contract Number",
1182
+ columnName: "contract_number_140a" },
1183
+ amount: { type: "number",
1184
+ name: "Amount" },
1185
+ id: { type: "number",
1186
+ name: "ID",
1187
+ isId: "increment" },
1188
+ service_provider_140a: { type: "string",
1189
+ name: "Service Provider",
1190
+ columnName: "service_provider_140a" },
1191
+ internal_area_code_140a: { type: "string",
1192
+ name: "Internal Area Code",
1193
+ columnName: "internal_area_code_140a" },
1194
+ fee_number_140a: { type: "string",
1195
+ name: "Fee Number",
1196
+ columnName: "fee_number_140a" },
1197
+ receiver_market_participant_140a: { type: "string",
1198
+ name: "Receiver Market Participant",
1199
+ columnName: "receiver_market_participant_140a" },
1200
+ employee_value_number_140a: { type: "string",
1201
+ name: "Employee Value Number",
1202
+ columnName: "employee_value_number_140a" },
1203
+ sender_market_participant_140a: { type: "string",
1204
+ name: "Sender Market Participant",
1205
+ columnName: "sender_market_participant_140a" },
1206
+ processing_indicator_140a: { type: "string",
1207
+ name: "Processing Indicator",
1208
+ columnName: "processing_indicator_140a" },
1209
+ insurance_id_140a: { type: "string",
1210
+ name: "Insurance ID",
1211
+ columnName: "insurance_id_140a" },
1212
+ company_id: { type: "number",
1213
+ name: "Company ID" }
1214
+ }
1190
1215
  }];
1191
1216
 
1192
1217
  const result = await generateSchema(collections);