@rebasepro/server-postgresql 0.2.1 → 0.2.4

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 (57) hide show
  1. package/dist/common/src/collections/default-collections.d.ts +12 -0
  2. package/dist/common/src/collections/index.d.ts +1 -0
  3. package/dist/common/src/data/query_builder.d.ts +51 -0
  4. package/dist/common/src/index.d.ts +1 -0
  5. package/dist/common/src/util/permissions.d.ts +1 -0
  6. package/dist/index.es.js +1202 -369
  7. package/dist/index.es.js.map +1 -1
  8. package/dist/index.umd.js +1200 -367
  9. package/dist/index.umd.js.map +1 -1
  10. package/dist/server-postgresql/src/PostgresBackendDriver.d.ts +1 -1
  11. package/dist/server-postgresql/src/PostgresBootstrapper.d.ts +1 -0
  12. package/dist/server-postgresql/src/auth/services.d.ts +43 -1
  13. package/dist/server-postgresql/src/connection.d.ts +25 -0
  14. package/dist/server-postgresql/src/schema/auth-schema.d.ts +2382 -35
  15. package/dist/server-postgresql/src/services/EntityFetchService.d.ts +4 -0
  16. package/dist/server-postgresql/src/services/entityService.d.ts +2 -0
  17. package/dist/server-postgresql/src/services/realtimeService.d.ts +20 -0
  18. package/dist/server-postgresql/src/utils/drizzle-conditions.d.ts +18 -0
  19. package/dist/types/src/controllers/auth.d.ts +2 -24
  20. package/dist/types/src/controllers/client.d.ts +0 -3
  21. package/dist/types/src/controllers/collection_registry.d.ts +1 -1
  22. package/dist/types/src/controllers/data.d.ts +21 -0
  23. package/dist/types/src/controllers/data_driver.d.ts +18 -0
  24. package/dist/types/src/controllers/registry.d.ts +5 -4
  25. package/dist/types/src/rebase_context.d.ts +1 -1
  26. package/dist/types/src/types/auth_adapter.d.ts +2 -4
  27. package/dist/types/src/types/collections.d.ts +0 -4
  28. package/dist/types/src/types/component_ref.d.ts +1 -1
  29. package/dist/types/src/types/cron.d.ts +1 -1
  30. package/dist/types/src/types/entity_views.d.ts +1 -0
  31. package/dist/types/src/types/export_import.d.ts +1 -1
  32. package/dist/types/src/types/formex.d.ts +2 -2
  33. package/dist/types/src/types/properties.d.ts +2 -2
  34. package/dist/types/src/types/translations.d.ts +28 -12
  35. package/dist/types/src/types/user_management_delegate.d.ts +6 -4
  36. package/dist/types/src/users/roles.d.ts +0 -8
  37. package/package.json +7 -6
  38. package/src/PostgresBackendDriver.ts +13 -7
  39. package/src/PostgresBootstrapper.ts +27 -8
  40. package/src/auth/ensure-tables.ts +79 -17
  41. package/src/auth/services.ts +292 -23
  42. package/src/cli.ts +5 -0
  43. package/src/connection.ts +77 -0
  44. package/src/data-transformer.ts +2 -2
  45. package/src/schema/auth-schema.ts +80 -14
  46. package/src/schema/default-collections.ts +1 -0
  47. package/src/schema/doctor.ts +82 -41
  48. package/src/schema/generate-drizzle-schema.ts +6 -6
  49. package/src/services/EntityFetchService.ts +69 -10
  50. package/src/services/entityService.ts +2 -0
  51. package/src/services/realtimeService.ts +214 -2
  52. package/src/utils/drizzle-conditions.ts +74 -2
  53. package/src/websocket.ts +10 -2
  54. package/test/auth-services.test.ts +15 -28
  55. package/test/drizzle-conditions.test.ts +168 -0
  56. package/test/postgresDataDriver.test.ts +130 -1
  57. package/vite.config.ts +1 -1
@@ -35,7 +35,12 @@ describe("PostgresBackendDriver", () => {
35
35
 
36
36
  beforeEach(() => {
37
37
  jest.clearAllMocks();
38
- delegate = new PostgresBackendDriver(mockDb, mockRealtimeService);
38
+ const mockRegistry = {
39
+ getCollectionByPath: jest.fn().mockReturnValue({ slug: "test_coll", properties: {} }),
40
+ getCollections: jest.fn().mockReturnValue([]),
41
+ getTable: jest.fn().mockReturnValue({})
42
+ } as any;
43
+ delegate = new PostgresBackendDriver(mockDb, mockRealtimeService, mockRegistry);
39
44
  });
40
45
 
41
46
  it("should initialize correctly", () => {
@@ -661,5 +666,129 @@ status: "new" });
661
666
  executeSqlSpy.mockRestore();
662
667
  });
663
668
  });
669
+
670
+ describe("storageSource in Callbacks", () => {
671
+ it("should inject storageSource: client.storage into contextForCallback in fetchCollection", async () => {
672
+ const mockStorage = { key: "mockStorage" };
673
+ delegate.client = {
674
+ storage: mockStorage
675
+ } as any;
676
+
677
+ const afterReadSpy = jest.fn().mockImplementation(async ({ entity }) => entity);
678
+ const mockCollectionWithCallback = {
679
+ slug: "test_coll",
680
+ callbacks: {
681
+ afterRead: afterReadSpy
682
+ }
683
+ } as any;
684
+
685
+ jest.spyOn(delegate.entityService, "fetchCollection").mockResolvedValueOnce([
686
+ { id: "e1", path: "test_coll", values: {} } as any
687
+ ]);
688
+
689
+ await delegate.fetchCollection({
690
+ path: "test_coll",
691
+ collection: mockCollectionWithCallback
692
+ });
693
+
694
+ expect(afterReadSpy).toHaveBeenCalled();
695
+ const callArgs = afterReadSpy.mock.calls[0][0];
696
+ expect(callArgs.context).toBeDefined();
697
+ expect(callArgs.context.storageSource).toBe(mockStorage);
698
+ });
699
+
700
+ it("should inject storageSource in fetchEntity", async () => {
701
+ const mockStorage = { key: "mockStorage" };
702
+ delegate.client = {
703
+ storage: mockStorage
704
+ } as any;
705
+
706
+ const afterReadSpy = jest.fn().mockImplementation(async ({ entity }) => entity);
707
+ const mockCollectionWithCallback = {
708
+ slug: "test_coll",
709
+ callbacks: {
710
+ afterRead: afterReadSpy
711
+ }
712
+ } as any;
713
+
714
+ jest.spyOn(delegate.entityService, "fetchEntity").mockResolvedValueOnce(
715
+ { id: "e1", path: "test_coll", values: {} } as any
716
+ );
717
+
718
+ await delegate.fetchEntity({
719
+ path: "test_coll",
720
+ entityId: "e1",
721
+ collection: mockCollectionWithCallback
722
+ });
723
+
724
+ expect(afterReadSpy).toHaveBeenCalled();
725
+ const callArgs = afterReadSpy.mock.calls[0][0];
726
+ expect(callArgs.context.storageSource).toBe(mockStorage);
727
+ });
728
+
729
+ it("should inject storageSource in saveEntity beforeSave and afterSave", async () => {
730
+ const mockStorage = { key: "mockStorage" };
731
+ delegate.client = {
732
+ storage: mockStorage
733
+ } as any;
734
+
735
+ const beforeSaveSpy = jest.fn().mockImplementation(async ({ values }) => values);
736
+ const afterSaveSpy = jest.fn();
737
+ const mockCollectionWithCallback = {
738
+ slug: "test_coll",
739
+ callbacks: {
740
+ beforeSave: beforeSaveSpy,
741
+ afterSave: afterSaveSpy
742
+ }
743
+ } as any;
744
+
745
+ jest.spyOn(delegate.entityService, "fetchEntity").mockResolvedValue(undefined);
746
+ jest.spyOn(delegate.entityService, "saveEntity").mockResolvedValueOnce(
747
+ { id: "e1", path: "test_coll", values: { name: "test" } } as any
748
+ );
749
+
750
+ await delegate.saveEntity({
751
+ path: "test_coll",
752
+ entityId: "e1",
753
+ values: { name: "test" },
754
+ collection: mockCollectionWithCallback,
755
+ status: "existing"
756
+ });
757
+
758
+ expect(beforeSaveSpy).toHaveBeenCalled();
759
+ expect(beforeSaveSpy.mock.calls[0][0].context.storageSource).toBe(mockStorage);
760
+ expect(afterSaveSpy).toHaveBeenCalled();
761
+ expect(afterSaveSpy.mock.calls[0][0].context.storageSource).toBe(mockStorage);
762
+ });
763
+
764
+ it("should inject storageSource in deleteEntity beforeDelete and afterDelete", async () => {
765
+ const mockStorage = { key: "mockStorage" };
766
+ delegate.client = {
767
+ storage: mockStorage
768
+ } as any;
769
+
770
+ const beforeDeleteSpy = jest.fn().mockImplementation(async () => true);
771
+ const afterDeleteSpy = jest.fn();
772
+ const mockCollectionWithCallback = {
773
+ slug: "test_coll",
774
+ callbacks: {
775
+ beforeDelete: beforeDeleteSpy,
776
+ afterDelete: afterDeleteSpy
777
+ }
778
+ } as any;
779
+
780
+ jest.spyOn(delegate.entityService, "deleteEntity").mockResolvedValueOnce();
781
+
782
+ await delegate.deleteEntity({
783
+ entity: { id: "e1", path: "test_coll", values: {} } as any,
784
+ collection: mockCollectionWithCallback
785
+ });
786
+
787
+ expect(beforeDeleteSpy).toHaveBeenCalled();
788
+ expect(beforeDeleteSpy.mock.calls[0][0].context.storageSource).toBe(mockStorage);
789
+ expect(afterDeleteSpy).toHaveBeenCalled();
790
+ expect(afterDeleteSpy.mock.calls[0][0].context.storageSource).toBe(mockStorage);
791
+ });
792
+ });
664
793
  });
665
794
 
package/vite.config.ts CHANGED
@@ -33,7 +33,7 @@ const isExternal = (id: string) => {
33
33
  // Externalize only deps the consumer app explicitly installs
34
34
  if (CONSUMER_EXTERNALS.some(ext => id === ext || id.startsWith(ext + "/"))) return true;
35
35
  // Externalize Node built-ins
36
- if (["fs", "path", "url", "util", "crypto", "http", "https", "net", "tls", "stream", "events", "os", "child_process", "buffer", "assert", "node:"].some(b => id === b || id.startsWith("node:") || id.startsWith(b + "/"))) return true;
36
+ if (["fs", "path", "url", "util", "crypto", "http", "https", "net", "tls", "stream", "events", "os", "child_process", "buffer", "assert", "dns", "zlib", "querystring", "node:"].some(b => id === b || id.startsWith("node:") || id.startsWith(b + "/"))) return true;
37
37
  // Inline everything else (jsonwebtoken, ws, zod, etc.)
38
38
  return false;
39
39
  };