couchset 0.2.7 → 0.3.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 +284 -153
- package/dist/connection/connection.d.ts +68 -0
- package/dist/connection/connection.js +485 -0
- package/dist/connection/connection.js.map +1 -0
- package/dist/connection/env.d.ts +2 -0
- package/dist/connection/env.js +16 -0
- package/dist/connection/env.js.map +1 -0
- package/dist/connection/index.d.ts +3 -0
- package/dist/connection/index.js +25 -0
- package/dist/connection/index.js.map +1 -0
- package/dist/connection/types.d.ts +25 -0
- package/dist/connection/types.js +3 -0
- package/dist/connection/types.js.map +1 -0
- package/dist/database.d.ts +9 -0
- package/dist/database.js +196 -0
- package/dist/database.js.map +1 -0
- package/dist/index.d.ts +18 -6
- package/dist/index.js +53 -8
- package/dist/index.js.map +1 -1
- package/dist/legacy/connection.d.ts +2 -0
- package/dist/legacy/connection.js +24 -0
- package/dist/legacy/connection.js.map +1 -0
- package/dist/legacy/index.d.ts +10 -0
- package/dist/legacy/index.js +93 -0
- package/dist/legacy/index.js.map +1 -0
- package/dist/legacy/model.d.ts +55 -0
- package/dist/legacy/model.js +282 -0
- package/dist/legacy/model.js.map +1 -0
- package/dist/legacy/pagination/index.d.ts +1 -0
- package/dist/legacy/pagination/index.js +18 -0
- package/dist/legacy/pagination/index.js.map +1 -0
- package/dist/legacy/pagination/pagination.d.ts +12 -0
- package/dist/legacy/pagination/pagination.js +85 -0
- package/dist/legacy/pagination/pagination.js.map +1 -0
- package/dist/legacy/search/customQuery.d.ts +13 -0
- package/dist/legacy/search/customQuery.js +73 -0
- package/dist/legacy/search/customQuery.js.map +1 -0
- package/dist/legacy/search/index.d.ts +1 -0
- package/dist/legacy/search/index.js +18 -0
- package/dist/legacy/search/index.js.map +1 -0
- package/dist/model/default-scope.d.ts +10 -0
- package/dist/model/default-scope.js +47 -0
- package/dist/model/default-scope.js.map +1 -0
- package/dist/model/hydrated-document.d.ts +30 -0
- package/dist/model/hydrated-document.js +118 -0
- package/dist/model/hydrated-document.js.map +1 -0
- package/dist/model/include.d.ts +33 -0
- package/dist/model/include.js +250 -0
- package/dist/model/include.js.map +1 -0
- package/dist/model/index.d.ts +137 -51
- package/dist/model/index.js +519 -174
- package/dist/model/index.js.map +1 -1
- package/dist/model/indexes.d.ts +16 -0
- package/dist/model/indexes.js +155 -0
- package/dist/model/indexes.js.map +1 -0
- package/dist/model/keyspace.d.ts +9 -0
- package/dist/model/keyspace.js +28 -0
- package/dist/model/keyspace.js.map +1 -0
- package/dist/model/read-helpers.d.ts +36 -0
- package/dist/model/read-helpers.js +275 -0
- package/dist/model/read-helpers.js.map +1 -0
- package/dist/model/safe-query.d.ts +23 -0
- package/dist/model/safe-query.js +138 -0
- package/dist/model/safe-query.js.map +1 -0
- package/dist/model/ttl.d.ts +9 -0
- package/dist/model/ttl.js +73 -0
- package/dist/model/ttl.js.map +1 -0
- package/dist/model/validation.d.ts +5 -0
- package/dist/model/validation.js +104 -0
- package/dist/model/validation.js.map +1 -0
- package/dist/model/write-helpers.d.ts +31 -0
- package/dist/model/write-helpers.js +220 -0
- package/dist/model/write-helpers.js.map +1 -0
- package/dist/pagination/index.d.ts +1 -0
- package/dist/pagination/index.js +1 -0
- package/dist/pagination/index.js.map +1 -1
- package/dist/pagination/pagination.d.ts +1 -8
- package/dist/pagination/pagination.js +16 -29
- package/dist/pagination/pagination.js.map +1 -1
- package/dist/pagination/safe-pagination.d.ts +15 -0
- package/dist/pagination/safe-pagination.js +221 -0
- package/dist/pagination/safe-pagination.js.map +1 -0
- package/dist/pagination/types.d.ts +11 -0
- package/dist/pagination/types.js +3 -0
- package/dist/pagination/types.js.map +1 -0
- package/dist/search/customQuery.d.ts +10 -3
- package/dist/search/customQuery.js +17 -18
- package/dist/search/customQuery.js.map +1 -1
- package/dist/shared/common.model.js +2 -2
- package/dist/shared/common.model.js.map +1 -1
- package/dist/timeseries/index.d.ts +1 -0
- package/dist/timeseries/index.js +18 -0
- package/dist/timeseries/index.js.map +1 -0
- package/dist/timeseries/time-series-model.d.ts +60 -0
- package/dist/timeseries/time-series-model.js +267 -0
- package/dist/timeseries/time-series-model.js.map +1 -0
- package/dist/utils/awaitTo.d.ts +1 -1
- package/dist/utils/awaitTo.js +1 -1
- package/dist/utils/awaitTo.js.map +1 -1
- package/docs/beta-migration.md +175 -0
- package/legacy/index.js +1 -0
- package/legacy/package.json +4 -0
- package/next/index.js +1 -0
- package/next/package.json +4 -0
- package/package.json +13 -8
- package/dist/connection.d.ts +0 -42
- package/dist/connection.js +0 -156
- package/dist/connection.js.map +0 -1
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
14
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
15
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
16
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
17
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
18
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
19
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
23
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
24
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
25
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
26
|
+
function step(op) {
|
|
27
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
28
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
29
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
30
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
31
|
+
switch (op[0]) {
|
|
32
|
+
case 0: case 1: t = op; break;
|
|
33
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
34
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
35
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
36
|
+
default:
|
|
37
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
38
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
39
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
40
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
41
|
+
if (t[2]) _.ops.pop();
|
|
42
|
+
_.trys.pop(); continue;
|
|
43
|
+
}
|
|
44
|
+
op = body.call(thisArg, _);
|
|
45
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
46
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
50
|
+
var t = {};
|
|
51
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
52
|
+
t[p] = s[p];
|
|
53
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
54
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
55
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
56
|
+
t[p[i]] = s[p[i]];
|
|
57
|
+
}
|
|
58
|
+
return t;
|
|
59
|
+
};
|
|
60
|
+
var __read = (this && this.__read) || function (o, n) {
|
|
61
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
62
|
+
if (!m) return o;
|
|
63
|
+
var i = m.call(o), r, ar = [], e;
|
|
64
|
+
try {
|
|
65
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
66
|
+
}
|
|
67
|
+
catch (error) { e = { error: error }; }
|
|
68
|
+
finally {
|
|
69
|
+
try {
|
|
70
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
71
|
+
}
|
|
72
|
+
finally { if (e) throw e.error; }
|
|
73
|
+
}
|
|
74
|
+
return ar;
|
|
75
|
+
};
|
|
76
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
77
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
78
|
+
if (ar || !(i in from)) {
|
|
79
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
80
|
+
ar[i] = from[i];
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
84
|
+
};
|
|
85
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
86
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
87
|
+
};
|
|
88
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
89
|
+
exports.findByIdWithMeta = exports.incrementById = exports.patchById = exports.mutateById = exports.replaceById = exports.upsert = exports.insert = void 0;
|
|
90
|
+
var couchbase_1 = __importDefault(require("../couchbase"));
|
|
91
|
+
var uuid_1 = require("../uuid");
|
|
92
|
+
var ttl_1 = require("./ttl");
|
|
93
|
+
var validation_1 = require("./validation");
|
|
94
|
+
var now = function () { return new Date(); };
|
|
95
|
+
var modelDocument = function (context, data, createdAt) {
|
|
96
|
+
var id = (0, uuid_1.generateUUID)();
|
|
97
|
+
var timestamp = now();
|
|
98
|
+
return __assign(__assign({ id: id }, data), { createdAt: createdAt || timestamp, updatedAt: timestamp, _type: context.collectionName, _scope: context.scope });
|
|
99
|
+
};
|
|
100
|
+
var replacementDocument = function (context, id, data, options) {
|
|
101
|
+
var document = __assign(__assign({}, data), { id: id, _type: context.collectionName, _scope: context.scope });
|
|
102
|
+
if (!options || !options.silent) {
|
|
103
|
+
document.updatedAt = now();
|
|
104
|
+
}
|
|
105
|
+
return document;
|
|
106
|
+
};
|
|
107
|
+
var unsetPaths = function (value) {
|
|
108
|
+
if (!value) {
|
|
109
|
+
return [];
|
|
110
|
+
}
|
|
111
|
+
return Array.isArray(value) ? value : Object.keys(value);
|
|
112
|
+
};
|
|
113
|
+
var insert = function (context, data, options) { return __awaiter(void 0, void 0, void 0, function () {
|
|
114
|
+
var document, validated;
|
|
115
|
+
return __generator(this, function (_a) {
|
|
116
|
+
switch (_a.label) {
|
|
117
|
+
case 0:
|
|
118
|
+
document = modelDocument(context, data);
|
|
119
|
+
return [4 /*yield*/, (0, validation_1.applyValidation)(document, context.validateCreate)];
|
|
120
|
+
case 1:
|
|
121
|
+
validated = _a.sent();
|
|
122
|
+
return [4 /*yield*/, context.collection.insert(validated.id, validated, (0, ttl_1.applyTtlOptions)(options))];
|
|
123
|
+
case 2:
|
|
124
|
+
_a.sent();
|
|
125
|
+
return [2 /*return*/, context.parse(validated)];
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
}); };
|
|
129
|
+
exports.insert = insert;
|
|
130
|
+
var upsert = function (context, data, options) { return __awaiter(void 0, void 0, void 0, function () {
|
|
131
|
+
var document, validated;
|
|
132
|
+
return __generator(this, function (_a) {
|
|
133
|
+
switch (_a.label) {
|
|
134
|
+
case 0:
|
|
135
|
+
document = modelDocument(context, data);
|
|
136
|
+
return [4 /*yield*/, (0, validation_1.applyValidation)(document, context.validateCreate)];
|
|
137
|
+
case 1:
|
|
138
|
+
validated = _a.sent();
|
|
139
|
+
return [4 /*yield*/, context.collection.upsert(validated.id, validated, (0, ttl_1.applyTtlOptions)(options))];
|
|
140
|
+
case 2:
|
|
141
|
+
_a.sent();
|
|
142
|
+
return [2 /*return*/, context.parse(validated)];
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
}); };
|
|
146
|
+
exports.upsert = upsert;
|
|
147
|
+
var replaceById = function (context, id, data, options) { return __awaiter(void 0, void 0, void 0, function () {
|
|
148
|
+
var _a, silent, replaceOptions, document, validated;
|
|
149
|
+
return __generator(this, function (_b) {
|
|
150
|
+
switch (_b.label) {
|
|
151
|
+
case 0:
|
|
152
|
+
_a = options || {}, silent = _a.silent, replaceOptions = __rest(_a, ["silent"]);
|
|
153
|
+
document = replacementDocument(context, id, data, { silent: silent });
|
|
154
|
+
return [4 /*yield*/, (0, validation_1.applyValidation)(document, context.validateReplace)];
|
|
155
|
+
case 1:
|
|
156
|
+
validated = _b.sent();
|
|
157
|
+
return [4 /*yield*/, context.collection.replace(id, validated, replaceOptions)];
|
|
158
|
+
case 2:
|
|
159
|
+
_b.sent();
|
|
160
|
+
return [2 /*return*/, context.parse(validated)];
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
}); };
|
|
164
|
+
exports.replaceById = replaceById;
|
|
165
|
+
var mutateById = function (context, id, specs, options) { return __awaiter(void 0, void 0, void 0, function () {
|
|
166
|
+
return __generator(this, function (_a) {
|
|
167
|
+
if (!Array.isArray(specs) || !specs.length) {
|
|
168
|
+
throw new Error('mutateById requires at least one mutation spec');
|
|
169
|
+
}
|
|
170
|
+
return [2 /*return*/, context.collection.mutateIn(id, specs, options)];
|
|
171
|
+
});
|
|
172
|
+
}); };
|
|
173
|
+
exports.mutateById = mutateById;
|
|
174
|
+
var patchById = function (context, id, patch, options) { return __awaiter(void 0, void 0, void 0, function () {
|
|
175
|
+
var specs, data;
|
|
176
|
+
return __generator(this, function (_a) {
|
|
177
|
+
switch (_a.label) {
|
|
178
|
+
case 0:
|
|
179
|
+
specs = __spreadArray(__spreadArray(__spreadArray(__spreadArray([], __read(Object.keys(patch.$set || {}).map(function (path) {
|
|
180
|
+
return couchbase_1.default.MutateInSpec.upsert(path, patch.$set[path]);
|
|
181
|
+
})), false), __read(unsetPaths(patch.$unset).map(function (path) { return couchbase_1.default.MutateInSpec.remove(path); })), false), __read(Object.keys(patch.$inc || {}).map(function (path) {
|
|
182
|
+
return couchbase_1.default.MutateInSpec.increment(path, patch.$inc[path]);
|
|
183
|
+
})), false), [
|
|
184
|
+
couchbase_1.default.MutateInSpec.upsert('updatedAt', now()),
|
|
185
|
+
], false);
|
|
186
|
+
return [4 /*yield*/, (0, exports.mutateById)(context, id, specs, options)];
|
|
187
|
+
case 1:
|
|
188
|
+
_a.sent();
|
|
189
|
+
return [4 /*yield*/, context.collection.get(id)];
|
|
190
|
+
case 2:
|
|
191
|
+
data = _a.sent();
|
|
192
|
+
return [2 /*return*/, context.parse(data.content)];
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
}); };
|
|
196
|
+
exports.patchById = patchById;
|
|
197
|
+
var incrementById = function (context, id, field, delta, options) { return __awaiter(void 0, void 0, void 0, function () {
|
|
198
|
+
var _a;
|
|
199
|
+
return __generator(this, function (_b) {
|
|
200
|
+
return [2 /*return*/, (0, exports.patchById)(context, id, { $inc: (_a = {}, _a[field] = delta, _a) }, options)];
|
|
201
|
+
});
|
|
202
|
+
}); };
|
|
203
|
+
exports.incrementById = incrementById;
|
|
204
|
+
var findByIdWithMeta = function (context, id, options) { return __awaiter(void 0, void 0, void 0, function () {
|
|
205
|
+
var data;
|
|
206
|
+
return __generator(this, function (_a) {
|
|
207
|
+
switch (_a.label) {
|
|
208
|
+
case 0: return [4 /*yield*/, context.collection.get(id, options)];
|
|
209
|
+
case 1:
|
|
210
|
+
data = _a.sent();
|
|
211
|
+
return [2 /*return*/, {
|
|
212
|
+
content: context.parse(data.content),
|
|
213
|
+
cas: data.cas,
|
|
214
|
+
expiryTime: data.expiryTime,
|
|
215
|
+
}];
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
}); };
|
|
219
|
+
exports.findByIdWithMeta = findByIdWithMeta;
|
|
220
|
+
//# sourceMappingURL=write-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-helpers.js","sourceRoot":"","sources":["../../src/model/write-helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n Collection,\n GetOptions,\n InsertOptions,\n MutateInOptions,\n ReplaceOptions,\n UpsertOptions,\n} from 'couchbase';\n\nimport couchbase from '../couchbase';\nimport {generateUUID} from '../uuid';\n\nimport {applyTtlOptions, TtlOptions} from './ttl';\nimport {applyValidation, ValidationHook} from './validation';\n\nimport type {AutoModelFields, UpdateOptions} from './index';\n\nexport interface ModelWriteContext {\n collection: Collection;\n collectionName: string;\n scope: string;\n parse: <T>(data: T) => T;\n validateCreate?: ValidationHook;\n validateReplace?: ValidationHook;\n}\n\nexport interface PatchByIdArgs {\n $set?: Record<string, any>;\n $unset?: string[] | Record<string, any>;\n $inc?: Record<string, number>;\n}\n\nexport interface FindByIdWithMetaResult<T> {\n content: T & AutoModelFields;\n cas: any;\n expiryTime?: any;\n}\n\nexport type InsertWriteOptions = InsertOptions & TtlOptions;\nexport type UpsertWriteOptions = UpsertOptions & TtlOptions;\n\nconst now = (): Date => new Date();\n\nconst modelDocument = <T>(\n context: ModelWriteContext,\n data: T,\n createdAt?: Date\n): T & AutoModelFields => {\n const id = generateUUID();\n const timestamp = now();\n\n return {\n id,\n ...data,\n createdAt: createdAt || timestamp,\n updatedAt: timestamp,\n _type: context.collectionName,\n _scope: context.scope,\n } as T & AutoModelFields;\n};\n\nconst replacementDocument = <T>(\n context: ModelWriteContext,\n id: string,\n data: T,\n options?: UpdateOptions\n): T & AutoModelFields => {\n const document: any = {\n ...data,\n id,\n _type: context.collectionName,\n _scope: context.scope,\n };\n\n if (!options || !options.silent) {\n document.updatedAt = now();\n }\n\n return document;\n};\n\nconst unsetPaths = (value?: string[] | Record<string, any>): string[] => {\n if (!value) {\n return [];\n }\n\n return Array.isArray(value) ? value : Object.keys(value);\n};\n\nexport const insert = async <T>(\n context: ModelWriteContext,\n data: T,\n options?: InsertWriteOptions\n): Promise<T & AutoModelFields> => {\n const document = modelDocument<T>(context, data);\n const validated = await applyValidation(document, context.validateCreate);\n\n await context.collection.insert(validated.id, validated, applyTtlOptions(options));\n\n return context.parse<T & AutoModelFields>(validated);\n};\n\nexport const upsert = async <T>(\n context: ModelWriteContext,\n data: T,\n options?: UpsertWriteOptions\n): Promise<T & AutoModelFields> => {\n const document = modelDocument<T>(context, data);\n const validated = await applyValidation(document, context.validateCreate);\n\n await context.collection.upsert(validated.id, validated, applyTtlOptions(options));\n\n return context.parse<T & AutoModelFields>(validated);\n};\n\nexport const replaceById = async <T>(\n context: ModelWriteContext,\n id: string,\n data: T,\n options?: UpdateOptions\n): Promise<T & AutoModelFields> => {\n const {silent, ...replaceOptions} = options || {};\n const document = replacementDocument<T>(context, id, data, {silent});\n const validated = await applyValidation(document, context.validateReplace);\n\n await context.collection.replace(id, validated, replaceOptions as ReplaceOptions);\n\n return context.parse<T & AutoModelFields>(validated);\n};\n\nexport const mutateById = async (\n context: ModelWriteContext,\n id: string,\n specs: any[],\n options?: MutateInOptions\n): Promise<any> => {\n if (!Array.isArray(specs) || !specs.length) {\n throw new Error('mutateById requires at least one mutation spec');\n }\n\n return context.collection.mutateIn(id, specs, options);\n};\n\nexport const patchById = async <T>(\n context: ModelWriteContext,\n id: string,\n patch: PatchByIdArgs,\n options?: MutateInOptions\n): Promise<T & AutoModelFields> => {\n const specs = [\n ...Object.keys(patch.$set || {}).map((path) =>\n couchbase.MutateInSpec.upsert(path, patch.$set[path])\n ),\n ...unsetPaths(patch.$unset).map((path) => couchbase.MutateInSpec.remove(path)),\n ...Object.keys(patch.$inc || {}).map((path) =>\n couchbase.MutateInSpec.increment(path, patch.$inc[path])\n ),\n couchbase.MutateInSpec.upsert('updatedAt', now()),\n ];\n\n await mutateById(context, id, specs, options);\n const data = await context.collection.get(id);\n\n return context.parse<T & AutoModelFields>(data.content);\n};\n\nexport const incrementById = async <T>(\n context: ModelWriteContext,\n id: string,\n field: string,\n delta: number,\n options?: MutateInOptions\n): Promise<T & AutoModelFields> => {\n return patchById<T>(context, id, {$inc: {[field]: delta}}, options);\n};\n\nexport const findByIdWithMeta = async <T>(\n context: ModelWriteContext,\n id: string,\n options?: GetOptions\n): Promise<FindByIdWithMetaResult<T>> => {\n const data = await context.collection.get(id, options);\n\n return {\n content: context.parse<T & AutoModelFields>(data.content),\n cas: data.cas,\n expiryTime: data.expiryTime,\n };\n};\n"]}
|
package/dist/pagination/index.js
CHANGED
|
@@ -15,4 +15,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./pagination"), exports);
|
|
18
|
+
__exportStar(require("./types"), exports);
|
|
18
19
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pagination/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B","sourcesContent":["export * from './pagination';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pagination/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B;AAC7B,0CAAwB","sourcesContent":["export * from './pagination';\nexport * from './types';\n"]}
|
|
@@ -40,8 +40,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
40
40
|
};
|
|
41
41
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
42
|
exports.Pagination = void 0;
|
|
43
|
-
var query_1 = require("../query");
|
|
44
43
|
var connection_1 = __importDefault(require("../connection"));
|
|
44
|
+
var safe_pagination_1 = require("./safe-pagination");
|
|
45
45
|
/**
|
|
46
46
|
* Common pagination
|
|
47
47
|
* where = {
|
|
@@ -53,42 +53,29 @@ var connection_1 = __importDefault(require("../connection"));
|
|
|
53
53
|
* @param args PaginationArgs
|
|
54
54
|
*/
|
|
55
55
|
var Pagination = function (args) { return __awaiter(void 0, void 0, void 0, function () {
|
|
56
|
-
var _a, bucketName, _b,
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
return __generator(this, function (_f) {
|
|
60
|
-
switch (_f.label) {
|
|
56
|
+
var _a, bucketName, _b, resultKey, cluster, _c, query, parameters, selectAll_1, rows, completedRows, error_1;
|
|
57
|
+
return __generator(this, function (_d) {
|
|
58
|
+
switch (_d.label) {
|
|
61
59
|
case 0:
|
|
62
|
-
_a = args.bucketName, bucketName = _a === void 0 ? '_default' : _a, _b = args.
|
|
63
|
-
// where: {owner: {$eq: 'stoqey'}, _type: {$eq: 'Trade'}},
|
|
64
|
-
} : _b, _c = args.page, page = _c === void 0 ? 0 : _c, _d = args.limit, limit = _d === void 0 ? 10 : _d, _e = args.orderBy, orderBy = _e === void 0 ? { createdAt: 'DESC' } : _e;
|
|
60
|
+
_a = args.bucketName, bucketName = _a === void 0 ? '_default' : _a, _b = args.resultKey, resultKey = _b === void 0 ? bucketName : _b;
|
|
65
61
|
cluster = connection_1.default.Instance.cluster;
|
|
66
|
-
|
|
67
|
-
if (Array.isArray(select)) {
|
|
68
|
-
select = select.map(function (i) { return ({ $field: i }); });
|
|
69
|
-
}
|
|
70
|
-
offset = page * limit;
|
|
71
|
-
_f.label = 1;
|
|
62
|
+
_d.label = 1;
|
|
72
63
|
case 1:
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
.limit(limit)
|
|
77
|
-
.offset(offset)
|
|
78
|
-
.orderBy(orderBy)
|
|
79
|
-
.build();
|
|
80
|
-
console.log('query', query);
|
|
81
|
-
return [4 /*yield*/, cluster.query(query)];
|
|
64
|
+
_d.trys.push([1, 3, , 4]);
|
|
65
|
+
_c = (0, safe_pagination_1.buildPaginationQuery)(args), query = _c.query, parameters = _c.parameters, selectAll_1 = _c.selectAll;
|
|
66
|
+
return [4 /*yield*/, cluster.query(query, { parameters: parameters })];
|
|
82
67
|
case 2:
|
|
83
|
-
rows = (
|
|
68
|
+
rows = (_d.sent()).rows;
|
|
84
69
|
completedRows = rows.map(function (r) {
|
|
85
|
-
return
|
|
70
|
+
return selectAll_1 ? r[resultKey] : r;
|
|
86
71
|
});
|
|
87
72
|
return [2 /*return*/, completedRows];
|
|
88
73
|
case 3:
|
|
89
|
-
error_1 =
|
|
90
|
-
|
|
91
|
-
|
|
74
|
+
error_1 = _d.sent();
|
|
75
|
+
if (args.throwOnError === false) {
|
|
76
|
+
return [2 /*return*/, []];
|
|
77
|
+
}
|
|
78
|
+
throw error_1;
|
|
92
79
|
case 4: return [2 /*return*/];
|
|
93
80
|
}
|
|
94
81
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../src/pagination/pagination.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../src/pagination/pagination.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6DAAgD;AAEhD,qDAAuD;AAGvD;;;;;;;;;GASG;AACI,IAAM,UAAU,GAAG,UAAO,IAAoB;;;;;gBAC1C,KAAmD,IAAI,WAAhC,EAAvB,UAAU,mBAAG,UAAU,KAAA,EAAE,KAA0B,IAAI,UAAR,EAAtB,SAAS,mBAAG,UAAU,KAAA,CAAS;gBAEzD,OAAO,GAAG,oBAAmB,CAAC,QAAQ,CAAC,OAAO,CAAC;;;;gBAG3C,KAAiC,IAAA,sCAAoB,EAAC,IAAI,CAAC,EAA1D,KAAK,WAAA,EAAE,UAAU,gBAAA,EAAE,0BAAS,CAA+B;gBAEnD,qBAAM,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,EAAC,UAAU,YAAA,EAAC,CAAC,EAAA;;gBAAhD,IAAI,GAAI,CAAA,SAAwC,CAAA,KAA5C;gBAEL,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,UAAC,CAAM;oBAClC,OAAO,WAAS,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxC,CAAC,CAAC,CAAC;gBAEH,sBAAO,aAAa,EAAC;;;gBAErB,IAAI,IAAI,CAAC,YAAY,KAAK,KAAK,EAAE,CAAC;oBAC9B,sBAAO,EAAE,EAAC;gBACd,CAAC;gBAED,MAAM,OAAK,CAAC;;;;KAEnB,CAAC;AAtBW,QAAA,UAAU,cAsBrB","sourcesContent":["import CouchbaseConnection from '../connection';\n\nimport {buildPaginationQuery} from './safe-pagination';\nimport {PaginationArgs} from './types';\n\n/**\n * Common pagination\n * where = {\n where: { owner: { $eq: \"stoqey\" }, _type: { $eq: \"Trade\" } },\n },\n page = 0,\n limit = 10,\n orderBy = { createdAt: \"DESC\" },\n * @param args PaginationArgs\n */\nexport const Pagination = async (args: PaginationArgs): Promise<any[]> => {\n const {bucketName = '_default', resultKey = bucketName} = args;\n\n const cluster = CouchbaseConnection.Instance.cluster;\n\n try {\n const {query, parameters, selectAll} = buildPaginationQuery(args);\n\n const {rows} = await cluster.query(query, {parameters});\n\n const completedRows = rows.map((r: any) => {\n return selectAll ? r[resultKey] : r;\n });\n\n return completedRows;\n } catch (error) {\n if (args.throwOnError === false) {\n return [];\n }\n\n throw error;\n }\n};\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { SortType } from '../query/interface/query.types';
|
|
2
|
+
import { PaginationArgs } from './types';
|
|
3
|
+
export interface PaginationQuery {
|
|
4
|
+
query: string;
|
|
5
|
+
parameters: Record<string, any>;
|
|
6
|
+
selectAll: boolean;
|
|
7
|
+
limit?: number;
|
|
8
|
+
offset?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface SelectionQueryOptions {
|
|
11
|
+
includeLimitOffset?: boolean;
|
|
12
|
+
defaultOrderBy?: Record<string, SortType>;
|
|
13
|
+
}
|
|
14
|
+
export declare const buildSelectionQuery: (args: PaginationArgs, options?: SelectionQueryOptions) => PaginationQuery;
|
|
15
|
+
export declare const buildPaginationQuery: (args: PaginationArgs) => PaginationQuery;
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __read = (this && this.__read) || function (o, n) {
|
|
3
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
4
|
+
if (!m) return o;
|
|
5
|
+
var i = m.call(o), r, ar = [], e;
|
|
6
|
+
try {
|
|
7
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
8
|
+
}
|
|
9
|
+
catch (error) { e = { error: error }; }
|
|
10
|
+
finally {
|
|
11
|
+
try {
|
|
12
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
13
|
+
}
|
|
14
|
+
finally { if (e) throw e.error; }
|
|
15
|
+
}
|
|
16
|
+
return ar;
|
|
17
|
+
};
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.buildPaginationQuery = exports.buildSelectionQuery = void 0;
|
|
20
|
+
var helpers_1 = require("../query/helpers");
|
|
21
|
+
var utils_1 = require("../query/utils");
|
|
22
|
+
var comparisonOperators = {
|
|
23
|
+
$eq: '=',
|
|
24
|
+
$neq: '!=',
|
|
25
|
+
$gt: '>',
|
|
26
|
+
$gte: '>=',
|
|
27
|
+
$lt: '<',
|
|
28
|
+
$lte: '<=',
|
|
29
|
+
};
|
|
30
|
+
var stringComparisonOperators = {
|
|
31
|
+
$like: 'LIKE',
|
|
32
|
+
$notLike: 'NOT LIKE',
|
|
33
|
+
};
|
|
34
|
+
var emptyComparisonOperators = {
|
|
35
|
+
$isNull: 'IS NULL',
|
|
36
|
+
$isNotNull: 'IS NOT NULL',
|
|
37
|
+
$isMissing: 'IS MISSING',
|
|
38
|
+
$isNotMissing: 'IS NOT MISSING',
|
|
39
|
+
$isValued: 'IS VALUED',
|
|
40
|
+
$isNotValued: 'IS NOT VALUED',
|
|
41
|
+
};
|
|
42
|
+
var multipleComparisonOperators = {
|
|
43
|
+
$btw: 'BETWEEN',
|
|
44
|
+
$notBtw: 'NOT BETWEEN',
|
|
45
|
+
};
|
|
46
|
+
var logicalOperators = {
|
|
47
|
+
$and: 'AND',
|
|
48
|
+
$or: 'OR',
|
|
49
|
+
};
|
|
50
|
+
var PaginationParameterStore = /** @class */ (function () {
|
|
51
|
+
function PaginationParameterStore() {
|
|
52
|
+
this.parameters = {};
|
|
53
|
+
this.index = 0;
|
|
54
|
+
}
|
|
55
|
+
PaginationParameterStore.prototype.add = function (value) {
|
|
56
|
+
var key = "cs_param_".concat(this.index);
|
|
57
|
+
this.index += 1;
|
|
58
|
+
this.parameters[key] = value;
|
|
59
|
+
return "$".concat(key);
|
|
60
|
+
};
|
|
61
|
+
return PaginationParameterStore;
|
|
62
|
+
}());
|
|
63
|
+
var collectionIdentifier = function (collection) {
|
|
64
|
+
if (collection.indexOf(' ') !== -1) {
|
|
65
|
+
return "`".concat(collection).replace(' ', '` ');
|
|
66
|
+
}
|
|
67
|
+
if (collection.indexOf('`') !== -1) {
|
|
68
|
+
return collection;
|
|
69
|
+
}
|
|
70
|
+
return "`".concat(collection, "`");
|
|
71
|
+
};
|
|
72
|
+
var hasLogicalOperator = function (clause) {
|
|
73
|
+
return Object.keys(clause).some(function (key) { return ['$and', '$or', '$not'].includes(key); });
|
|
74
|
+
};
|
|
75
|
+
var parameterizeValue = function (value, store) {
|
|
76
|
+
return store.add(value);
|
|
77
|
+
};
|
|
78
|
+
var buildComparisonExpr = function (fieldName, comparison, store) {
|
|
79
|
+
var field = (0, utils_1.escapeReservedWords)(fieldName);
|
|
80
|
+
var expr = Object.keys(comparison)
|
|
81
|
+
.map(function (operator) {
|
|
82
|
+
if (Object.prototype.hasOwnProperty.call(emptyComparisonOperators, operator)) {
|
|
83
|
+
return "".concat(field, " ").concat(emptyComparisonOperators[operator]);
|
|
84
|
+
}
|
|
85
|
+
if (Object.prototype.hasOwnProperty.call(comparisonOperators, operator)) {
|
|
86
|
+
return "".concat(field).concat(comparisonOperators[operator]).concat(parameterizeValue(comparison[operator], store));
|
|
87
|
+
}
|
|
88
|
+
if (Object.prototype.hasOwnProperty.call(stringComparisonOperators, operator)) {
|
|
89
|
+
return "".concat(field, " ").concat(stringComparisonOperators[operator], " ").concat(parameterizeValue(comparison[operator], store));
|
|
90
|
+
}
|
|
91
|
+
if (Object.prototype.hasOwnProperty.call(multipleComparisonOperators, operator) &&
|
|
92
|
+
Array.isArray(comparison[operator])) {
|
|
93
|
+
var _a = __read(comparison[operator], 2), from = _a[0], to = _a[1];
|
|
94
|
+
return "".concat(field, " ").concat(multipleComparisonOperators[operator], " ").concat(parameterizeValue(from, store), " AND ").concat(parameterizeValue(to, store));
|
|
95
|
+
}
|
|
96
|
+
throw new Error("Unsupported pagination where operator: ".concat(operator));
|
|
97
|
+
})
|
|
98
|
+
.join(' AND ');
|
|
99
|
+
return Object.keys(comparison).length > 1 ? "(".concat(expr, ")") : expr;
|
|
100
|
+
};
|
|
101
|
+
var buildFieldExpr = function (field, store) {
|
|
102
|
+
return Object.keys(field)
|
|
103
|
+
.map(function (fieldName) {
|
|
104
|
+
var value = field[fieldName];
|
|
105
|
+
if (value &&
|
|
106
|
+
typeof value === 'object' &&
|
|
107
|
+
!Array.isArray(value) &&
|
|
108
|
+
Object.keys(value).some(function (operator) { return operator.indexOf('$') === 0; })) {
|
|
109
|
+
return buildComparisonExpr(fieldName, value, store);
|
|
110
|
+
}
|
|
111
|
+
if (fieldName.indexOf('$') === -1) {
|
|
112
|
+
return "".concat((0, utils_1.escapeReservedWords)(fieldName), "=").concat(parameterizeValue(value, store));
|
|
113
|
+
}
|
|
114
|
+
throw new Error("Unsupported pagination where field: ".concat(fieldName));
|
|
115
|
+
})
|
|
116
|
+
.join(' AND ');
|
|
117
|
+
};
|
|
118
|
+
var buildWhereClauseExpr = function (clause, store) {
|
|
119
|
+
if (!hasLogicalOperator(clause)) {
|
|
120
|
+
return buildFieldExpr(clause, store);
|
|
121
|
+
}
|
|
122
|
+
return Object.keys(clause)
|
|
123
|
+
.map(function (key) {
|
|
124
|
+
var _a;
|
|
125
|
+
var value = clause[key];
|
|
126
|
+
if (Array.isArray(value) &&
|
|
127
|
+
Object.prototype.hasOwnProperty.call(logicalOperators, key)) {
|
|
128
|
+
return "(".concat(value
|
|
129
|
+
.map(function (item) { return buildWhereClauseExpr(item, store); })
|
|
130
|
+
.join(" ".concat(logicalOperators[key], " ")), ")");
|
|
131
|
+
}
|
|
132
|
+
if (key === '$not' && Array.isArray(value)) {
|
|
133
|
+
return "NOT (".concat(value
|
|
134
|
+
.map(function (item) { return buildWhereClauseExpr(item, store); })
|
|
135
|
+
.join(' AND '), ")");
|
|
136
|
+
}
|
|
137
|
+
return buildWhereClauseExpr((_a = {}, _a[key] = value, _a), store);
|
|
138
|
+
})
|
|
139
|
+
.join(' AND ');
|
|
140
|
+
};
|
|
141
|
+
var buildWhereExpr = function (expr, store, clause) {
|
|
142
|
+
if (clause === void 0) { clause = 'WHERE'; }
|
|
143
|
+
return expr ? " ".concat(clause, " ").concat(buildWhereClauseExpr(expr, store)) : '';
|
|
144
|
+
};
|
|
145
|
+
var buildUseKeysExpr = function (useKeys, store) {
|
|
146
|
+
return Array.isArray(useKeys) ? " USE KEYS ".concat(parameterizeValue(useKeys, store)) : '';
|
|
147
|
+
};
|
|
148
|
+
var buildLetExpr = function (letExpr, store, clause) {
|
|
149
|
+
if (clause === void 0) { clause = 'LET'; }
|
|
150
|
+
return Array.isArray(letExpr)
|
|
151
|
+
? " ".concat(clause, " ").concat(letExpr
|
|
152
|
+
.map(function (value) {
|
|
153
|
+
return "".concat((0, utils_1.escapeReservedWords)(value.key), "=").concat(parameterizeValue(value.value, store));
|
|
154
|
+
})
|
|
155
|
+
.join(','))
|
|
156
|
+
: '';
|
|
157
|
+
};
|
|
158
|
+
var buildGroupByExpr = function (groupByExpr, lettingExpr, havingExpr, store) {
|
|
159
|
+
if (!groupByExpr) {
|
|
160
|
+
return '';
|
|
161
|
+
}
|
|
162
|
+
return " GROUP BY ".concat(groupByExpr
|
|
163
|
+
.map(function (value) {
|
|
164
|
+
return "".concat((0, utils_1.escapeReservedWords)(value.expr)).concat(value.as ? " AS ".concat(value.as) : '');
|
|
165
|
+
})
|
|
166
|
+
.join(',')).concat(buildLetExpr(lettingExpr, store, 'LETTING')).concat(buildWhereExpr(havingExpr, store, 'HAVING'));
|
|
167
|
+
};
|
|
168
|
+
var buildSelectExpr = function (select) {
|
|
169
|
+
if (!select || select === '*') {
|
|
170
|
+
return { expr: '*', selectAll: true };
|
|
171
|
+
}
|
|
172
|
+
if (typeof select === 'string') {
|
|
173
|
+
return { expr: select, selectAll: false };
|
|
174
|
+
}
|
|
175
|
+
var selectExpr = select.map(function (item) {
|
|
176
|
+
return typeof item === 'string' ? { $field: item } : item;
|
|
177
|
+
});
|
|
178
|
+
return { expr: (0, helpers_1.buildSelectArrayExpr)(selectExpr), selectAll: false };
|
|
179
|
+
};
|
|
180
|
+
var buildOrderByExpr = function (orderExpr) {
|
|
181
|
+
return orderExpr
|
|
182
|
+
? " ORDER BY ".concat(Object.keys(orderExpr)
|
|
183
|
+
.map(function (value) { return "".concat((0, utils_1.escapeReservedWords)(value), " ").concat(orderExpr[value]); })
|
|
184
|
+
.join(','))
|
|
185
|
+
: '';
|
|
186
|
+
};
|
|
187
|
+
var addNamedParameter = function (parameters, key, value) {
|
|
188
|
+
parameters[key] = value;
|
|
189
|
+
return "$".concat(key);
|
|
190
|
+
};
|
|
191
|
+
var buildSelectionQuery = function (args, options) {
|
|
192
|
+
if (options === void 0) { options = {}; }
|
|
193
|
+
var _a = args.bucketName, bucketName = _a === void 0 ? '_default' : _a, _b = args.where, where = _b === void 0 ? {} : _b, _c = args.page, page = _c === void 0 ? 0 : _c, _d = args.limit, limit = _d === void 0 ? 10 : _d, offset = args.offset, _e = args.orderBy, orderBy = _e === void 0 ? options.defaultOrderBy : _e;
|
|
194
|
+
var _f = options.includeLimitOffset, includeLimitOffset = _f === void 0 ? false : _f;
|
|
195
|
+
var store = new PaginationParameterStore();
|
|
196
|
+
var parameters = store.parameters;
|
|
197
|
+
var _g = buildSelectExpr(args.select || '*'), selectExpr = _g.expr, selectAll = _g.selectAll;
|
|
198
|
+
var queryOffset = typeof offset === 'number' ? offset : page * limit;
|
|
199
|
+
var conditions = where || {};
|
|
200
|
+
var plainJoin = conditions.plainJoin ? " ".concat(conditions.plainJoin, " ") : '';
|
|
201
|
+
var limitOffsetExpr = includeLimitOffset
|
|
202
|
+
? " LIMIT ".concat(addNamedParameter(parameters, 'cs_limit', limit), " OFFSET ").concat(addNamedParameter(parameters, 'cs_offset', queryOffset))
|
|
203
|
+
: '';
|
|
204
|
+
var query = "SELECT ".concat(selectExpr, " FROM ").concat(collectionIdentifier(bucketName)).concat(plainJoin).concat(buildUseKeysExpr(conditions.use, store)).concat(buildLetExpr(conditions.let, store)).concat(buildWhereExpr(conditions.where, store)).concat(buildGroupByExpr(conditions.groupBy, conditions.letting, conditions.having, store)).concat(buildOrderByExpr(orderBy)).concat(limitOffsetExpr);
|
|
205
|
+
return {
|
|
206
|
+
query: query,
|
|
207
|
+
parameters: parameters,
|
|
208
|
+
selectAll: selectAll,
|
|
209
|
+
limit: limit,
|
|
210
|
+
offset: queryOffset,
|
|
211
|
+
};
|
|
212
|
+
};
|
|
213
|
+
exports.buildSelectionQuery = buildSelectionQuery;
|
|
214
|
+
var buildPaginationQuery = function (args) {
|
|
215
|
+
return (0, exports.buildSelectionQuery)(args, {
|
|
216
|
+
includeLimitOffset: true,
|
|
217
|
+
defaultOrderBy: { createdAt: 'DESC' },
|
|
218
|
+
});
|
|
219
|
+
};
|
|
220
|
+
exports.buildPaginationQuery = buildPaginationQuery;
|
|
221
|
+
//# sourceMappingURL=safe-pagination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-pagination.js","sourceRoot":"","sources":["../../src/pagination/safe-pagination.ts"],"names":[],"mappings":"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","sourcesContent":["import {buildSelectArrayExpr} from '../query/helpers';\nimport {IGroupBy, ILetExpr, LogicalWhereExpr, SortType} from '../query/interface/query.types';\nimport {escapeReservedWords} from '../query/utils';\n\nimport {PaginationArgs} from './types';\n\nexport interface PaginationQuery {\n query: string;\n parameters: Record<string, any>;\n selectAll: boolean;\n limit?: number;\n offset?: number;\n}\n\nexport interface SelectionQueryOptions {\n includeLimitOffset?: boolean;\n defaultOrderBy?: Record<string, SortType>;\n}\n\nconst comparisonOperators: Record<string, string> = {\n $eq: '=',\n $neq: '!=',\n $gt: '>',\n $gte: '>=',\n $lt: '<',\n $lte: '<=',\n};\n\nconst stringComparisonOperators: Record<string, string> = {\n $like: 'LIKE',\n $notLike: 'NOT LIKE',\n};\n\nconst emptyComparisonOperators: Record<string, string> = {\n $isNull: 'IS NULL',\n $isNotNull: 'IS NOT NULL',\n $isMissing: 'IS MISSING',\n $isNotMissing: 'IS NOT MISSING',\n $isValued: 'IS VALUED',\n $isNotValued: 'IS NOT VALUED',\n};\n\nconst multipleComparisonOperators: Record<string, string> = {\n $btw: 'BETWEEN',\n $notBtw: 'NOT BETWEEN',\n};\n\nconst logicalOperators: Record<string, string> = {\n $and: 'AND',\n $or: 'OR',\n};\n\nclass PaginationParameterStore {\n public parameters: Record<string, any> = {};\n private index = 0;\n\n public add(value: any): string {\n const key = `cs_param_${this.index}`;\n this.index += 1;\n this.parameters[key] = value;\n\n return `$${key}`;\n }\n}\n\nconst collectionIdentifier = (collection: string): string => {\n if (collection.indexOf(' ') !== -1) {\n return `\\`${collection}`.replace(' ', '` ');\n }\n\n if (collection.indexOf('`') !== -1) {\n return collection;\n }\n\n return `\\`${collection}\\``;\n};\n\nconst hasLogicalOperator = (clause: Record<string, any>): boolean => {\n return Object.keys(clause).some((key) => ['$and', '$or', '$not'].includes(key));\n};\n\nconst parameterizeValue = (value: any, store: PaginationParameterStore): string => {\n return store.add(value);\n};\n\nconst buildComparisonExpr = (\n fieldName: string,\n comparison: Record<string, any>,\n store: PaginationParameterStore\n): string => {\n const field = escapeReservedWords(fieldName);\n const expr = Object.keys(comparison)\n .map((operator) => {\n if (Object.prototype.hasOwnProperty.call(emptyComparisonOperators, operator)) {\n return `${field} ${emptyComparisonOperators[operator]}`;\n }\n\n if (Object.prototype.hasOwnProperty.call(comparisonOperators, operator)) {\n return `${field}${comparisonOperators[operator]}${parameterizeValue(\n comparison[operator],\n store\n )}`;\n }\n\n if (Object.prototype.hasOwnProperty.call(stringComparisonOperators, operator)) {\n return `${field} ${stringComparisonOperators[operator]} ${parameterizeValue(\n comparison[operator],\n store\n )}`;\n }\n\n if (\n Object.prototype.hasOwnProperty.call(multipleComparisonOperators, operator) &&\n Array.isArray(comparison[operator])\n ) {\n const [from, to] = comparison[operator];\n\n return `${field} ${multipleComparisonOperators[operator]} ${parameterizeValue(\n from,\n store\n )} AND ${parameterizeValue(to, store)}`;\n }\n\n throw new Error(`Unsupported pagination where operator: ${operator}`);\n })\n .join(' AND ');\n\n return Object.keys(comparison).length > 1 ? `(${expr})` : expr;\n};\n\nconst buildFieldExpr = (field: Record<string, any>, store: PaginationParameterStore): string => {\n return Object.keys(field)\n .map((fieldName) => {\n const value = field[fieldName];\n\n if (\n value &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n Object.keys(value).some((operator) => operator.indexOf('$') === 0)\n ) {\n return buildComparisonExpr(fieldName, value, store);\n }\n\n if (fieldName.indexOf('$') === -1) {\n return `${escapeReservedWords(fieldName)}=${parameterizeValue(value, store)}`;\n }\n\n throw new Error(`Unsupported pagination where field: ${fieldName}`);\n })\n .join(' AND ');\n};\n\nconst buildWhereClauseExpr = (\n clause: LogicalWhereExpr,\n store: PaginationParameterStore\n): string => {\n if (!hasLogicalOperator(clause as Record<string, any>)) {\n return buildFieldExpr(clause as Record<string, any>, store);\n }\n\n return Object.keys(clause)\n .map((key) => {\n const value = clause[key];\n\n if (\n Array.isArray(value) &&\n Object.prototype.hasOwnProperty.call(logicalOperators, key)\n ) {\n return `(${value\n .map((item) => buildWhereClauseExpr(item as LogicalWhereExpr, store))\n .join(` ${logicalOperators[key]} `)})`;\n }\n\n if (key === '$not' && Array.isArray(value)) {\n return `NOT (${value\n .map((item) => buildWhereClauseExpr(item as LogicalWhereExpr, store))\n .join(' AND ')})`;\n }\n\n return buildWhereClauseExpr({[key]: value} as LogicalWhereExpr, store);\n })\n .join(' AND ');\n};\n\nconst buildWhereExpr = (\n expr: LogicalWhereExpr | undefined,\n store: PaginationParameterStore,\n clause = 'WHERE'\n): string => {\n return expr ? ` ${clause} ${buildWhereClauseExpr(expr, store)}` : '';\n};\n\nconst buildUseKeysExpr = (\n useKeys: string[] | undefined,\n store: PaginationParameterStore\n): string => {\n return Array.isArray(useKeys) ? ` USE KEYS ${parameterizeValue(useKeys, store)}` : '';\n};\n\nconst buildLetExpr = (\n letExpr: ILetExpr[] | undefined,\n store: PaginationParameterStore,\n clause = 'LET'\n): string => {\n return Array.isArray(letExpr)\n ? ` ${clause} ${letExpr\n .map(\n (value: ILetExpr) =>\n `${escapeReservedWords(value.key)}=${parameterizeValue(value.value, store)}`\n )\n .join(',')}`\n : '';\n};\n\nconst buildGroupByExpr = (\n groupByExpr: IGroupBy[] | undefined,\n lettingExpr: ILetExpr[] | undefined,\n havingExpr: LogicalWhereExpr | undefined,\n store: PaginationParameterStore\n): string => {\n if (!groupByExpr) {\n return '';\n }\n\n return ` GROUP BY ${groupByExpr\n .map((value: IGroupBy) => {\n return `${escapeReservedWords(value.expr)}${value.as ? ` AS ${value.as}` : ''}`;\n })\n .join(',')}${buildLetExpr(lettingExpr, store, 'LETTING')}${buildWhereExpr(\n havingExpr,\n store,\n 'HAVING'\n )}`;\n};\n\nconst buildSelectExpr = (select?: any[] | string): {expr: string; selectAll: boolean} => {\n if (!select || select === '*') {\n return {expr: '*', selectAll: true};\n }\n\n if (typeof select === 'string') {\n return {expr: select, selectAll: false};\n }\n\n const selectExpr = select.map((item) => {\n return typeof item === 'string' ? {$field: item} : item;\n });\n\n return {expr: buildSelectArrayExpr(selectExpr), selectAll: false};\n};\n\nconst buildOrderByExpr = (orderExpr: Record<string, SortType> | undefined): string => {\n return orderExpr\n ? ` ORDER BY ${Object.keys(orderExpr)\n .map((value: string) => `${escapeReservedWords(value)} ${orderExpr[value]}`)\n .join(',')}`\n : '';\n};\n\nconst addNamedParameter = (parameters: Record<string, any>, key: string, value: any): string => {\n parameters[key] = value;\n\n return `$${key}`;\n};\n\nexport const buildSelectionQuery = (\n args: PaginationArgs,\n options: SelectionQueryOptions = {}\n): PaginationQuery => {\n const {\n bucketName = '_default',\n where = {},\n page = 0,\n limit = 10,\n offset,\n orderBy = options.defaultOrderBy,\n } = args;\n const {includeLimitOffset = false} = options;\n const store = new PaginationParameterStore();\n const parameters = store.parameters;\n const {expr: selectExpr, selectAll} = buildSelectExpr(args.select || '*');\n const queryOffset = typeof offset === 'number' ? offset : page * limit;\n const conditions = where || {};\n const plainJoin = conditions.plainJoin ? ` ${conditions.plainJoin} ` : '';\n const limitOffsetExpr = includeLimitOffset\n ? ` LIMIT ${addNamedParameter(parameters, 'cs_limit', limit)} OFFSET ${addNamedParameter(\n parameters,\n 'cs_offset',\n queryOffset\n )}`\n : '';\n\n const query = `SELECT ${selectExpr} FROM ${collectionIdentifier(\n bucketName\n )}${plainJoin}${buildUseKeysExpr(conditions.use, store)}${buildLetExpr(\n conditions.let,\n store\n )}${buildWhereExpr(conditions.where, store)}${buildGroupByExpr(\n conditions.groupBy,\n conditions.letting,\n conditions.having,\n store\n )}${buildOrderByExpr(orderBy)}${limitOffsetExpr}`;\n\n return {\n query,\n parameters,\n selectAll,\n limit,\n offset: queryOffset,\n };\n};\n\nexport const buildPaginationQuery = (args: PaginationArgs): PaginationQuery => {\n return buildSelectionQuery(args, {\n includeLimitOffset: true,\n defaultOrderBy: {createdAt: 'DESC'},\n });\n};\n"]}
|