@juit/pgproxy-persister 1.3.6 → 1.4.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/dist/index.cjs +3 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.mjs +1 -0
- package/dist/index.mjs.map +1 -1
- package/dist/model.cjs +31 -45
- package/dist/model.cjs.map +1 -1
- package/dist/model.mjs +19 -33
- package/dist/model.mjs.map +1 -1
- package/dist/search.cjs +215 -0
- package/dist/search.cjs.map +6 -0
- package/dist/search.d.ts +211 -0
- package/dist/search.mjs +189 -0
- package/dist/search.mjs.map +6 -0
- package/dist/utils.cjs +53 -0
- package/dist/utils.cjs.map +6 -0
- package/dist/utils.d.ts +4 -0
- package/dist/utils.mjs +25 -0
- package/dist/utils.mjs.map +6 -0
- package/package.json +3 -3
- package/src/index.ts +1 -0
- package/src/model.ts +21 -51
- package/src/search.ts +587 -0
- package/src/utils.ts +33 -0
package/dist/index.cjs
CHANGED
|
@@ -28,11 +28,13 @@ module.exports = __toCommonJS(index_exports);
|
|
|
28
28
|
var import_pgproxy_client = require("@juit/pgproxy-client");
|
|
29
29
|
__reExport(index_exports, require("./model.cjs"), module.exports);
|
|
30
30
|
__reExport(index_exports, require("./persister.cjs"), module.exports);
|
|
31
|
+
__reExport(index_exports, require("./search.cjs"), module.exports);
|
|
31
32
|
// Annotate the CommonJS export names for ESM import in node:
|
|
32
33
|
0 && (module.exports = {
|
|
33
34
|
SQL,
|
|
34
35
|
escape,
|
|
35
36
|
...require("./model.cjs"),
|
|
36
|
-
...require("./persister.cjs")
|
|
37
|
+
...require("./persister.cjs"),
|
|
38
|
+
...require("./search.cjs")
|
|
37
39
|
});
|
|
38
40
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts"],
|
|
4
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,4BAA4B;AAC5B,0BAAc,wBAFd;AAGA,0BAAc,4BAHd;",
|
|
4
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,4BAA4B;AAC5B,0BAAc,wBAFd;AAGA,0BAAc,4BAHd;AAIA,0BAAc,yBAJd;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/dist/index.d.ts
CHANGED
package/dist/index.mjs
CHANGED
package/dist/index.mjs.map
CHANGED
package/dist/model.cjs
CHANGED
|
@@ -24,15 +24,7 @@ __export(model_exports, {
|
|
|
24
24
|
});
|
|
25
25
|
module.exports = __toCommonJS(model_exports);
|
|
26
26
|
var import_pgproxy_client = require("@juit/pgproxy-client");
|
|
27
|
-
|
|
28
|
-
if (!assertion) throw new Error(message);
|
|
29
|
-
}
|
|
30
|
-
function assertArray(value, message) {
|
|
31
|
-
assert(Array.isArray(value), message);
|
|
32
|
-
}
|
|
33
|
-
function assertObject(value, message) {
|
|
34
|
-
assert(value && typeof value === "object", message);
|
|
35
|
-
}
|
|
27
|
+
var import_utils = require("./utils.cjs");
|
|
36
28
|
function where(query, params) {
|
|
37
29
|
const conditions = [];
|
|
38
30
|
let count = 0;
|
|
@@ -52,8 +44,8 @@ function where(query, params) {
|
|
|
52
44
|
count
|
|
53
45
|
];
|
|
54
46
|
}
|
|
55
|
-
function insert(
|
|
56
|
-
assertObject(query, "Called INSERT with a non-object");
|
|
47
|
+
function insert(etable, query, unique = false) {
|
|
48
|
+
(0, import_utils.assertObject)(query, "Called INSERT with a non-object");
|
|
57
49
|
const columns = [];
|
|
58
50
|
const placeholders = [];
|
|
59
51
|
const values = [];
|
|
@@ -65,15 +57,15 @@ function insert(schema, table, query, unique = false) {
|
|
|
65
57
|
}
|
|
66
58
|
const returning = unique ? "ON CONFLICT DO NOTHING RETURNING *" : "RETURNING *";
|
|
67
59
|
return [
|
|
68
|
-
columns.length == 0 ? `INSERT INTO ${
|
|
60
|
+
columns.length == 0 ? `INSERT INTO ${etable} DEFAULT VALUES ${returning}` : `INSERT INTO ${etable} (${columns.join()}) VALUES (${placeholders.join()}) ${returning}`,
|
|
69
61
|
values
|
|
70
62
|
];
|
|
71
63
|
}
|
|
72
|
-
function upsert(
|
|
73
|
-
assertObject(keys, "Called UPSERT with a non-object for keys");
|
|
74
|
-
assertObject(data, "Called UPSERT with a non-object for data");
|
|
75
|
-
assert(Object.keys(keys).length > 0, "Called UPSERT with no conflict keys");
|
|
76
|
-
assert(Object.keys(data).length > 0, "Called UPSERT with no updateable data");
|
|
64
|
+
function upsert(etable, keys, data) {
|
|
65
|
+
(0, import_utils.assertObject)(keys, "Called UPSERT with a non-object for keys");
|
|
66
|
+
(0, import_utils.assertObject)(data, "Called UPSERT with a non-object for data");
|
|
67
|
+
(0, import_utils.assert)(Object.keys(keys).length > 0, "Called UPSERT with no conflict keys");
|
|
68
|
+
(0, import_utils.assert)(Object.keys(data).length > 0, "Called UPSERT with no updateable data");
|
|
77
69
|
const object = { ...keys, ...data, ...keys };
|
|
78
70
|
const columns = [];
|
|
79
71
|
const placeholders = [];
|
|
@@ -95,14 +87,14 @@ function upsert(schema, table, keys, data) {
|
|
|
95
87
|
values.push(value);
|
|
96
88
|
}
|
|
97
89
|
return [
|
|
98
|
-
`INSERT INTO ${
|
|
90
|
+
`INSERT INTO ${etable} (${columns.join()}) VALUES (${placeholders.join()}) ON CONFLICT (${conflictKeys.join(",")}) DO UPDATE SET ${updates.join(",")} RETURNING *`,
|
|
99
91
|
values
|
|
100
92
|
];
|
|
101
93
|
}
|
|
102
|
-
function select(
|
|
94
|
+
function select(etable, query, sort, offset, limit) {
|
|
103
95
|
if (typeof sort === "string") sort = [sort];
|
|
104
|
-
assertObject(query, "Called SELECT with a non-object query");
|
|
105
|
-
assertArray(sort, "Called SELECT with a non-array sort");
|
|
96
|
+
(0, import_utils.assertObject)(query, "Called SELECT with a non-object query");
|
|
97
|
+
(0, import_utils.assertArray)(sort, "Called SELECT with a non-array sort");
|
|
106
98
|
const [conditions, values] = where(query, []);
|
|
107
99
|
const order = [];
|
|
108
100
|
for (const field of sort) {
|
|
@@ -115,7 +107,7 @@ function select(schema, table, query, sort, offset, limit) {
|
|
|
115
107
|
}
|
|
116
108
|
}
|
|
117
109
|
const orderby = order.length == 0 ? "" : ` ORDER BY ${order.join(",")}`;
|
|
118
|
-
let sql = `SELECT * FROM ${
|
|
110
|
+
let sql = `SELECT * FROM ${etable}${conditions}${orderby}`;
|
|
119
111
|
if (offset && offset > 0) {
|
|
120
112
|
sql += ` OFFSET $${values.length + 1}`;
|
|
121
113
|
values.push(Math.floor(offset));
|
|
@@ -126,9 +118,9 @@ function select(schema, table, query, sort, offset, limit) {
|
|
|
126
118
|
}
|
|
127
119
|
return [sql, values];
|
|
128
120
|
}
|
|
129
|
-
function update(
|
|
130
|
-
assertObject(query, "Called UPDATE with a non-object query");
|
|
131
|
-
assertObject(patch, "Called UPDATE with a non-object patch");
|
|
121
|
+
function update(etable, query, patch) {
|
|
122
|
+
(0, import_utils.assertObject)(query, "Called UPDATE with a non-object query");
|
|
123
|
+
(0, import_utils.assertObject)(patch, "Called UPDATE with a non-object patch");
|
|
132
124
|
const patches = [];
|
|
133
125
|
const values = [];
|
|
134
126
|
for (const [column, value] of Object.entries(patch)) {
|
|
@@ -136,44 +128,38 @@ function update(schema, table, query, patch) {
|
|
|
136
128
|
const index = values.push(value);
|
|
137
129
|
patches.push(`${(0, import_pgproxy_client.escape)(column)}=$${index}`);
|
|
138
130
|
}
|
|
139
|
-
if (patches.length === 0) return select(
|
|
131
|
+
if (patches.length === 0) return select(etable, query, [], 0, 0);
|
|
140
132
|
const [conditions, , count] = where(query, values);
|
|
141
|
-
assert(count > 0, "Cowardly refusing to run UPDATE with empty query");
|
|
142
|
-
const statement = `UPDATE ${
|
|
133
|
+
(0, import_utils.assert)(count > 0, "Cowardly refusing to run UPDATE with empty query");
|
|
134
|
+
const statement = `UPDATE ${etable} SET ${patches.join()}${conditions} RETURNING *`;
|
|
143
135
|
return [statement, values];
|
|
144
136
|
}
|
|
145
|
-
function del(
|
|
146
|
-
assertObject(query, "Called DELETE with a non-object query");
|
|
137
|
+
function del(etable, query) {
|
|
138
|
+
(0, import_utils.assertObject)(query, "Called DELETE with a non-object query");
|
|
147
139
|
const [conditions, values, count] = where(query, []);
|
|
148
|
-
assert(count > 0, "Cowardly refusing to run DELETE with empty query");
|
|
149
|
-
return [`DELETE FROM ${
|
|
140
|
+
(0, import_utils.assert)(count > 0, "Cowardly refusing to run DELETE with empty query");
|
|
141
|
+
return [`DELETE FROM ${etable}${conditions} RETURNING *`, values];
|
|
150
142
|
}
|
|
151
143
|
var ModelImpl = class {
|
|
152
144
|
_connection;
|
|
153
|
-
|
|
154
|
-
_table;
|
|
145
|
+
_etable;
|
|
155
146
|
constructor(connection, name) {
|
|
156
147
|
this._connection = connection;
|
|
157
|
-
|
|
158
|
-
assert(extra.length === 0, `Invalid table name "${name}"`);
|
|
159
|
-
const [schema, table] = maybeTable ? [schemaOrTable, maybeTable] : ["public", schemaOrTable];
|
|
160
|
-
assert(table, `Invalid table name "${name}"`);
|
|
161
|
-
this._schema = schema || "public";
|
|
162
|
-
this._table = table;
|
|
148
|
+
this._etable = (0, import_utils.encodeSchemaAndName)(name);
|
|
163
149
|
}
|
|
164
150
|
// Actual implementation
|
|
165
151
|
async create(data, unique = false) {
|
|
166
|
-
const [sql, params] = insert(this.
|
|
152
|
+
const [sql, params] = insert(this._etable, data, unique);
|
|
167
153
|
const result = await this._connection.query(sql, params);
|
|
168
154
|
return result.rows[0];
|
|
169
155
|
}
|
|
170
156
|
async upsert(keys, data) {
|
|
171
|
-
const [sql, params] = upsert(this.
|
|
157
|
+
const [sql, params] = upsert(this._etable, keys, data);
|
|
172
158
|
const result = await this._connection.query(sql, params);
|
|
173
159
|
return result.rows[0];
|
|
174
160
|
}
|
|
175
161
|
async read(query = {}, sort = [], offset = 0, limit = 0) {
|
|
176
|
-
const [sql, params] = select(this.
|
|
162
|
+
const [sql, params] = select(this._etable, query, sort, offset, limit);
|
|
177
163
|
const result = await this._connection.query(sql, params);
|
|
178
164
|
return result.rows;
|
|
179
165
|
}
|
|
@@ -182,12 +168,12 @@ var ModelImpl = class {
|
|
|
182
168
|
return result[0];
|
|
183
169
|
}
|
|
184
170
|
async update(query, patch) {
|
|
185
|
-
const [sql, params] = update(this.
|
|
171
|
+
const [sql, params] = update(this._etable, query, patch);
|
|
186
172
|
const result = await this._connection.query(sql, params);
|
|
187
173
|
return result.rows;
|
|
188
174
|
}
|
|
189
175
|
async delete(query) {
|
|
190
|
-
const [sql, params] = del(this.
|
|
176
|
+
const [sql, params] = del(this._etable, query);
|
|
191
177
|
const result = await this._connection.query(sql, params);
|
|
192
178
|
return result.rowCount;
|
|
193
179
|
}
|
package/dist/model.cjs.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/model.ts"],
|
|
4
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAAuB;
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/dist/model.mjs
CHANGED
|
@@ -1,14 +1,6 @@
|
|
|
1
1
|
// model.ts
|
|
2
2
|
import { escape } from "@juit/pgproxy-client";
|
|
3
|
-
|
|
4
|
-
if (!assertion) throw new Error(message);
|
|
5
|
-
}
|
|
6
|
-
function assertArray(value, message) {
|
|
7
|
-
assert(Array.isArray(value), message);
|
|
8
|
-
}
|
|
9
|
-
function assertObject(value, message) {
|
|
10
|
-
assert(value && typeof value === "object", message);
|
|
11
|
-
}
|
|
3
|
+
import { assert, assertArray, assertObject, encodeSchemaAndName } from "./utils.mjs";
|
|
12
4
|
function where(query, params) {
|
|
13
5
|
const conditions = [];
|
|
14
6
|
let count = 0;
|
|
@@ -28,7 +20,7 @@ function where(query, params) {
|
|
|
28
20
|
count
|
|
29
21
|
];
|
|
30
22
|
}
|
|
31
|
-
function insert(
|
|
23
|
+
function insert(etable, query, unique = false) {
|
|
32
24
|
assertObject(query, "Called INSERT with a non-object");
|
|
33
25
|
const columns = [];
|
|
34
26
|
const placeholders = [];
|
|
@@ -41,11 +33,11 @@ function insert(schema, table, query, unique = false) {
|
|
|
41
33
|
}
|
|
42
34
|
const returning = unique ? "ON CONFLICT DO NOTHING RETURNING *" : "RETURNING *";
|
|
43
35
|
return [
|
|
44
|
-
columns.length == 0 ? `INSERT INTO ${
|
|
36
|
+
columns.length == 0 ? `INSERT INTO ${etable} DEFAULT VALUES ${returning}` : `INSERT INTO ${etable} (${columns.join()}) VALUES (${placeholders.join()}) ${returning}`,
|
|
45
37
|
values
|
|
46
38
|
];
|
|
47
39
|
}
|
|
48
|
-
function upsert(
|
|
40
|
+
function upsert(etable, keys, data) {
|
|
49
41
|
assertObject(keys, "Called UPSERT with a non-object for keys");
|
|
50
42
|
assertObject(data, "Called UPSERT with a non-object for data");
|
|
51
43
|
assert(Object.keys(keys).length > 0, "Called UPSERT with no conflict keys");
|
|
@@ -71,11 +63,11 @@ function upsert(schema, table, keys, data) {
|
|
|
71
63
|
values.push(value);
|
|
72
64
|
}
|
|
73
65
|
return [
|
|
74
|
-
`INSERT INTO ${
|
|
66
|
+
`INSERT INTO ${etable} (${columns.join()}) VALUES (${placeholders.join()}) ON CONFLICT (${conflictKeys.join(",")}) DO UPDATE SET ${updates.join(",")} RETURNING *`,
|
|
75
67
|
values
|
|
76
68
|
];
|
|
77
69
|
}
|
|
78
|
-
function select(
|
|
70
|
+
function select(etable, query, sort, offset, limit) {
|
|
79
71
|
if (typeof sort === "string") sort = [sort];
|
|
80
72
|
assertObject(query, "Called SELECT with a non-object query");
|
|
81
73
|
assertArray(sort, "Called SELECT with a non-array sort");
|
|
@@ -91,7 +83,7 @@ function select(schema, table, query, sort, offset, limit) {
|
|
|
91
83
|
}
|
|
92
84
|
}
|
|
93
85
|
const orderby = order.length == 0 ? "" : ` ORDER BY ${order.join(",")}`;
|
|
94
|
-
let sql = `SELECT * FROM ${
|
|
86
|
+
let sql = `SELECT * FROM ${etable}${conditions}${orderby}`;
|
|
95
87
|
if (offset && offset > 0) {
|
|
96
88
|
sql += ` OFFSET $${values.length + 1}`;
|
|
97
89
|
values.push(Math.floor(offset));
|
|
@@ -102,7 +94,7 @@ function select(schema, table, query, sort, offset, limit) {
|
|
|
102
94
|
}
|
|
103
95
|
return [sql, values];
|
|
104
96
|
}
|
|
105
|
-
function update(
|
|
97
|
+
function update(etable, query, patch) {
|
|
106
98
|
assertObject(query, "Called UPDATE with a non-object query");
|
|
107
99
|
assertObject(patch, "Called UPDATE with a non-object patch");
|
|
108
100
|
const patches = [];
|
|
@@ -112,44 +104,38 @@ function update(schema, table, query, patch) {
|
|
|
112
104
|
const index = values.push(value);
|
|
113
105
|
patches.push(`${escape(column)}=$${index}`);
|
|
114
106
|
}
|
|
115
|
-
if (patches.length === 0) return select(
|
|
107
|
+
if (patches.length === 0) return select(etable, query, [], 0, 0);
|
|
116
108
|
const [conditions, , count] = where(query, values);
|
|
117
109
|
assert(count > 0, "Cowardly refusing to run UPDATE with empty query");
|
|
118
|
-
const statement = `UPDATE ${
|
|
110
|
+
const statement = `UPDATE ${etable} SET ${patches.join()}${conditions} RETURNING *`;
|
|
119
111
|
return [statement, values];
|
|
120
112
|
}
|
|
121
|
-
function del(
|
|
113
|
+
function del(etable, query) {
|
|
122
114
|
assertObject(query, "Called DELETE with a non-object query");
|
|
123
115
|
const [conditions, values, count] = where(query, []);
|
|
124
116
|
assert(count > 0, "Cowardly refusing to run DELETE with empty query");
|
|
125
|
-
return [`DELETE FROM ${
|
|
117
|
+
return [`DELETE FROM ${etable}${conditions} RETURNING *`, values];
|
|
126
118
|
}
|
|
127
119
|
var ModelImpl = class {
|
|
128
120
|
_connection;
|
|
129
|
-
|
|
130
|
-
_table;
|
|
121
|
+
_etable;
|
|
131
122
|
constructor(connection, name) {
|
|
132
123
|
this._connection = connection;
|
|
133
|
-
|
|
134
|
-
assert(extra.length === 0, `Invalid table name "${name}"`);
|
|
135
|
-
const [schema, table] = maybeTable ? [schemaOrTable, maybeTable] : ["public", schemaOrTable];
|
|
136
|
-
assert(table, `Invalid table name "${name}"`);
|
|
137
|
-
this._schema = schema || "public";
|
|
138
|
-
this._table = table;
|
|
124
|
+
this._etable = encodeSchemaAndName(name);
|
|
139
125
|
}
|
|
140
126
|
// Actual implementation
|
|
141
127
|
async create(data, unique = false) {
|
|
142
|
-
const [sql, params] = insert(this.
|
|
128
|
+
const [sql, params] = insert(this._etable, data, unique);
|
|
143
129
|
const result = await this._connection.query(sql, params);
|
|
144
130
|
return result.rows[0];
|
|
145
131
|
}
|
|
146
132
|
async upsert(keys, data) {
|
|
147
|
-
const [sql, params] = upsert(this.
|
|
133
|
+
const [sql, params] = upsert(this._etable, keys, data);
|
|
148
134
|
const result = await this._connection.query(sql, params);
|
|
149
135
|
return result.rows[0];
|
|
150
136
|
}
|
|
151
137
|
async read(query = {}, sort = [], offset = 0, limit = 0) {
|
|
152
|
-
const [sql, params] = select(this.
|
|
138
|
+
const [sql, params] = select(this._etable, query, sort, offset, limit);
|
|
153
139
|
const result = await this._connection.query(sql, params);
|
|
154
140
|
return result.rows;
|
|
155
141
|
}
|
|
@@ -158,12 +144,12 @@ var ModelImpl = class {
|
|
|
158
144
|
return result[0];
|
|
159
145
|
}
|
|
160
146
|
async update(query, patch) {
|
|
161
|
-
const [sql, params] = update(this.
|
|
147
|
+
const [sql, params] = update(this._etable, query, patch);
|
|
162
148
|
const result = await this._connection.query(sql, params);
|
|
163
149
|
return result.rows;
|
|
164
150
|
}
|
|
165
151
|
async delete(query) {
|
|
166
|
-
const [sql, params] = del(this.
|
|
152
|
+
const [sql, params] = del(this._etable, query);
|
|
167
153
|
const result = await this._connection.query(sql, params);
|
|
168
154
|
return result.rowCount;
|
|
169
155
|
}
|
package/dist/model.mjs.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/model.ts"],
|
|
4
|
-
"mappings": ";AAAA,SAAS,cAAc;
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/dist/search.cjs
ADDED
|
@@ -0,0 +1,215 @@
|
|
|
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
|
+
// search.ts
|
|
21
|
+
var search_exports = {};
|
|
22
|
+
__export(search_exports, {
|
|
23
|
+
Search: () => Search,
|
|
24
|
+
reviver: () => reviver
|
|
25
|
+
});
|
|
26
|
+
module.exports = __toCommonJS(search_exports);
|
|
27
|
+
var import_pgproxy_client = require("@juit/pgproxy-client");
|
|
28
|
+
var import_utils = require("./utils.cjs");
|
|
29
|
+
var ISO_RE = /^(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))$/;
|
|
30
|
+
function reviver(_key, data) {
|
|
31
|
+
if (typeof data === "string" && ISO_RE.test(data)) return new Date(data);
|
|
32
|
+
return data;
|
|
33
|
+
}
|
|
34
|
+
var SearchImpl = class {
|
|
35
|
+
/** Our persister instance */
|
|
36
|
+
#persister;
|
|
37
|
+
/** The escaped table name */
|
|
38
|
+
#eTable;
|
|
39
|
+
/** The escaped joins */
|
|
40
|
+
#eJoins;
|
|
41
|
+
/** The full-text search column (if any) */
|
|
42
|
+
#fullTextSearchColumn;
|
|
43
|
+
constructor(persister, table, joinsOrFullTextSearchColumn, maybeFullTextSearchColumn) {
|
|
44
|
+
this.#persister = persister;
|
|
45
|
+
this.#eTable = (0, import_utils.encodeSchemaAndName)(table);
|
|
46
|
+
let joins = {};
|
|
47
|
+
let fullTextSearchColumn = void 0;
|
|
48
|
+
if (typeof joinsOrFullTextSearchColumn === "string") {
|
|
49
|
+
fullTextSearchColumn = joinsOrFullTextSearchColumn;
|
|
50
|
+
} else if (joinsOrFullTextSearchColumn) {
|
|
51
|
+
joins = joinsOrFullTextSearchColumn;
|
|
52
|
+
fullTextSearchColumn = maybeFullTextSearchColumn;
|
|
53
|
+
}
|
|
54
|
+
this.#fullTextSearchColumn = fullTextSearchColumn || void 0;
|
|
55
|
+
this.#eJoins = Object.fromEntries(Object.entries(joins).map(([key, def]) => {
|
|
56
|
+
return [key, {
|
|
57
|
+
column: (0, import_pgproxy_client.escape)(def.column),
|
|
58
|
+
refTable: (0, import_utils.encodeSchemaAndName)(def.refTable),
|
|
59
|
+
refColumn: (0, import_pgproxy_client.escape)(def.refColumn),
|
|
60
|
+
sortColumn: def.sortColumn ? (0, import_pgproxy_client.escape)(def.sortColumn) : void 0
|
|
61
|
+
}];
|
|
62
|
+
}));
|
|
63
|
+
}
|
|
64
|
+
#query(count, options, extra) {
|
|
65
|
+
const {
|
|
66
|
+
offset = 0,
|
|
67
|
+
limit = 20,
|
|
68
|
+
filters = [],
|
|
69
|
+
sort,
|
|
70
|
+
order,
|
|
71
|
+
q
|
|
72
|
+
} = options;
|
|
73
|
+
const etable = this.#eTable;
|
|
74
|
+
const ejoins = this.#eJoins;
|
|
75
|
+
const fields = [];
|
|
76
|
+
const where = [];
|
|
77
|
+
const orderby = [];
|
|
78
|
+
const params = [];
|
|
79
|
+
if (extra) {
|
|
80
|
+
where.push(extra.where);
|
|
81
|
+
params.push(...extra.params);
|
|
82
|
+
}
|
|
83
|
+
let esearch = "";
|
|
84
|
+
if (count === "only") {
|
|
85
|
+
if (this.#fullTextSearchColumn) esearch = (0, import_pgproxy_client.escape)(this.#fullTextSearchColumn);
|
|
86
|
+
} else if (this.#fullTextSearchColumn) {
|
|
87
|
+
fields.push(`(TO_JSONB(${etable}.*) - $${params.push(this.#fullTextSearchColumn)})`);
|
|
88
|
+
esearch = (0, import_pgproxy_client.escape)(this.#fullTextSearchColumn);
|
|
89
|
+
} else {
|
|
90
|
+
fields.push(`TO_JSONB(${etable}.*)`);
|
|
91
|
+
}
|
|
92
|
+
const from = [etable];
|
|
93
|
+
let joinIndex = 0;
|
|
94
|
+
const joinedTables = {};
|
|
95
|
+
Object.entries(ejoins).forEach(([as, { column, refTable, refColumn }]) => {
|
|
96
|
+
const ealias = (0, import_pgproxy_client.escape)(`__$${(++joinIndex).toString(16).padStart(4, "0")}$__`);
|
|
97
|
+
joinedTables[as] ??= ealias;
|
|
98
|
+
if (count !== "only") {
|
|
99
|
+
const index = params.push(as);
|
|
100
|
+
fields.push(`JSONB_BUILD_OBJECT($${index}::TEXT, TO_JSONB(${ealias}))`);
|
|
101
|
+
}
|
|
102
|
+
from.push(`LEFT JOIN ${refTable} ${ealias} ON ${etable}.${column} = ${ealias}.${refColumn}`);
|
|
103
|
+
});
|
|
104
|
+
if (sort) {
|
|
105
|
+
const joinedOrder = order?.toLocaleLowerCase() === "desc" ? " DESC" : "";
|
|
106
|
+
if (ejoins[sort]) {
|
|
107
|
+
(0, import_utils.assert)(ejoins[sort].sortColumn, `Sort column for joined field "${sort}" not defined`);
|
|
108
|
+
const joinedTableAlias = joinedTables[sort];
|
|
109
|
+
const joinedColumn = ejoins[sort].sortColumn;
|
|
110
|
+
orderby.push(`${joinedTableAlias}.${joinedColumn}${joinedOrder} NULLS LAST`);
|
|
111
|
+
} else {
|
|
112
|
+
orderby.push(`${etable}.${(0, import_pgproxy_client.escape)(sort)}${joinedOrder}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (q) {
|
|
116
|
+
(0, import_utils.assert)(esearch, "Full-text search column not defined");
|
|
117
|
+
if (q.match(/^[\w][-@\w]*$/)) {
|
|
118
|
+
from.push(`CROSS JOIN LATERAL CAST(LOWER($${params.push(q + ":*")}) AS tsquery) AS "__query"`);
|
|
119
|
+
} else {
|
|
120
|
+
from.push(`CROSS JOIN LATERAL websearch_to_tsquery($${params.push(q)}) AS "__query"`);
|
|
121
|
+
}
|
|
122
|
+
orderby.push(`ts_rank(${etable}.${esearch}, "__query") DESC`);
|
|
123
|
+
where.push(`"__query" @@ ${etable}.${esearch}`);
|
|
124
|
+
}
|
|
125
|
+
for (const { name, field, op = "=", value } of filters) {
|
|
126
|
+
const [ecolumn, evalue] = field && ["like", "ilike", "~"].includes(op) ? [`${(0, import_pgproxy_client.escape)(name)}->>$${params.push(field)}`, value] : field ? [`${(0, import_pgproxy_client.escape)(name)}->$${params.push(field)}`, JSON.stringify(value)] : [(0, import_pgproxy_client.escape)(name), value];
|
|
127
|
+
if (op === "in") {
|
|
128
|
+
const evalue2 = field && Array.isArray(value) ? value.map((v) => JSON.stringify(v)) : value;
|
|
129
|
+
where.push(`${etable}.${ecolumn} = ANY($${params.push(evalue2)})`);
|
|
130
|
+
continue;
|
|
131
|
+
} else if (op === "not in") {
|
|
132
|
+
const evalue2 = field && Array.isArray(value) ? value.map((v) => JSON.stringify(v)) : value;
|
|
133
|
+
where.push(`${etable}.${ecolumn} != ALL($${params.push(evalue2)})`);
|
|
134
|
+
continue;
|
|
135
|
+
} else if (op === "@>" || op === "<@") {
|
|
136
|
+
(0, import_utils.assert)(!field, `Field "${field}" cannot be specified when using JSONB operator "${op}" for column "${name}"`);
|
|
137
|
+
where.push(`${etable}.${ecolumn} ${op} ($${params.push(JSON.stringify(value))})::JSONB`);
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
let operator;
|
|
141
|
+
switch (op) {
|
|
142
|
+
case ">":
|
|
143
|
+
operator = ">";
|
|
144
|
+
break;
|
|
145
|
+
case ">=":
|
|
146
|
+
operator = ">=";
|
|
147
|
+
break;
|
|
148
|
+
case "<":
|
|
149
|
+
operator = "<";
|
|
150
|
+
break;
|
|
151
|
+
case "<=":
|
|
152
|
+
operator = "<=";
|
|
153
|
+
break;
|
|
154
|
+
case "like":
|
|
155
|
+
operator = "LIKE";
|
|
156
|
+
break;
|
|
157
|
+
case "ilike":
|
|
158
|
+
operator = "ILIKE";
|
|
159
|
+
break;
|
|
160
|
+
case "~":
|
|
161
|
+
operator = "ILIKE";
|
|
162
|
+
break;
|
|
163
|
+
case "!=":
|
|
164
|
+
operator = "IS DISTINCT FROM";
|
|
165
|
+
break;
|
|
166
|
+
case "=":
|
|
167
|
+
operator = "IS NOT DISTINCT FROM";
|
|
168
|
+
break;
|
|
169
|
+
default:
|
|
170
|
+
throw new Error(`Unsupported operator "${op}" for column "${name}"`);
|
|
171
|
+
}
|
|
172
|
+
where.push(`${etable}.${ecolumn} ${operator} $${params.push(evalue)}`);
|
|
173
|
+
}
|
|
174
|
+
const result = `(${fields.join(" || ")})::TEXT AS "result"`;
|
|
175
|
+
const clauses = count === "only" ? 'COUNT(*) AS "total"' : count ? `COUNT(*) OVER() AS "total", ${result}` : result;
|
|
176
|
+
let sql = `SELECT ${clauses} FROM ${from.join(" ")}`;
|
|
177
|
+
if (where.length) sql += ` WHERE ${where.join(" AND ")}`;
|
|
178
|
+
if (orderby.length && count !== "only") sql += ` ORDER BY ${orderby.join(", ")}`;
|
|
179
|
+
if (offset) sql += ` OFFSET $${params.push(offset)}`;
|
|
180
|
+
if (limit) sql += ` LIMIT $${params.push(limit)}`;
|
|
181
|
+
return [sql, params];
|
|
182
|
+
}
|
|
183
|
+
query(options, extra) {
|
|
184
|
+
return this.#query(false, options, extra);
|
|
185
|
+
}
|
|
186
|
+
async find(options, extra) {
|
|
187
|
+
const [sql, params] = this.#query(false, { ...options, offset: 0, limit: 1 }, extra);
|
|
188
|
+
const result = await this.#persister.query(sql, params);
|
|
189
|
+
if (result.rows[0]) return JSON.parse(result.rows[0].result, reviver);
|
|
190
|
+
return void 0;
|
|
191
|
+
}
|
|
192
|
+
async search(options, extra) {
|
|
193
|
+
const [sql, params] = this.#query(true, options, extra);
|
|
194
|
+
const result = await this.#persister.query(sql, params).catch((error) => {
|
|
195
|
+
throw new Error(`Error executing search query: ${error.message}`, { cause: { sql, params, error } });
|
|
196
|
+
});
|
|
197
|
+
if (result.rows.length === 0 && (options.offset || 0) > 0) {
|
|
198
|
+
const [sql2, params2] = this.#query("only", { ...options, offset: 0, limit: void 0 }, extra);
|
|
199
|
+
const result2 = await this.#persister.query(sql2, params2);
|
|
200
|
+
(0, import_utils.assert)(result2.rows[0], "Expected total row in count query");
|
|
201
|
+
const total2 = Number(result2.rows[0].total);
|
|
202
|
+
return { total: total2, rows: [] };
|
|
203
|
+
}
|
|
204
|
+
const rows = result.rows.map((row) => JSON.parse(row.result, reviver));
|
|
205
|
+
const total = Number(result.rows[0]?.total) || 0;
|
|
206
|
+
return { total, rows };
|
|
207
|
+
}
|
|
208
|
+
};
|
|
209
|
+
var Search = SearchImpl;
|
|
210
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
211
|
+
0 && (module.exports = {
|
|
212
|
+
Search,
|
|
213
|
+
reviver
|
|
214
|
+
});
|
|
215
|
+
//# sourceMappingURL=search.cjs.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/search.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": ["evalue", "sql", "params", "result", "total"]
|
|
6
|
+
}
|