@juit/pgproxy-types 1.0.0
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 +14 -0
- package/dist/index.cjs +48 -0
- package/dist/index.cjs.map +6 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.mjs +15 -0
- package/dist/index.mjs.map +6 -0
- package/dist/oids.cjs +163 -0
- package/dist/oids.cjs.map +6 -0
- package/dist/oids.d.ts +74 -0
- package/dist/oids.mjs +138 -0
- package/dist/oids.mjs.map +6 -0
- package/dist/parsers/array.cjs +140 -0
- package/dist/parsers/array.cjs.map +6 -0
- package/dist/parsers/array.d.ts +31 -0
- package/dist/parsers/array.mjs +111 -0
- package/dist/parsers/array.mjs.map +6 -0
- package/dist/parsers/basic.cjs +69 -0
- package/dist/parsers/basic.cjs.map +6 -0
- package/dist/parsers/basic.d.ts +15 -0
- package/dist/parsers/basic.mjs +28 -0
- package/dist/parsers/basic.mjs.map +6 -0
- package/dist/parsers/bytea.cjs +68 -0
- package/dist/parsers/bytea.cjs.map +6 -0
- package/dist/parsers/bytea.d.ts +7 -0
- package/dist/parsers/bytea.mjs +43 -0
- package/dist/parsers/bytea.mjs.map +6 -0
- package/dist/parsers/geometric.cjs +86 -0
- package/dist/parsers/geometric.cjs.map +6 -0
- package/dist/parsers/geometric.d.ts +27 -0
- package/dist/parsers/geometric.mjs +58 -0
- package/dist/parsers/geometric.mjs.map +6 -0
- package/dist/parsers/interval.cjs +50 -0
- package/dist/parsers/interval.cjs.map +6 -0
- package/dist/parsers/interval.d.ts +23 -0
- package/dist/parsers/interval.mjs +14 -0
- package/dist/parsers/interval.mjs.map +6 -0
- package/dist/parsers/range.cjs +97 -0
- package/dist/parsers/range.cjs.map +6 -0
- package/dist/parsers/range.d.ts +54 -0
- package/dist/parsers/range.mjs +50 -0
- package/dist/parsers/range.mjs.map +6 -0
- package/dist/parsers.cjs +104 -0
- package/dist/parsers.cjs.map +6 -0
- package/dist/parsers.d.ts +8 -0
- package/dist/parsers.mjs +86 -0
- package/dist/parsers.mjs.map +6 -0
- package/dist/registry.cjs +189 -0
- package/dist/registry.cjs.map +6 -0
- package/dist/registry.d.ts +81 -0
- package/dist/registry.mjs +200 -0
- package/dist/registry.mjs.map +6 -0
- package/dist/serializers/bytea.cjs +52 -0
- package/dist/serializers/bytea.cjs.map +6 -0
- package/dist/serializers/bytea.d.ts +13 -0
- package/dist/serializers/bytea.mjs +27 -0
- package/dist/serializers/bytea.mjs.map +6 -0
- package/dist/serializers/date.cjs +46 -0
- package/dist/serializers/date.cjs.map +6 -0
- package/dist/serializers/date.d.ts +2 -0
- package/dist/serializers/date.mjs +21 -0
- package/dist/serializers/date.mjs.map +6 -0
- package/dist/serializers.cjs +119 -0
- package/dist/serializers.cjs.map +6 -0
- package/dist/serializers.d.ts +20 -0
- package/dist/serializers.mjs +92 -0
- package/dist/serializers.mjs.map +6 -0
- package/package.json +49 -0
- package/src/index.ts +13 -0
- package/src/oids.ts +90 -0
- package/src/parsers/array.ts +176 -0
- package/src/parsers/basic.ts +55 -0
- package/src/parsers/bytea.ts +77 -0
- package/src/parsers/geometric.ts +96 -0
- package/src/parsers/interval.ts +40 -0
- package/src/parsers/range.ts +128 -0
- package/src/parsers.ts +57 -0
- package/src/registry.ts +168 -0
- package/src/serializers/bytea.ts +67 -0
- package/src/serializers/date.ts +63 -0
- package/src/serializers.ts +165 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// serializers/date.ts
|
|
2
|
+
function pad(number, digits) {
|
|
3
|
+
return number.toString().padStart(digits, "0");
|
|
4
|
+
}
|
|
5
|
+
function serializeDateUTC(date) {
|
|
6
|
+
if (isNaN(date.getTime()))
|
|
7
|
+
throw new TypeError("Attempted to serialize invalid date");
|
|
8
|
+
let year = date.getUTCFullYear();
|
|
9
|
+
const isBCYear = year < 1;
|
|
10
|
+
if (isBCYear)
|
|
11
|
+
year = Math.abs(year) + 1;
|
|
12
|
+
let ret = pad(year, 4) + "-" + pad(date.getUTCMonth() + 1, 2) + "-" + pad(date.getUTCDate(), 2) + "T" + pad(date.getUTCHours(), 2) + ":" + pad(date.getUTCMinutes(), 2) + ":" + pad(date.getUTCSeconds(), 2) + "." + pad(date.getUTCMilliseconds(), 3);
|
|
13
|
+
ret += "+00:00";
|
|
14
|
+
if (isBCYear)
|
|
15
|
+
ret += " BC";
|
|
16
|
+
return ret;
|
|
17
|
+
}
|
|
18
|
+
export {
|
|
19
|
+
serializeDateUTC
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=date.mjs.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/serializers/date.ts"],
|
|
4
|
+
"mappings": ";AACA,SAAS,IAAI,QAAgB,QAAwB;AACnD,SAAO,OAAO,SAAS,EAAE,SAAS,QAAQ,GAAG;AAC/C;AAwCO,SAAS,iBAAiB,MAAoB;AACnD,MAAI,MAAM,KAAK,QAAQ,CAAC;AAAG,UAAM,IAAI,UAAU,qCAAqC;AAEpF,MAAI,OAAO,KAAK,eAAe;AAC/B,QAAM,WAAW,OAAO;AACxB,MAAI;AAAU,WAAO,KAAK,IAAI,IAAI,IAAI;AAEtC,MAAI,MACF,IAAI,MAAM,CAAC,IAAI,MACf,IAAI,KAAK,YAAY,IAAI,GAAG,CAAC,IAAI,MACjC,IAAI,KAAK,WAAW,GAAG,CAAC,IAAI,MAC5B,IAAI,KAAK,YAAY,GAAG,CAAC,IAAI,MAC7B,IAAI,KAAK,cAAc,GAAG,CAAC,IAAI,MAC/B,IAAI,KAAK,cAAc,GAAG,CAAC,IAAI,MAC/B,IAAI,KAAK,mBAAmB,GAAG,CAAC;AAElC,SAAO;AACP,MAAI;AAAU,WAAO;AACrB,SAAO;AACT;",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// serializers.ts
|
|
21
|
+
var serializers_exports = {};
|
|
22
|
+
__export(serializers_exports, {
|
|
23
|
+
serialize: () => serialize,
|
|
24
|
+
serializeByteA: () => import_bytea2.serializeByteA,
|
|
25
|
+
serializeDateUTC: () => import_date2.serializeDateUTC
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(serializers_exports);
|
|
28
|
+
var import_bytea = require("./serializers/bytea.cjs");
|
|
29
|
+
var import_date = require("./serializers/date.cjs");
|
|
30
|
+
var import_bytea2 = require("./serializers/bytea.cjs");
|
|
31
|
+
var import_date2 = require("./serializers/date.cjs");
|
|
32
|
+
var serializationCache = /* @__PURE__ */ new WeakMap();
|
|
33
|
+
function quote(string) {
|
|
34
|
+
return `"${string.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`;
|
|
35
|
+
}
|
|
36
|
+
function serializeArray(value, stack) {
|
|
37
|
+
const result = new Array(value.length);
|
|
38
|
+
for (let i = 0; i < value.length; i++) {
|
|
39
|
+
const member = value[i];
|
|
40
|
+
const type = typeof member;
|
|
41
|
+
if (member === null || member === void 0) {
|
|
42
|
+
result[i] = "NULL";
|
|
43
|
+
} else if (type === "boolean") {
|
|
44
|
+
result[i] = member ? "t" : "f";
|
|
45
|
+
} else if (type === "bigint" || type === "number") {
|
|
46
|
+
result[i] = `${member}`;
|
|
47
|
+
} else if (Array.isArray(member)) {
|
|
48
|
+
const cached = serializationCache.get(member);
|
|
49
|
+
if (cached) {
|
|
50
|
+
result[i] = cached;
|
|
51
|
+
} else {
|
|
52
|
+
if (stack.has(member))
|
|
53
|
+
throw new TypeError("Circularity detected serializing");
|
|
54
|
+
stack.add(member);
|
|
55
|
+
result[i] = serializeArray(member, stack);
|
|
56
|
+
serializationCache.set(member, result[i]);
|
|
57
|
+
stack.delete(member);
|
|
58
|
+
}
|
|
59
|
+
} else if (ArrayBuffer.isView(member)) {
|
|
60
|
+
result[i] = `"\\${(0, import_bytea.serializeByteA)(member)}"`;
|
|
61
|
+
} else {
|
|
62
|
+
result[i] = quote(serializeValue(member, stack));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return `{${result.join(",")}}`;
|
|
66
|
+
}
|
|
67
|
+
function serializeValue(value, stack) {
|
|
68
|
+
if (value === null)
|
|
69
|
+
throw new TypeError('Can not serialize "null"');
|
|
70
|
+
switch (typeof value) {
|
|
71
|
+
case "string":
|
|
72
|
+
return value;
|
|
73
|
+
case "boolean":
|
|
74
|
+
return value ? "t" : "f";
|
|
75
|
+
case "bigint":
|
|
76
|
+
case "number":
|
|
77
|
+
return value.toString();
|
|
78
|
+
case "object":
|
|
79
|
+
break;
|
|
80
|
+
case "function":
|
|
81
|
+
case "symbol":
|
|
82
|
+
case "undefined":
|
|
83
|
+
default:
|
|
84
|
+
throw new TypeError(`Can not serialize "${typeof value}"`);
|
|
85
|
+
}
|
|
86
|
+
const cached = serializationCache.get(value);
|
|
87
|
+
if (cached !== void 0)
|
|
88
|
+
return cached;
|
|
89
|
+
if (stack.has(value))
|
|
90
|
+
throw new TypeError("Circularity detected serializing");
|
|
91
|
+
stack.add(value);
|
|
92
|
+
const subserialize = (v) => serializeValue(v, stack);
|
|
93
|
+
let string;
|
|
94
|
+
if (isPGSerializable(value)) {
|
|
95
|
+
string = value.toPostgres(subserialize);
|
|
96
|
+
} else if (ArrayBuffer.isView(value)) {
|
|
97
|
+
string = (0, import_bytea.serializeByteA)(value);
|
|
98
|
+
} else if (Array.isArray(value)) {
|
|
99
|
+
string = serializeArray(value, stack);
|
|
100
|
+
} else if (value instanceof Date) {
|
|
101
|
+
string = (0, import_date.serializeDateUTC)(value);
|
|
102
|
+
} else {
|
|
103
|
+
string = JSON.stringify(value);
|
|
104
|
+
}
|
|
105
|
+
serializationCache.set(value, string);
|
|
106
|
+
stack.delete(value);
|
|
107
|
+
return string;
|
|
108
|
+
}
|
|
109
|
+
function isPGSerializable(value) {
|
|
110
|
+
return value && typeof value["toPostgres"] === "function";
|
|
111
|
+
}
|
|
112
|
+
var serialize = (value) => serializeValue(value, /* @__PURE__ */ new WeakSet());
|
|
113
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
114
|
+
0 && (module.exports = {
|
|
115
|
+
serialize,
|
|
116
|
+
serializeByteA,
|
|
117
|
+
serializeDateUTC
|
|
118
|
+
});
|
|
119
|
+
//# sourceMappingURL=serializers.cjs.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/serializers.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": ["import_bytea", "import_date"]
|
|
6
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Defines an object that can be serialized to a _string_ comprehensible by
|
|
3
|
+
* PostgreSQL.
|
|
4
|
+
*
|
|
5
|
+
* The `serialize` parameter is a serialization function which can be used
|
|
6
|
+
* to serialize _members_ of the {@link PGSerializable} itself (e.g. boundaries
|
|
7
|
+
* of a {@link PGRange}, members of an _array_, ...).
|
|
8
|
+
*/
|
|
9
|
+
export interface PGSerializable {
|
|
10
|
+
toPostgres(serialize: PGSerialize): string;
|
|
11
|
+
}
|
|
12
|
+
/** An interface describing our {@link serialize} function. */
|
|
13
|
+
export interface PGSerialize {
|
|
14
|
+
(value?: null | undefined): never;
|
|
15
|
+
(value: any): string;
|
|
16
|
+
}
|
|
17
|
+
/** Serialize a value to _string_ comprehensible by PostgreSQL. */
|
|
18
|
+
export declare const serialize: PGSerialize;
|
|
19
|
+
export { serializeByteA } from './serializers/bytea';
|
|
20
|
+
export { serializeDateUTC } from './serializers/date';
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// serializers.ts
|
|
2
|
+
import { serializeByteA } from "./serializers/bytea.mjs";
|
|
3
|
+
import { serializeDateUTC } from "./serializers/date.mjs";
|
|
4
|
+
import { serializeByteA as serializeByteA2 } from "./serializers/bytea.mjs";
|
|
5
|
+
import { serializeDateUTC as serializeDateUTC2 } from "./serializers/date.mjs";
|
|
6
|
+
var serializationCache = /* @__PURE__ */ new WeakMap();
|
|
7
|
+
function quote(string) {
|
|
8
|
+
return `"${string.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`;
|
|
9
|
+
}
|
|
10
|
+
function serializeArray(value, stack) {
|
|
11
|
+
const result = new Array(value.length);
|
|
12
|
+
for (let i = 0; i < value.length; i++) {
|
|
13
|
+
const member = value[i];
|
|
14
|
+
const type = typeof member;
|
|
15
|
+
if (member === null || member === void 0) {
|
|
16
|
+
result[i] = "NULL";
|
|
17
|
+
} else if (type === "boolean") {
|
|
18
|
+
result[i] = member ? "t" : "f";
|
|
19
|
+
} else if (type === "bigint" || type === "number") {
|
|
20
|
+
result[i] = `${member}`;
|
|
21
|
+
} else if (Array.isArray(member)) {
|
|
22
|
+
const cached = serializationCache.get(member);
|
|
23
|
+
if (cached) {
|
|
24
|
+
result[i] = cached;
|
|
25
|
+
} else {
|
|
26
|
+
if (stack.has(member))
|
|
27
|
+
throw new TypeError("Circularity detected serializing");
|
|
28
|
+
stack.add(member);
|
|
29
|
+
result[i] = serializeArray(member, stack);
|
|
30
|
+
serializationCache.set(member, result[i]);
|
|
31
|
+
stack.delete(member);
|
|
32
|
+
}
|
|
33
|
+
} else if (ArrayBuffer.isView(member)) {
|
|
34
|
+
result[i] = `"\\${serializeByteA(member)}"`;
|
|
35
|
+
} else {
|
|
36
|
+
result[i] = quote(serializeValue(member, stack));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return `{${result.join(",")}}`;
|
|
40
|
+
}
|
|
41
|
+
function serializeValue(value, stack) {
|
|
42
|
+
if (value === null)
|
|
43
|
+
throw new TypeError('Can not serialize "null"');
|
|
44
|
+
switch (typeof value) {
|
|
45
|
+
case "string":
|
|
46
|
+
return value;
|
|
47
|
+
case "boolean":
|
|
48
|
+
return value ? "t" : "f";
|
|
49
|
+
case "bigint":
|
|
50
|
+
case "number":
|
|
51
|
+
return value.toString();
|
|
52
|
+
case "object":
|
|
53
|
+
break;
|
|
54
|
+
case "function":
|
|
55
|
+
case "symbol":
|
|
56
|
+
case "undefined":
|
|
57
|
+
default:
|
|
58
|
+
throw new TypeError(`Can not serialize "${typeof value}"`);
|
|
59
|
+
}
|
|
60
|
+
const cached = serializationCache.get(value);
|
|
61
|
+
if (cached !== void 0)
|
|
62
|
+
return cached;
|
|
63
|
+
if (stack.has(value))
|
|
64
|
+
throw new TypeError("Circularity detected serializing");
|
|
65
|
+
stack.add(value);
|
|
66
|
+
const subserialize = (v) => serializeValue(v, stack);
|
|
67
|
+
let string;
|
|
68
|
+
if (isPGSerializable(value)) {
|
|
69
|
+
string = value.toPostgres(subserialize);
|
|
70
|
+
} else if (ArrayBuffer.isView(value)) {
|
|
71
|
+
string = serializeByteA(value);
|
|
72
|
+
} else if (Array.isArray(value)) {
|
|
73
|
+
string = serializeArray(value, stack);
|
|
74
|
+
} else if (value instanceof Date) {
|
|
75
|
+
string = serializeDateUTC(value);
|
|
76
|
+
} else {
|
|
77
|
+
string = JSON.stringify(value);
|
|
78
|
+
}
|
|
79
|
+
serializationCache.set(value, string);
|
|
80
|
+
stack.delete(value);
|
|
81
|
+
return string;
|
|
82
|
+
}
|
|
83
|
+
function isPGSerializable(value) {
|
|
84
|
+
return value && typeof value["toPostgres"] === "function";
|
|
85
|
+
}
|
|
86
|
+
var serialize = (value) => serializeValue(value, /* @__PURE__ */ new WeakSet());
|
|
87
|
+
export {
|
|
88
|
+
serialize,
|
|
89
|
+
serializeByteA2 as serializeByteA,
|
|
90
|
+
serializeDateUTC2 as serializeDateUTC
|
|
91
|
+
};
|
|
92
|
+
//# sourceMappingURL=serializers.mjs.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/serializers.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": ["serializeByteA", "serializeDateUTC"]
|
|
6
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@juit/pgproxy-types",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"main": "./dist/index.cjs",
|
|
5
|
+
"module": "./dist/index.mjs",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"require": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"default": "./dist/index.cjs"
|
|
12
|
+
},
|
|
13
|
+
"import": {
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"default": "./dist/index.mjs"
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"author": "Juit Developers <developers@juit.com>",
|
|
20
|
+
"license": "Apache-2.0",
|
|
21
|
+
"repository": {
|
|
22
|
+
"type": "git",
|
|
23
|
+
"url": "git+ssh://git@github.com/juitnow/juit-pgproxy.git"
|
|
24
|
+
},
|
|
25
|
+
"keywords": [
|
|
26
|
+
"database",
|
|
27
|
+
"pg",
|
|
28
|
+
"pool",
|
|
29
|
+
"postgres",
|
|
30
|
+
"proxy"
|
|
31
|
+
],
|
|
32
|
+
"bugs": {
|
|
33
|
+
"url": "https://github.com/juitnow/juit-pgproxy/issues"
|
|
34
|
+
},
|
|
35
|
+
"homepage": "https://github.com/juitnow/juit-pgproxy#readme",
|
|
36
|
+
"directories": {
|
|
37
|
+
"test": "test"
|
|
38
|
+
},
|
|
39
|
+
"files": [
|
|
40
|
+
"*.md",
|
|
41
|
+
"dist/",
|
|
42
|
+
"src/"
|
|
43
|
+
],
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"postgres-date": "^2.1.0",
|
|
46
|
+
"postgres-interval": "^4.0.1",
|
|
47
|
+
"postgres-range": "^1.1.3"
|
|
48
|
+
}
|
|
49
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export * from './oids'
|
|
2
|
+
export * from './parsers'
|
|
3
|
+
export * from './registry'
|
|
4
|
+
export * from './serializers'
|
|
5
|
+
|
|
6
|
+
/* Re-export our classes and constructors */
|
|
7
|
+
export type { PGArray } from './parsers/array'
|
|
8
|
+
|
|
9
|
+
export { PGCircle, PGPoint } from './parsers/geometric'
|
|
10
|
+
export { PGInterval } from './parsers/interval'
|
|
11
|
+
export { PGRange } from './parsers/range'
|
|
12
|
+
|
|
13
|
+
export type { PGCircleConstructor, PGPointConstructor } from './parsers/geometric'
|
package/src/oids.ts
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Relevant OIDS.
|
|
3
|
+
*
|
|
4
|
+
* See the `pg_catalog.pg_type` table, or the values listed in the sources at:
|
|
5
|
+
* https://github.com/postgres/postgres/blob/master/src/include/catalog/pg_type.dat
|
|
6
|
+
*/
|
|
7
|
+
export const PGOIDs = {
|
|
8
|
+
/* Basic known types |_oid__|_typname______| */
|
|
9
|
+
bool: 16, /* | 16 | bool | */
|
|
10
|
+
bytea: 17, /* | 17 | bytea | */
|
|
11
|
+
int8: 20, /* | 20 | int8 | */
|
|
12
|
+
int2: 21, /* | 21 | int2 | */
|
|
13
|
+
int4: 23, /* | 23 | int4 | */
|
|
14
|
+
oid: 26, /* | 26 | oid | */
|
|
15
|
+
json: 114, /* | 114 | json | */
|
|
16
|
+
point: 600, /* | 600 | point | */
|
|
17
|
+
float4: 700, /* | 700 | float4 | */
|
|
18
|
+
float8: 701, /* | 701 | float8 | */
|
|
19
|
+
circle: 718, /* | 718 | circle | */
|
|
20
|
+
varchar: 1043, /* | 1043 | varchar | */
|
|
21
|
+
timestamp: 1114, /* | 1114 | timestamp | */
|
|
22
|
+
timestamptz: 1184, /* | 1184 | timestamptz | */
|
|
23
|
+
interval: 1186, /* | 1186 | interval | */
|
|
24
|
+
numeric: 1700, /* | 1700 | numeric | */
|
|
25
|
+
jsonb: 3802, /* | 3802 | jsonb | */
|
|
26
|
+
|
|
27
|
+
/* Native array types of the above |_oid__|_typname______|_base_| */
|
|
28
|
+
_bool: 1000, /* | 1000 | _bool | 16 | */
|
|
29
|
+
_bytea: 1001, /* | 1001 | _bytea | 17 | */
|
|
30
|
+
_int8: 1016, /* | 1016 | _int8 | 20 | */
|
|
31
|
+
_int2: 1005, /* | 1005 | _int2 | 21 | */
|
|
32
|
+
_int4: 1007, /* | 1007 | _int4 | 23 | */
|
|
33
|
+
_oid: 1028, /* | 1028 | _oid | 26 | */
|
|
34
|
+
_json: 199, /* | 199 | _json | 114 | */
|
|
35
|
+
_point: 1017, /* | 1017 | _point | 600 | */
|
|
36
|
+
_float4: 1021, /* | 1021 | _float4 | 700 | */
|
|
37
|
+
_float8: 1022, /* | 1022 | _float8 | 701 | */
|
|
38
|
+
_circle: 719, /* | 719 | _circle | 718 | */
|
|
39
|
+
_timestamp: 1115, /* | 1115 | _timestamp | 1114 | */
|
|
40
|
+
_timestamptz: 1185, /* | 1185 | _timestamptz | 1184 | */
|
|
41
|
+
_interval: 1187, /* | 1187 | _interval | 1186 | */
|
|
42
|
+
_numeric: 1231, /* | 1231 | _numeric | */
|
|
43
|
+
_jsonb: 3807, /* | 3807 | _jsonb | 3802 | */
|
|
44
|
+
|
|
45
|
+
/* Other known array types |_oid__|_typname______| */
|
|
46
|
+
_cidr: 651, /* | 651 | _cidr | */
|
|
47
|
+
_money: 791, /* | 791 | _money | */
|
|
48
|
+
_regproc: 1008, /* | 1008 | _regproc | */
|
|
49
|
+
_text: 1009, /* | 1009 | _text | */
|
|
50
|
+
_bpchar: 1014, /* | 1014 | _bpchar | */
|
|
51
|
+
_varchar: 1015, /* | 1015 | _varchar | */
|
|
52
|
+
_macaddr: 1040, /* | 1040 | _macaddr | */
|
|
53
|
+
_inet: 1041, /* | 1041 | _inet | */
|
|
54
|
+
_date: 1182, /* | 1182 | _date | */
|
|
55
|
+
_time: 1183, /* | 1183 | _time | */
|
|
56
|
+
_timetz: 1270, /* | 1270 | _timetz | */
|
|
57
|
+
_uuid: 2951, /* | 2951 | _uuid | */
|
|
58
|
+
|
|
59
|
+
/* Range types |_oid__|_typname______| */
|
|
60
|
+
int4range: 3904, /* | 3904 | int4range | */
|
|
61
|
+
numrange: 3906, /* | 3906 | numrange | */
|
|
62
|
+
tsrange: 3908, /* | 3908 | tsrange | */
|
|
63
|
+
tstzrange: 3910, /* | 3910 | tstzrange | */
|
|
64
|
+
daterange: 3912, /* | 3912 | daterange | */
|
|
65
|
+
int8range: 3926, /* | 3926 | int8range | */
|
|
66
|
+
|
|
67
|
+
/* Array of range types |_oid__|_typname______|_base_| */
|
|
68
|
+
_int4range: 3905, /* | 3905 | _int4range | 3904 | */
|
|
69
|
+
_numrange: 3907, /* | 3907 | _numrange | 3906 | */
|
|
70
|
+
_tsrange: 3909, /* | 3909 | _tsrange | 3908 | */
|
|
71
|
+
_tstzrange: 3911, /* | 3911 | _tstzrange | 3910 | */
|
|
72
|
+
_daterange: 3913, /* | 3913 | _daterange | 3912 | */
|
|
73
|
+
_int8range: 3927, /* | 3927 | _int8range | 3926 | */
|
|
74
|
+
|
|
75
|
+
/* Special types |_oid__|_typname______| */
|
|
76
|
+
void: 2278, /* function returns no value. | 2278 | void | */
|
|
77
|
+
xid: 28, /* transaction id (int4) | 28 | xid | */
|
|
78
|
+
xid8: 5069, /* transaction id (int8) | 5069 | xid8 | */
|
|
79
|
+
_xid: 1011, /* array of transaction ids (_int4) | 1011 | _xid | */
|
|
80
|
+
_xid8: 271, /* array of transaction ids (_int8) | 271 | _xid8 | */
|
|
81
|
+
|
|
82
|
+
} as const
|
|
83
|
+
|
|
84
|
+
Object.freeze(PGOIDs)
|
|
85
|
+
|
|
86
|
+
/** Supported PostgreSQL OIDs */
|
|
87
|
+
export type PGOIDs = typeof PGOIDs
|
|
88
|
+
|
|
89
|
+
/** Supported type _names_ as defined in the `pg_catalog.pg_type` table */
|
|
90
|
+
export type PGTypeName = keyof PGOIDs
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
// Verbatim from https://github.com/bendrucker/postgres-array (MIT license)
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
parseBigint,
|
|
5
|
+
parseBool,
|
|
6
|
+
parseJson,
|
|
7
|
+
parseString,
|
|
8
|
+
parseTimestamp,
|
|
9
|
+
parseTimestampTz,
|
|
10
|
+
} from './basic'
|
|
11
|
+
import { parseByteA } from './bytea'
|
|
12
|
+
import { parseCircle, parsePoint } from './geometric'
|
|
13
|
+
import { parseInterval } from './interval'
|
|
14
|
+
|
|
15
|
+
import type { PGParser } from '../parsers'
|
|
16
|
+
import type { PGCircle, PGPoint } from './geometric'
|
|
17
|
+
import type { PGInterval } from './interval'
|
|
18
|
+
|
|
19
|
+
/** A parsed PostgreSQL `array` */
|
|
20
|
+
export type PGArray<T = string> = (T | null)[]
|
|
21
|
+
|
|
22
|
+
/** Parse a PostgreSQL array of string values */
|
|
23
|
+
export function parseArray(source: string): PGArray
|
|
24
|
+
/** Parse a PostgreSQL array using the specified parser for its elements */
|
|
25
|
+
export function parseArray<T>(source: string, parser: PGParser<T>): PGArray<T>
|
|
26
|
+
/* overloaded implementation */
|
|
27
|
+
export function parseArray(
|
|
28
|
+
source: string,
|
|
29
|
+
parser = parseString,
|
|
30
|
+
): PGArray {
|
|
31
|
+
return parseInternal(source, parser, false)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/* ========================================================================== */
|
|
35
|
+
|
|
36
|
+
/** Parse a PostgreSQL array of _bigint_ values */
|
|
37
|
+
export const parseBigintArray: PGParser<PGArray<bigint>> =
|
|
38
|
+
(value: string) => parseArray(value, parseBigint)
|
|
39
|
+
|
|
40
|
+
/** Parse a PostgreSQL array of _boolean_ values */
|
|
41
|
+
export const parseBoolArray: PGParser<PGArray<boolean>> =
|
|
42
|
+
(value: string) => parseArray(value, parseBool)
|
|
43
|
+
|
|
44
|
+
/** Parse a PostgreSQL array of _binary_ values */
|
|
45
|
+
export const parseByteAArray: PGParser<PGArray<Uint8Array>> =
|
|
46
|
+
(value: string) => parseArray(value, parseByteA)
|
|
47
|
+
|
|
48
|
+
/** Parse a PostgreSQL array of {@link PGCircle} values */
|
|
49
|
+
export const parseCircleArray: PGParser<PGArray<PGCircle>> =
|
|
50
|
+
(value: string) => parseArray(value, parseCircle)
|
|
51
|
+
|
|
52
|
+
/** Parse a PostgreSQL array of _float_ values */
|
|
53
|
+
export const parseFloatArray: PGParser<PGArray<number>> =
|
|
54
|
+
(value: string) => parseArray(value, parseFloat)
|
|
55
|
+
|
|
56
|
+
/** Parse a PostgreSQL array of _number_ values */
|
|
57
|
+
export const parseIntArray: PGParser<PGArray<number>> =
|
|
58
|
+
(value: string) => parseArray(value, parseInt)
|
|
59
|
+
|
|
60
|
+
/** Parse a PostgreSQL array of {@link PGInterval} values */
|
|
61
|
+
export const parseIntervalArray: PGParser<PGArray<PGInterval>> =
|
|
62
|
+
(value: string) => parseArray(value, parseInterval)
|
|
63
|
+
|
|
64
|
+
/** Parse a PostgreSQL array of _JSON_ values */
|
|
65
|
+
export const parseJsonArray: PGParser<PGArray<any[]>> =
|
|
66
|
+
(value: string) => parseArray(value, parseJson)
|
|
67
|
+
|
|
68
|
+
/** Parse a PostgreSQL array of {@link PGPoint} values */
|
|
69
|
+
export const parsePointArray: PGParser<PGArray<PGPoint>> =
|
|
70
|
+
(value: string) => parseArray(value, parsePoint)
|
|
71
|
+
|
|
72
|
+
/** Parse a PostgreSQL array of _timestamp without time zone_ values */
|
|
73
|
+
export const parseTimestampArray: PGParser<PGArray<Date>> =
|
|
74
|
+
(value: string) => parseArray(value, parseTimestamp)
|
|
75
|
+
|
|
76
|
+
/** Parse a PostgreSQL array of _timestamp with time zone_ values */
|
|
77
|
+
export const parseTimestampTzArray: PGParser<PGArray<Date>> =
|
|
78
|
+
(value: string) => parseArray(value, parseTimestampTz)
|
|
79
|
+
|
|
80
|
+
/* ========================================================================== *
|
|
81
|
+
* INTERNALS *
|
|
82
|
+
* ========================================================================== */
|
|
83
|
+
|
|
84
|
+
/** Result from parsing a nested sub-array */
|
|
85
|
+
interface SubArrayResult {
|
|
86
|
+
entries: any,
|
|
87
|
+
position: number,
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function parseInternal(source: string, parser: PGParser<any>, nested: false): any[]
|
|
91
|
+
function parseInternal(source: string, parser: PGParser<any>, nested: true): SubArrayResult
|
|
92
|
+
function parseInternal(source: string, parser: PGParser<any>, nested: boolean): any[] | SubArrayResult {
|
|
93
|
+
const entries = []
|
|
94
|
+
let character = ''
|
|
95
|
+
let quote = false
|
|
96
|
+
let position = 0
|
|
97
|
+
let dimension = 0
|
|
98
|
+
let recorded = ''
|
|
99
|
+
|
|
100
|
+
const newEntry = (includeEmpty?: boolean): void => {
|
|
101
|
+
let entry: string | null = recorded
|
|
102
|
+
|
|
103
|
+
if (entry.length > 0 || includeEmpty) {
|
|
104
|
+
if (entry === 'NULL' && !includeEmpty) {
|
|
105
|
+
entry = null
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
if (entry !== null) {
|
|
109
|
+
entries.push(parser(entry))
|
|
110
|
+
} else {
|
|
111
|
+
entries.push(null)
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
recorded = ''
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
if (source[0] === '[') {
|
|
119
|
+
while (position < source.length) {
|
|
120
|
+
const char = source[position++]
|
|
121
|
+
|
|
122
|
+
if (char === '=') {
|
|
123
|
+
break
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
while (position < source.length) {
|
|
129
|
+
let escaped = false
|
|
130
|
+
character = source[position++]!
|
|
131
|
+
|
|
132
|
+
if (character === '\\') {
|
|
133
|
+
character = source[position++]!
|
|
134
|
+
escaped = true
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if (character === '{' && !quote) {
|
|
138
|
+
dimension++
|
|
139
|
+
|
|
140
|
+
if (dimension > 1) {
|
|
141
|
+
const result = parseInternal(source.substring(position - 1), parser, true)
|
|
142
|
+
entries.push(result.entries)
|
|
143
|
+
position += result.position - 2
|
|
144
|
+
}
|
|
145
|
+
} else if (character === '}' && !quote) {
|
|
146
|
+
dimension--
|
|
147
|
+
|
|
148
|
+
if (!dimension) {
|
|
149
|
+
newEntry()
|
|
150
|
+
|
|
151
|
+
if (nested) {
|
|
152
|
+
return {
|
|
153
|
+
entries,
|
|
154
|
+
position,
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
} else if (character === '"' && !escaped) {
|
|
159
|
+
if (quote) {
|
|
160
|
+
newEntry(true)
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
quote = !quote
|
|
164
|
+
} else if (character === ',' && !quote) {
|
|
165
|
+
newEntry()
|
|
166
|
+
} else {
|
|
167
|
+
recorded += character
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
if (dimension !== 0) {
|
|
172
|
+
throw new Error('array dimension not balanced')
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
return entries
|
|
176
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/* ========================================================================== *
|
|
2
|
+
* PARSE BASIC TYPES *
|
|
3
|
+
* ========================================================================== */
|
|
4
|
+
|
|
5
|
+
import postgresDate from 'postgres-date'
|
|
6
|
+
|
|
7
|
+
import type { PGParser } from '../parsers'
|
|
8
|
+
|
|
9
|
+
/* ===== INVALID CONSTANTS ================================================== */
|
|
10
|
+
|
|
11
|
+
const INVALID_DATE = new Date(NaN)
|
|
12
|
+
|
|
13
|
+
/* ===== BASIC PARSERS ====================================================== */
|
|
14
|
+
|
|
15
|
+
// parseInt and parseFloat are from JS
|
|
16
|
+
|
|
17
|
+
/** Parse a `bigint` */
|
|
18
|
+
export const parseBigint: PGParser<bigint> = BigInt
|
|
19
|
+
|
|
20
|
+
/** Parse some JSON */
|
|
21
|
+
export const parseJson: PGParser<any> = JSON.parse
|
|
22
|
+
|
|
23
|
+
/** Parse a `boolean` */
|
|
24
|
+
export const parseBool: PGParser<boolean> = (value: string): boolean => {
|
|
25
|
+
return value === 'TRUE' ||
|
|
26
|
+
value === 't' ||
|
|
27
|
+
value === 'true' ||
|
|
28
|
+
value === 'y' ||
|
|
29
|
+
value === 'yes' ||
|
|
30
|
+
value === 'on' ||
|
|
31
|
+
value === '1'
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Parse a `string` (identity transformation) */
|
|
35
|
+
export const parseString: PGParser<string> = (value: string): string => value
|
|
36
|
+
|
|
37
|
+
/** Parse anything into `null` (normally used only for `void` types) */
|
|
38
|
+
export const parseVoid: PGParser<null> = (): null => null
|
|
39
|
+
|
|
40
|
+
/* ===== WRAP POSTGRES-DATE ================================================= */
|
|
41
|
+
|
|
42
|
+
/** Parse a PostgreSQL timestamp _without_ time zone */
|
|
43
|
+
export const parseTimestamp: PGParser<Date> = (value: string): Date => {
|
|
44
|
+
const utc = value.endsWith(' BC') ?
|
|
45
|
+
value.slice(0, -3) + 'Z BC' :
|
|
46
|
+
value + 'Z'
|
|
47
|
+
|
|
48
|
+
return parseTimestampTz(utc)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** Parse a PostgreSQL timestamp _with_ time zone */
|
|
52
|
+
export const parseTimestampTz: PGParser<Date> = (value: string): Date => {
|
|
53
|
+
const date = postgresDate(value)
|
|
54
|
+
return date instanceof Date ? date : INVALID_DATE
|
|
55
|
+
}
|