prostgles-server 2.0.157 → 2.0.158

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.
@@ -45,9 +45,8 @@ function tryRunP(desc, func, log) {
45
45
  await func(rv, rj);
46
46
  }
47
47
  catch (err) {
48
- log?.(JSON.stringify(err));
48
+ log?.(`${desc} failed: ` + JSON.stringify(err));
49
49
  setTimeout(() => {
50
- log?.("Throw err");
51
50
  throw err;
52
51
  }, 1000);
53
52
  }
@@ -65,13 +64,6 @@ async function isomorphic(db) {
65
64
  await db.items2.delete({});
66
65
  await db.items.delete({});
67
66
  }
68
- // await tryRun("UUID data", async () => {
69
- // const r = await db.uuid_text.insert({}, { returning: "*"});
70
- // throw r;
71
- // })
72
- // setTimeout(async () => {
73
- // await db.any("DROP TABLE IF EXISTS tt; CREATE TABLE tt(id serial);");
74
- // }, 500)
75
67
  await tryRun("Prepare data", async () => {
76
68
  await db.items.insert([{ name: "a" }, { name: "a" }, { name: "b" }]);
77
69
  console.log(await db.items.find());
@@ -419,244 +411,199 @@ async function isomorphic(db) {
419
411
  console.log("TODO: socket.io stringifies dates");
420
412
  });
421
413
  await tryRun("Postgis examples", async () => {
422
- await tryRun("Postgis examples", async () => {
423
- await db.shapes.delete();
424
- const p1 = { ST_GeomFromText: ["POINT(-1 1)", 4326] }, p2 = { ST_GeomFromText: ["POINT(-2 2)", 4326] };
425
- await db.shapes.insert([
426
- { geom: p1, geog: p1 },
427
- { geom: p2, geog: p2 },
428
- ]);
429
- /** Basic functions and extent filters */
430
- const f = await db.shapes.findOne({ $and: [
431
- { "geom.&&.st_makeenvelope": [
432
- -3, 2,
433
- -2, 2
434
- ] },
435
- { "geog.&&.st_makeenvelope": [
436
- -3, 2,
437
- -2, 2
438
- ] }
439
- ]
440
- }, {
441
- select: {
442
- geomTxt: { "$ST_AsText": ["geom"] },
443
- geomGeo: { "$ST_AsGeoJSON": ["geom"] },
444
- },
445
- orderBy: "geom"
446
- });
447
- assert_1.strict.deepStrictEqual(f, {
448
- geomGeo: {
449
- coordinates: [-2, 2],
450
- type: 'Point'
451
- },
452
- geomTxt: 'POINT(-2 2)'
453
- });
454
- /**Aggregate functions */
455
- const aggs = await db.shapes.findOne({}, {
456
- select: {
457
- xMin: { "$ST_XMin_Agg": ["geom"] },
458
- xMax: { "$ST_XMax_Agg": ["geom"] },
459
- yMin: { "$ST_YMin_Agg": ["geom"] },
460
- yMax: { "$ST_YMax_Agg": ["geom"] },
461
- zMin: { "$ST_ZMin_Agg": ["geom"] },
462
- zMax: { "$ST_ZMax_Agg": ["geom"] },
463
- extent: { "$ST_Extent": ["geom"] },
464
- // extent3D: { "$ST_3DExtent": ["geom"] },
465
- },
466
- });
467
- assert_1.strict.deepStrictEqual(aggs, {
468
- xMax: -1,
469
- xMin: -2,
470
- yMax: 2,
471
- yMin: 1,
472
- zMax: 0,
473
- zMin: 0,
474
- extent: 'BOX(-2 1,-1 2)',
475
- // extent3D: 'BOX3D(-2 1 0,-1 2 6.952908662134e-310)' <-- looks like a value that will fail tests at some point
476
- });
414
+ await db.shapes.delete();
415
+ const p1 = { ST_GeomFromText: ["POINT(-1 1)", 4326] }, p2 = { ST_GeomFromText: ["POINT(-2 2)", 4326] };
416
+ await db.shapes.insert([
417
+ { geom: p1, geog: p1 },
418
+ { geom: p2, geog: p2 },
419
+ ]);
420
+ /** Basic functions and extent filters */
421
+ const f = await db.shapes.findOne({ $and: [
422
+ { "geom.&&.st_makeenvelope": [
423
+ -3, 2,
424
+ -2, 2
425
+ ] },
426
+ { "geog.&&.st_makeenvelope": [
427
+ -3, 2,
428
+ -2, 2
429
+ ] }
430
+ ]
431
+ }, {
432
+ select: {
433
+ geomTxt: { "$ST_AsText": ["geom"] },
434
+ geomGeo: { "$ST_AsGeoJSON": ["geom"] },
435
+ },
436
+ orderBy: "geom"
477
437
  });
478
- await tryRun("Local file upload", async () => {
479
- let str = "This is a string", data = Buffer.from(str, "utf-8"), mediaFile = { data, name: "sample_file.txt" };
480
- const file = await db.media.insert(mediaFile, { returning: "*" });
481
- const _data = fs.readFileSync(__dirname + "/server/media/" + file.name);
482
- assert_1.strict.equal(str, _data.toString('utf8'));
483
- await tryRun("Nested insert", async () => {
484
- const { name, media: { extension, content_type, original_name } } = await db.items_with_one_media.insert({ name: "somename.txt", media: mediaFile }, { returning: "*" });
485
- assert_1.strict.deepStrictEqual({ extension, content_type, original_name }, {
486
- extension: 'txt',
487
- content_type: 'text/plain',
488
- original_name: 'sample_file.txt',
489
- });
490
- // const _data = fs.readFileSync(__dirname + "/server/media/"+file.name);
491
- assert_1.strict.equal(name, "somename.txt");
492
- });
438
+ assert_1.strict.deepStrictEqual(f, {
439
+ geomGeo: {
440
+ coordinates: [-2, 2],
441
+ type: 'Point'
442
+ },
443
+ geomTxt: 'POINT(-2 2)'
493
444
  });
494
- await tryRun("Exists filter example", async () => {
495
- const fo = await db.items.findOne(), f = await db.items.find();
496
- assert_1.strict.deepStrictEqual(fo, { h: null, id: 1, name: 'a' }, "findOne query failed");
497
- assert_1.strict.deepStrictEqual(f[0], { h: null, id: 1, name: 'a' }, "findOne query failed");
445
+ /**Aggregate functions */
446
+ const aggs = await db.shapes.findOne({}, {
447
+ select: {
448
+ xMin: { "$ST_XMin_Agg": ["geom"] },
449
+ xMax: { "$ST_XMax_Agg": ["geom"] },
450
+ yMin: { "$ST_YMin_Agg": ["geom"] },
451
+ yMax: { "$ST_YMax_Agg": ["geom"] },
452
+ zMin: { "$ST_ZMin_Agg": ["geom"] },
453
+ zMax: { "$ST_ZMax_Agg": ["geom"] },
454
+ extent: { "$ST_Extent": ["geom"] },
455
+ // extent3D: { "$ST_3DExtent": ["geom"] },
456
+ },
498
457
  });
499
- await tryRun("Result size", async () => {
500
- const is75bits = await db.items.size({}, { select: { name: 1 } });
501
- assert_1.strict.equal(is75bits, '75', "Result size query failed");
458
+ assert_1.strict.deepStrictEqual(aggs, {
459
+ xMax: -1,
460
+ xMin: -2,
461
+ yMax: 2,
462
+ yMin: 1,
463
+ zMax: 0,
464
+ zMin: 0,
465
+ extent: 'BOX(-2 1,-1 2)',
466
+ // extent3D: 'BOX3D(-2 1 0,-1 2 6.952908662134e-310)' <-- looks like a value that will fail tests at some point
502
467
  });
503
- await tryRun("Basic exists", async () => {
504
- const expect0 = await db.items.count({
505
- $and: [
506
- { $exists: { items2: { name: "a" } } },
507
- { $exists: { items3: { name: "b" } } },
508
- ]
468
+ });
469
+ await tryRun("Local file upload", async () => {
470
+ let str = "This is a string", data = Buffer.from(str, "utf-8"), mediaFile = { data, name: "sample_file.txt" };
471
+ const file = await db.media.insert(mediaFile, { returning: "*" });
472
+ const _data = fs.readFileSync(__dirname + "/server/media/" + file.name);
473
+ assert_1.strict.equal(str, _data.toString('utf8'));
474
+ await tryRun("Nested insert", async () => {
475
+ const { name, media: { extension, content_type, original_name } } = await db.items_with_one_media.insert({ name: "somename.txt", media: mediaFile }, { returning: "*" });
476
+ assert_1.strict.deepStrictEqual({ extension, content_type, original_name }, {
477
+ extension: 'txt',
478
+ content_type: 'text/plain',
479
+ original_name: 'sample_file.txt',
509
480
  });
510
- assert_1.strict.equal(expect0, 0, "$exists query failed");
481
+ // const _data = fs.readFileSync(__dirname + "/server/media/"+file.name);
482
+ assert_1.strict.equal(name, "somename.txt");
511
483
  });
512
- await tryRun("Basic fts with shorthand notation", async () => {
513
- const res = await db.items.count({
514
- $and: [
515
- { $exists: { items2: { "name.@@.to_tsquery": ["a"] } } },
516
- { $exists: { items3: { "name.@@.to_tsquery": ["b"] } } },
517
- ]
518
- });
519
- // assert.deepStrictEqual(res, { name: 'a'})
520
- assert_1.strict.equal(res, 0, "FTS query failed");
484
+ });
485
+ await tryRun("Exists filter example", async () => {
486
+ const fo = await db.items.findOne(), f = await db.items.find();
487
+ assert_1.strict.deepStrictEqual(fo, { h: null, id: 1, name: 'a' }, "findOne query failed");
488
+ assert_1.strict.deepStrictEqual(f[0], { h: null, id: 1, name: 'a' }, "findOne query failed");
489
+ });
490
+ await tryRun("Result size", async () => {
491
+ const is75bits = await db.items.size({}, { select: { name: 1 } });
492
+ assert_1.strict.equal(is75bits, '75', "Result size query failed");
493
+ });
494
+ await tryRun("Basic exists", async () => {
495
+ const expect0 = await db.items.count({
496
+ $and: [
497
+ { $exists: { items2: { name: "a" } } },
498
+ { $exists: { items3: { name: "b" } } },
499
+ ]
521
500
  });
522
- await tryRun("Exists with shortest path wildcard filter example", async () => {
523
- const expect2 = await db.items.find({
524
- $and: [
525
- { $existsJoined: { "**.items3": { name: "a" } } },
526
- { $existsJoined: { items2: { name: "a" } } }
527
- ]
528
- });
529
- assert_1.strict.equal(expect2.length, 2, "$existsJoined query failed");
501
+ assert_1.strict.equal(expect0, 0, "$exists query failed");
502
+ });
503
+ await tryRun("Basic fts with shorthand notation", async () => {
504
+ const res = await db.items.count({
505
+ $and: [
506
+ { $exists: { items2: { "name.@@.to_tsquery": ["a"] } } },
507
+ { $exists: { items3: { "name.@@.to_tsquery": ["b"] } } },
508
+ ]
530
509
  });
531
- await tryRun("Exists with exact path filter example", async () => {
532
- const _expect2 = await db.items.find({
533
- $and: [
534
- // { "items2": { name: "a" } },
535
- // { "items2.items3": { name: "a" } },
536
- { $existsJoined: { items2: { name: "a" } } }
537
- ]
538
- });
539
- assert_1.strict.equal(_expect2.length, 2, "$existsJoined query failed");
510
+ // assert.deepStrictEqual(res, { name: 'a'})
511
+ assert_1.strict.equal(res, 0, "FTS query failed");
512
+ });
513
+ await tryRun("Exists with shortest path wildcard filter example", async () => {
514
+ const expect2 = await db.items.find({
515
+ $and: [
516
+ { $existsJoined: { "**.items3": { name: "a" } } },
517
+ { $existsJoined: { items2: { name: "a" } } }
518
+ ]
540
519
  });
541
- await tryRun("Not Exists with exact path filter example", async () => {
542
- const _expect1 = await db.items.find({
543
- $and: [
544
- // { "items2": { name: "a" } },
545
- // { "items2.items3": { name: "a" } },
546
- { $notExistsJoined: { items2: { name: "a" } } }
547
- ]
548
- });
549
- assert_1.strict.equal(_expect1.length, 1, "$notExistsJoined query failed");
520
+ assert_1.strict.equal(expect2.length, 2, "$existsJoined query failed");
521
+ });
522
+ await tryRun("Exists with exact path filter example", async () => {
523
+ const _expect2 = await db.items.find({
524
+ $and: [
525
+ // { "items2": { name: "a" } },
526
+ // { "items2.items3": { name: "a" } },
527
+ { $existsJoined: { items2: { name: "a" } } }
528
+ ]
550
529
  });
551
- /* Upsert */
552
- await tryRun("Upsert example", async () => {
553
- await db.items.upsert({ name: "tx" }, { name: "tx" });
554
- await db.items.upsert({ name: "tx" }, { name: "tx" });
555
- assert_1.strict.equal(await db.items.count({ name: "tx" }), 1, "upsert command failed");
530
+ assert_1.strict.equal(_expect2.length, 2, "$existsJoined query failed");
531
+ });
532
+ await tryRun("Not Exists with exact path filter example", async () => {
533
+ const _expect1 = await db.items.find({
534
+ $and: [
535
+ // { "items2": { name: "a" } },
536
+ // { "items2.items3": { name: "a" } },
537
+ { $notExistsJoined: { items2: { name: "a" } } }
538
+ ]
556
539
  });
557
- /* Joins example */
558
- await tryRun("Joins example", async () => {
559
- const items = await db.items.find({}, {
560
- select: {
561
- "*": 1,
562
- items3: "*",
563
- items22: db.leftJoin.items2({}, "*")
564
- }
565
- });
566
- if (!items.length || !items.every(it => Array.isArray(it.items3) && Array.isArray(it.items22))) {
567
- console.log(items[0].items3);
568
- throw "Joined select query failed";
540
+ assert_1.strict.equal(_expect1.length, 1, "$notExistsJoined query failed");
541
+ });
542
+ /* Upsert */
543
+ await tryRun("Upsert example", async () => {
544
+ await db.items.upsert({ name: "tx" }, { name: "tx" });
545
+ await db.items.upsert({ name: "tx" }, { name: "tx" });
546
+ assert_1.strict.equal(await db.items.count({ name: "tx" }), 1, "upsert command failed");
547
+ });
548
+ /* Joins example */
549
+ await tryRun("Joins example", async () => {
550
+ const items = await db.items.find({}, {
551
+ select: {
552
+ "*": 1,
553
+ items3: "*",
554
+ items22: db.leftJoin.items2({}, "*")
569
555
  }
570
556
  });
571
- /* Joins duplicate table example */
572
- await tryRun("Joins repeating table example", async () => {
573
- const items2 = await db.items.find({}, {
574
- select: {
575
- "*": 1,
576
- items2: "*"
577
- }
578
- });
579
- const items2j = await db.items.find({}, {
580
- select: {
581
- "*": 1,
582
- items2: "*",
583
- items2j: db.leftJoin.items2({}, "*")
584
- }
585
- });
586
- items2.forEach((d, i) => {
587
- assert_1.strict.deepStrictEqual(d.items2, items2j[i].items2, "Joins duplicate aliased table query failed");
588
- assert_1.strict.deepStrictEqual(d.items2, items2j[i].items2j, "Joins duplicate aliased table query failed");
589
- });
590
- });
591
- await tryRun("Join aggregate functions example", async () => {
592
- const singleShortHandAgg = await db.items.findOne({}, { select: { id: "$max" } });
593
- const singleAgg = await db.items.findOne({}, { select: { id: { "$max": ["id"] } } });
594
- assert_1.strict.deepStrictEqual(singleShortHandAgg, { id: 4 });
595
- assert_1.strict.deepStrictEqual(singleAgg, { id: 4 });
596
- const shortHandAggJoined = await db.items.findOne({ id: 4 }, { select: { id: 1, items2: { name: "$max" } } });
597
- assert_1.strict.deepStrictEqual(shortHandAggJoined, { id: 4, items2: [] });
598
- // console.log(JSON.stringify(shortHandAggJoined, null, 2));
599
- // throw 1;
600
- /* TODO joins & aggs */
601
- // const aggsJoined = await db.items.find(
602
- // {},
603
- // {
604
- // select: {
605
- // id: "$count",
606
- // name: 1,
607
- // items2: {
608
- // id: 1
609
- // }
610
- // },
611
- // orderBy: {
612
- // id: -1
613
- // }
614
- // }
615
- // );
616
- // console.log(JSON.stringify(aggsJoined, null, 2))
617
- // assert.deepStrictEqual(aggsJoined, [
618
- // {
619
- // "name": "a",
620
- // "items2": [
621
- // {
622
- // "id": 1
623
- // },
624
- // {
625
- // "id": 1
626
- // }
627
- // ],
628
- // "id": "2"
629
- // },
630
- // {
631
- // "name": "b",
632
- // "items2": [],
633
- // "id": "1"
634
- // },
635
- // {
636
- // "name": "tx",
637
- // "items2": [],
638
- // "id": "1"
639
- // }
640
- // ], "Joined aggregation query failed");
557
+ if (!items.length || !items.every(it => Array.isArray(it.items3) && Array.isArray(it.items22))) {
558
+ console.log(items[0].items3);
559
+ throw "Joined select query failed";
560
+ }
561
+ });
562
+ /* Joins duplicate table example */
563
+ await tryRun("Joins repeating table example", async () => {
564
+ const items2 = await db.items.find({}, {
565
+ select: {
566
+ "*": 1,
567
+ items2: "*"
568
+ }
641
569
  });
642
- /* $rowhash -> Custom column that returms md5(ctid + allowed select columns). Used in joins & CRUD to bypass PKey details */
643
- await tryRun("$rowhash example", async () => {
644
- const rowhash = await db.items.findOne({}, { select: { $rowhash: 1, "*": 1 } });
645
- const f = { $rowhash: rowhash.$rowhash };
646
- const rowhashView = await db.v_items.findOne({}, { select: { $rowhash: 1 } });
647
- const rh1 = await db.items.findOne({ $rowhash: rowhash.$rowhash }, { select: { $rowhash: 1 } });
648
- const rhView = await db.v_items.findOne({ $rowhash: rowhashView.$rowhash }, { select: { $rowhash: 1 } });
649
- // console.log({ rowhash, f });
650
- await db.items.update(f, { name: 'a' });
651
- // console.log(rowhash, rh1)
652
- // console.log(rowhashView, rhView)
653
- if (typeof rowhash.$rowhash !== "string" ||
654
- typeof rowhashView.$rowhash !== "string" ||
655
- rowhash.$rowhash !== rh1.$rowhash ||
656
- rowhashView.$rowhash !== rhView.$rowhash) {
657
- throw "$rowhash query failed";
570
+ const items2j = await db.items.find({}, {
571
+ select: {
572
+ "*": 1,
573
+ items2: "*",
574
+ items2j: db.leftJoin.items2({}, "*")
658
575
  }
659
576
  });
577
+ items2.forEach((d, i) => {
578
+ assert_1.strict.deepStrictEqual(d.items2, items2j[i].items2, "Joins duplicate aliased table query failed");
579
+ assert_1.strict.deepStrictEqual(d.items2, items2j[i].items2j, "Joins duplicate aliased table query failed");
580
+ });
581
+ });
582
+ await tryRun("Join aggregate functions example", async () => {
583
+ const singleShortHandAgg = await db.items.findOne({}, { select: { id: "$max" } });
584
+ const singleAgg = await db.items.findOne({}, { select: { id: { "$max": ["id"] } } });
585
+ assert_1.strict.deepStrictEqual(singleShortHandAgg, { id: 4 });
586
+ assert_1.strict.deepStrictEqual(singleAgg, { id: 4 });
587
+ const shortHandAggJoined = await db.items.findOne({ id: 4 }, { select: { id: 1, items2: { name: "$max" } } });
588
+ assert_1.strict.deepStrictEqual(shortHandAggJoined, { id: 4, items2: [] });
589
+ });
590
+ /* $rowhash -> Custom column that returms md5(ctid + allowed select columns). Used in joins & CRUD to bypass PKey details */
591
+ await tryRun("$rowhash example", async () => {
592
+ const rowhash = await db.items.findOne({}, { select: { $rowhash: 1, "*": 1 } });
593
+ const f = { $rowhash: rowhash.$rowhash };
594
+ const rowhashView = await db.v_items.findOne({}, { select: { $rowhash: 1 } });
595
+ const rh1 = await db.items.findOne({ $rowhash: rowhash.$rowhash }, { select: { $rowhash: 1 } });
596
+ const rhView = await db.v_items.findOne({ $rowhash: rowhashView.$rowhash }, { select: { $rowhash: 1 } });
597
+ // console.log({ rowhash, f });
598
+ await db.items.update(f, { name: 'a' });
599
+ // console.log(rowhash, rh1)
600
+ // console.log(rowhashView, rhView)
601
+ if (typeof rowhash.$rowhash !== "string" ||
602
+ typeof rowhashView.$rowhash !== "string" ||
603
+ rowhash.$rowhash !== rh1.$rowhash ||
604
+ rowhashView.$rowhash !== rhView.$rowhash) {
605
+ throw "$rowhash query failed";
606
+ }
660
607
  });
661
608
  }
662
609
  exports.default = isomorphic;
@@ -19,11 +19,10 @@ export async function tryRun(desc: string, func: () => any, log?: Function){
19
19
  export function tryRunP(desc: string, func: (resolve: any, reject: any) => any, log?: Function){
20
20
  return new Promise(async (rv, rj) => {
21
21
  try {
22
- await func(rv, rj)
22
+ await func(rv, rj);
23
23
  } catch(err: any){
24
- log?.(JSON.stringify(err));
24
+ log?.(`${desc} failed: ` + JSON.stringify(err));
25
25
  setTimeout(() => {
26
- log?.("Throw err");
27
26
  throw err;
28
27
  }, 1000)
29
28
  }
@@ -45,17 +44,6 @@ export default async function isomorphic(db: Partial<DbHandler> | Partial<DBHand
45
44
  await db.items.delete({ });
46
45
 
47
46
  }
48
-
49
-
50
- // await tryRun("UUID data", async () => {
51
- // const r = await db.uuid_text.insert({}, { returning: "*"});
52
- // throw r;
53
- // })
54
-
55
- // setTimeout(async () => {
56
- // await db.any("DROP TABLE IF EXISTS tt; CREATE TABLE tt(id serial);");
57
-
58
- // }, 500)
59
47
 
60
48
 
61
49
  await tryRun("Prepare data", async () => {
@@ -471,8 +459,6 @@ export default async function isomorphic(db: Partial<DbHandler> | Partial<DBHand
471
459
  console.log("TODO: socket.io stringifies dates")
472
460
  });
473
461
 
474
- await tryRun("Postgis examples", async () => {
475
-
476
462
  await tryRun("Postgis examples", async () => {
477
463
  await db.shapes.delete();
478
464
  const p1 = { ST_GeomFromText: ["POINT(-1 1)", 4326] },
@@ -693,51 +679,6 @@ export default async function isomorphic(db: Partial<DbHandler> | Partial<DBHand
693
679
  { select: { id: 1, items2: { name: "$max" } }}
694
680
  );
695
681
  assert.deepStrictEqual(shortHandAggJoined, { id: 4, items2: [] });
696
- // console.log(JSON.stringify(shortHandAggJoined, null, 2));
697
- // throw 1;
698
-
699
- /* TODO joins & aggs */
700
- // const aggsJoined = await db.items.find(
701
- // {},
702
- // {
703
- // select: {
704
- // id: "$count",
705
- // name: 1,
706
- // items2: {
707
- // id: 1
708
- // }
709
- // },
710
- // orderBy: {
711
- // id: -1
712
- // }
713
- // }
714
- // );
715
- // console.log(JSON.stringify(aggsJoined, null, 2))
716
- // assert.deepStrictEqual(aggsJoined, [
717
- // {
718
- // "name": "a",
719
- // "items2": [
720
- // {
721
- // "id": 1
722
- // },
723
- // {
724
- // "id": 1
725
- // }
726
- // ],
727
- // "id": "2"
728
- // },
729
- // {
730
- // "name": "b",
731
- // "items2": [],
732
- // "id": "1"
733
- // },
734
- // {
735
- // "name": "tx",
736
- // "items2": [],
737
- // "id": "1"
738
- // }
739
- // ], "Joined aggregation query failed");
740
-
741
682
  });
742
683
 
743
684