prostgles-server 2.0.13 → 2.0.17

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 (42) hide show
  1. package/dist/DboBuilder.d.ts.map +1 -1
  2. package/dist/DboBuilder.js +15 -13
  3. package/dist/DboBuilder.js.map +1 -1
  4. package/dist/FileManager.d.ts +2 -1
  5. package/dist/FileManager.d.ts.map +1 -1
  6. package/dist/FileManager.js +6 -1
  7. package/dist/FileManager.js.map +1 -1
  8. package/dist/Prostgles.d.ts +3 -0
  9. package/dist/Prostgles.d.ts.map +1 -1
  10. package/dist/Prostgles.js +7 -1
  11. package/dist/Prostgles.js.map +1 -1
  12. package/dist/QueryBuilder.js +2 -2
  13. package/dist/QueryBuilder.js.map +1 -1
  14. package/dist/TableConfig.d.ts +57 -0
  15. package/dist/TableConfig.d.ts.map +1 -0
  16. package/dist/TableConfig.js +79 -0
  17. package/dist/TableConfig.js.map +1 -0
  18. package/lib/DboBuilder.ts +17 -11
  19. package/lib/FileManager.ts +6 -2
  20. package/lib/Prostgles.ts +13 -1
  21. package/lib/QueryBuilder.ts +2 -2
  22. package/lib/TableConfig.ts +117 -0
  23. package/package.json +2 -2
  24. package/tests/client_only_queries.js +3 -0
  25. package/tests/client_only_queries.ts +4 -0
  26. package/tests/config_test/DBoGenerated.d.ts +29 -1
  27. package/tests/config_test/index.js +29 -3
  28. package/tests/config_test/index.js.map +1 -1
  29. package/tests/config_test/index.ts +34 -5
  30. package/tests/config_test/init.sql +6 -0
  31. package/tests/isomorphic_queries.js +6 -2
  32. package/tests/isomorphic_queries.ts +8 -2
  33. package/tests/server/DBoGenerated.d.ts +20 -1
  34. package/tests/server/index.js +9 -1
  35. package/tests/server/index.ts +9 -1
  36. package/tests/server/init.sql +7 -0
  37. package/tests/server/media/{5b4c60e4-28ed-4695-8970-43f3b83d1372.txt → 07244a06-b87a-469d-ad24-8d6450c63141.txt} +0 -0
  38. package/tests/server/media/{843aef93-47b4-4ae6-b2cb-bae369bb2155.txt → 1d3ef9f2-bb5d-460b-9e17-29c784548b54.txt} +0 -0
  39. package/tests/server/media/{bbcd7a13-af68-445d-a1cf-946c2073af70.txt → 2e8709ec-d71d-4112-b711-0f6eba9a2e61.txt} +0 -0
  40. package/tests/server/media/{e218d3fd-7e70-4c02-95db-e0d4ff27c611.txt → b27fa91a-4ad0-4f05-8b67-83684947a43c.txt} +0 -0
  41. package/tests/server/package-lock.json +3 -3
  42. package/tests/test.sh +1 -1
package/lib/DboBuilder.ts CHANGED
@@ -119,12 +119,14 @@ export type LocalParams = {
119
119
  data: AnyObject;
120
120
  }
121
121
  }
122
- function replaceNonAlphaNumeric(string: string): string {
123
- return string.replace(/[\W_]+/g,"_");
122
+ function replaceNonAlphaNumeric(string: string, replacement = "_"): string {
123
+ return string.replace(/[\W_]+/g, replacement);
124
124
  }
125
- function capitalizeFirstLetter(string: string) : string {
126
- return replaceNonAlphaNumeric(string).charAt(0).toUpperCase() + string.slice(1);
125
+ function capitalizeFirstLetter(string: string, nonalpha_replacement?: string) : string {
126
+ const str = replaceNonAlphaNumeric(string, nonalpha_replacement);
127
+ return str.charAt(0).toUpperCase() + str.slice(1);
127
128
  }
129
+
128
130
  function snakify(str: string, capitalize = false) : string {
129
131
 
130
132
  return str.split("").map((c, i)=> {
@@ -309,10 +311,11 @@ class ColSet {
309
311
  const col = this.opts.columns.find(c => c.name === key);
310
312
  if(!col) throw "Unexpected missing col name";
311
313
  const colIsJSON = ["json", "jsonb"].includes(col.data_type);
314
+ const colIsUUID = ["uuid"].includes(col.data_type);
312
315
 
313
316
  return {
314
317
  escapedCol: asName(key),
315
- escapedVal: pgp.as.format(colIsJSON? "$1:json" : "$1", [row[key]])
318
+ escapedVal: pgp.as.format(colIsUUID? "$1::uuid" : colIsJSON? "$1:json" : "$1", [row[key]])
316
319
  }
317
320
  });
318
321
 
@@ -612,9 +615,11 @@ export class ViewHandler {
612
615
  if(!p.select.getColumns) throw "Not allowed";
613
616
 
614
617
  // console.log("getColumns", this.name, this.columns.map(c => c.name))
618
+
615
619
  let _lang = lang;
616
620
  let columns = this.columns.map(c => {
617
- let label = c.comment || c.name;
621
+ let label = c.comment || capitalizeFirstLetter(c.name, " ");
622
+
618
623
  const iConf = this.dboBuilder.prostgles?.opts?.i18n?.column_labels?.[this.name]?.[c.name];
619
624
  const fallbackLang = this.dboBuilder.prostgles?.opts?.i18n?.fallbackLang;
620
625
  _lang = _lang || fallbackLang as string;
@@ -635,6 +640,7 @@ export class ViewHandler {
635
640
  filter: Boolean(p.select && p.select.filterFields && p.select.filterFields.includes(c.name)),
636
641
  update: Boolean(p.update && p.update.fields && p.update.fields.includes(c.name)),
637
642
  delete: Boolean(p.delete && p.delete.filterFields && p.delete.filterFields.includes(c.name)),
643
+ ...(this.dboBuilder?.prostgles?.tableConfigurator?.getColInfo({ table: this.name, col: c.name}) || {})
638
644
  }
639
645
  });
640
646
 
@@ -1898,10 +1904,9 @@ export class TableHandler extends ViewHandler {
1898
1904
  let data = this.prepareFieldValues(row, forcedData, allowedFields, fixIssues);
1899
1905
  const dataKeys = Object.keys(data);
1900
1906
 
1901
- if(!data || !dataKeys.length) {
1902
- // throw "missing/invalid data provided";
1903
- }
1904
- // let cs = new pgp.helpers.ColumnSet(this.columnSet.columns.filter(c => dataKeys.includes(c.name)), { table: this.name });
1907
+ dataKeys.map(col => {
1908
+ this.dboBuilder.prostgles?.tableConfigurator?.checkColVal({ table: this.name, col, value: data[col] });
1909
+ })
1905
1910
 
1906
1911
  return { data, allowedCols: this.columns.filter(c => dataKeys.includes(c.name)).map(c => c.name) }
1907
1912
  }
@@ -2188,7 +2193,8 @@ export class TableHandler extends ViewHandler {
2188
2193
  const keys = Object.keys(forcedData);
2189
2194
  if(keys.length){
2190
2195
  try {
2191
- const values = pgp.helpers.values(forcedData),
2196
+ const colset = new pgp.helpers.ColumnSet(this.columns.filter(c => keys.includes(c.name)).map(c => ({ name: c.name, cast: c.udt_name === "uuid"? c.udt_name : undefined }))),
2197
+ values = pgp.helpers.values(forcedData, colset),
2192
2198
  colNames = this.prepareSelect(keys, this.column_names);
2193
2199
  await this.db.any("EXPLAIN INSERT INTO " + this.escapedName + " (${colNames:raw}) SELECT * FROM ( VALUES ${values:raw} ) t WHERE FALSE;", { colNames, values })
2194
2200
  } catch(e){
@@ -6,12 +6,16 @@ import * as fs from 'fs';
6
6
  import * as FileType from "file-type";
7
7
  import * as sharp from "sharp";
8
8
 
9
- import { Prostgles } from './Prostgles';
9
+ import { DB, Prostgles } from './Prostgles';
10
10
  import { asName, AnyObject } from 'prostgles-types';
11
11
  import { TableHandler } from './DboBuilder';
12
12
 
13
13
  const HOUR = 3600 * 1000;
14
14
 
15
+ export const asSQLIdentifier = async (name: string, db: DB): Promise<string> => {
16
+ return (await db.one("select format('%I', $1) as name", [name]))?.name
17
+ }
18
+
15
19
  export type ImageOptions = {
16
20
  keepMetadata?: boolean;
17
21
  compression?:
@@ -300,7 +304,7 @@ export default class FileManager {
300
304
  return await this.s3Client.getSignedUrlPromise("getObject", params);
301
305
  }
302
306
 
303
- private parseSQLIdentifier = async (name: string ) => this.prostgles.dbo.sql<"value">("select format('%I', $1)", [name], { returnType: "value" } )
307
+ private parseSQLIdentifier = async (name: string ) => asSQLIdentifier(name, this.prostgles.db);// this.prostgles.dbo.sql<"value">("select format('%I', $1)", [name], { returnType: "value" } )
304
308
 
305
309
  init = async (prg: Prostgles) => {
306
310
  this.prostgles = prg;
package/lib/Prostgles.ts CHANGED
@@ -13,6 +13,8 @@ const version = pkgj.version;
13
13
  import AuthHandler, { ClientInfo, Auth } from "./AuthHandler";
14
14
  console.log("Add a basic auth mode where user and sessions table are created");
15
15
 
16
+ import TableConfigurator, { TableConfig } from "./TableConfig";
17
+
16
18
  import { get } from "./utils";
17
19
  import { DboBuilder, DbHandler, TableHandler, ViewHandler, isPlainObject, LocalParams } from "./DboBuilder";
18
20
  import { PubSubManager, DEFAULT_SYNC_BATCH_SIZE, asValue } from "./PubSubManager";
@@ -404,6 +406,7 @@ export type ProstglesInitOptions<DBO = DbHandler> = {
404
406
  onNotice?: (msg: any) => void;
405
407
  i18n?: I18N_CONFIG<AnyObject>;
406
408
  fileTable?: FileTableConfig;
409
+ tableConfig?: TableConfig;
407
410
  }
408
411
 
409
412
  // interface ISocketSetup {
@@ -474,6 +477,8 @@ export class Prostgles<DBO = DbHandler> {
474
477
 
475
478
  fileManager?: FileManager;
476
479
 
480
+ tableConfigurator?: TableConfigurator;
481
+
477
482
  isMedia(tableName: string){
478
483
  return this.opts?.fileTable?.tableName === tableName;
479
484
  }
@@ -488,7 +493,7 @@ export class Prostgles<DBO = DbHandler> {
488
493
  "onReady", "dbConnection", "dbOptions", "publishMethods", "io",
489
494
  "publish", "schema", "publishRawSQL", "wsChannelNamePrefix", "onSocketConnect",
490
495
  "onSocketDisconnect", "sqlFilePath", "auth", "DEBUG_MODE", "watchSchema",
491
- "i18n", "fileTable"
496
+ "i18n", "fileTable", "tableConfig"
492
497
  ];
493
498
  const unknownParams = Object.keys(params).filter((key: string) => !(config as string[]).includes(key))
494
499
  if(unknownParams.length){
@@ -615,6 +620,13 @@ export class Prostgles<DBO = DbHandler> {
615
620
  }
616
621
 
617
622
  try {
623
+
624
+ await this.refreshDBO();
625
+ if(this.opts.tableConfig){
626
+ this.tableConfigurator = new TableConfigurator(this as any);
627
+ await this.tableConfigurator.init();
628
+ }
629
+
618
630
  /* 3. Make DBO object from all tables and views */
619
631
  await this.refreshDBO();
620
632
 
@@ -472,8 +472,8 @@ export const FUNCTIONS: FunctionSpec[] = [
472
472
  let a1 = asValue(args[0]),
473
473
  a2 = asNameAlias(args[1], tableAlias);
474
474
  if(funcName === "position_lower"){
475
- a1 = `LOWER(${a1})`;
476
- a2 = `LOWER(${a2})`;
475
+ a1 = `LOWER(${a1}::text)`;
476
+ a2 = `LOWER(${a2}::text)`;
477
477
  }
478
478
  return `position( ${a1} IN ${a2} )`;
479
479
  }
@@ -0,0 +1,117 @@
1
+ import { AnyObject, asName } from "prostgles-types";
2
+ import { LocalParams } from "./DboBuilder";
3
+ import { asSQLIdentifier } from "./FileManager";
4
+ import { DB, DbHandler, Prostgles } from "./Prostgles";
5
+
6
+ type ColExtraInfo = {
7
+ min?: string | number;
8
+ max?: string | number;
9
+ hint?: string;
10
+ };
11
+
12
+ /**
13
+ * Helper utility to create lookup tables for TEXT columns
14
+ */
15
+ export type TableConfig<LANG_IDS = { en: 1, ro: 1 }> = {
16
+ [table_name: string]: {
17
+ [column_name: string]: {
18
+
19
+ /**
20
+ * Will add these values to .getColumns() result
21
+ */
22
+ info?: ColExtraInfo;
23
+
24
+ /**
25
+ * Will create a lookup table that this column will reference
26
+ */
27
+ lookupValues?: {
28
+ nullable?: boolean;
29
+ values: {
30
+ id: string;
31
+ i18n?: {
32
+ [lang_id in keyof LANG_IDS]: string
33
+ }
34
+ }[]
35
+ }
36
+ }
37
+ }
38
+ }
39
+
40
+ /**
41
+ * Will be run between initSQL and fileTable
42
+ */
43
+ export default class TableConfigurator {
44
+
45
+ config?: TableConfig;
46
+ dbo: DbHandler;
47
+ db: DB;
48
+ sidKeyName: string;
49
+ prostgles: Prostgles
50
+
51
+ constructor(prostgles: Prostgles){
52
+ this.config = prostgles.opts.tableConfig;
53
+ this.dbo = prostgles.dbo;
54
+ this.db = prostgles.db;
55
+ this.prostgles = prostgles;
56
+ }
57
+
58
+ getColInfo = (params: {col: string, table: string}): ColExtraInfo | undefined => {
59
+ return this.config[params.table]?.[params.col]?.info;
60
+ }
61
+
62
+ checkColVal = (params: {col: string, table: string, value: any }): void => {
63
+ const conf = this.getColInfo(params);
64
+ if(conf){
65
+ const { value } = params;
66
+ const { min, max } = conf;
67
+ if(min !== undefined && value !== undefined && value < min) throw `${params.col} must be less than ${min}`
68
+ if(max !== undefined && value !== undefined && value > max) throw `${params.col} must be greater than ${max}`
69
+ }
70
+ }
71
+
72
+ async init(){
73
+ await Promise.all(Object.keys(this.config).map(async tableName => {
74
+ if(!this.dbo?.[tableName])throw "Table not found: " + tableName;
75
+
76
+ const tCols = this.dbo?.[tableName]?.columns;
77
+ const tConf = this.config[tableName];
78
+
79
+ await Promise.all(Object.keys(tConf).map(async colName => {
80
+ const colConf = tConf[colName];
81
+ const lookupConf = colConf.lookupValues;
82
+ const rows = lookupConf?.values;
83
+ if(rows?.length){
84
+
85
+ const keys = Object.keys(rows?.[0]?.i18n || {})
86
+ const lookup_table_name = await asSQLIdentifier(`lookup_${tableName}_${colName}`, this.db)
87
+ // const lookup_table_name = asName(`lookup_${tableName}_${colName}`);
88
+
89
+ await this.db.any(`CREATE TABLE IF NOT EXISTS ${lookup_table_name} (
90
+ id TEXT PRIMARY KEY
91
+ ${keys.length? (", " + keys.map(k => asName(k) + " TEXT ").join(", ")) : ""}
92
+ )`);
93
+
94
+ if(!tCols.find(c => c.name === colName)){
95
+ await this.db.any(`ALTER TABLE ${asName(tableName)} ADD COLUMN ${asName(colName)} TEXT ${!lookupConf.nullable? " NOT NULL " : ""} REFERENCES ${lookup_table_name} (id)`)
96
+ };
97
+
98
+ await this.prostgles.refreshDBO();
99
+
100
+ const lcols = await this.dbo[lookup_table_name].columns;
101
+ const missing_lcols = keys.filter(k => !lcols.find(lc => lc.name === k));
102
+
103
+ if(missing_lcols.length){
104
+ await this.db.any(`ALTER TABLE ${lookup_table_name} ${missing_lcols.map(c => `ADD COLUMN ${c} TEXT `).join(", ")}`)
105
+ }
106
+
107
+ await this.dbo[lookup_table_name].insert(
108
+ rows.map(r => ({ id: r.id, ...r.i18n })),
109
+ { onConflictDoNothing: true }
110
+ );
111
+
112
+ console.log(`TableConfig: Created ${lookup_table_name}(id) for ${tableName}(${asName(colName)})`)
113
+ }
114
+ }))
115
+ }))
116
+ }
117
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prostgles-server",
3
- "version": "2.0.13",
3
+ "version": "2.0.17",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -29,7 +29,7 @@
29
29
  "bluebird": "^3.7.2",
30
30
  "file-type": "^16.5.3",
31
31
  "pg-promise": "^10.9.5",
32
- "prostgles-types": "^1.5.102",
32
+ "prostgles-types": "^1.5.103",
33
33
  "sharp": "^0.29.1"
34
34
  },
35
35
  "devDependencies": {
@@ -115,6 +115,9 @@ async function client_only(db, auth, log, methods) {
115
115
  /* Validated insert */
116
116
  const expectB = await db.insert_rules.insert({ name: "a" }, { returning: "*" });
117
117
  assert_1.strict.deepStrictEqual(expectB, { name: "b" }, "Validated insert failed");
118
+ /* forced UUID insert */
119
+ const row = await db.uuid_text.insert({}, { returning: "*" });
120
+ assert_1.strict.equal(row.id, 'c81089e1-c4c1-45d7-a73d-e2d613cb7c3e');
118
121
  await testRealtime();
119
122
  // auth.login({ username: "john", password: "secret" });
120
123
  // await tout();
@@ -139,6 +139,10 @@ export default async function client_only(db: DBHandlerClient, auth: Auth, log:
139
139
  const expectB = await db.insert_rules.insert({ name: "a" }, { returning: "*" });
140
140
  assert.deepStrictEqual(expectB, { name: "b" }, "Validated insert failed");
141
141
 
142
+ /* forced UUID insert */
143
+ const row: any = await db.uuid_text.insert({}, {returning: "*"});
144
+ assert.equal(row.id, 'c81089e1-c4c1-45d7-a73d-e2d613cb7c3e')
145
+
142
146
  await testRealtime();
143
147
 
144
148
  // auth.login({ username: "john", password: "secret" });
@@ -30,6 +30,11 @@ export type I18n_languages = {
30
30
  "label"?: string;
31
31
  "label_en"?: string;
32
32
  }
33
+ export type Insert_rules = {
34
+ "id"?: number;
35
+ "name"?: string;
36
+ "added"?: Date;
37
+ }
33
38
  export type Item_children = {
34
39
  "id"?: number;
35
40
  "item_id"?: number;
@@ -67,6 +72,7 @@ export type Items4_pub = {
67
72
  export type Items_m1 = {
68
73
  "id"?: number;
69
74
  "name"?: string;
75
+ "name_type"?: string;
70
76
  }
71
77
  export type Items_with_media = {
72
78
  "id"?: number;
@@ -82,6 +88,11 @@ export type Lookup_experience_types = {
82
88
  "en"?: string;
83
89
  "ro"?: string;
84
90
  }
91
+ export type Lookup_items_m1_name_type = {
92
+ "id"?: string;
93
+ "en"?: string;
94
+ "ro"?: string;
95
+ }
85
96
  export type Lookup_settled_status = {
86
97
  "id"?: string;
87
98
  "en"?: string;
@@ -184,6 +195,10 @@ export type Usr = {
184
195
  "is_active"?: boolean;
185
196
  "age"?: number;
186
197
  }
198
+ export type Uuid_text = {
199
+ "id"?: string;
200
+ "name"?: string;
201
+ }
187
202
  export type V_items = {
188
203
  "id"?: number;
189
204
  "name"?: string;
@@ -207,6 +222,7 @@ export type JoinMakerTables = {
207
222
  "items_with_media": JoinMaker<Items_with_media>;
208
223
  "items_with_one_media": JoinMaker<Items_with_one_media>;
209
224
  "lookup_experience_types": JoinMaker<Lookup_experience_types>;
225
+ "lookup_items_m1_name_type": JoinMaker<Lookup_items_m1_name_type>;
210
226
  "lookup_status": JoinMaker<Lookup_status>;
211
227
  "media": JoinMaker<Media>;
212
228
  "prostgles_lookup_media_items_m1": JoinMaker<Prostgles_lookup_media_items_m1>;
@@ -230,6 +246,7 @@ export type DBObj = {
230
246
  "*": TableHandler<D_42>
231
247
  "ex_j_ins": TableHandler<Ex_j_ins>
232
248
  "i18n_languages": TableHandler<I18n_languages>
249
+ "insert_rules": TableHandler<Insert_rules>
233
250
  "item_children": TableHandler<Item_children>
234
251
  "items": TableHandler<Items>
235
252
  "items2": TableHandler<Items2>
@@ -240,6 +257,7 @@ export type DBObj = {
240
257
  "items_with_media": TableHandler<Items_with_media>
241
258
  "items_with_one_media": TableHandler<Items_with_one_media>
242
259
  "lookup_experience_types": TableHandler<Lookup_experience_types>
260
+ "lookup_items_m1_name_type": TableHandler<Lookup_items_m1_name_type>
243
261
  "lookup_settled_status": TableHandler<Lookup_settled_status>
244
262
  "lookup_status": TableHandler<Lookup_status>
245
263
  "media": TableHandler<Media>
@@ -260,6 +278,7 @@ export type DBObj = {
260
278
  "tt1": TableHandler<Tt1>
261
279
  "tttt": TableHandler<Tttt>
262
280
  "usr": TableHandler<Usr>
281
+ "uuid_text": TableHandler<Uuid_text>
263
282
  "v_items": ViewHandler<V_items>
264
283
  "various": TableHandler<Various>
265
284
  "various_nested": TableHandler<Various_nested>
@@ -286,6 +305,9 @@ export type I18N_DBO_CONFIG<LANG_IDS = { en: 1, fr: 1 }> = {
286
305
  "i18n_languages": {
287
306
  [key in "id" | "label" | "label_en"]: { [lang_id in keyof LANG_IDS]: string };
288
307
  };
308
+ "insert_rules": {
309
+ [key in "id" | "name" | "added"]: { [lang_id in keyof LANG_IDS]: string };
310
+ };
289
311
  "item_children": {
290
312
  [key in "id" | "item_id" | "name" | "tst"]: { [lang_id in keyof LANG_IDS]: string };
291
313
  };
@@ -305,7 +327,7 @@ export type I18N_DBO_CONFIG<LANG_IDS = { en: 1, fr: 1 }> = {
305
327
  [key in "id" | "public" | "name" | "added"]: { [lang_id in keyof LANG_IDS]: string };
306
328
  };
307
329
  "items_m1": {
308
- [key in "id" | "name"]: { [lang_id in keyof LANG_IDS]: string };
330
+ [key in "id" | "name" | "name_type"]: { [lang_id in keyof LANG_IDS]: string };
309
331
  };
310
332
  "items_with_media": {
311
333
  [key in "id" | "name"]: { [lang_id in keyof LANG_IDS]: string };
@@ -316,6 +338,9 @@ export type I18N_DBO_CONFIG<LANG_IDS = { en: 1, fr: 1 }> = {
316
338
  "lookup_experience_types": {
317
339
  [key in "id" | "en" | "ro"]: { [lang_id in keyof LANG_IDS]: string };
318
340
  };
341
+ "lookup_items_m1_name_type": {
342
+ [key in "id" | "en" | "ro"]: { [lang_id in keyof LANG_IDS]: string };
343
+ };
319
344
  "lookup_settled_status": {
320
345
  [key in "id" | "en" | "ro"]: { [lang_id in keyof LANG_IDS]: string };
321
346
  };
@@ -376,6 +401,9 @@ export type I18N_DBO_CONFIG<LANG_IDS = { en: 1, fr: 1 }> = {
376
401
  "usr": {
377
402
  [key in "id" | "status" | "msg" | "added" | "is_active" | "age"]: { [lang_id in keyof LANG_IDS]: string };
378
403
  };
404
+ "uuid_text": {
405
+ [key in "id" | "name"]: { [lang_id in keyof LANG_IDS]: string };
406
+ };
379
407
  "v_items": {
380
408
  [key in "id" | "name"]: { [lang_id in keyof LANG_IDS]: string };
381
409
  };
@@ -76,6 +76,14 @@ const log = (msg, extra) => {
76
76
  items_with_one_media: {
77
77
  insert: "*"
78
78
  },
79
+ uuid_text: {
80
+ insert: {
81
+ fields: "*",
82
+ forcedData: {
83
+ id: 'c81089e1-c4c1-45d7-a73d-e2d613cb7c3e'
84
+ }
85
+ }
86
+ }
79
87
  // v_various: "*",
80
88
  };
81
89
  },
@@ -101,6 +109,18 @@ const log = (msg, extra) => {
101
109
  }
102
110
  },
103
111
  transactions: true,
112
+ tableConfig: {
113
+ items_m1: {
114
+ lookupColumns: {
115
+ name_type: {
116
+ values: [
117
+ { id: "type 1", i18n: { en: "hehe", ro: "hihi" } },
118
+ { id: "type 2" }
119
+ ]
120
+ }
121
+ }
122
+ }
123
+ },
104
124
  onReady: async (db, _db) => {
105
125
  // console.log("onReady", Object.keys(db))
106
126
  app.get('*', function (req, res) {
@@ -121,15 +141,21 @@ const log = (msg, extra) => {
121
141
  // console.log(res)
122
142
  // console.log(await db.various_nested.insert({ various: {} }, {returning: "*"}))
123
143
  // console.log(await db.various.insert({ various_nested: {} }, {returning: "*"}))
124
- let str = "This is a string", data = Buffer.from(str, "utf-8"), mediaFile = { data, name: "sample_file.txt" };
144
+ // let str = "This is a string",
145
+ // data = Buffer.from(str, "utf-8"),
146
+ // mediaFile = { data, name: "sample_file.txt" }
125
147
  // const file = await db.media.insert(mediaFile, { returning: "*" });
126
- await db.items_with_one_media.delete();
127
- await db.media.delete();
148
+ // await db.items_with_one_media.delete();
149
+ // await db.media.delete();
128
150
  // const items_with_one_media = await db.items_m1.insert({ name: "items_m1", items_with_one_media: [{ name: "sample_file.txt", media: [mediaFile] }]}, { returning: "*" });
129
151
  // console.log(await await db.items_m1.find())
130
152
  // console.log(await await db.items_with_one_media.find())
131
153
  // console.log(await await db.media.find());
132
154
  // throw items_with_one_media;
155
+ const r = await db.uuid_text.insert({ id: 'c81089e1-c4c1-45d7-a73d-e2d613cb7c3e' }, { returning: "*" });
156
+ await db.uuid_text.update({ id: 'c81089e1-c4c1-45d7-a73d-e2d613cb7c3e' }, { id: 'c81089e1-c4c1-45d7-a73d-e2d613cb7c3e' });
157
+ console.log(await db.uuid_text.find({ "id.$ilike": 'c81089e1-c4c1-45d7-a73d-e2d613cb7c3e' }));
158
+ throw r;
133
159
  }
134
160
  catch (e) {
135
161
  console.error(e);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"}
@@ -82,6 +82,14 @@ prostgles<DBObj>({
82
82
  items_with_one_media: {
83
83
  insert: "*"
84
84
  },
85
+ uuid_text: {
86
+ insert: {
87
+ fields: "*",
88
+ forcedData: {
89
+ id: 'c81089e1-c4c1-45d7-a73d-e2d613cb7c3e'
90
+ }
91
+ }
92
+ }
85
93
  // v_various: "*",
86
94
  };
87
95
 
@@ -108,6 +116,20 @@ prostgles<DBObj>({
108
116
  }
109
117
  },
110
118
  transactions: true,
119
+ tableConfig: {
120
+ items_m1: {
121
+ lookupColumns:{
122
+
123
+ name_type: {
124
+ values: [
125
+ { id: "type 1", i18n: { en: "hehe", ro: "hihi" } },
126
+ { id: "type 2" }
127
+ ]
128
+ }
129
+
130
+ }
131
+ }
132
+ },
111
133
  onReady: async (db, _db: any) => {
112
134
 
113
135
  // console.log("onReady", Object.keys(db))
@@ -135,14 +157,14 @@ prostgles<DBObj>({
135
157
  // console.log(await db.various.insert({ various_nested: {} }, {returning: "*"}))
136
158
 
137
159
 
138
- let str = "This is a string",
139
- data = Buffer.from(str, "utf-8"),
140
- mediaFile = { data, name: "sample_file.txt" }
160
+ // let str = "This is a string",
161
+ // data = Buffer.from(str, "utf-8"),
162
+ // mediaFile = { data, name: "sample_file.txt" }
141
163
 
142
164
  // const file = await db.media.insert(mediaFile, { returning: "*" });
143
165
 
144
- await db.items_with_one_media.delete();
145
- await db.media.delete();
166
+ // await db.items_with_one_media.delete();
167
+ // await db.media.delete();
146
168
  // const items_with_one_media = await db.items_m1.insert({ name: "items_m1", items_with_one_media: [{ name: "sample_file.txt", media: [mediaFile] }]}, { returning: "*" });
147
169
  // console.log(await await db.items_m1.find())
148
170
  // console.log(await await db.items_with_one_media.find())
@@ -150,6 +172,13 @@ prostgles<DBObj>({
150
172
 
151
173
  // throw items_with_one_media;
152
174
 
175
+ const r = await db.uuid_text.insert({id: 'c81089e1-c4c1-45d7-a73d-e2d613cb7c3e' }, { returning: "*"});
176
+ await db.uuid_text.update({ id: 'c81089e1-c4c1-45d7-a73d-e2d613cb7c3e'}, { id: 'c81089e1-c4c1-45d7-a73d-e2d613cb7c3e'});
177
+ console.log(
178
+ await db.uuid_text.find({ "id.$ilike": 'c81089e1-c4c1-45d7-a73d-e2d613cb7c3e' })
179
+ )
180
+ throw r;
181
+
153
182
  } catch(e){
154
183
  console.error(e)
155
184
  }
@@ -9,6 +9,12 @@ CREATE TABLE IF NOT EXISTS various_nested (
9
9
  );
10
10
 
11
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
+
12
18
  DROP TABLE IF EXISTS items_m1 CASCADE;
13
19
  CREATE TABLE IF NOT EXISTS items_m1 (
14
20
  id SERIAL PRIMARY KEY,
@@ -46,6 +46,10 @@ async function isomorphic(db) {
46
46
  await db.items4_pub.delete({});
47
47
  /* Access controlled */
48
48
  await db.items4.delete({});
49
+ // await tryRun("UUID data", async () => {
50
+ // const r = await db.uuid_text.insert({}, { returning: "*"});
51
+ // throw r;
52
+ // })
49
53
  // setTimeout(async () => {
50
54
  // await db.any("DROP TABLE IF EXISTS tt; CREATE TABLE tt(id serial);");
51
55
  // }, 500)
@@ -73,7 +77,7 @@ async function isomorphic(db) {
73
77
  // console.log(JSON.stringify(res, null, 2))
74
78
  assert_1.strict.deepStrictEqual(res, [
75
79
  {
76
- "label": "id",
80
+ "label": "Id",
77
81
  "name": "id",
78
82
  "data_type": "integer",
79
83
  "udt_name": "int4",
@@ -93,7 +97,7 @@ async function isomorphic(db) {
93
97
  "delete": true
94
98
  },
95
99
  {
96
- "label": "tr1_id",
100
+ "label": "Tr1 id",
97
101
  "name": "tr1_id",
98
102
  "data_type": "integer",
99
103
  "udt_name": "int4",
@@ -28,6 +28,12 @@ export default async function isomorphic(db: Partial<DbHandler> | Partial<DBHand
28
28
  /* Access controlled */
29
29
  await db.items4.delete({ });
30
30
 
31
+
32
+ // await tryRun("UUID data", async () => {
33
+ // const r = await db.uuid_text.insert({}, { returning: "*"});
34
+ // throw r;
35
+ // })
36
+
31
37
  // setTimeout(async () => {
32
38
  // await db.any("DROP TABLE IF EXISTS tt; CREATE TABLE tt(id serial);");
33
39
 
@@ -64,7 +70,7 @@ export default async function isomorphic(db: Partial<DbHandler> | Partial<DBHand
64
70
  res,
65
71
  [
66
72
  {
67
- "label": "id",
73
+ "label": "Id",
68
74
  "name": "id",
69
75
  "data_type": "integer",
70
76
  "udt_name": "int4",
@@ -84,7 +90,7 @@ export default async function isomorphic(db: Partial<DbHandler> | Partial<DBHand
84
90
  "delete": true
85
91
  },
86
92
  {
87
- "label": "tr1_id",
93
+ "label": "Tr1 id",
88
94
  "name": "tr1_id",
89
95
  "data_type": "integer",
90
96
  "udt_name": "int4",