prostgles-server 3.0.131 → 3.0.133

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 (56) hide show
  1. package/dist/Prostgles.d.ts +6 -1
  2. package/dist/Prostgles.d.ts.map +1 -1
  3. package/dist/Prostgles.js +6 -2
  4. package/dist/Prostgles.js.map +1 -1
  5. package/dist/TableConfig/TableConfig.d.ts.map +1 -1
  6. package/dist/TableConfig/TableConfig.js +81 -147
  7. package/dist/TableConfig/TableConfig.js.map +1 -1
  8. package/dist/TableConfig/getColumnDefinitionQuery.d.ts +3 -19
  9. package/dist/TableConfig/getColumnDefinitionQuery.d.ts.map +1 -1
  10. package/dist/TableConfig/getColumnDefinitionQuery.js +5 -38
  11. package/dist/TableConfig/getColumnDefinitionQuery.js.map +1 -1
  12. package/dist/TableConfig/getConstraintDefinitionQueries.d.ts +27 -1
  13. package/dist/TableConfig/getConstraintDefinitionQueries.d.ts.map +1 -1
  14. package/dist/TableConfig/getConstraintDefinitionQueries.js +40 -6
  15. package/dist/TableConfig/getConstraintDefinitionQueries.js.map +1 -1
  16. package/dist/TableConfig/getFutureTableSchema.d.ts +15 -0
  17. package/dist/TableConfig/getFutureTableSchema.d.ts.map +1 -0
  18. package/dist/TableConfig/getFutureTableSchema.js +51 -0
  19. package/dist/TableConfig/getFutureTableSchema.js.map +1 -0
  20. package/dist/TableConfig/getTableColumnQueries.d.ts +16 -0
  21. package/dist/TableConfig/getTableColumnQueries.d.ts.map +1 -0
  22. package/dist/TableConfig/getTableColumnQueries.js +108 -0
  23. package/dist/TableConfig/getTableColumnQueries.js.map +1 -0
  24. package/lib/Prostgles.d.ts +6 -1
  25. package/lib/Prostgles.d.ts.map +1 -1
  26. package/lib/Prostgles.js +6 -2
  27. package/lib/Prostgles.ts +12 -3
  28. package/lib/TableConfig/TableConfig.d.ts.map +1 -1
  29. package/lib/TableConfig/TableConfig.js +81 -147
  30. package/lib/TableConfig/TableConfig.ts +94 -154
  31. package/lib/TableConfig/getColumnDefinitionQuery.d.ts +3 -19
  32. package/lib/TableConfig/getColumnDefinitionQuery.d.ts.map +1 -1
  33. package/lib/TableConfig/getColumnDefinitionQuery.js +5 -38
  34. package/lib/TableConfig/getColumnDefinitionQuery.ts +4 -46
  35. package/lib/TableConfig/getConstraintDefinitionQueries.d.ts +27 -1
  36. package/lib/TableConfig/getConstraintDefinitionQueries.d.ts.map +1 -1
  37. package/lib/TableConfig/getConstraintDefinitionQueries.js +40 -6
  38. package/lib/TableConfig/getConstraintDefinitionQueries.ts +64 -6
  39. package/lib/TableConfig/getFutureTableSchema.d.ts +15 -0
  40. package/lib/TableConfig/getFutureTableSchema.d.ts.map +1 -0
  41. package/lib/TableConfig/getFutureTableSchema.js +50 -0
  42. package/lib/TableConfig/getFutureTableSchema.ts +73 -0
  43. package/lib/TableConfig/getTableColumnQueries.d.ts +16 -0
  44. package/lib/TableConfig/getTableColumnQueries.d.ts.map +1 -0
  45. package/lib/TableConfig/getTableColumnQueries.js +107 -0
  46. package/lib/TableConfig/getTableColumnQueries.ts +130 -0
  47. package/package.json +1 -1
  48. package/tests/client/PID.txt +1 -1
  49. package/tests/config_test/index.ts +1 -2
  50. package/tests/config_test/init.sql +1 -8
  51. package/tests/server/DBoGenerated.d.ts +12 -2
  52. package/tests/server/index.js +5 -1
  53. package/tests/server/index.ts +5 -1
  54. package/tests/server/init.sql +1 -7
  55. package/tests/server/package-lock.json +1 -1
  56. package/tests/server/package.json +1 -1
@@ -0,0 +1,130 @@
1
+ import { getKeys, asName as _asName, isObject, asName } from "prostgles-types";
2
+ import { DB, DBHandlerServer } from "../Prostgles";
3
+ import { validate_jsonb_schema_sql } from "../JSONBValidation/validate_jsonb_schema_sql";
4
+ import { getColumnDefinitionQuery, getTableColumns } from "./getColumnDefinitionQuery";
5
+ import { TableConfig } from "./TableConfig";
6
+ import { log } from "../PubSubManager/PubSubManager";
7
+ import { getFutureTableSchema } from "./getFutureTableSchema";
8
+
9
+ type Args = {
10
+ db: DB;
11
+ tableConf: TableConfig[string];
12
+ tableName: string;
13
+ tableHandler: DBHandlerServer[string];
14
+ }
15
+
16
+ export const getTableColumnQueries = async ({ db, tableConf, tableName, tableHandler }: Args): Promise<undefined | {
17
+ columnDefs: string[];
18
+ newColumnDefs: string[];
19
+ fullQuery: string;
20
+ isCreate: boolean;
21
+ }> => {
22
+
23
+ let newColumnDefs: string[] = [];
24
+ const droppedColNames: string[] = [];
25
+ const alteredColQueries: string[] = [];
26
+ let fullQuery = "";
27
+ let isCreate = false;
28
+
29
+ if ("columns" in tableConf && tableConf.columns) {
30
+
31
+ const hasJSONBValidation = getKeys(tableConf.columns).some(c => {
32
+ const cConf = tableConf.columns?.[c];
33
+ return cConf && isObject(cConf) && (cConf.jsonbSchema || cConf.jsonbSchemaType)
34
+ });
35
+
36
+ /** Must install validation function */
37
+ if(hasJSONBValidation){
38
+ try {
39
+ await db.any(validate_jsonb_schema_sql);
40
+ } catch(err: any){
41
+ console.error("Could not install the jsonb validation function due to error: ", err);
42
+ throw err;
43
+ }
44
+ }
45
+
46
+ const columns = getKeys(tableConf.columns).filter(c => {
47
+ const colDef = tableConf.columns![c];
48
+ /** Exclude NamedJoinColumn */
49
+ return typeof colDef === "string" || !("joinDef" in colDef)
50
+ }) as string[];
51
+
52
+ const colDefs: { name: string; def: string }[] = [];
53
+
54
+ for await(const colName of columns) {
55
+ const colConf = tableConf.columns![colName];
56
+
57
+ /* Get column definition */
58
+ const colDef = await getColumnDefinitionQuery({ colConf, column: colName, db, table: tableName });
59
+ if(colDef){
60
+ colDefs.push({ name: colName, def: colDef});
61
+ }
62
+ }
63
+ const columnDefs = colDefs.map(c => c.def);
64
+
65
+ if(!colDefs.length){
66
+ return undefined;
67
+ }
68
+
69
+
70
+ const ALTERQ = `ALTER TABLE ${asName(tableName)}`;
71
+ if (!tableHandler) {
72
+ newColumnDefs.push(...colDefs.map(c => c.def));
73
+
74
+ } else if (tableHandler) {
75
+ const currCols = await getTableColumns({ db, table: tableName });
76
+
77
+ /** Add new columns */
78
+ newColumnDefs = colDefs.filter(nc => !tableHandler.columns?.some(c => nc.name === c.name)).map(c => c.def);
79
+
80
+ /** Altered/Dropped columns */
81
+ const { cols: futureCols } = await getFutureTableSchema({ tableName, columnDefs, constraintDefs: [], db });
82
+ currCols.forEach(c => {
83
+ const newCol = futureCols.find(nc => nc.column_name === c.column_name);
84
+ if(!newCol){
85
+ droppedColNames.push(c.column_name);
86
+ } else if(newCol.nullable !== c.nullable){
87
+ alteredColQueries.push(`${ALTERQ} ALTER COLUMN ${asName(c.column_name)} ${newCol.nullable? "SET" : "DROP"} NOT NULL;`)
88
+ } else if(newCol.udt_name !== c.udt_name){
89
+ alteredColQueries.push(`${ALTERQ} ALTER COLUMN ${asName(c.column_name)} TYPE ${newCol.udt_name};`)
90
+ } else if(newCol.column_default !== c.column_default){
91
+ const colConfig = colDefs.find(cd => cd.name === c.column_name);
92
+ if(["serial", "bigserial"].some(t => colConfig?.def.toLowerCase().includes(` ${t}`)) && c.column_default?.toLowerCase().includes("nextval")){
93
+ /** Ignore SERIAL/BIGSERIAL <> nextval mismatch */
94
+ } else {
95
+ alteredColQueries.push(`${ALTERQ} ALTER COLUMN ${asName(c.column_name)} ${newCol.column_default === null? "DROP DEFAULT" : `SET DEFAULT ${newCol.column_default}`};`)
96
+ }
97
+ }
98
+ });
99
+ }
100
+
101
+ if (!tableHandler || tableConf.dropIfExists || tableConf.dropIfExistsCascade) {
102
+ isCreate = true;
103
+ const DROPQ = `DROP TABLE IF EXISTS ${asName(tableName)}`;
104
+ fullQuery = ([
105
+ ...(tableConf.dropIfExists? [`${DROPQ};`] : tableConf.dropIfExistsCascade? [`${DROPQ} CASCADE;`] : []),
106
+ `CREATE TABLE ${asName(tableName)} (`,
107
+ columnDefs.join(", \n"),
108
+ `);`
109
+ ].join("\n"));
110
+
111
+ } else {
112
+ fullQuery = [
113
+ ...droppedColNames.map(c => `${ALTERQ} DROP COLUMN ${asName(c)};`),
114
+ ...newColumnDefs.map(c => `${ALTERQ} ADD COLUMN ${c};`),
115
+ ...alteredColQueries,
116
+ ].join("\n");
117
+ }
118
+
119
+ return {
120
+ fullQuery,
121
+ columnDefs,
122
+ isCreate,
123
+ newColumnDefs,
124
+ }
125
+ } else {
126
+ return undefined;
127
+ }
128
+
129
+
130
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prostgles-server",
3
- "version": "3.0.131",
3
+ "version": "3.0.133",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -1 +1 @@
1
- 34106
1
+ 100487
@@ -171,8 +171,7 @@ prostgles<DBObj>({
171
171
  // console.log(await await db.media.find());
172
172
 
173
173
  // throw items_with_one_media;
174
-
175
- console.log(await db.uuid_text.getColumns())
174
+
176
175
 
177
176
  } catch(e){
178
177
  console.error(e)
@@ -7,14 +7,7 @@ CREATE TABLE IF NOT EXISTS various_nested (
7
7
  various_id INTEGER REFERENCES various(id),
8
8
  name TEXT
9
9
  );
10
-
11
-
12
- DROP TABLE IF EXISTS uuid_text CASCADE;
13
- CREATE TABLE IF NOT EXISTS uuid_text (
14
- id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
15
- name TEXT
16
- );
17
-
10
+
18
11
  DROP TABLE IF EXISTS items_m1 CASCADE;
19
12
  CREATE TABLE IF NOT EXISTS items_m1 (
20
13
  id SERIAL PRIMARY KEY,
@@ -465,8 +465,18 @@ export type DBSchemaGenerated = {
465
465
  columns: {
466
466
  col1?: null | string;
467
467
  col2?: null | string;
468
- id?: string;
469
- name?: null | string;
468
+ id?: null | string;
469
+ };
470
+ };
471
+ uuid_text1: {
472
+ is_view: false;
473
+ select: true;
474
+ insert: true;
475
+ update: true;
476
+ delete: true;
477
+ columns: {
478
+ col1?: null | string;
479
+ col2?: null | string;
470
480
  };
471
481
  };
472
482
  v_items: {
@@ -153,7 +153,7 @@ function dd() {
153
153
  }
154
154
  },
155
155
  lookup_col1: {
156
- dropIfExists: true,
156
+ dropIfExistsCascade: true,
157
157
  isLookupTable: {
158
158
  values: {
159
159
  a: {},
@@ -163,6 +163,7 @@ function dd() {
163
163
  },
164
164
  uuid_text: {
165
165
  columns: {
166
+ id: "UUID",
166
167
  col1: {
167
168
  references: {
168
169
  tableName: "lookup_col1",
@@ -177,6 +178,9 @@ function dd() {
177
178
  }
178
179
  }
179
180
  },
181
+ // uuid_text: {
182
+ // columns: {id: "UUID"}
183
+ // },
180
184
  rec_ref: {
181
185
  columns: {
182
186
  id: "SERIAL PRIMARY KEY",
@@ -174,7 +174,7 @@ function dd(){
174
174
  }
175
175
  },
176
176
  lookup_col1: {
177
- dropIfExists: true,
177
+ dropIfExistsCascade: true,
178
178
  isLookupTable: {
179
179
  values: {
180
180
  a: {},
@@ -184,6 +184,7 @@ function dd(){
184
184
  },
185
185
  uuid_text: {
186
186
  columns: {
187
+ id: "UUID",
187
188
  col1: {
188
189
  references: {
189
190
  tableName: "lookup_col1",
@@ -198,6 +199,9 @@ function dd(){
198
199
  }
199
200
  }
200
201
  },
202
+ // uuid_text: {
203
+ // columns: {id: "UUID"}
204
+ // },
201
205
  rec_ref: {
202
206
  columns: {
203
207
  id: "SERIAL PRIMARY KEY",
@@ -11,13 +11,7 @@ CREATE TABLE IF NOT EXISTS shapes (
11
11
  DROP TABLE IF EXISTS prostgles_lookup_media_items_m1;
12
12
  DROP TABLE IF EXISTS prostgles_lookup_media_items_with_media;
13
13
  DROP TABLE IF EXISTS prostgles_lookup_media_items_with_one_media;
14
-
15
-
16
- DROP TABLE IF EXISTS uuid_text CASCADE;
17
- CREATE TABLE IF NOT EXISTS uuid_text (
18
- id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
19
- name TEXT
20
- );
14
+
21
15
 
22
16
  DROP TABLE IF EXISTS media CASCADE;
23
17
 
@@ -21,7 +21,7 @@
21
21
  },
22
22
  "../..": {
23
23
  "name": "prostgles-server",
24
- "version": "3.0.130",
24
+ "version": "3.0.132",
25
25
  "license": "MIT",
26
26
  "dependencies": {
27
27
  "@aws-sdk/client-s3": "^3.272.0",
@@ -7,7 +7,7 @@
7
7
  "start": "tsc-watch --onSuccess \"node index.js\"",
8
8
  "dev": "NOSTOP=true npm start",
9
9
  "build": "rm -rf ./node_modules/* && rm -rf ./media/* && npm i && tsc",
10
- "test-server": "TEST_TYPE=server node index.js",
10
+ "test-server": "TEST_TYPE=server node --inspect index.js",
11
11
  "test-client": "TEST_TYPE=client node index.js "
12
12
  },
13
13
  "author": "",