@rebasepro/server-postgresql 0.0.1-canary.09e5ec5

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 (196) hide show
  1. package/LICENSE +6 -0
  2. package/README.md +106 -0
  3. package/build-errors.txt +37 -0
  4. package/dist/common/src/collections/CollectionRegistry.d.ts +56 -0
  5. package/dist/common/src/collections/index.d.ts +1 -0
  6. package/dist/common/src/data/buildRebaseData.d.ts +14 -0
  7. package/dist/common/src/index.d.ts +3 -0
  8. package/dist/common/src/util/builders.d.ts +57 -0
  9. package/dist/common/src/util/callbacks.d.ts +6 -0
  10. package/dist/common/src/util/collections.d.ts +11 -0
  11. package/dist/common/src/util/common.d.ts +2 -0
  12. package/dist/common/src/util/conditions.d.ts +26 -0
  13. package/dist/common/src/util/entities.d.ts +58 -0
  14. package/dist/common/src/util/enums.d.ts +3 -0
  15. package/dist/common/src/util/index.d.ts +16 -0
  16. package/dist/common/src/util/navigation_from_path.d.ts +34 -0
  17. package/dist/common/src/util/navigation_utils.d.ts +20 -0
  18. package/dist/common/src/util/parent_references_from_path.d.ts +6 -0
  19. package/dist/common/src/util/paths.d.ts +14 -0
  20. package/dist/common/src/util/permissions.d.ts +5 -0
  21. package/dist/common/src/util/references.d.ts +2 -0
  22. package/dist/common/src/util/relations.d.ts +22 -0
  23. package/dist/common/src/util/resolutions.d.ts +72 -0
  24. package/dist/common/src/util/storage.d.ts +24 -0
  25. package/dist/index.es.js +11298 -0
  26. package/dist/index.es.js.map +1 -0
  27. package/dist/index.umd.js +11306 -0
  28. package/dist/index.umd.js.map +1 -0
  29. package/dist/server-postgresql/src/PostgresBackendDriver.d.ts +100 -0
  30. package/dist/server-postgresql/src/PostgresBootstrapper.d.ts +40 -0
  31. package/dist/server-postgresql/src/auth/ensure-tables.d.ts +6 -0
  32. package/dist/server-postgresql/src/auth/services.d.ts +192 -0
  33. package/dist/server-postgresql/src/cli.d.ts +1 -0
  34. package/dist/server-postgresql/src/collections/PostgresCollectionRegistry.d.ts +43 -0
  35. package/dist/server-postgresql/src/connection.d.ts +40 -0
  36. package/dist/server-postgresql/src/data-transformer.d.ts +58 -0
  37. package/dist/server-postgresql/src/databasePoolManager.d.ts +20 -0
  38. package/dist/server-postgresql/src/history/HistoryService.d.ts +71 -0
  39. package/dist/server-postgresql/src/history/ensure-history-table.d.ts +7 -0
  40. package/dist/server-postgresql/src/index.d.ts +13 -0
  41. package/dist/server-postgresql/src/interfaces.d.ts +18 -0
  42. package/dist/server-postgresql/src/schema/auth-schema.d.ts +868 -0
  43. package/dist/server-postgresql/src/schema/doctor-cli.d.ts +2 -0
  44. package/dist/server-postgresql/src/schema/doctor.d.ts +43 -0
  45. package/dist/server-postgresql/src/schema/generate-drizzle-schema-logic.d.ts +2 -0
  46. package/dist/server-postgresql/src/schema/generate-drizzle-schema.d.ts +1 -0
  47. package/dist/server-postgresql/src/schema/introspect-db-logic.d.ts +82 -0
  48. package/dist/server-postgresql/src/schema/introspect-db.d.ts +1 -0
  49. package/dist/server-postgresql/src/schema/test-schema.d.ts +24 -0
  50. package/dist/server-postgresql/src/services/BranchService.d.ts +47 -0
  51. package/dist/server-postgresql/src/services/EntityFetchService.d.ts +209 -0
  52. package/dist/server-postgresql/src/services/EntityPersistService.d.ts +41 -0
  53. package/dist/server-postgresql/src/services/RelationService.d.ts +98 -0
  54. package/dist/server-postgresql/src/services/entity-helpers.d.ts +38 -0
  55. package/dist/server-postgresql/src/services/entityService.d.ts +104 -0
  56. package/dist/server-postgresql/src/services/index.d.ts +4 -0
  57. package/dist/server-postgresql/src/services/realtimeService.d.ts +188 -0
  58. package/dist/server-postgresql/src/utils/drizzle-conditions.d.ts +116 -0
  59. package/dist/server-postgresql/src/websocket.d.ts +5 -0
  60. package/dist/types/src/controllers/analytics_controller.d.ts +7 -0
  61. package/dist/types/src/controllers/auth.d.ts +119 -0
  62. package/dist/types/src/controllers/client.d.ts +170 -0
  63. package/dist/types/src/controllers/collection_registry.d.ts +45 -0
  64. package/dist/types/src/controllers/customization_controller.d.ts +60 -0
  65. package/dist/types/src/controllers/data.d.ts +168 -0
  66. package/dist/types/src/controllers/data_driver.d.ts +160 -0
  67. package/dist/types/src/controllers/database_admin.d.ts +11 -0
  68. package/dist/types/src/controllers/dialogs_controller.d.ts +36 -0
  69. package/dist/types/src/controllers/effective_role.d.ts +4 -0
  70. package/dist/types/src/controllers/email.d.ts +34 -0
  71. package/dist/types/src/controllers/index.d.ts +18 -0
  72. package/dist/types/src/controllers/local_config_persistence.d.ts +20 -0
  73. package/dist/types/src/controllers/navigation.d.ts +213 -0
  74. package/dist/types/src/controllers/registry.d.ts +54 -0
  75. package/dist/types/src/controllers/side_dialogs_controller.d.ts +67 -0
  76. package/dist/types/src/controllers/side_entity_controller.d.ts +90 -0
  77. package/dist/types/src/controllers/snackbar.d.ts +24 -0
  78. package/dist/types/src/controllers/storage.d.ts +171 -0
  79. package/dist/types/src/index.d.ts +4 -0
  80. package/dist/types/src/rebase_context.d.ts +105 -0
  81. package/dist/types/src/types/backend.d.ts +536 -0
  82. package/dist/types/src/types/builders.d.ts +15 -0
  83. package/dist/types/src/types/chips.d.ts +5 -0
  84. package/dist/types/src/types/collections.d.ts +856 -0
  85. package/dist/types/src/types/cron.d.ts +102 -0
  86. package/dist/types/src/types/data_source.d.ts +64 -0
  87. package/dist/types/src/types/entities.d.ts +145 -0
  88. package/dist/types/src/types/entity_actions.d.ts +98 -0
  89. package/dist/types/src/types/entity_callbacks.d.ts +173 -0
  90. package/dist/types/src/types/entity_link_builder.d.ts +7 -0
  91. package/dist/types/src/types/entity_overrides.d.ts +10 -0
  92. package/dist/types/src/types/entity_views.d.ts +61 -0
  93. package/dist/types/src/types/export_import.d.ts +21 -0
  94. package/dist/types/src/types/index.d.ts +23 -0
  95. package/dist/types/src/types/locales.d.ts +4 -0
  96. package/dist/types/src/types/modify_collections.d.ts +5 -0
  97. package/dist/types/src/types/plugins.d.ts +279 -0
  98. package/dist/types/src/types/properties.d.ts +1176 -0
  99. package/dist/types/src/types/property_config.d.ts +70 -0
  100. package/dist/types/src/types/relations.d.ts +336 -0
  101. package/dist/types/src/types/slots.d.ts +252 -0
  102. package/dist/types/src/types/translations.d.ts +870 -0
  103. package/dist/types/src/types/user_management_delegate.d.ts +121 -0
  104. package/dist/types/src/types/websockets.d.ts +78 -0
  105. package/dist/types/src/users/index.d.ts +2 -0
  106. package/dist/types/src/users/roles.d.ts +22 -0
  107. package/dist/types/src/users/user.d.ts +46 -0
  108. package/drizzle-test/0000_woozy_junta.sql +6 -0
  109. package/drizzle-test/0001_youthful_arachne.sql +1 -0
  110. package/drizzle-test/0002_lively_dragon_lord.sql +2 -0
  111. package/drizzle-test/0003_mean_king_cobra.sql +2 -0
  112. package/drizzle-test/meta/0000_snapshot.json +47 -0
  113. package/drizzle-test/meta/0001_snapshot.json +48 -0
  114. package/drizzle-test/meta/0002_snapshot.json +38 -0
  115. package/drizzle-test/meta/0003_snapshot.json +48 -0
  116. package/drizzle-test/meta/_journal.json +34 -0
  117. package/drizzle-test-out/0000_tan_trauma.sql +6 -0
  118. package/drizzle-test-out/0001_rapid_drax.sql +1 -0
  119. package/drizzle-test-out/meta/0000_snapshot.json +44 -0
  120. package/drizzle-test-out/meta/0001_snapshot.json +54 -0
  121. package/drizzle-test-out/meta/_journal.json +20 -0
  122. package/drizzle.test.config.ts +10 -0
  123. package/jest-all.log +3128 -0
  124. package/jest.log +49 -0
  125. package/package.json +92 -0
  126. package/scratch.ts +41 -0
  127. package/src/PostgresBackendDriver.ts +1008 -0
  128. package/src/PostgresBootstrapper.ts +231 -0
  129. package/src/auth/ensure-tables.ts +381 -0
  130. package/src/auth/services.ts +799 -0
  131. package/src/cli.ts +648 -0
  132. package/src/collections/PostgresCollectionRegistry.ts +96 -0
  133. package/src/connection.ts +84 -0
  134. package/src/data-transformer.ts +608 -0
  135. package/src/databasePoolManager.ts +85 -0
  136. package/src/history/HistoryService.ts +248 -0
  137. package/src/history/ensure-history-table.ts +45 -0
  138. package/src/index.ts +13 -0
  139. package/src/interfaces.ts +60 -0
  140. package/src/schema/auth-schema.ts +169 -0
  141. package/src/schema/doctor-cli.ts +47 -0
  142. package/src/schema/doctor.ts +595 -0
  143. package/src/schema/generate-drizzle-schema-logic.ts +765 -0
  144. package/src/schema/generate-drizzle-schema.ts +151 -0
  145. package/src/schema/introspect-db-logic.ts +542 -0
  146. package/src/schema/introspect-db.ts +211 -0
  147. package/src/schema/test-schema.ts +11 -0
  148. package/src/services/BranchService.ts +237 -0
  149. package/src/services/EntityFetchService.ts +1576 -0
  150. package/src/services/EntityPersistService.ts +349 -0
  151. package/src/services/RelationService.ts +1274 -0
  152. package/src/services/entity-helpers.ts +147 -0
  153. package/src/services/entityService.ts +211 -0
  154. package/src/services/index.ts +13 -0
  155. package/src/services/realtimeService.ts +1034 -0
  156. package/src/utils/drizzle-conditions.ts +1000 -0
  157. package/src/websocket.ts +518 -0
  158. package/test/auth-services.test.ts +661 -0
  159. package/test/batch-many-to-many-regression.test.ts +573 -0
  160. package/test/branchService.test.ts +367 -0
  161. package/test/data-transformer-hardening.test.ts +417 -0
  162. package/test/data-transformer.test.ts +175 -0
  163. package/test/doctor.test.ts +182 -0
  164. package/test/drizzle-conditions.test.ts +895 -0
  165. package/test/entityService.errors.test.ts +367 -0
  166. package/test/entityService.relations.test.ts +1008 -0
  167. package/test/entityService.subcollection-search.test.ts +566 -0
  168. package/test/entityService.test.ts +1035 -0
  169. package/test/generate-drizzle-schema.test.ts +988 -0
  170. package/test/historyService.test.ts +141 -0
  171. package/test/introspect-db-generation.test.ts +436 -0
  172. package/test/introspect-db-utils.test.ts +389 -0
  173. package/test/n-plus-one-regression.test.ts +314 -0
  174. package/test/postgresDataDriver.test.ts +648 -0
  175. package/test/realtimeService.test.ts +307 -0
  176. package/test/relation-pipeline-gaps.test.ts +637 -0
  177. package/test/relations.test.ts +1115 -0
  178. package/test/unmapped-tables-safety.test.ts +345 -0
  179. package/test-drizzle-bug.ts +18 -0
  180. package/test-drizzle-out/0000_cultured_freak.sql +7 -0
  181. package/test-drizzle-out/0001_tiresome_professor_monster.sql +1 -0
  182. package/test-drizzle-out/meta/0000_snapshot.json +55 -0
  183. package/test-drizzle-out/meta/0001_snapshot.json +63 -0
  184. package/test-drizzle-out/meta/_journal.json +20 -0
  185. package/test-drizzle-prompt.sh +2 -0
  186. package/test-policy-prompt.sh +3 -0
  187. package/test-programmatic.ts +30 -0
  188. package/test-programmatic2.ts +59 -0
  189. package/test-schema-no-policies.ts +12 -0
  190. package/test_drizzle_mock.js +3 -0
  191. package/test_find_changed.mjs +32 -0
  192. package/test_hash.js +14 -0
  193. package/test_output.txt +3145 -0
  194. package/tsconfig.json +49 -0
  195. package/tsconfig.prod.json +20 -0
  196. package/vite.config.ts +82 -0
@@ -0,0 +1,182 @@
1
+ import { EntityCollection, StringProperty, NumberProperty, DateProperty, ArrayProperty, Property } from "@rebasepro/types";
2
+ import { generateSchema } from "../src/schema/generate-drizzle-schema-logic";
3
+ import { checkCollectionsVsSchema, getExpectedColumnType } from "../src/schema/doctor";
4
+ import * as fs from "fs";
5
+ import * as path from "path";
6
+ import { tmpdir } from "os";
7
+
8
+ // Re-export for testing — we need to access the internal helper
9
+ // but since it's not exported, we test it indirectly via checkCollectionsVsSchema
10
+
11
+ describe("Rebase Schema Doctor", () => {
12
+
13
+ describe("checkCollectionsVsSchema", () => {
14
+ const createTempSchemaFile = async (content: string): Promise<string> => {
15
+ const dir = fs.mkdtempSync(path.join(tmpdir(), "doctor-test-"));
16
+ const filePath = path.join(dir, "schema.generated.ts");
17
+ fs.writeFileSync(filePath, content, "utf-8");
18
+ return filePath;
19
+ };
20
+
21
+ it("should detect missing schema file", async () => {
22
+ const collections: EntityCollection[] = [{
23
+ slug: "products",
24
+ table: "products",
25
+ name: "Products",
26
+ properties: { name: { type: "string" } }
27
+ }];
28
+
29
+ const result = await checkCollectionsVsSchema(collections, "/nonexistent/path/schema.generated.ts");
30
+ expect(result.passed).toBe(false);
31
+ expect(result.issues).toHaveLength(1);
32
+ expect(result.issues[0].category).toBe("schema_stale");
33
+ expect(result.issues[0].severity).toBe("error");
34
+ });
35
+
36
+ it("should pass when schema matches collections", async () => {
37
+ const collections: EntityCollection[] = [{
38
+ slug: "products",
39
+ table: "products",
40
+ name: "Products",
41
+ properties: {
42
+ name: { type: "string" },
43
+ price: { type: "number" }
44
+ }
45
+ }];
46
+
47
+ // Generate the expected schema and write to temp file
48
+ const expectedSchema = await generateSchema(collections);
49
+ const schemaPath = await createTempSchemaFile(expectedSchema);
50
+
51
+ try {
52
+ const result = await checkCollectionsVsSchema(collections, schemaPath);
53
+ expect(result.passed).toBe(true);
54
+ expect(result.issues).toHaveLength(0);
55
+ } finally {
56
+ fs.rmSync(path.dirname(schemaPath), { recursive: true });
57
+ }
58
+ });
59
+
60
+ it("should detect stale schema when collections have changed", async () => {
61
+ const originalCollections: EntityCollection[] = [{
62
+ slug: "products",
63
+ table: "products",
64
+ name: "Products",
65
+ properties: { name: { type: "string" } }
66
+ }];
67
+
68
+ const updatedCollections: EntityCollection[] = [{
69
+ slug: "products",
70
+ table: "products",
71
+ name: "Products",
72
+ properties: {
73
+ name: { type: "string" },
74
+ price: { type: "number" } // New field added
75
+ }
76
+ }];
77
+
78
+ // Write schema for original, check against updated
79
+ const originalSchema = await generateSchema(originalCollections);
80
+ const schemaPath = await createTempSchemaFile(originalSchema);
81
+
82
+ try {
83
+ const result = await checkCollectionsVsSchema(updatedCollections, schemaPath);
84
+ expect(result.passed).toBe(false);
85
+ expect(result.issues.some(i => i.category === "schema_stale")).toBe(true);
86
+ } finally {
87
+ fs.rmSync(path.dirname(schemaPath), { recursive: true });
88
+ }
89
+ });
90
+
91
+ it("should return error for nonexistent schema file even with empty collections", async () => {
92
+ const result = await checkCollectionsVsSchema([], "/nonexistent/path");
93
+ // Schema file doesn't exist → error regardless of collection count
94
+ expect(result.passed).toBe(false);
95
+ expect(result.issues[0].category).toBe("schema_stale");
96
+ });
97
+ });
98
+
99
+ describe("column type mapping", () => {
100
+ // We test getExpectedColumnType indirectly through import
101
+ // These are integration-style tests against the mapping logic
102
+
103
+ it("should map string types correctly", () => {
104
+ expect(getExpectedColumnType({ type: "string" })).toBe("character varying");
105
+ expect(getExpectedColumnType({ type: "string",
106
+ columnType: "text" } as StringProperty)).toBe("text");
107
+ expect(getExpectedColumnType({ type: "string",
108
+ columnType: "char" } as StringProperty)).toBe("character");
109
+ });
110
+
111
+ it("should map number types correctly", () => {
112
+ expect(getExpectedColumnType({ type: "number" })).toBe("numeric");
113
+ expect(getExpectedColumnType({ type: "number",
114
+ validation: { integer: true } } as NumberProperty)).toBe("integer");
115
+ expect(getExpectedColumnType({ type: "number",
116
+ columnType: "real" } as NumberProperty)).toBe("real");
117
+ expect(getExpectedColumnType({ type: "number",
118
+ columnType: "double precision" } as NumberProperty)).toBe("double precision");
119
+ expect(getExpectedColumnType({ type: "number",
120
+ columnType: "bigint" } as NumberProperty)).toBe("bigint");
121
+ });
122
+
123
+ it("should map boolean type correctly", () => {
124
+ expect(getExpectedColumnType({ type: "boolean" })).toBe("boolean");
125
+ });
126
+
127
+ it("should map date types correctly", () => {
128
+ expect(getExpectedColumnType({ type: "date" })).toBe("timestamp with time zone");
129
+ expect(getExpectedColumnType({ type: "date",
130
+ columnType: "date" } as DateProperty)).toBe("date");
131
+ expect(getExpectedColumnType({ type: "date",
132
+ columnType: "time" } as DateProperty)).toBe("time without time zone");
133
+ });
134
+
135
+ it("should map json types correctly", () => {
136
+ expect(getExpectedColumnType({ type: "map" })).toBe("jsonb");
137
+ expect(getExpectedColumnType({ type: "array" })).toBe("jsonb");
138
+ expect(getExpectedColumnType({ type: "array",
139
+ columnType: "json" } as ArrayProperty)).toBe("json");
140
+ });
141
+
142
+ it("should map enum string to USER-DEFINED", () => {
143
+ expect(getExpectedColumnType({
144
+ type: "string",
145
+ enum: { active: "Active",
146
+ inactive: "Inactive" }
147
+ } as StringProperty)).toBe("USER-DEFINED");
148
+ });
149
+
150
+ it("should return null for relation type", () => {
151
+ expect(getExpectedColumnType({ type: "relation" } as Property)).toBe(null);
152
+ });
153
+ });
154
+
155
+ describe("report generation", () => {
156
+ it("should correctly count errors and warnings in summary", () => {
157
+ const issues = [
158
+ { severity: "error" as const,
159
+ category: "missing_table" as const,
160
+ table: "t1",
161
+ message: "m",
162
+ fix: "f" },
163
+ { severity: "warning" as const,
164
+ category: "type_mismatch" as const,
165
+ table: "t2",
166
+ message: "m",
167
+ fix: "f" },
168
+ { severity: "error" as const,
169
+ category: "missing_column" as const,
170
+ table: "t3",
171
+ message: "m",
172
+ fix: "f" }
173
+ ];
174
+
175
+ const errors = issues.filter(i => i.severity === "error").length;
176
+ const warnings = issues.filter(i => i.severity === "warning").length;
177
+
178
+ expect(errors).toBe(2);
179
+ expect(warnings).toBe(1);
180
+ });
181
+ });
182
+ });