@saltcorn/db-common 0.6.2-beta.3 → 0.6.3-beta.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.
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+ /* eslint-disable */
3
+ var addSorting = (function () {
4
+ 'use strict';
5
+ var cols, currentSort = {
6
+ index: 0,
7
+ desc: false
8
+ };
9
+ // returns the summary table element
10
+ function getTable() {
11
+ return document.querySelector('.coverage-summary');
12
+ }
13
+ // returns the thead element of the summary table
14
+ function getTableHeader() {
15
+ return getTable().querySelector('thead tr');
16
+ }
17
+ // returns the tbody element of the summary table
18
+ function getTableBody() {
19
+ return getTable().querySelector('tbody');
20
+ }
21
+ // returns the th element for nth column
22
+ function getNthColumn(n) {
23
+ return getTableHeader().querySelectorAll('th')[n];
24
+ }
25
+ // loads all columns
26
+ function loadColumns() {
27
+ var colNodes = getTableHeader().querySelectorAll('th'), colNode, cols = [], col, i;
28
+ for (i = 0; i < colNodes.length; i += 1) {
29
+ colNode = colNodes[i];
30
+ col = {
31
+ key: colNode.getAttribute('data-col'),
32
+ sortable: !colNode.getAttribute('data-nosort'),
33
+ type: colNode.getAttribute('data-type') || 'string'
34
+ };
35
+ cols.push(col);
36
+ if (col.sortable) {
37
+ col.defaultDescSort = col.type === 'number';
38
+ colNode.innerHTML =
39
+ colNode.innerHTML + '<span class="sorter"></span>';
40
+ }
41
+ }
42
+ return cols;
43
+ }
44
+ // attaches a data attribute to every tr element with an object
45
+ // of data values keyed by column name
46
+ function loadRowData(tableRow) {
47
+ var tableCols = tableRow.querySelectorAll('td'), colNode, col, data = {}, i, val;
48
+ for (i = 0; i < tableCols.length; i += 1) {
49
+ colNode = tableCols[i];
50
+ col = cols[i];
51
+ val = colNode.getAttribute('data-value');
52
+ if (col.type === 'number') {
53
+ val = Number(val);
54
+ }
55
+ data[col.key] = val;
56
+ }
57
+ return data;
58
+ }
59
+ // loads all row data
60
+ function loadData() {
61
+ var rows = getTableBody().querySelectorAll('tr'), i;
62
+ for (i = 0; i < rows.length; i += 1) {
63
+ rows[i].data = loadRowData(rows[i]);
64
+ }
65
+ }
66
+ // sorts the table using the data for the ith column
67
+ function sortByIndex(index, desc) {
68
+ var key = cols[index].key, sorter = function (a, b) {
69
+ a = a.data[key];
70
+ b = b.data[key];
71
+ return a < b ? -1 : a > b ? 1 : 0;
72
+ }, finalSorter = sorter, tableBody = document.querySelector('.coverage-summary tbody'), rowNodes = tableBody.querySelectorAll('tr'), rows = [], i;
73
+ if (desc) {
74
+ finalSorter = function (a, b) {
75
+ return -1 * sorter(a, b);
76
+ };
77
+ }
78
+ for (i = 0; i < rowNodes.length; i += 1) {
79
+ rows.push(rowNodes[i]);
80
+ tableBody.removeChild(rowNodes[i]);
81
+ }
82
+ rows.sort(finalSorter);
83
+ for (i = 0; i < rows.length; i += 1) {
84
+ tableBody.appendChild(rows[i]);
85
+ }
86
+ }
87
+ // removes sort indicators for current column being sorted
88
+ function removeSortIndicators() {
89
+ var col = getNthColumn(currentSort.index), cls = col.className;
90
+ cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, '');
91
+ col.className = cls;
92
+ }
93
+ // adds sort indicators for current column being sorted
94
+ function addSortIndicators() {
95
+ getNthColumn(currentSort.index).className += currentSort.desc
96
+ ? ' sorted-desc'
97
+ : ' sorted';
98
+ }
99
+ // adds event listeners for all sorter widgets
100
+ function enableUI() {
101
+ var i, el, ithSorter = function ithSorter(i) {
102
+ var col = cols[i];
103
+ return function () {
104
+ var desc = col.defaultDescSort;
105
+ if (currentSort.index === i) {
106
+ desc = !currentSort.desc;
107
+ }
108
+ sortByIndex(i, desc);
109
+ removeSortIndicators();
110
+ currentSort.index = i;
111
+ currentSort.desc = desc;
112
+ addSortIndicators();
113
+ };
114
+ };
115
+ for (i = 0; i < cols.length; i += 1) {
116
+ if (cols[i].sortable) {
117
+ // add the click event handler on the th so users
118
+ // dont have to click on those tiny arrows
119
+ el = getNthColumn(i).querySelector('.sorter').parentElement;
120
+ if (el.addEventListener) {
121
+ el.addEventListener('click', ithSorter(i));
122
+ }
123
+ else {
124
+ el.attachEvent('onclick', ithSorter(i));
125
+ }
126
+ }
127
+ }
128
+ }
129
+ // adds sorting functionality to the UI
130
+ return function () {
131
+ if (!getTable()) {
132
+ return;
133
+ }
134
+ cols = loadColumns();
135
+ loadData();
136
+ addSortIndicators();
137
+ enableUI();
138
+ };
139
+ })();
140
+ window.addEventListener('load', addSorting);
141
+ //# sourceMappingURL=sorter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sorter.js","sourceRoot":"","sources":["../../../coverage/lcov-report/sorter.js"],"names":[],"mappings":"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"}
@@ -1,3 +1,7 @@
1
+ /**
2
+ * @category db-common
3
+ * @module internal
4
+ */
1
5
  /**
2
6
  * Transform value to correct sql name.
3
7
  * Note! Dont use other symbols than ^A-Za-z_0-9
@@ -5,7 +9,7 @@
5
9
  * @param {string} nm
6
10
  * @returns {string}
7
11
  */
8
- export declare const sqlsanitize: (nm: string | any) => string;
12
+ export declare const sqlsanitize: (nm: string | symbol) => string;
9
13
  /**
10
14
  * Transform value to correct sql name.
11
15
  * Instead of sqlsanitize also allows .
@@ -15,10 +19,38 @@ export declare const sqlsanitize: (nm: string | any) => string;
15
19
  * @param {string} nm
16
20
  * @returns {string}
17
21
  */
18
- export declare const sqlsanitizeAllowDots: (nm: string | any) => string;
22
+ export declare const sqlsanitizeAllowDots: (nm: string | symbol) => string;
23
+ export declare type Value = string | number | boolean | Date | Value[];
24
+ export declare type Where = {
25
+ _fts?: {
26
+ fields: any[];
27
+ table?: string;
28
+ searchTerm: string;
29
+ };
30
+ or?: Where[];
31
+ not?: Where | symbol;
32
+ eq?: Value[];
33
+ [key: string]: {
34
+ in: Value[];
35
+ } | {
36
+ or: Value[];
37
+ } | {
38
+ gt: Value;
39
+ equal?: boolean;
40
+ } | {
41
+ lt: Value;
42
+ equal?: boolean;
43
+ } | Value[] | {
44
+ inSelect: {
45
+ where: Where;
46
+ field: string;
47
+ table: string;
48
+ };
49
+ } | null | symbol | any;
50
+ };
19
51
  declare type WhereAndVals = {
20
52
  where: string;
21
- values: string[];
53
+ values: Value[];
22
54
  };
23
55
  /**
24
56
  * @param {object} whereObj
@@ -26,11 +58,64 @@ declare type WhereAndVals = {
26
58
  * @param {number} initCount
27
59
  * @returns {object}
28
60
  */
29
- export declare const mkWhere: (whereObj: any, is_sqlite: boolean, initCount?: number) => WhereAndVals;
61
+ export declare const mkWhere: (whereObj: Where, is_sqlite: boolean, initCount?: number) => WhereAndVals;
62
+ export declare type CoordOpts = {
63
+ latField: string;
64
+ longField: string;
65
+ lat: string;
66
+ long: string;
67
+ };
68
+ export declare type SelectOptions = {
69
+ orderBy?: {
70
+ distance: CoordOpts;
71
+ } | string;
72
+ limit?: string | number;
73
+ offset?: string | number;
74
+ nocase?: boolean;
75
+ orderDesc?: boolean;
76
+ cached?: boolean;
77
+ versioned?: boolean;
78
+ min_role_read?: number;
79
+ min_role_write?: number;
80
+ ownership_field_id?: string;
81
+ ownership_formula?: string;
82
+ description?: string;
83
+ };
84
+ export declare const orderByIsObject: (object: any) => object is {
85
+ distance: CoordOpts;
86
+ };
87
+ export declare type JoinField = {
88
+ ref: any;
89
+ target: any;
90
+ through: any;
91
+ [key: string]: any;
92
+ };
93
+ export declare type JoinOptions = {
94
+ joinFields?: JoinField;
95
+ aggregations?: AggregationOptions[];
96
+ where: any;
97
+ } & SelectOptions;
98
+ export declare type AggregationOptions = {
99
+ table: string;
100
+ ref: string;
101
+ field: string;
102
+ where?: string;
103
+ aggregate: string;
104
+ subselect?: SubselectOptions;
105
+ };
106
+ export declare type SubselectOptions = {
107
+ tableName: string;
108
+ whereField: string;
109
+ field: string;
110
+ table: any;
111
+ };
30
112
  /**
31
113
  * @param {object} selopts
32
- * @returns {string[]}
114
+ * @returns {string}
33
115
  */
34
- export declare const mkSelectOptions: (selopts: any) => string;
116
+ export declare const mkSelectOptions: (selopts: SelectOptions) => string;
117
+ export declare type Row = {
118
+ [key: string]: any;
119
+ };
35
120
  export {};
36
121
  //# sourceMappingURL=internal.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../internal.ts"],"names":[],"mappings":"AAOA;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,OAAQ,MAAM,GAAG,GAAG,KAAG,MAK9C,CAAC;AACF;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,OAAQ,MAAM,GAAG,GAAG,KAAG,MAKvD,CAAC;AA6OF,aAAK,YAAY,GAAG;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC;AACF;;;;;GAKG;AACH,eAAO,MAAM,OAAO,aACR,GAAG,aACF,OAAO,yBAEjB,YAaF,CAAC;AAsCF;;;GAGG;AACH,eAAO,MAAM,eAAe,YAAa,GAAG,WAkB3C,CAAC"}
1
+ {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../internal.ts"],"names":[],"mappings":"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"}
package/dist/internal.js CHANGED
@@ -1,11 +1,10 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.mkSelectOptions = exports.mkWhere = exports.sqlsanitizeAllowDots = exports.sqlsanitize = void 0;
4
2
  /**
5
3
  * @category db-common
6
4
  * @module internal
7
5
  */
8
- const { footer } = require("@saltcorn/markup/tags");
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.mkSelectOptions = exports.orderByIsObject = exports.mkWhere = exports.sqlsanitizeAllowDots = exports.sqlsanitize = void 0;
9
8
  //https://stackoverflow.com/questions/15300704/regex-with-my-jquery-function-for-sql-variable-name-validation
10
9
  /**
11
10
  * Transform value to correct sql name.
@@ -15,8 +14,9 @@ const { footer } = require("@saltcorn/markup/tags");
15
14
  * @returns {string}
16
15
  */
17
16
  const sqlsanitize = (nm) => {
18
- if (typeof nm === "symbol")
19
- return (0, exports.sqlsanitize)(nm.description);
17
+ if (typeof nm === "symbol") {
18
+ return nm.description ? (0, exports.sqlsanitize)(nm.description) : "";
19
+ }
20
20
  const s = nm.replace(/[^A-Za-z_0-9]*/g, "");
21
21
  if (s[0] >= "0" && s[0] <= "9")
22
22
  return `_${s}`;
@@ -34,8 +34,9 @@ exports.sqlsanitize = sqlsanitize;
34
34
  * @returns {string}
35
35
  */
36
36
  const sqlsanitizeAllowDots = (nm) => {
37
- if (typeof nm === "symbol")
38
- return (0, exports.sqlsanitizeAllowDots)(nm.description);
37
+ if (typeof nm === "symbol") {
38
+ return nm.description ? (0, exports.sqlsanitizeAllowDots)(nm.description) : "";
39
+ }
39
40
  const s = nm.replace(/[^A-Za-z_0-9."]*/g, "");
40
41
  if (s[0] >= "0" && s[0] <= "9")
41
42
  return `_${s}`;
@@ -43,6 +44,34 @@ const sqlsanitizeAllowDots = (nm) => {
43
44
  return s;
44
45
  };
45
46
  exports.sqlsanitizeAllowDots = sqlsanitizeAllowDots;
47
+ const postgresPlaceHolderStack = (init = 0) => {
48
+ let values = [];
49
+ let i = init;
50
+ return {
51
+ push(x) {
52
+ values.push(x);
53
+ i += 1;
54
+ return `$${i}`;
55
+ },
56
+ is_sqlite: false,
57
+ getValues() {
58
+ return values;
59
+ },
60
+ };
61
+ };
62
+ const sqlitePlaceHolderStack = () => {
63
+ let values = [];
64
+ return {
65
+ push(x) {
66
+ values.push(x);
67
+ return `?`;
68
+ },
69
+ is_sqlite: true,
70
+ getValues() {
71
+ return values;
72
+ },
73
+ };
74
+ };
46
75
  /**
47
76
  *
48
77
  * @param {object} v
@@ -50,9 +79,9 @@ exports.sqlsanitizeAllowDots = sqlsanitizeAllowDots;
50
79
  * @param {boolean} is_sqlite
51
80
  * @returns {string}
52
81
  */
53
- const whereFTS = (v, i, is_sqlite) => {
82
+ const whereFTS = (v, phs) => {
54
83
  const { fields, table } = v;
55
- var flds = fields
84
+ let flds = fields
56
85
  .filter((f) => f.type && f.type.sql_name === "text")
57
86
  .map((f) => "coalesce(" +
58
87
  (table
@@ -62,26 +91,10 @@ const whereFTS = (v, i, is_sqlite) => {
62
91
  .join(" || ' ' || ");
63
92
  if (flds === "")
64
93
  flds = "''";
65
- if (is_sqlite)
66
- return `${flds} LIKE '%' || ? || '%'`;
94
+ if (phs.is_sqlite)
95
+ return `${flds} LIKE '%' || ${phs.push(v.searchTerm)} || '%'`;
67
96
  else
68
- return `to_tsvector('english', ${flds}) @@ plainto_tsquery('english', $${i})`;
69
- };
70
- /**
71
- * @param {boolean} is_sqlite
72
- * @param {string} i
73
- * @returns {string}
74
- */
75
- const placeHolder = (is_sqlite, i) => is_sqlite ? `?` : `$${i}`;
76
- /**
77
- * @returns {number}
78
- */
79
- const mkCounter = (init = 0) => {
80
- let i = init;
81
- return () => {
82
- i += 1;
83
- return i;
84
- };
97
+ return `to_tsvector('english', ${flds}) @@ plainto_tsquery('english', ${phs.push(v.searchTerm)})`;
85
98
  };
86
99
  /**
87
100
  *
@@ -89,27 +102,14 @@ const mkCounter = (init = 0) => {
89
102
  * @param {string} i
90
103
  * @returns {function}
91
104
  */
92
- const subSelectWhere = (is_sqlite, i) => (k, v) => {
105
+ const subSelectWhere = (phs) => (k, v) => {
93
106
  const whereObj = v.inSelect.where;
94
107
  const wheres = whereObj ? Object.entries(whereObj) : [];
95
108
  const where = whereObj && wheres.length > 0
96
- ? "where " + wheres.map(whereClause(is_sqlite, i)).join(" and ")
109
+ ? "where " + wheres.map(whereClause(phs)).join(" and ")
97
110
  : "";
98
111
  return `${quote((0, exports.sqlsanitizeAllowDots)(k))} in (select ${v.inSelect.field} from ${v.inSelect.table} ${where})`;
99
112
  };
100
- /**
101
- * @param {object} v
102
- * @returns {object[]}
103
- */
104
- const subSelectVals = (v) => {
105
- const whereObj = v.inSelect.where;
106
- const wheres = whereObj ? Object.entries(whereObj) : [];
107
- const xs = wheres
108
- .map(getVal)
109
- .flat(1)
110
- .filter((v) => v !== null);
111
- return xs;
112
- };
113
113
  /**
114
114
  * @param {string} s
115
115
  * @returns {string}
@@ -119,21 +119,25 @@ const wrapParens = (s) => (s ? `(${s})` : s);
119
119
  * @param {string} s
120
120
  * @returns {string}
121
121
  */
122
- const quote = (s) => s.includes(".") || s.includes('"') ? s : `"${s}"`;
122
+ const quote = (s) => s.includes(".")
123
+ ? s.split(".").map(quote).join(".")
124
+ : s.includes('"')
125
+ ? s
126
+ : `"${s}"`;
123
127
  /**
124
128
  * @param {boolean} is_sqlite
125
129
  * @param {string} i
126
130
  * @returns {function}
127
131
  */
128
- const whereOr = (is_sqlite, i) => (ors) => wrapParens(ors
132
+ const whereOr = (phs) => (ors) => wrapParens(ors
129
133
  .map((vi) => Object.entries(vi)
130
- .map((kv) => whereClause(is_sqlite, i)(kv))
134
+ .map((kv) => whereClause(phs)(kv))
131
135
  .join(" and "))
132
136
  .join(" or "));
133
- const equals = ([v1, v2], is_sqlite, i) => {
137
+ const equals = ([v1, v2], phs) => {
134
138
  const pVal = (v) => typeof v === "symbol"
135
- ? quote((0, exports.sqlsanitizeAllowDots)(v.description))
136
- : placeHolder(is_sqlite, i()) + (typeof v === "string" ? "::text" : "");
139
+ ? quote((0, exports.sqlsanitizeAllowDots)(v))
140
+ : phs.push(v) + (typeof v === "string" ? "::text" : "");
137
141
  const isNull = (v) => `${pVal(v)} is null`;
138
142
  if (v1 === null && v2 === null)
139
143
  return "null is null";
@@ -143,92 +147,45 @@ const equals = ([v1, v2], is_sqlite, i) => {
143
147
  return isNull(v1);
144
148
  return `${pVal(v1)}=${pVal(v2)}`;
145
149
  };
146
- const equalsVals = (vs) => {
147
- let vals = new Array();
148
- vs.forEach((v) => {
149
- if (v !== null && typeof v !== "symbol")
150
- vals.push(v);
151
- });
152
- //console.log({ vals });
153
- return vals;
154
- };
155
150
  /**
156
151
  * @param {boolean} is_sqlite
157
152
  * @param {string} i
158
153
  * @returns {function}
159
154
  */
160
- const whereClause = (is_sqlite, i) => ([k, v]) => k === "_fts"
161
- ? whereFTS(v, i(), is_sqlite)
155
+ const whereClause = (phs) => ([k, v]) => k === "_fts"
156
+ ? whereFTS(v, phs)
162
157
  : typeof (v || {}).in !== "undefined"
163
- ? `${quote((0, exports.sqlsanitizeAllowDots)(k))} = ${is_sqlite ? "" : "ANY"} (${placeHolder(is_sqlite, i())})`
158
+ ? `${quote((0, exports.sqlsanitizeAllowDots)(k))} = ${phs.is_sqlite ? "" : "ANY"} (${phs.push(v.in)})`
164
159
  : k === "or" && Array.isArray(v)
165
- ? whereOr(is_sqlite, i)(v)
160
+ ? whereOr(phs)(v)
166
161
  : k === "not" && typeof v === "object"
167
162
  ? `not (${Object.entries(v)
168
- .map((kv) => whereClause(is_sqlite, i)(kv))
163
+ .map((kv) => whereClause(phs)(kv))
169
164
  .join(" and ")})`
170
165
  : k === "eq" && Array.isArray(v)
171
166
  ? // @ts-ignore
172
- equals(v, is_sqlite, i)
167
+ equals(v, phs)
173
168
  : v && v.or && Array.isArray(v.or)
174
- ? wrapParens(v.or.map((vi) => whereClause(is_sqlite, i)([k, vi])).join(" or "))
169
+ ? wrapParens(v.or.map((vi) => whereClause(phs)([k, vi])).join(" or "))
175
170
  : Array.isArray(v)
176
- ? v.map((vi) => whereClause(is_sqlite, i)([k, vi])).join(" and ")
171
+ ? v.map((vi) => whereClause(phs)([k, vi])).join(" and ")
177
172
  : typeof (v || {}).ilike !== "undefined"
178
- ? `${quote((0, exports.sqlsanitizeAllowDots)(k))} ${is_sqlite ? "LIKE" : "ILIKE"} '%' || ${placeHolder(is_sqlite, i())} || '%'`
173
+ ? `${quote((0, exports.sqlsanitizeAllowDots)(k))} ${phs.is_sqlite ? "LIKE" : "ILIKE"} '%' || ${phs.push(v.ilike)} || '%'`
179
174
  : typeof (v || {}).gt !== "undefined"
180
- ? `${quote((0, exports.sqlsanitizeAllowDots)(k))}>${v.equal ? "=" : ""}${placeHolder(is_sqlite, i())}`
175
+ ? `${quote((0, exports.sqlsanitizeAllowDots)(k))}>${v.equal ? "=" : ""}${phs.push(v.gt)}`
181
176
  : typeof (v || {}).lt !== "undefined"
182
- ? `${quote((0, exports.sqlsanitizeAllowDots)(k))}<${v.equal ? "=" : ""}${placeHolder(is_sqlite, i())}`
177
+ ? `${quote((0, exports.sqlsanitizeAllowDots)(k))}<${v.equal ? "=" : ""}${phs.push(v.lt)}`
183
178
  : typeof (v || {}).inSelect !== "undefined"
184
- ? subSelectWhere(is_sqlite, i)(k, v)
179
+ ? subSelectWhere(phs)(k, v)
185
180
  : typeof (v || {}).json !== "undefined"
186
- ? is_sqlite
187
- ? `json_extract(${quote((0, exports.sqlsanitizeAllowDots)(k))}, '$.${(0, exports.sqlsanitizeAllowDots)(v.json[0])}')=${placeHolder(is_sqlite, i())}`
188
- : `${quote((0, exports.sqlsanitizeAllowDots)(k))}->>'${(0, exports.sqlsanitizeAllowDots)(v.json[0])}'=${placeHolder(is_sqlite, i())}`
181
+ ? phs.is_sqlite
182
+ ? `json_extract(${quote((0, exports.sqlsanitizeAllowDots)(k))}, '$.${(0, exports.sqlsanitizeAllowDots)(v.json[0])}')=${phs.push(v.json[1])}`
183
+ : `${quote((0, exports.sqlsanitizeAllowDots)(k))}->>'${(0, exports.sqlsanitizeAllowDots)(v.json[0])}'=${phs.push(v.json[1])}`
189
184
  : v === null
190
185
  ? `${quote((0, exports.sqlsanitizeAllowDots)(k))} is null`
191
186
  : k === "not"
192
- ? `not (${typeof v === "symbol" ? v.description : placeHolder(is_sqlite, i())})`
193
- : `${quote((0, exports.sqlsanitizeAllowDots)(k))}=${typeof v === "symbol" ? v.description : placeHolder(is_sqlite, i())}`;
194
- /**
195
- * @param {object[]} opts
196
- * @param {object} opts.k
197
- * @param {object} opts.v
198
- * @returns {boolean|object}
199
- */
200
- const getVal = ([k, v]) => k === "_fts"
201
- ? v.searchTerm
202
- : typeof (v || {}).in !== "undefined"
203
- ? [v.in]
204
- : k === "not" && typeof v === "object"
205
- ? Object.entries(v).map(getVal).flat(1)
206
- : k === "eq" && Array.isArray(v)
207
- ? equalsVals(v).flat(1)
208
- : k === "or" && Array.isArray(v)
209
- ? v
210
- .map((vi) => Object.entries(vi).map(getVal))
211
- .flat(1)
212
- .flat(1)
213
- : v && v.or && Array.isArray(v.or)
214
- ? v.or.map((vi) => getVal([k, vi])).flat(1)
215
- : Array.isArray(v)
216
- ? v.map((vi) => getVal([k, vi])).flat(1)
217
- : typeof (v || {}).ilike !== "undefined"
218
- ? v.ilike
219
- : typeof (v || {}).inSelect !== "undefined"
220
- ? subSelectVals(v)
221
- : typeof (v || {}).lt !== "undefined"
222
- ? v.lt
223
- : typeof (v || {}).gt !== "undefined"
224
- ? v.gt
225
- : typeof (v || {}).sql !== "undefined"
226
- ? null
227
- : typeof (v || {}).json !== "undefined"
228
- ? v.json[1]
229
- : typeof v === "symbol"
230
- ? null
231
- : v;
187
+ ? `not (${typeof v === "symbol" ? v.description : phs.push(v)})`
188
+ : `${quote((0, exports.sqlsanitizeAllowDots)(k))}=${typeof v === "symbol" ? v.description : phs.push(v)}`;
232
189
  /**
233
190
  * @param {object} whereObj
234
191
  * @param {boolean} is_sqlite
@@ -238,14 +195,13 @@ const getVal = ([k, v]) => k === "_fts"
238
195
  const mkWhere = (whereObj, is_sqlite, initCount = 0) => {
239
196
  const wheres = whereObj ? Object.entries(whereObj) : [];
240
197
  //console.log({ wheres });
198
+ const placeHolderStack = is_sqlite
199
+ ? sqlitePlaceHolderStack()
200
+ : postgresPlaceHolderStack(initCount);
241
201
  const where = whereObj && wheres.length > 0
242
- ? "where " +
243
- wheres.map(whereClause(is_sqlite, mkCounter(initCount))).join(" and ")
202
+ ? "where " + wheres.map(whereClause(placeHolderStack)).join(" and ")
244
203
  : "";
245
- const values = wheres
246
- .map(getVal)
247
- .flat(1)
248
- .filter((v) => v !== null);
204
+ const values = placeHolderStack.getValues();
249
205
  return { where, values };
250
206
  };
251
207
  exports.mkWhere = mkWhere;
@@ -270,19 +226,25 @@ const getDistanceOrder = ({ latField, longField, lat, long }) => {
270
226
  const cos_lat_2 = Math.pow(Math.cos((+lat * Math.PI) / 180), 2);
271
227
  return `((${(0, exports.sqlsanitizeAllowDots)(latField)} - ${+lat})*(${(0, exports.sqlsanitizeAllowDots)(latField)} - ${+lat})) + ((${(0, exports.sqlsanitizeAllowDots)(longField)} - ${+long})*(${(0, exports.sqlsanitizeAllowDots)(longField)} - ${+long})*${cos_lat_2})`;
272
228
  };
229
+ const orderByIsObject = (object) => {
230
+ return object && object.distance;
231
+ };
232
+ exports.orderByIsObject = orderByIsObject;
273
233
  /**
274
234
  * @param {object} selopts
275
- * @returns {string[]}
235
+ * @returns {string}
276
236
  */
277
237
  const mkSelectOptions = (selopts) => {
278
238
  const orderby = selopts.orderBy === "RANDOM()"
279
239
  ? "order by RANDOM()"
280
- : selopts.orderBy && selopts.orderBy.distance
240
+ : selopts.orderBy &&
241
+ typeof selopts.orderBy === "object" &&
242
+ selopts.orderBy.distance
281
243
  ? `order by ${getDistanceOrder(selopts.orderBy.distance)}`
282
- : selopts.orderBy && selopts.nocase
283
- ? `order by lower(${(0, exports.sqlsanitizeAllowDots)(selopts.orderBy)})${selopts.orderDesc ? " DESC" : ""}`
284
- : selopts.orderBy
285
- ? `order by ${(0, exports.sqlsanitizeAllowDots)(selopts.orderBy)}${selopts.orderDesc ? " DESC" : ""}`
244
+ : selopts.orderBy && typeof selopts.orderBy === "string" && selopts.nocase
245
+ ? `order by lower(${quote((0, exports.sqlsanitizeAllowDots)(selopts.orderBy))})${selopts.orderDesc ? " DESC" : ""}`
246
+ : selopts.orderBy && typeof selopts.orderBy === "string"
247
+ ? `order by ${quote((0, exports.sqlsanitizeAllowDots)(selopts.orderBy))}${selopts.orderDesc ? " DESC" : ""}`
286
248
  : "";
287
249
  const limit = selopts.limit ? `limit ${toInt(selopts.limit)}` : "";
288
250
  const offset = selopts.offset ? `offset ${toInt(selopts.offset)}` : "";