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.
- package/dist/Prostgles.d.ts +6 -1
- package/dist/Prostgles.d.ts.map +1 -1
- package/dist/Prostgles.js +6 -2
- package/dist/Prostgles.js.map +1 -1
- package/dist/TableConfig/TableConfig.d.ts.map +1 -1
- package/dist/TableConfig/TableConfig.js +81 -147
- package/dist/TableConfig/TableConfig.js.map +1 -1
- package/dist/TableConfig/getColumnDefinitionQuery.d.ts +3 -19
- package/dist/TableConfig/getColumnDefinitionQuery.d.ts.map +1 -1
- package/dist/TableConfig/getColumnDefinitionQuery.js +5 -38
- package/dist/TableConfig/getColumnDefinitionQuery.js.map +1 -1
- package/dist/TableConfig/getConstraintDefinitionQueries.d.ts +27 -1
- package/dist/TableConfig/getConstraintDefinitionQueries.d.ts.map +1 -1
- package/dist/TableConfig/getConstraintDefinitionQueries.js +40 -6
- package/dist/TableConfig/getConstraintDefinitionQueries.js.map +1 -1
- package/dist/TableConfig/getFutureTableSchema.d.ts +15 -0
- package/dist/TableConfig/getFutureTableSchema.d.ts.map +1 -0
- package/dist/TableConfig/getFutureTableSchema.js +51 -0
- package/dist/TableConfig/getFutureTableSchema.js.map +1 -0
- package/dist/TableConfig/getTableColumnQueries.d.ts +16 -0
- package/dist/TableConfig/getTableColumnQueries.d.ts.map +1 -0
- package/dist/TableConfig/getTableColumnQueries.js +108 -0
- package/dist/TableConfig/getTableColumnQueries.js.map +1 -0
- package/lib/Prostgles.d.ts +6 -1
- package/lib/Prostgles.d.ts.map +1 -1
- package/lib/Prostgles.js +6 -2
- package/lib/Prostgles.ts +12 -3
- package/lib/TableConfig/TableConfig.d.ts.map +1 -1
- package/lib/TableConfig/TableConfig.js +81 -147
- package/lib/TableConfig/TableConfig.ts +94 -154
- package/lib/TableConfig/getColumnDefinitionQuery.d.ts +3 -19
- package/lib/TableConfig/getColumnDefinitionQuery.d.ts.map +1 -1
- package/lib/TableConfig/getColumnDefinitionQuery.js +5 -38
- package/lib/TableConfig/getColumnDefinitionQuery.ts +4 -46
- package/lib/TableConfig/getConstraintDefinitionQueries.d.ts +27 -1
- package/lib/TableConfig/getConstraintDefinitionQueries.d.ts.map +1 -1
- package/lib/TableConfig/getConstraintDefinitionQueries.js +40 -6
- package/lib/TableConfig/getConstraintDefinitionQueries.ts +64 -6
- package/lib/TableConfig/getFutureTableSchema.d.ts +15 -0
- package/lib/TableConfig/getFutureTableSchema.d.ts.map +1 -0
- package/lib/TableConfig/getFutureTableSchema.js +50 -0
- package/lib/TableConfig/getFutureTableSchema.ts +73 -0
- package/lib/TableConfig/getTableColumnQueries.d.ts +16 -0
- package/lib/TableConfig/getTableColumnQueries.d.ts.map +1 -0
- package/lib/TableConfig/getTableColumnQueries.js +107 -0
- package/lib/TableConfig/getTableColumnQueries.ts +130 -0
- package/package.json +1 -1
- package/tests/client/PID.txt +1 -1
- package/tests/config_test/index.ts +1 -2
- package/tests/config_test/init.sql +1 -8
- package/tests/server/DBoGenerated.d.ts +12 -2
- package/tests/server/index.js +5 -1
- package/tests/server/index.ts +5 -1
- package/tests/server/init.sql +1 -7
- package/tests/server/package-lock.json +1 -1
- 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
package/tests/client/PID.txt
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
100487
|
|
@@ -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
|
-
|
|
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: {
|
package/tests/server/index.js
CHANGED
|
@@ -153,7 +153,7 @@ function dd() {
|
|
|
153
153
|
}
|
|
154
154
|
},
|
|
155
155
|
lookup_col1: {
|
|
156
|
-
|
|
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",
|
package/tests/server/index.ts
CHANGED
|
@@ -174,7 +174,7 @@ function dd(){
|
|
|
174
174
|
}
|
|
175
175
|
},
|
|
176
176
|
lookup_col1: {
|
|
177
|
-
|
|
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",
|
package/tests/server/init.sql
CHANGED
|
@@ -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
|
|
|
@@ -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": "",
|