prostgles-server 4.2.39 → 4.2.41

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/README.md CHANGED
@@ -77,6 +77,19 @@ prostgles({
77
77
  });
78
78
  ```
79
79
 
80
+ react.tsx
81
+ ```js
82
+
83
+ const App = () => {
84
+ const { isLoading, dbo } = useProstglesClient();
85
+ if(isLoading) return null;
86
+ return <>
87
+ Database tables: {Object.keys(dbo)}
88
+ </>
89
+ }
90
+
91
+ ```
92
+
80
93
  ./public/index.html
81
94
  ```html
82
95
 
@@ -95,7 +108,7 @@ prostgles({
95
108
 
96
109
  prostgles({
97
110
  socket: io(),
98
- onReady: async (dbo, dbsMethods, schemaTables, auth) => {
111
+ onReady: async ({ dbo, dbsMethods, schemaTables, auth }) => {
99
112
 
100
113
  }
101
114
  });
@@ -1 +1 @@
1
- {"version":3,"file":"runSQL.d.ts","sourceRoot":"","sources":["../../lib/DboBuilder/runSQL.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,iCAAiC,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,UAAU,EAA4B,MAAM,iBAAiB,CAAC;AAElF,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAyB,MAAM,cAAc,CAAC;AAG9E,wBAAsB,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,GAAG,EAAE,EAAE,OAAO,EAAE,UAAU,GAAG,SAAS,EAAE,WAAW,CAAC,EAAE,WAAW,gBAkFtK;AAcD;;GAEG;AACH,eAAO,MAAM,mBAAmB,SAAwB,UAAU;qBAAmD,MAAM;aAAW,MAAM;mBAmB3I,CAAA;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,UAAU,iBAyBlD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,CAAC,OAAO,EAAE;;;;;;;;;;;;;;;IAiB1E;AAED,eAAO,MAAM,SAAS,cAAqB,SAAS,gBAAgB,WAAW,KAAG,QAAQ,OAAO,CAQhG,CAAA;AAED,eAAO,MAAM,eAAe,cAAmB,QAAQ,OAAO,CAE7D,CAAA"}
1
+ {"version":3,"file":"runSQL.d.ts","sourceRoot":"","sources":["../../lib/DboBuilder/runSQL.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,iCAAiC,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,UAAU,EAA4B,MAAM,iBAAiB,CAAC;AAElF,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAyB,MAAM,cAAc,CAAC;AAG9E,wBAAsB,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,GAAG,EAAE,EAAE,OAAO,EAAE,UAAU,GAAG,SAAS,EAAE,WAAW,CAAC,EAAE,WAAW,gBAkFtK;AAcD;;GAEG;AACH,eAAO,MAAM,mBAAmB,SAAwB,UAAU;qBAAmD,MAAM;aAAW,MAAM;mBAY3I,CAAA;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,UAAU,iBAyBlD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,CAAC,OAAO,EAAE;;;;;;;;;;;;;;;IAiB1E;AAED,eAAO,MAAM,SAAS,cAAqB,SAAS,gBAAgB,WAAW,KAAG,QAAQ,OAAO,CAQhG,CAAA;AAED,eAAO,MAAM,eAAe,cAAmB,QAAQ,OAAO,CAE7D,CAAA"}
@@ -103,13 +103,6 @@ const watchSchemaFallback = async function ({ queryWithoutRLS, command }) {
103
103
  if (SCHEMA_ALTERING_COMMANDS.includes(command)) {
104
104
  this.prostgles.onSchemaChange({ command, query: queryWithoutRLS });
105
105
  }
106
- // This seems too unrealiable
107
- // else if (queryWithoutRLS) {
108
- // const cleanedQuery = queryWithoutRLS.toLowerCase().replace(/\s\s+/g, ' ');
109
- // if (EVENT_TRIGGER_TAGS.some(q => cleanedQuery.includes(q.toLowerCase() + " "))) {
110
- // this.prostgles.onSchemaChange({ command, query: queryWithoutRLS })
111
- // }
112
- // }
113
106
  }
114
107
  };
115
108
  exports.watchSchemaFallback = watchSchemaFallback;
@@ -1 +1 @@
1
- {"version":3,"file":"runSQL.js","sourceRoot":"","sources":["../../lib/DboBuilder/runSQL.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runSQL.js","sourceRoot":"","sources":["../../lib/DboBuilder/runSQL.ts"],"names":[],"mappings":";;;AAAA,2CAA0E;AAG1E,8DAA2D;AAE3D,6CAA8E;AAGvE,KAAK,UAAU,MAAM,CAAmB,eAAuB,EAAE,IAAmC,EAAE,OAA+B,EAAE,WAAyB;IACrK,MAAM,YAAY,GAAG,eAAe,CAAC;IACrC,IAAG,YAAY,EAAE,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC,EAAC,CAAC;QACrG,MAAM,EAAE,wBAAwB,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;QAC9F,IAAG,CAAC,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAC,CAAC;YACnE,MAAM,oLAAoL;gBAC1L,gHAAgH,CAAA;QAClH,CAAC;IACH,CAAC;IAED,MAAM,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAEhC,IAAI,CAAC,CAAC,MAAM,IAAA,iBAAS,EAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;QACpD,MAAM,wBAAwB,CAAC;IACjC,CAAC;IAED,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,GAAG,IAAI,EAAE,GAAe,OAAO,IAAK,EAAiB,CAAC;IAChG,MAAM,EAAE,MAAM,EAAE,GAAG,WAAW,IAAI,EAAE,CAAC;IAGrC,MAAM,EAAE,GAAG,WAAW,EAAE,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC;IACzC,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC5B,IAAG,WAAW,EAAE,EAAE;YAAE,MAAM,gDAAgD,CAAC;QAC3E,IAAI,CAAC,MAAM;YAAE,MAAM,iCAAiC,CAAC;QACrD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAG,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAClH,OAAO,UAAU,CAAC;IAEpB,CAAC;SAAM,IAAI,UAAU,KAAK,oBAAoB,EAAE,CAAC;QAC/C,IAAI,CAAC,MAAM;YAAE,MAAM,iCAAiC,CAAA;QACpD,OAAO,MAAM,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAEjE,CAAC;SAAM,IAAI,UAAU,KAAK,WAAW,EAAE,CAAC;QACtC,IAAI,CAAC;YACH,OAAO,gBAAG,CAAC,EAAE,CAAC,MAAM,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAO,GAAW,CAAC,QAAQ,EAAE,CAAC;QAChC,CAAC;IAEH,CAAC;IAED,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,eAAe,CAAA;IACvB,CAAC;IAED,IAAI,UAAU,GAAgC,YAAY,GAAG,EAAE,CAAC;IAChE,MAAM,mBAAmB,GAAG,CAAC,UAAU,KAAK,WAAW,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;IACjJ,IAAI,mBAAmB,EAAE,CAAC;QACxB,UAAU,GAAG,IAAI,+BAAE,CAAC;YAClB,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,gBAAG,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY;SACnE,CAAC,CAAC;IACL,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,MAAM,CAAY,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;IACxF,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC;IAErC,MAAM,cAAc,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;IAC5G,IAAG,cAAc,EAAE,CAAC;QAClB,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC;IAEd,CAAC;SAAM,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;IAEjB,CAAC;SAAM,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;QAClC,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAE7C,CAAC;SAAM,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAElD,CAAC;SAAM,CAAC;QAEN,MAAM,IAAI,GAAiC;YACzC,QAAQ,EAAE,CAAC;YACX,GAAG,WAAW;YACd,MAAM,EAAE,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;SAChD,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAlFD,wBAkFC;AAED,MAAM,WAAW,GAAG,KAAK,WAA4B,eAAuB,EAAE,EAAE,OAAO,EAAmC,EAAE,WAAgC,EAAE,WAAyB;IAErL,2BAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,CAAC;IAE7D,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB,MAAM,EAAE,MAAM,EAAE,GAAG,WAAW,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,WAAW;YAAE,MAAM,IAAI,KAAK,CAAC,mHAAmH,CAAC,CAAA;QACtJ,IAAI,CAAC,MAAM;YAAE,MAAM,iCAAiC,CAAA;QACpD,OAAO,MAAM,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,SAAS,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IAClF,CAAC;AACH,CAAC,CAAA;AAED;;GAEG;AACI,MAAM,mBAAmB,GAAG,KAAK,WAA4B,EAAE,eAAe,EAAE,OAAO,EAAiD;IAC7I,MAAM,wBAAwB,GAAG,uCAAkB,CAAC,CAAA,kDAAkD;IACtG,MAAM,yBAAyB,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACxE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC;IACpE,IACE,WAAW;QACX,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,IAAI,eAAe,KAAK,mBAAmB,IAAI,yBAAyB,CAAC,EACrG,CAAC;QACD,IAAI,wBAAwB,CAAC,QAAQ,CAAC,OAAc,CAAC,EAAE,CAAC;YACtD,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAA;QACpE,CAAC;IACH,CAAC;AACH,CAAC,CAAA;AAZY,QAAA,mBAAmB,uBAY/B;AAEM,KAAK,UAAU,YAAY;IAChC,IAAI,CAAC,UAAU,KAAK,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,kCAAkC,CAAC,IAAI,EAAE,CAAC;IAChF,IAAI,CAAC,WAAW,KAAK,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;GAgBtC,CAAC,IAAI,EAAE,CAAC;IACT,IAAI,CAAC,kBAAkB,KAAK,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;;;;;GAK7C,CAAC,CAAC;AACL,CAAC;AAzBD,oCAyBC;AAED,SAAgB,oBAAoB,CAAmB,MAAoB;IACzE,OAAO,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE;QACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAW,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,OAAO,IAAI,MAAM,EACxF,KAAK,GAAG,IAAI,CAAC,WAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,EAC5D,MAAM,GAAG,IAAI,CAAC,kBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,gBAAgB,KAAK,CAAC,CAAC,QAAQ,CAAC,EACzG,UAAU,GAAG,IAAA,6BAAgB,EAAC,QAAQ,CAAC,CAAC;QAE1C,OAAO;YACL,GAAG,CAAC;YACJ,UAAU;YACV,QAAQ;YACR,QAAQ,EAAE,QAAQ;YAClB,SAAS,EAAE,KAAK,EAAE,OAAO;YACzB,WAAW,EAAE,KAAK,EAAE,UAAU;YAC9B,UAAU,EAAE,MAAM,EAAE,WAAW;SAChC,CAAA;IACH,CAAC,CAAC,IAAI,EAAE,CAAC;AACX,CAAC;AAjBD,oDAiBC;AAEM,MAAM,SAAS,GAAG,KAAK,EAAE,SAAoB,EAAE,WAAyB,EAAoB,EAAE;IACnG,IAAI,CAAC,WAAW,EAAE,MAAM,IAAI,CAAC,WAAW,EAAE,OAAO;QAAE,OAAO,IAAI,CAAC;IAE/D,MAAM,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC;IAC/B,MAAM,aAAa,GAAG,MAAM,SAAS,CAAC,aAAc,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAClF,YAAY;IACZ,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,aAAa,CAAC,CAAC;IAChE,OAAO,OAAO,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC;AACjE,CAAC,CAAA;AARY,QAAA,SAAS,aAQrB;AAEM,MAAM,eAAe,GAAG,KAAK,EAAE,EAAM,EAAoB,EAAE;IAChE,OAAO,EAAE,CAAC,GAAG,CAAC,oEAAoE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,CAAA;AAC1H,CAAC,CAAA;AAFY,QAAA,eAAe,mBAE3B"}
@@ -116,13 +116,6 @@ export const watchSchemaFallback = async function(this: DboBuilder, { queryWitho
116
116
  if (SCHEMA_ALTERING_COMMANDS.includes(command as any)) {
117
117
  this.prostgles.onSchemaChange({ command, query: queryWithoutRLS })
118
118
  }
119
- // This seems too unrealiable
120
- // else if (queryWithoutRLS) {
121
- // const cleanedQuery = queryWithoutRLS.toLowerCase().replace(/\s\s+/g, ' ');
122
- // if (EVENT_TRIGGER_TAGS.some(q => cleanedQuery.includes(q.toLowerCase() + " "))) {
123
- // this.prostgles.onSchemaChange({ command, query: queryWithoutRLS })
124
- // }
125
- // }
126
119
  }
127
120
  }
128
121
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prostgles-server",
3
- "version": "4.2.39",
3
+ "version": "4.2.41",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -46,7 +46,7 @@
46
46
  "pg-cursor": "^2.10.3",
47
47
  "pg-promise": "^11.5.4",
48
48
  "prostgles-client": "^4.0.53",
49
- "prostgles-types": "^4.0.73"
49
+ "prostgles-types": "^4.0.74"
50
50
  },
51
51
  "devDependencies": {
52
52
  "@types/bluebird": "^3.5.36",
@@ -1,12 +1,15 @@
1
1
  import { strict as assert } from "assert";
2
2
  import { describe, test } from "node:test";
3
3
  import type { DBHandlerClient } from "./index";
4
- import { renderReactHook } from "./renderReactHook";
5
- import { pickKeys } from "prostgles-types";
4
+ import { renderReactHook, renderReactHookManual } from "./renderReactHook";
5
+ import { AnyObject, pickKeys } from "prostgles-types";
6
+ import { useProstglesClient } from "prostgles-client/dist/prostgles";
7
+
8
+ export const clientHooks = async (db: DBHandlerClient, getSocketOptions: (watchSchema?: boolean) => AnyObject) => {
6
9
 
7
- export const clientHooks = async (db: DBHandlerClient) => {
8
10
  const resultLoading = { data: undefined, isLoading: true, error: undefined };
9
11
  await describe("React hooks", async (t) => {
12
+
10
13
  const defaultFilter = { name: "abc" };
11
14
  await Promise.all([
12
15
  "useFind",
@@ -5,9 +5,11 @@ import { isomorphicQueries } from "../isomorphicQueries.spec";
5
5
  import { clientOnlyQueries } from "../clientOnlyQueries.spec";
6
6
  import { clientRestApi } from "../clientRestApi.spec";
7
7
  import { clientFileTests } from "../clientFileTests.spec";
8
- import { InitOptions } from "prostgles-client/dist/prostgles";
8
+ import type { Auth, DBHandlerClient, MethodHandler } from "prostgles-client/dist/prostgles";
9
9
  export { DBHandlerClient, Auth } from "prostgles-client/dist/prostgles";
10
10
  import { clientHooks } from "./hooks.spec";
11
+ import { useProstglesTest } from "./useProstgles.spec";
12
+ import { DBSchemaTable } from "prostgles-types";
11
13
 
12
14
  const start = Date.now();
13
15
  const log = (msgOrObj: any, extra?: any) => {
@@ -17,33 +19,39 @@ const log = (msgOrObj: any, extra?: any) => {
17
19
  log("Started client...");
18
20
 
19
21
  const { TEST_NAME } = process.env;
22
+ const url = "http://127.0.0.1:3001";
23
+ const path = "/teztz/s";
24
+ const pathWatchSchema = "/teztz/sWatchSchema";
25
+ const getSocketOptions = (watchSchema = false) => ({
26
+ uri: url,
27
+ path: watchSchema? pathWatchSchema : path,
28
+ query: { token: TEST_NAME },
29
+ });
30
+ const { uri, ...socketOpts } = getSocketOptions();
31
+ const socket = io(uri, socketOpts);
20
32
 
21
- type ClientTestSpec = {
22
- onRun: InitOptions["onReady"]
23
- };
33
+ type ClientTestSpecV2 = (args: {
34
+ db: DBHandlerClient<void>;
35
+ methods: MethodHandler;
36
+ tableSchema: DBSchemaTable[];
37
+ isReconnect?: boolean;
38
+ auth: Auth;
39
+ }) => Promise<void>;
24
40
 
25
- const tests: Record<string, ClientTestSpec> = {
26
- main: {
27
- onRun: async (db, methods, tableSchema, auth) => {
28
- await isomorphicQueries(db, log);
29
- await clientOnlyQueries(db, auth, log, methods, tableSchema, TEST_NAME);
30
- await clientHooks(db);
31
- },
41
+ const tests: Record<string, ClientTestSpecV2> = {
42
+ main: async ({ db, methods, tableSchema, auth }) => {
43
+ await isomorphicQueries(db, log);
44
+ await clientOnlyQueries(db, auth, log, methods, tableSchema, TEST_NAME);
45
+ await clientHooks(db, getSocketOptions);
32
46
  },
33
- // hooks: {
34
- // onRun: async (db) => {
35
- // await clientHooks(db);
36
- // },
37
- // },
38
- files: {
39
- onRun: async (db, methods, tableSchema, auth) => {
40
- await clientFileTests(db, auth, log, methods, tableSchema)
41
- },
47
+ useProstgles: async ({ db }) => {
48
+ await useProstglesTest(db, getSocketOptions);
42
49
  },
43
- rest_api: {
44
- onRun: async (db, methods, tableSchema, auth) => {
45
- await clientRestApi(db, auth, log, methods, tableSchema, TEST_NAME);
46
- }
50
+ files: async ({ db, methods, tableSchema, auth }) => {
51
+ await clientFileTests(db, auth, log, methods, tableSchema)
52
+ },
53
+ rest_api: async ({ db, methods, tableSchema, auth }) => {
54
+ await clientRestApi(db, auth, log, methods, tableSchema, TEST_NAME);
47
55
  }
48
56
  };
49
57
 
@@ -52,9 +60,6 @@ if(!test){
52
60
  throw `Invalid TEST_NAME env var provided (${TEST_NAME}). Expecting one of: ${Object.keys(tests)}`;
53
61
  }
54
62
 
55
- const url = process.env.PRGL_CLIENT_URL || "http://127.0.0.1:3001";
56
- const path = process.env.PRGL_CLIENT_PATH || "/teztz/s";
57
- const socket = io(url, { path, query: { token: TEST_NAME } });
58
63
  const stopTest = (args?: { err: any; }) => {
59
64
  const { err } = args ?? {};
60
65
  if(args) {
@@ -109,7 +114,7 @@ try {
109
114
  }
110
115
  console.log = onLog;
111
116
  }
112
- await test.onRun(db, methods, tableSchema, auth, isReconnect);
117
+ await test({ db, methods, tableSchema, auth, isReconnect });
113
118
 
114
119
  stopTest();
115
120
 
@@ -10,9 +10,9 @@
10
10
  "license": "ISC",
11
11
  "dependencies": {
12
12
  "@types/node": "^20.9.2",
13
- "prostgles-client": "^4.0.95",
13
+ "prostgles-client": "^4.0.115",
14
14
  "prostgles-types": "^4.0.51",
15
- "socket.io-client": "^4.7.1"
15
+ "socket.io-client": "^4.7.5"
16
16
  },
17
17
  "devDependencies": {
18
18
  "jsdom": "^24.0.0",
@@ -351,25 +351,29 @@
351
351
  }
352
352
  },
353
353
  "node_modules/prostgles-client": {
354
- "version": "4.0.95",
355
- "resolved": "https://registry.npmjs.org/prostgles-client/-/prostgles-client-4.0.95.tgz",
356
- "integrity": "sha512-flYinJ21wkJm+u8zY3CuxUdTT3vwgJ/hTg3cZHdy71/TaYFRseDUSDuK8Lkw6rsRmhtKbdeFO5D9JbEqiuYinA==",
354
+ "version": "4.0.115",
355
+ "resolved": "https://registry.npmjs.org/prostgles-client/-/prostgles-client-4.0.115.tgz",
356
+ "integrity": "sha512-YMnWOY352K8v++eR8Nb2Ikmi+3U0bxaFbPlsHAa1XmFhGq3UqRponUMcgYLiXjbWrvMRULSVWdYezdMTZU/a/g==",
357
357
  "dependencies": {
358
- "prostgles-types": "^4.0.73"
358
+ "prostgles-types": "^4.0.74"
359
359
  },
360
360
  "peerDependencies": {
361
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
361
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
362
+ "socket.io-client": "^4.7.0 || ^4.7.5"
362
363
  },
363
364
  "peerDependenciesMeta": {
364
365
  "react": {
365
366
  "optional": true
367
+ },
368
+ "socket.io-client": {
369
+ "optional": true
366
370
  }
367
371
  }
368
372
  },
369
373
  "node_modules/prostgles-types": {
370
- "version": "4.0.73",
371
- "resolved": "https://registry.npmjs.org/prostgles-types/-/prostgles-types-4.0.73.tgz",
372
- "integrity": "sha512-WL3pxQW90ReaSjjls4wCTN3bn4mJc7ivJLQgWYqfFehz9VVWj6YqxrqXquBDD5Fa2xbfbab4cR16R6MckcP3CA==",
374
+ "version": "4.0.74",
375
+ "resolved": "https://registry.npmjs.org/prostgles-types/-/prostgles-types-4.0.74.tgz",
376
+ "integrity": "sha512-6+MW7q1INIpO3JOkSCDD8oUG3U22VYbSWt2s0j3/0Uog4Dr90EzxX2TE7jV0NXmK+AAs+HHZ9u5olipMv0sHmQ==",
373
377
  "dependencies": {
374
378
  "json-schema": "^0.4.0"
375
379
  }
@@ -13,9 +13,9 @@
13
13
  "license": "ISC",
14
14
  "dependencies": {
15
15
  "@types/node": "^20.9.2",
16
- "prostgles-client": "^4.0.95",
16
+ "prostgles-client": "^4.0.115",
17
17
  "prostgles-types": "^4.0.51",
18
- "socket.io-client": "^4.7.1"
18
+ "socket.io-client": "^4.7.5"
19
19
  },
20
20
  "devDependencies": {
21
21
  "jsdom": "^24.0.0",
@@ -19,9 +19,11 @@ global.document = window.document;
19
19
  import React from "react";
20
20
  import { createRoot } from "react-dom/client";
21
21
 
22
+ type Hook = (...args: any[]) => any;
22
23
 
24
+ // TODO: add hook result types
23
25
  type RenderHookArgs = {
24
- hook: (...args: any[]) => any;
26
+ hook: Hook;
25
27
  props: any[];
26
28
  onResult?: (result: any) => void;
27
29
  expectedRerenders: number;
@@ -35,7 +37,7 @@ type RenderHookArgs = {
35
37
 
36
38
  let testedHook: Function;
37
39
  const root = createRoot(window.document.getElementById('root'));
38
- const reactRender = ({ hook, props, onResult, onUnmount }: Pick<Required<RenderHookArgs>, "hook" | "props" | "onResult"> & { onUnmount: ()=>void; }) => {
40
+ const reactRender = ({ hook, props, onResult, onUnmount }: Pick<Required<RenderHookArgs>, "hook" | "props" | "onResult"> & { onUnmount: () => void; }) => {
39
41
  const BasicComponent = ({ props }) => {
40
42
  const result = hook(...props);
41
43
  React.useEffect(() => {
@@ -62,6 +64,67 @@ const resetBasicComponent = () => {
62
64
  React.createElement(OtherBasicComponent, { props: {} }, null)
63
65
  );
64
66
  }
67
+ type OnEnd<H extends Hook> = (results: ReturnType<H>[]) => Promise<void> | void;
68
+ export const renderReactHookManual = async <H extends Hook>(rootArgs: {
69
+ hook: H;
70
+ initialProps: Parameters<H>;
71
+ onUnmount?: () => void;
72
+ /**
73
+ * Time to wait after the last render to resolve the promise
74
+ * default: 250
75
+ */
76
+ renderDuration?: number;
77
+ onEnd?: OnEnd<H>;
78
+ }): Promise<{
79
+ setProps: (props: Parameters<H>, opts: { waitFor?: number; onEnd?: OnEnd<H>; }) => void;
80
+ getResults: () => ReturnType<H>[];
81
+ }> => {
82
+ const { hook, onUnmount, renderDuration = 250, onEnd } = rootArgs;
83
+ let lastRenderWaitTimeout: NodeJS.Timeout | null = null;
84
+ let didResolve = false;
85
+ let setProps: (props: any[]) => void;
86
+ resetBasicComponent();
87
+ return new Promise((resolve, reject) => {
88
+ const results = [];
89
+ const onRender = (result) => {
90
+ results.push(result);
91
+ if(didResolve) return;
92
+ clearTimeout(lastRenderWaitTimeout);
93
+ lastRenderWaitTimeout = setTimeout(async () => {
94
+
95
+ if(!setProps) {
96
+ reject("setProps not set");
97
+ return;
98
+ }
99
+ await onEnd?.(results);
100
+ didResolve = true;
101
+ return resolve({
102
+ setProps: async (props, { waitFor = 250, onEnd } = {}) => {
103
+ setProps(props);
104
+ await tout(waitFor);
105
+ await onEnd?.(results);
106
+ },
107
+ getResults: () => results
108
+ });
109
+ }, renderDuration);
110
+ }
111
+ const BasicComponent = ({ props: initialProps }) => {
112
+ const [props, _setProps] = React.useState(initialProps);
113
+ setProps = _setProps;
114
+ const result = hook(...props);
115
+ React.useEffect(() => {
116
+ return () => {
117
+ onUnmount?.();
118
+ };
119
+ }, []);
120
+ onRender(result);
121
+ return React.createElement('h1', null, `Hello`);
122
+ }
123
+ root.render(
124
+ React.createElement(BasicComponent, { props: rootArgs.initialProps }, null)
125
+ );
126
+ });
127
+ }
65
128
 
66
129
  export const renderReactHook = (rootArgs: RenderHookArgs): Promise<RenderResult> => {
67
130
  const { hook, props, onResult, expectedRerenders, timeout = 5000, lastRenderWait = 250 } = rootArgs;
@@ -99,7 +162,7 @@ export const renderReactHook = (rootArgs: RenderHookArgs): Promise<RenderResult>
99
162
  if(isRerender){
100
163
  reject(new Error("Unmounted before expected rerenders"));
101
164
  }
102
- }
165
+ }
103
166
  });
104
167
  setTimeout(() => {
105
168
  if(!resolved){
@@ -107,4 +170,6 @@ export const renderReactHook = (rootArgs: RenderHookArgs): Promise<RenderResult>
107
170
  }
108
171
  }, timeout);
109
172
  });
110
- }
173
+ }
174
+
175
+ export const tout = (ms: number) => new Promise(res => setTimeout(res, ms));
@@ -0,0 +1,112 @@
1
+ import { strict as assert } from "assert";
2
+ import { describe, test } from "node:test";
3
+ import { useProstglesClient } from "prostgles-client/dist/prostgles";
4
+ import { AnyObject } from "prostgles-types";
5
+ import type { DBHandlerClient } from "./index";
6
+ import { renderReactHook, renderReactHookManual } from "./renderReactHook";
7
+
8
+ export const useProstglesTest = async (db: DBHandlerClient, getSocketOptions: (watchSchema?: boolean) => AnyObject) => {
9
+ await describe("useProstgles hook", async (t) => {
10
+ const socketOptions = getSocketOptions();
11
+ await test("useProstglesClient", async (t) => {
12
+ const { results: [res1, res2] } = await renderReactHook({
13
+ hook: useProstglesClient,
14
+ props: [{ socketOptions }],
15
+ expectedRerenders: 2
16
+ });
17
+ assert.deepStrictEqual(
18
+ res1,
19
+ { isLoading: true }
20
+ );
21
+ assert.equal(
22
+ typeof (res2 as any)?.dbo.items4.useFind,
23
+ "function"
24
+ );
25
+ });
26
+
27
+ const newTableName = "newly_created_table";
28
+ await test("useProstglesClient with schema reload", async (t) => {
29
+ await db.sql(`DROP TABLE IF EXISTS ${newTableName}; DROP TABLE IF EXISTS will_delete;`);
30
+ await db.sql(`select pg_sleep(1)`);
31
+ let rerenders = 0
32
+ const { results: [res1, res2, res3], rerender } = await renderReactHook({
33
+ hook: useProstglesClient,
34
+ props: [{ socketOptions: getSocketOptions(true) }],
35
+ expectedRerenders: 3,
36
+ onResult: () => {
37
+ rerenders++;
38
+ if(rerenders < 2) return;
39
+ rerenders = -2;
40
+ db.sql(`CREATE TABLE ${newTableName}(id integer);`);
41
+ }
42
+ });
43
+ assert.deepStrictEqual(
44
+ res1,
45
+ { isLoading: true }
46
+ );
47
+ assert.equal(
48
+ res2.isLoading,
49
+ false
50
+ );
51
+ assert.equal(
52
+ typeof (res2 as any)?.dbo[newTableName]?.useFind,
53
+ "undefined"
54
+ );
55
+ assert.equal(
56
+ typeof (res3 as any)?.dbo[newTableName].useFind,
57
+ "function"
58
+ );
59
+
60
+ const count = await (res3 as any)?.dbo[newTableName].count();
61
+ assert.equal(count, 0);
62
+ });
63
+
64
+ await test("useProstglesClient with initial skip", async (t) => {
65
+ const { setProps } = await renderReactHookManual({
66
+ hook: useProstglesClient,
67
+ initialProps: [{ socketOptions, skip: true }],
68
+ onEnd: async (results) => {
69
+ assert.deepStrictEqual(results, [{ isLoading: true }]);
70
+ }
71
+ });
72
+ await setProps([{ socketOptions }], {
73
+ onEnd: async (results) => {
74
+ assert.equal(results.length, 3);
75
+ const [res1, res2, res3] = results;
76
+ assert.deepStrictEqual([res1, res2], [{ isLoading: true }, { isLoading: true }]);
77
+ const count = await (res3 as any)?.dbo.items4.count();
78
+ assert.equal(count, 0);
79
+
80
+ assert.equal(res3.isLoading, false);
81
+ if("error" in res3) throw res3.error;
82
+ assert.equal(
83
+ typeof res3.dbo[newTableName]?.useFind,
84
+ "undefined"
85
+ );
86
+ }
87
+ });
88
+
89
+ await setProps([{ socketOptions: getSocketOptions(true) }], {
90
+ onEnd: async (results) => {
91
+ assert.equal(results.length, 5);
92
+ const [res1, res2, res3, res4, res5] = results;
93
+ assert.equal(results.length, 5);
94
+ assert.equal(res5.isLoading, false);
95
+ if("error" in res5) throw res5.error;
96
+
97
+ const count = await res5.dbo.items4.count();
98
+ assert.equal(count, 0);
99
+
100
+ assert.equal(
101
+ typeof res5.dbo[newTableName].useFind,
102
+ "function"
103
+ );
104
+ const count0 = await res5.dbo[newTableName].count();
105
+ assert.equal(count0, 0);
106
+ }
107
+ });
108
+ });
109
+
110
+ });
111
+
112
+ }
@@ -257,6 +257,16 @@ export type DBSchemaGenerated = {
257
257
  id: string;
258
258
  };
259
259
  };
260
+ newly_created_table: {
261
+ is_view: false;
262
+ select: true;
263
+ insert: true;
264
+ update: true;
265
+ delete: true;
266
+ columns: {
267
+ id?: null | number;
268
+ };
269
+ };
260
270
  obj_table: {
261
271
  is_view: false;
262
272
  select: true;
@@ -15,6 +15,7 @@ testPublishTypes();
15
15
 
16
16
  const isClientTest = (process.env.TEST_TYPE === "client");
17
17
  const io = !isClientTest? undefined : require("socket.io")(http, { path: "/teztz/s" });
18
+ const ioWatchSchema = !isClientTest? undefined : require("socket.io")(http, { path: "/teztz/sWatchSchema" });
18
19
 
19
20
  http.listen(3001);
20
21
 
@@ -77,181 +78,201 @@ function dd(){
77
78
  dbo.tbl.find;
78
79
  }
79
80
 
80
- prostgles<DBSchemaGenerated>({
81
- dbConnection,
82
- sqlFilePath: path.join(__dirname+'/../../init.sql'),
83
- io,
84
- tsGeneratedTypesDir: path.join(__dirname + '/../../'),
85
- transactions: true,
86
- schema: { public: 1, prostgles_test: 1 },
87
- onLog: async ev => {
88
- if(ev.type === "debug" || ev.type === "connect" || ev.type === "disconnect"){
89
- // log("onLog", ev);
90
- }
91
- },
92
- tableConfig: testTableConfig,
93
- fileTable: {
94
- referencedTables: {
95
- users_public_info: {
96
- type: "column",
97
- referenceColumns: {
98
- avatar: {
99
- acceptedContent: "*"
81
+ (async () => {
82
+
83
+
84
+ if(isClientTest && process.env.TEST_NAME === "useProstgles"){
85
+ await prostgles<DBSchemaGenerated>({
86
+ dbConnection,
87
+ io: ioWatchSchema,
88
+ transactions: true,
89
+ schema: { public: 1, prostgles_test: 1 },
90
+ onReady: async ({ dbo, db }) => {},
91
+ publish: "*",
92
+ watchSchema: true,
93
+ });
94
+ }
95
+
96
+ prostgles<DBSchemaGenerated>({
97
+ dbConnection,
98
+ sqlFilePath: path.join(__dirname+'/../../init.sql'),
99
+ io,
100
+ tsGeneratedTypesDir: path.join(__dirname + '/../../'),
101
+ transactions: true,
102
+ schema: { public: 1, prostgles_test: 1 },
103
+ onLog: async ev => {
104
+ if(ev.type === "debug" || ev.type === "connect" || ev.type === "disconnect"){
105
+ // log("onLog", ev);
106
+ }
107
+ },
108
+ tableConfig: testTableConfig,
109
+ fileTable: {
110
+ referencedTables: {
111
+ users_public_info: {
112
+ type: "column",
113
+ referenceColumns: {
114
+ avatar: {
115
+ acceptedContent: "*"
116
+ }
100
117
  }
101
118
  }
102
- }
119
+ },
120
+ localConfig: {
121
+ localFolderPath: path.join(__dirname+'/media'),
122
+ },
123
+ expressApp: app,
124
+ tableName: "files",
103
125
  },
104
- localConfig: {
105
- localFolderPath: path.join(__dirname+'/media'),
126
+ restApi: {
127
+ expressApp: app,
128
+ routePrefix: "/api"
106
129
  },
107
- expressApp: app,
108
- tableName: "files",
109
- },
110
- restApi: {
111
- expressApp: app,
112
- routePrefix: "/api"
113
- },
114
-
115
- onSocketConnect: ({ socket, db }) => {
116
- console.log("onSocketConnect", socket.id)
117
- if(isClientTest){
118
- log("Client connected -> console does not work. use log function. socket.id:", socket.id);
119
- socket.emit("start-test", { server_id: Math.random() });
120
- socket.on("log", async (data, cb) => {
121
- console.log("Client log ", data);
122
- });
123
- socket.on("stop-test", async (err, cb) => {
124
- cb();
125
- console.log("Client test " + (!err? "successful" : "failed"));
126
- stopTest(err);
127
- });
128
- }
129
130
 
130
- },
131
+ onSocketConnect: ({ socket, db }) => {
132
+ console.log("onSocketConnect", socket.id)
133
+ if(isClientTest){
134
+ log("Client connected -> console does not work. use log function. socket.id:", socket.id);
135
+ socket.emit("start-test", { server_id: Math.random() });
136
+ socket.on("log", async (data, cb) => {
137
+ console.log("Client log ", data);
138
+ });
139
+ socket.on("stop-test", async (err, cb) => {
140
+ cb();
141
+ console.log("Client test " + (!err? "successful" : "failed"));
142
+ stopTest(err);
143
+ });
144
+ }
145
+
146
+ },
131
147
 
132
- onSocketDisconnect: ({ socket, db }) => {
133
- if(isClientTest){
134
- log("Client disconnected. socket.id:", socket.id);
135
- }
148
+ onSocketDisconnect: ({ socket, db }) => {
149
+ if(isClientTest){
150
+ log("Client disconnected. socket.id:", socket.id);
151
+ }
152
+
153
+ },
136
154
 
137
- },
138
-
139
- publishRawSQL: async (params) => {
140
- return true;// Boolean(user && user.type === "admin")
141
- },
142
- auth: {
143
- sidKeyName: "token",
144
- getUser: async (sid) => {
145
- if(sid){
146
- const s = sessions.find(s => s.id === sid);
147
- if(s) {
148
- const user = users.find(u => s && s.user_id === u.id);
149
- if(user) {
150
- return { sid: s.id, user, clientUser: { sid: s.id, uid: user.id } }
155
+ publishRawSQL: async (params) => {
156
+ return true;// Boolean(user && user.type === "admin")
157
+ },
158
+ auth: {
159
+ sidKeyName: "token",
160
+ getUser: async (sid) => {
161
+ if(sid){
162
+ const s = sessions.find(s => s.id === sid);
163
+ if(s) {
164
+ const user = users.find(u => s && s.user_id === u.id);
165
+ if(user) {
166
+ return { sid: s.id, user, clientUser: { sid: s.id, uid: user.id } }
167
+ }
151
168
  }
152
169
  }
170
+ return undefined;
171
+ },
172
+ login: async ({ username, password } = {}) => {
173
+ const u = users.find(u => u.username === username && u.password === password);
174
+ if(!u) throw "something went wrong: " + JSON.stringify({ username, password });
175
+ let s = sessions.find(s => s.user_id === u.id)
176
+ if(!s){
177
+ s = { id: "SID" + Date.now(), user_id: u.id }
178
+ sessions.push(s)
179
+ }
180
+ log("Logged in!")
181
+ return { sid: s.id, expires: Infinity, onExpiration: "redirect" }
182
+ },
183
+ cacheSession: {
184
+ getSession: async (sid) => {
185
+ const s = sessions.find(s => s.id === sid);
186
+ return s? { sid: s.id, expires: Infinity, onExpiration: "redirect" } : undefined
187
+ }
188
+ },
189
+ expressConfig: {
190
+ app,
191
+ onGetRequestOK(req, res, params) {
192
+ log(req.originalUrl)
193
+ res.sendFile(path.join(__dirname, '../../index.html'));
194
+ },
153
195
  }
154
- return undefined;
155
- },
156
- login: async ({ username, password } = {}) => {
157
- const u = users.find(u => u.username === username && u.password === password);
158
- if(!u) throw "something went wrong: " + JSON.stringify({ username, password });
159
- let s = sessions.find(s => s.user_id === u.id)
160
- if(!s){
161
- s = { id: "SID" + Date.now(), user_id: u.id }
162
- sessions.push(s)
163
- }
164
- log("Logged in!")
165
- return { sid: s.id, expires: Infinity, onExpiration: "redirect" }
166
196
  },
167
- cacheSession: {
168
- getSession: async (sid) => {
169
- const s = sessions.find(s => s.id === sid);
170
- return s? { sid: s.id, expires: Infinity, onExpiration: "redirect" } : undefined
197
+ publishMethods: async (params) => {
198
+ return {
199
+ get: () => 222
171
200
  }
172
201
  },
173
- expressConfig: {
174
- app,
175
- onGetRequestOK(req, res, params) {
176
- log(req.originalUrl)
177
- res.sendFile(path.join(__dirname, '../../index.html'));
202
+ publish: testPublish,
203
+ joins: [
204
+ {
205
+ tables: ["items", "items2"],
206
+ on: [{ name: "name" }],
207
+ type: "many-many"
178
208
  },
179
- }
180
- },
181
- publishMethods: async (params) => {
182
- return {
183
- get: () => 222
184
- }
185
- },
186
- publish: testPublish,
187
- joins: [
188
- {
189
- tables: ["items", "items2"],
190
- on: [{ name: "name" }],
191
- type: "many-many"
192
- },
193
- {
194
- tables: ["items2", "items3"],
195
- on: [{ name: "name" }],
196
- type: "many-many"
197
- },
198
- {
199
- tables: ["items4a", "items"],
200
- on: [{ items_id: "id" }],
201
- type: "many-many"
202
- },
203
- {
204
- tables: ["items4a", "items2"],
205
- on: [{ items2_id: "id" }],
206
- type: "many-many"
207
- },
208
- {
209
- tables: ["items_multi", "items"],
210
- on: [
211
- { items0_id: "id" },
212
- { items1_id: "id" },
213
- { items2_id: "id" },
214
- { items3_id: "id" },
215
- ],
216
- type: "many-many"
217
- }
218
- ],
219
- onReady: async ({ dbo, db }) => {
220
- log("prostgles onReady");
209
+ {
210
+ tables: ["items2", "items3"],
211
+ on: [{ name: "name" }],
212
+ type: "many-many"
213
+ },
214
+ {
215
+ tables: ["items4a", "items"],
216
+ on: [{ items_id: "id" }],
217
+ type: "many-many"
218
+ },
219
+ {
220
+ tables: ["items4a", "items2"],
221
+ on: [{ items2_id: "id" }],
222
+ type: "many-many"
223
+ },
224
+ {
225
+ tables: ["items_multi", "items"],
226
+ on: [
227
+ { items0_id: "id" },
228
+ { items1_id: "id" },
229
+ { items2_id: "id" },
230
+ { items3_id: "id" },
231
+ ],
232
+ type: "many-many"
233
+ }
234
+ ],
235
+ onReady: async ({ dbo, db }) => {
236
+ log("prostgles onReady");
221
237
 
222
- try {
223
-
224
- if(isClientTest){
225
- const execPath = path.resolve(`${__dirname}/../../../client`);
226
- /** For some reason the below doesn't work anymore */
227
- // const proc = spawn("npm", ["run", "test"], { cwd: execPath, stdio: "inherit" });
228
-
229
- spawn("node", ["dist/client/index.js"], { cwd: execPath, stdio: "inherit" });
230
- // const clientPath = `cd ${__dirname}/../../../clientz && npm test`;
231
- // const proc = exec(clientPath, console.log);
232
- // proc.stdout?.on('data', function(data) {
233
- // console.log(data);
234
- // });
235
- // proc.stderr?.on('data', function(data) {
236
- // console.error(data);
237
- // });
238
- log("Waiting for client...");
238
+ try {
239
239
 
240
- } else if(process.env.TEST_TYPE === "server"){
240
+ if(isClientTest){
241
+ const execPath = path.resolve(`${__dirname}/../../../client`);
242
+ /** For some reason the below doesn't work anymore */
243
+ // const proc = spawn("npm", ["run", "test"], { cwd: execPath, stdio: "inherit" });
244
+
245
+ spawn("node", [
246
+ // "--inspect-brk",
247
+ "dist/client/index.js"
248
+ ], { cwd: execPath, stdio: "inherit" });
241
249
 
242
- await serverOnlyQueries(dbo as any);
243
- log("Server-only query tests successful");
244
- await isomorphicQueries(dbo as any, log);
245
- log("Server isomorphic tests successful");
250
+ // const clientPath = `cd ${__dirname}/../../../clientz && npm test`;
251
+ // const proc = exec(clientPath, console.log);
252
+ // proc.stdout?.on('data', function(data) {
253
+ // console.log(data);
254
+ // });
255
+ // proc.stderr?.on('data', function(data) {
256
+ // console.error(data);
257
+ // });
258
+ log("Waiting for client...");
259
+
260
+ } else if(process.env.TEST_TYPE === "server"){
246
261
 
247
- stopTest()
248
- }
249
- } catch(err) {
250
- console.trace(err)
251
- if(process.env.TEST_TYPE){
252
- stopTest(err ?? "Error")
262
+ await serverOnlyQueries(dbo as any);
263
+ log("Server-only query tests successful");
264
+ await isomorphicQueries(dbo as any, log);
265
+ log("Server isomorphic tests successful");
266
+
267
+ stopTest()
268
+ }
269
+ } catch(err) {
270
+ console.trace(err)
271
+ if(process.env.TEST_TYPE){
272
+ stopTest(err ?? "Error")
273
+ }
253
274
  }
254
- }
255
-
256
- },
257
- });
275
+
276
+ },
277
+ });
278
+ })();
@@ -21,7 +21,7 @@
21
21
  },
22
22
  "../..": {
23
23
  "name": "prostgles-server",
24
- "version": "4.2.38",
24
+ "version": "4.2.40",
25
25
  "license": "MIT",
26
26
  "dependencies": {
27
27
  "@types/express": "^4.17.13",
@@ -35,7 +35,7 @@
35
35
  "pg-cursor": "^2.10.3",
36
36
  "pg-promise": "^11.5.4",
37
37
  "prostgles-client": "^4.0.53",
38
- "prostgles-types": "^4.0.73"
38
+ "prostgles-types": "^4.0.74"
39
39
  },
40
40
  "devDependencies": {
41
41
  "@types/bluebird": "^3.5.36",
@@ -1548,7 +1548,7 @@
1548
1548
  "pg-cursor": "^2.10.3",
1549
1549
  "pg-promise": "^11.5.4",
1550
1550
  "prostgles-client": "^4.0.53",
1551
- "prostgles-types": "^4.0.73",
1551
+ "prostgles-types": "^4.0.74",
1552
1552
  "typescript": "^5.3.3"
1553
1553
  }
1554
1554
  },
package/tests/test.sh CHANGED
@@ -13,8 +13,8 @@ npm run build
13
13
 
14
14
  #npm run test-server 2>&1 ./server.log
15
15
  npm run test-server && \
16
- TEST_NAME="main" npm run test-client && \
17
- # TEST_NAME="hooks" npm run test-client && \
18
- TEST_NAME="files" npm run test-client && \
19
- TEST_NAME="rest_api" npm run test-client
16
+ TEST_NAME="main" npm run test-client && \
17
+ TEST_NAME="useProstgles" npm run test-client && \
18
+ TEST_NAME="files" npm run test-client && \
19
+ TEST_NAME="rest_api" npm run test-client
20
20