prostgles-server 2.0.176 → 2.0.179

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 (100) hide show
  1. package/dist/AuthHandler.d.ts +4 -4
  2. package/dist/AuthHandler.d.ts.map +1 -1
  3. package/dist/DBSchemaBuilder.d.ts +6 -6
  4. package/dist/DBSchemaBuilder.d.ts.map +1 -1
  5. package/dist/DBSchemaBuilder.js +51 -7
  6. package/dist/DBSchemaBuilder.js.map +1 -1
  7. package/dist/DboBuilder.d.ts +20 -21
  8. package/dist/DboBuilder.d.ts.map +1 -1
  9. package/dist/DboBuilder.js +2 -2
  10. package/dist/DboBuilder.js.map +1 -1
  11. package/dist/Prostgles.d.ts +8 -10
  12. package/dist/Prostgles.d.ts.map +1 -1
  13. package/dist/Prostgles.js.map +1 -1
  14. package/dist/PublishParser.d.ts +37 -37
  15. package/dist/PublishParser.d.ts.map +1 -1
  16. package/dist/PublishParser.js.map +1 -1
  17. package/dist/index.d.ts +2 -3
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js.map +1 -1
  20. package/lib/AuthHandler.d.ts +148 -0
  21. package/lib/AuthHandler.d.ts.map +1 -0
  22. package/lib/AuthHandler.js +411 -0
  23. package/lib/AuthHandler.ts +3 -3
  24. package/lib/DBEventsManager.d.ts +38 -0
  25. package/lib/DBEventsManager.d.ts.map +1 -0
  26. package/lib/DBEventsManager.js +136 -0
  27. package/lib/DBSchemaBuilder.d.ts +11 -0
  28. package/lib/DBSchemaBuilder.d.ts.map +1 -0
  29. package/lib/DBSchemaBuilder.js +102 -0
  30. package/lib/DBSchemaBuilder.ts +91 -23
  31. package/lib/DboBuilder.d.ts +428 -0
  32. package/lib/DboBuilder.d.ts.map +1 -0
  33. package/lib/DboBuilder.js +3078 -0
  34. package/lib/DboBuilder.ts +29 -29
  35. package/lib/FileManager.d.ts +168 -0
  36. package/lib/FileManager.d.ts.map +1 -0
  37. package/lib/FileManager.js +474 -0
  38. package/lib/Filtering.d.ts +15 -0
  39. package/lib/Filtering.d.ts.map +1 -0
  40. package/lib/Filtering.js +299 -0
  41. package/lib/PostgresNotifListenManager.d.ts +27 -0
  42. package/lib/PostgresNotifListenManager.d.ts.map +1 -0
  43. package/lib/PostgresNotifListenManager.js +122 -0
  44. package/lib/Prostgles.d.ts +193 -0
  45. package/lib/Prostgles.d.ts.map +1 -0
  46. package/lib/Prostgles.js +579 -0
  47. package/lib/Prostgles.ts +6 -6
  48. package/lib/PubSubManager.d.ts +157 -0
  49. package/lib/PubSubManager.d.ts.map +1 -0
  50. package/lib/PubSubManager.js +1400 -0
  51. package/lib/PublishParser.d.ts +262 -0
  52. package/lib/PublishParser.d.ts.map +1 -0
  53. package/lib/PublishParser.js +390 -0
  54. package/lib/PublishParser.ts +39 -38
  55. package/lib/QueryBuilder.d.ts +124 -0
  56. package/lib/QueryBuilder.d.ts.map +1 -0
  57. package/lib/QueryBuilder.js +1349 -0
  58. package/lib/SyncReplication.d.ts +34 -0
  59. package/lib/SyncReplication.d.ts.map +1 -0
  60. package/lib/SyncReplication.js +411 -0
  61. package/lib/TableConfig.d.ts +175 -0
  62. package/lib/TableConfig.d.ts.map +1 -0
  63. package/lib/TableConfig.js +231 -0
  64. package/lib/index.d.ts +10 -0
  65. package/lib/index.d.ts.map +1 -0
  66. package/lib/index.js +45 -0
  67. package/lib/index.ts +3 -4
  68. package/lib/shortestPath.d.ts +10 -0
  69. package/lib/shortestPath.d.ts.map +1 -0
  70. package/lib/shortestPath.js +111 -0
  71. package/lib/utils.d.ts +2 -0
  72. package/lib/utils.d.ts.map +1 -0
  73. package/lib/utils.js +5 -0
  74. package/package.json +3 -3
  75. package/tests/client/PID.txt +1 -1
  76. package/tests/client/index.d.ts +1 -1
  77. package/tests/client/index.d.ts.map +1 -1
  78. package/tests/client/tsconfig.json +1 -0
  79. package/tests/client_only_queries.d.ts +4 -0
  80. package/tests/client_only_queries.d.ts.map +1 -0
  81. package/tests/isomorphic_queries.d.ts +6 -0
  82. package/tests/isomorphic_queries.d.ts.map +1 -0
  83. package/tests/isomorphic_queries.ts +1 -1
  84. package/tests/server/DBoGenerated.d.ts +97 -196
  85. package/tests/server/dboTypeCheck.d.ts +2 -0
  86. package/tests/server/dboTypeCheck.d.ts.map +1 -0
  87. package/tests/server/dboTypeCheck.js +14 -0
  88. package/tests/server/dboTypeCheck.ts +17 -0
  89. package/tests/server/index.d.ts +2 -0
  90. package/tests/server/index.d.ts.map +1 -0
  91. package/tests/server/index.js +11 -11
  92. package/tests/server/index.ts +23 -16
  93. package/tests/server/package-lock.json +5 -5
  94. package/tests/server/publishTypeCheck.d.ts +2 -0
  95. package/tests/server/publishTypeCheck.d.ts.map +1 -0
  96. package/tests/server/publishTypeCheck.js +120 -0
  97. package/tests/server/publishTypeCheck.ts +129 -0
  98. package/tests/server/tsconfig.json +5 -5
  99. package/tests/server_only_queries.d.ts +2 -0
  100. package/tests/server_only_queries.d.ts.map +1 -0
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DBEventsManager = void 0;
4
+ const PostgresNotifListenManager_1 = require("./PostgresNotifListenManager");
5
+ const prostgles_types_1 = require("prostgles-types");
6
+ class DBEventsManager {
7
+ constructor(db_pg, pgp) {
8
+ this.notifies = {};
9
+ this.notice = {
10
+ socketChannel: prostgles_types_1.CHANNELS.NOTICE_EV,
11
+ socketUnsubChannel: prostgles_types_1.CHANNELS.NOTICE_EV + "unsubscribe",
12
+ sockets: []
13
+ };
14
+ this.onNotif = ({ channel, payload }) => {
15
+ // console.log(36, { channel, payload }, Object.keys(this.notifies));
16
+ Object.keys(this.notifies)
17
+ .filter(ch => ch === channel)
18
+ .map(ch => {
19
+ const sub = this.notifies[ch];
20
+ sub.sockets.map(s => {
21
+ s.emit(sub.socketChannel, payload);
22
+ });
23
+ sub.localFuncs.map(lf => {
24
+ lf(payload);
25
+ });
26
+ });
27
+ };
28
+ this.onNotice = (notice) => {
29
+ if (this.notice && this.notice.sockets.length) {
30
+ this.notice.sockets.map(s => {
31
+ s.emit(this.notice.socketChannel, notice);
32
+ });
33
+ }
34
+ };
35
+ this.getNotifChannelName = async (channel) => {
36
+ const c = await this.db_pg.one("SELECT quote_ident($1) as c", channel);
37
+ return c.c;
38
+ };
39
+ this.db_pg = db_pg;
40
+ this.pgp = pgp;
41
+ }
42
+ async addNotify(query, socket, func) {
43
+ if (typeof query !== "string" || (!socket && !func)) {
44
+ throw "Expecting (query: string, socket?, localFunc?) But received: " + JSON.stringify({ query, socket, func });
45
+ }
46
+ /* Remove comments */
47
+ let q = query.trim()
48
+ .replace(/\/\*[\s\S]*?\*\/|\/\/.*/g, '\n')
49
+ .split("\n").map(v => v.trim()).filter(v => v && !v.startsWith("--"))
50
+ .join("\n");
51
+ /* Find the notify channel name */
52
+ if (!q.toLowerCase().startsWith("listen")) {
53
+ throw "Expecting a LISTEN query but got: " + query;
54
+ }
55
+ q = q.slice(7).trim(); // Remove listen
56
+ if (q.endsWith(";"))
57
+ q = q.slice(0, -1);
58
+ if (q.startsWith('"') && q.endsWith('"')) {
59
+ q = q.slice(1, -1);
60
+ }
61
+ else {
62
+ /* Replicate PG by lowercasing identifier if not quoted */
63
+ q = q.toLowerCase();
64
+ }
65
+ q = q.replace(/""/g, `"`);
66
+ let channel = q;
67
+ let notifChannel = await this.getNotifChannelName(channel);
68
+ notifChannel = notifChannel.replace(/""/g, `"`);
69
+ if (notifChannel.startsWith('"'))
70
+ notifChannel = notifChannel.slice(1, -1);
71
+ const socketChannel = prostgles_types_1.CHANNELS.LISTEN_EV + notifChannel, socketUnsubChannel = socketChannel + "unsubscribe";
72
+ if (!this.notifies[notifChannel]) {
73
+ this.notifies[notifChannel] = {
74
+ socketChannel,
75
+ sockets: socket ? [socket] : [],
76
+ localFuncs: func ? [func] : [],
77
+ notifMgr: await PostgresNotifListenManager_1.PostgresNotifListenManager.create(this.db_pg, this.onNotif, channel)
78
+ };
79
+ }
80
+ else {
81
+ if (socket && !this.notifies[notifChannel].sockets.find(s => s.id === socket.id)) {
82
+ this.notifies[notifChannel].sockets.push(socket);
83
+ }
84
+ else if (func) {
85
+ this.notifies[notifChannel].localFuncs.push(func);
86
+ }
87
+ }
88
+ if (socket) {
89
+ socket.removeAllListeners(socketUnsubChannel);
90
+ socket.on(socketUnsubChannel, () => {
91
+ this.removeNotify(notifChannel, socket);
92
+ });
93
+ }
94
+ return {
95
+ // unsubscribe: () => this.removeNotify(notifChannel, socket, func),
96
+ socketChannel,
97
+ socketUnsubChannel,
98
+ notifChannel,
99
+ };
100
+ }
101
+ removeNotify(channel, socket, func) {
102
+ if (channel && this.notifies[channel]) {
103
+ if (socket) {
104
+ this.notifies[channel].sockets = this.notifies[channel].sockets.filter(s => s.id !== socket.id);
105
+ }
106
+ else if (func) {
107
+ this.notifies[channel].localFuncs = this.notifies[channel].localFuncs.filter(f => f !== func);
108
+ }
109
+ /* UNLISTEN if no listeners ?? */
110
+ }
111
+ if (socket) {
112
+ (0, prostgles_types_1.getKeys)(this.notifies).forEach(channel => {
113
+ this.notifies[channel].sockets = this.notifies[channel].sockets.filter(s => s.id !== socket.id);
114
+ });
115
+ }
116
+ }
117
+ addNotice(socket) {
118
+ if (!socket || !socket.id)
119
+ throw "Expecting a socket obj with id";
120
+ if (!this.notice.sockets.find(s => s.id === socket.id)) {
121
+ this.notice.sockets.push(socket);
122
+ }
123
+ const { socketChannel, socketUnsubChannel } = this.notice;
124
+ socket.removeAllListeners(socketUnsubChannel);
125
+ socket.on(socketUnsubChannel, () => {
126
+ this.removeNotice(socket);
127
+ });
128
+ return { socketChannel, socketUnsubChannel, };
129
+ }
130
+ removeNotice(socket) {
131
+ if (!socket || !socket.id)
132
+ throw "Expecting a socket obj with id";
133
+ this.notice.sockets = this.notice.sockets.filter(s => s.id !== socket.id);
134
+ }
135
+ }
136
+ exports.DBEventsManager = DBEventsManager;
@@ -0,0 +1,11 @@
1
+ import { DBSchema, TableHandler, ViewHandler } from "prostgles-types";
2
+ import { DBHandlerServer, DboBuilder } from "./DboBuilder";
3
+ import { PublishAllOrNothing, PublishTableRule, PublishViewRule } from "./PublishParser";
4
+ export declare const getDBSchema: (dboBuilder: DboBuilder) => string;
5
+ export declare type DBOFullyTyped<Schema = void> = Schema extends DBSchema ? ({
6
+ [tov_name in keyof Schema]: Schema[tov_name]["is_view"] extends true ? ViewHandler<Schema[tov_name]["columns"]> : TableHandler<Schema[tov_name]["columns"]>;
7
+ } & Pick<DBHandlerServer, "tx" | "sql">) : DBHandlerServer;
8
+ export declare type PublishFullyTyped<Schema = void> = Schema extends DBSchema ? (PublishAllOrNothing | {
9
+ [tov_name in keyof Partial<Schema>]: PublishAllOrNothing | (Schema[tov_name]["is_view"] extends true ? PublishViewRule<Schema[tov_name]["columns"]> : PublishTableRule<Schema[tov_name]["columns"]>);
10
+ }) : (PublishAllOrNothing | Record<string, PublishViewRule | PublishTableRule | PublishAllOrNothing>);
11
+ //# sourceMappingURL=DBSchemaBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DBSchemaBuilder.d.ts","sourceRoot":"","sources":["DBSchemaBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAGtE,OAAO,EAAE,eAAe,EAAE,UAAU,EAAmC,MAAM,cAAc,CAAC;AAC5F,OAAO,EAAE,mBAAmB,EAAiB,gBAAgB,EAAE,eAAe,EAAI,MAAM,iBAAiB,CAAC;AAG1G,eAAO,MAAM,WAAW,eAAgB,UAAU,KAAG,MAsBpD,CAAA;AAED,oBAAY,aAAa,CAAC,MAAM,GAAG,IAAI,IAAI,MAAM,SAAS,QAAQ,GAAE,CAChE;KACG,QAAQ,IAAI,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,SAAS,IAAI,GAClE,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,GACxC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC;CAC5C,GAAG,IAAI,CAAC,eAAe,EAAE,IAAI,GAAG,KAAK,CAAC,CACxC,GACD,eAAe,CAAC;AA+DlB,oBAAY,iBAAiB,CAAC,MAAM,GAAG,IAAI,IAAI,MAAM,SAAS,QAAQ,GAAE,CACpE,mBAAmB,GACnB;KACC,QAAQ,IAAI,MAAM,OAAO,CAAC,MAAM,CAAC,GAC9B,mBAAmB,GACnB,CACA,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,SAAS,IAAI,GACtC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,GAC5C,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,CAChD;CACJ,CACF,GAAG,CACA,mBAAmB,GACnB,MAAM,CAAC,MAAM,EAAE,eAAe,GAAG,gBAAgB,GAAG,mBAAmB,CAAC,CAC3E,CAAC"}
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getDBSchema = void 0;
7
+ const _1 = __importDefault(require("."));
8
+ const DboBuilder_1 = require("./DboBuilder");
9
+ const getDBSchema = (dboBuilder) => {
10
+ let tables = [];
11
+ /** Tables and columns are sorted to avoid infinite loops due to changing order */
12
+ dboBuilder.tablesOrViews?.slice(0).sort((a, b) => a.name.localeCompare(b.name)).forEach(tov => {
13
+ const cols = tov.columns.slice(0).sort((a, b) => a.name.localeCompare(b.name));
14
+ tables.push(`${(0, DboBuilder_1.escapeTSNames)(tov.name)}: {
15
+ is_view: ${tov.is_view};
16
+ select: ${tov.privileges.select}
17
+ insert: ${tov.privileges.insert}
18
+ update: ${tov.privileges.update}
19
+ delete: ${tov.privileges.delete}
20
+ columns: {${cols.map(c => `
21
+ ${(0, DboBuilder_1.escapeTSNames)(c.name)}${c.is_nullable || c.has_default ? "?" : ""}: ${(0, DboBuilder_1.postgresToTsType)(c.udt_name)}${c.is_nullable ? " | null" : ""}`).join(";")}
22
+ }
23
+ };\n `);
24
+ });
25
+ return `
26
+ export type DBSchemaGenerated = {
27
+ ${tables.join("")}
28
+ }
29
+ `;
30
+ };
31
+ exports.getDBSchema = getDBSchema;
32
+ /** Type checks */
33
+ (() => {
34
+ const ddb = 1;
35
+ ddb.dwad.insert;
36
+ ddb.dwad.delete;
37
+ const d = 1;
38
+ d.dwad.insert;
39
+ d.dwad.delete;
40
+ const p = 1;
41
+ p.dbo.dwad.insert;
42
+ ddb.dwad.delete;
43
+ (0, _1.default)({
44
+ dbConnection: 1,
45
+ publish: async (params) => {
46
+ const row = await params.dbo.dwadwa.find?.({});
47
+ return "*";
48
+ },
49
+ onReady: (dbo) => {
50
+ dbo.tdwa.find();
51
+ }
52
+ });
53
+ const auth = {
54
+ sidKeyName: "sid_token",
55
+ getUser: async (sid, db, _db) => {
56
+ db.dwadaw.find;
57
+ return 1;
58
+ }
59
+ };
60
+ });
61
+ /** Test the created schema */
62
+ const c = 1;
63
+ const test = c;
64
+ const db = 1;
65
+ const publish = () => {
66
+ const r = {
67
+ tbl1: {
68
+ select: {
69
+ fields: "*",
70
+ forcedFilter: { col1: 32, col2: "" }
71
+ },
72
+ getColumns: true,
73
+ getInfo: true,
74
+ delete: {
75
+ filterFields: { col1: 1 }
76
+ }
77
+ },
78
+ tbl2: {
79
+ delete: { forcedFilter: { col1: 2 } }
80
+ }
81
+ };
82
+ const res = {
83
+ tbl1: {
84
+ select: {
85
+ fields: "*",
86
+ forcedFilter: { col1: 32, col2: "" }
87
+ },
88
+ getColumns: true,
89
+ getInfo: true,
90
+ delete: {
91
+ filterFields: { col1: 1 }
92
+ }
93
+ },
94
+ tbl2: {
95
+ delete: { forcedFilter: { col1: 2 } }
96
+ }
97
+ };
98
+ const res1 = r;
99
+ const p = 1;
100
+ p.dbo.dwadaw.find();
101
+ return res;
102
+ };
@@ -1,6 +1,8 @@
1
- import { DBSchemaColumns, DBSchemaInsertColumns, DBSchema, TableHandler, ViewHandler } from "prostgles-types";
1
+ import { DBSchema, TableHandler, ViewHandler } from "prostgles-types";
2
+ import prostgles from ".";
3
+ import { Auth } from "./AuthHandler";
2
4
  import { DBHandlerServer, DboBuilder, escapeTSNames, postgresToTsType } from "./DboBuilder";
3
- import { PublishAllOrNothing, PublishTableRule, PublishViewRule, TableRule, ViewRule } from "./PublishParser";
5
+ import { PublishAllOrNothing, PublishParams, PublishTableRule, PublishViewRule, } from "./PublishParser";
4
6
 
5
7
 
6
8
  export const getDBSchema = (dboBuilder: DboBuilder): string => {
@@ -15,45 +17,78 @@ tables.push(`${escapeTSNames(tov.name)}: {
15
17
  insert: ${tov.privileges.insert}
16
18
  update: ${tov.privileges.update}
17
19
  delete: ${tov.privileges.delete}
18
- dataTypes: { ${cols.map(c => `${escapeTSNames(c.name)}: ${postgresToTsType(c.udt_name)}${c.is_nullable? " | null" : ""}`).join("; ")} };
19
20
  columns: {${cols.map(c => `
20
- ${escapeTSNames(c.name)}: { type: ${postgresToTsType(c.udt_name)}; is_nullable: ${c.is_nullable}; is_nullable_or_has_default: ${c.is_nullable || c.has_default}; }`).join(";\n")}
21
+ ${escapeTSNames(c.name)}${c.is_nullable || c.has_default? "?" : ""}: ${postgresToTsType(c.udt_name)}${c.is_nullable? " | null" : ""}`).join(";")}
21
22
  }
22
23
  };\n `)
23
24
  })
24
25
  return `
25
- type DBSchema = {
26
+ export type DBSchemaGenerated = {
26
27
  ${tables.join("")}
27
28
  }
28
29
  `;
29
30
  }
30
31
 
31
- const ccc: DBSchemaInsertColumns<{ col1: { type: string; }; col2: { type: number; is_nullable_or_has_default: true } }> = {
32
- col1: "",
33
- col2: 22
34
- }
32
+ export type DBOFullyTyped<Schema = void> = Schema extends DBSchema? (
33
+ {
34
+ [tov_name in keyof Schema]: Schema[tov_name]["is_view"] extends true?
35
+ ViewHandler<Schema[tov_name]["columns"]> :
36
+ TableHandler<Schema[tov_name]["columns"]>
37
+ } & Pick<DBHandlerServer, "tx" | "sql">
38
+ ) :
39
+ DBHandlerServer;
40
+
41
+
42
+
43
+
44
+ /** Type checks */
45
+ (() => {
35
46
 
47
+ const ddb: DBOFullyTyped = 1 as any;
48
+ ddb.dwad.insert!;
49
+ ddb.dwad.delete!;
36
50
 
51
+ const d: DBOFullyTyped<undefined> = 1 as any;
52
+ d.dwad.insert!;
53
+ d.dwad.delete!;
37
54
 
38
- export type DBOFullyTyped<Schema extends DBSchema = never> = Schema extends DBSchema? ({
39
- [tov_name in keyof Schema]: Schema[tov_name]["is_view"] extends true? ViewHandler<DBSchemaColumns<Schema[tov_name]["columns"]>> : TableHandler<DBSchemaColumns<Schema[tov_name]["columns"]>>
40
- } & Pick<DBHandlerServer, "tx" | "sql">) : DBHandlerServer;
55
+ const p: PublishParams = 1 as any;
56
+ p.dbo.dwad.insert!;
57
+ ddb.dwad.delete!;
58
+
59
+ prostgles({
60
+ dbConnection: 1 as any,
61
+ publish: async (params) => {
62
+ const row = await params.dbo.dwadwa.find?.({});
63
+
64
+ return "*" as "*"
65
+ },
66
+ onReady: (dbo) => {
67
+ dbo.tdwa.find!()
68
+ }
69
+ });
41
70
 
42
71
 
72
+ const auth: Auth = {
73
+ sidKeyName: "sid_token",
74
+ getUser: async (sid, db, _db) => {
75
+ db.dwadaw.find;
76
+ return 1 as any;
77
+ }
78
+ }
79
+ })
43
80
 
44
81
  type S = {
45
82
  tbl1: {
46
- dataTypes: {type: string;};
47
83
  columns: {
48
- col1: { type: number | null;}
49
- col2: { type: string; }
84
+ col1: number | null;
85
+ col2: string;
50
86
  }
51
87
  },
52
88
  tbl2: {
53
- dataTypes: {type: string;};
54
89
  columns: {
55
- col1: { type: number | null;}
56
- col2: { type: string; }
90
+ col1: number | null;
91
+ col2: string;
57
92
  }
58
93
  }
59
94
  }
@@ -64,16 +99,28 @@ const test: DBSchema = c;
64
99
  const db: DBOFullyTyped<S> = 1 as any;
65
100
 
66
101
 
67
- export type PublishFullyTyped<Schema extends DBSchema> = {
68
- [tov_name in keyof Partial<Schema>]: PublishAllOrNothing | (Schema[tov_name]["is_view"] extends true? PublishViewRule<Schema[tov_name]> : PublishTableRule<Schema[tov_name]>);
69
- };
102
+ export type PublishFullyTyped<Schema = void> = Schema extends DBSchema? (
103
+ | PublishAllOrNothing
104
+ | {
105
+ [tov_name in keyof Partial<Schema>]:
106
+ | PublishAllOrNothing
107
+ | (
108
+ Schema[tov_name]["is_view"] extends true?
109
+ PublishViewRule<Schema[tov_name]["columns"]> :
110
+ PublishTableRule<Schema[tov_name]["columns"]>
111
+ );
112
+ }
113
+ ) : (
114
+ | PublishAllOrNothing
115
+ | Record<string, PublishViewRule | PublishTableRule | PublishAllOrNothing>
116
+ );
70
117
 
71
118
 
72
119
  const publish = (): PublishFullyTyped<S> => {
73
- const res: PublishFullyTyped<S> = {
120
+ const r = {
74
121
  tbl1: {
75
122
  select: {
76
- fields: "*",
123
+ fields: "*" as "*",
77
124
  forcedFilter: { col1: 32, col2: "" }
78
125
  },
79
126
  getColumns: true,
@@ -86,6 +133,27 @@ const publish = (): PublishFullyTyped<S> => {
86
133
  delete: {forcedFilter: {col1: 2}}
87
134
  }
88
135
  }
136
+ const res: PublishFullyTyped<S> = {
137
+ tbl1: {
138
+ select: {
139
+ fields: "*",
140
+ forcedFilter: { col1: 32, col2: "" }
141
+ },
142
+ getColumns: true,
143
+ getInfo: true,
144
+ delete: {
145
+ filterFields: { col1: 1 }
146
+ }
147
+ },
148
+ tbl2: {
149
+ delete: {forcedFilter: { col1: 2 }}
150
+ }
151
+ }
152
+ const res1: PublishFullyTyped = r
153
+
154
+ const p: PublishParams<undefined> = 1 as any;
155
+
156
+ p.dbo.dwadaw.find!();
89
157
 
90
158
  return res;
91
159
  }