@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.
- package/dist/common/src/collections/default-collections.d.ts +12 -0
- package/dist/common/src/collections/index.d.ts +1 -0
- package/dist/common/src/data/query_builder.d.ts +51 -0
- package/dist/common/src/index.d.ts +1 -0
- package/dist/common/src/util/permissions.d.ts +1 -0
- package/dist/index.es.js +1202 -369
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +1200 -367
- package/dist/index.umd.js.map +1 -1
- package/dist/server-postgresql/src/PostgresBackendDriver.d.ts +1 -1
- package/dist/server-postgresql/src/PostgresBootstrapper.d.ts +1 -0
- package/dist/server-postgresql/src/auth/services.d.ts +43 -1
- package/dist/server-postgresql/src/connection.d.ts +25 -0
- package/dist/server-postgresql/src/schema/auth-schema.d.ts +2382 -35
- package/dist/server-postgresql/src/services/EntityFetchService.d.ts +4 -0
- package/dist/server-postgresql/src/services/entityService.d.ts +2 -0
- package/dist/server-postgresql/src/services/realtimeService.d.ts +20 -0
- package/dist/server-postgresql/src/utils/drizzle-conditions.d.ts +18 -0
- package/dist/types/src/controllers/auth.d.ts +2 -24
- package/dist/types/src/controllers/client.d.ts +0 -3
- package/dist/types/src/controllers/collection_registry.d.ts +1 -1
- package/dist/types/src/controllers/data.d.ts +21 -0
- package/dist/types/src/controllers/data_driver.d.ts +18 -0
- package/dist/types/src/controllers/registry.d.ts +5 -4
- package/dist/types/src/rebase_context.d.ts +1 -1
- package/dist/types/src/types/auth_adapter.d.ts +2 -4
- package/dist/types/src/types/collections.d.ts +0 -4
- package/dist/types/src/types/component_ref.d.ts +1 -1
- package/dist/types/src/types/cron.d.ts +1 -1
- package/dist/types/src/types/entity_views.d.ts +1 -0
- package/dist/types/src/types/export_import.d.ts +1 -1
- package/dist/types/src/types/formex.d.ts +2 -2
- package/dist/types/src/types/properties.d.ts +2 -2
- package/dist/types/src/types/translations.d.ts +28 -12
- package/dist/types/src/types/user_management_delegate.d.ts +6 -4
- package/dist/types/src/users/roles.d.ts +0 -8
- package/package.json +7 -6
- package/src/PostgresBackendDriver.ts +13 -7
- package/src/PostgresBootstrapper.ts +27 -8
- package/src/auth/ensure-tables.ts +79 -17
- package/src/auth/services.ts +292 -23
- package/src/cli.ts +5 -0
- package/src/connection.ts +77 -0
- package/src/data-transformer.ts +2 -2
- package/src/schema/auth-schema.ts +80 -14
- package/src/schema/default-collections.ts +1 -0
- package/src/schema/doctor.ts +82 -41
- package/src/schema/generate-drizzle-schema.ts +6 -6
- package/src/services/EntityFetchService.ts +69 -10
- package/src/services/entityService.ts +2 -0
- package/src/services/realtimeService.ts +214 -2
- package/src/utils/drizzle-conditions.ts +74 -2
- package/src/websocket.ts +10 -2
- package/test/auth-services.test.ts +15 -28
- package/test/drizzle-conditions.test.ts +168 -0
- package/test/postgresDataDriver.test.ts +130 -1
- package/vite.config.ts +1 -1
|
@@ -35,7 +35,12 @@ describe("PostgresBackendDriver", () => {
|
|
|
35
35
|
|
|
36
36
|
beforeEach(() => {
|
|
37
37
|
jest.clearAllMocks();
|
|
38
|
-
|
|
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
|
};
|