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.
Files changed (108) hide show
  1. package/README.md +284 -153
  2. package/dist/connection/connection.d.ts +68 -0
  3. package/dist/connection/connection.js +485 -0
  4. package/dist/connection/connection.js.map +1 -0
  5. package/dist/connection/env.d.ts +2 -0
  6. package/dist/connection/env.js +16 -0
  7. package/dist/connection/env.js.map +1 -0
  8. package/dist/connection/index.d.ts +3 -0
  9. package/dist/connection/index.js +25 -0
  10. package/dist/connection/index.js.map +1 -0
  11. package/dist/connection/types.d.ts +25 -0
  12. package/dist/connection/types.js +3 -0
  13. package/dist/connection/types.js.map +1 -0
  14. package/dist/database.d.ts +9 -0
  15. package/dist/database.js +196 -0
  16. package/dist/database.js.map +1 -0
  17. package/dist/index.d.ts +18 -6
  18. package/dist/index.js +53 -8
  19. package/dist/index.js.map +1 -1
  20. package/dist/legacy/connection.d.ts +2 -0
  21. package/dist/legacy/connection.js +24 -0
  22. package/dist/legacy/connection.js.map +1 -0
  23. package/dist/legacy/index.d.ts +10 -0
  24. package/dist/legacy/index.js +93 -0
  25. package/dist/legacy/index.js.map +1 -0
  26. package/dist/legacy/model.d.ts +55 -0
  27. package/dist/legacy/model.js +282 -0
  28. package/dist/legacy/model.js.map +1 -0
  29. package/dist/legacy/pagination/index.d.ts +1 -0
  30. package/dist/legacy/pagination/index.js +18 -0
  31. package/dist/legacy/pagination/index.js.map +1 -0
  32. package/dist/legacy/pagination/pagination.d.ts +12 -0
  33. package/dist/legacy/pagination/pagination.js +85 -0
  34. package/dist/legacy/pagination/pagination.js.map +1 -0
  35. package/dist/legacy/search/customQuery.d.ts +13 -0
  36. package/dist/legacy/search/customQuery.js +73 -0
  37. package/dist/legacy/search/customQuery.js.map +1 -0
  38. package/dist/legacy/search/index.d.ts +1 -0
  39. package/dist/legacy/search/index.js +18 -0
  40. package/dist/legacy/search/index.js.map +1 -0
  41. package/dist/model/default-scope.d.ts +10 -0
  42. package/dist/model/default-scope.js +47 -0
  43. package/dist/model/default-scope.js.map +1 -0
  44. package/dist/model/hydrated-document.d.ts +30 -0
  45. package/dist/model/hydrated-document.js +118 -0
  46. package/dist/model/hydrated-document.js.map +1 -0
  47. package/dist/model/include.d.ts +33 -0
  48. package/dist/model/include.js +250 -0
  49. package/dist/model/include.js.map +1 -0
  50. package/dist/model/index.d.ts +137 -51
  51. package/dist/model/index.js +519 -174
  52. package/dist/model/index.js.map +1 -1
  53. package/dist/model/indexes.d.ts +16 -0
  54. package/dist/model/indexes.js +155 -0
  55. package/dist/model/indexes.js.map +1 -0
  56. package/dist/model/keyspace.d.ts +9 -0
  57. package/dist/model/keyspace.js +28 -0
  58. package/dist/model/keyspace.js.map +1 -0
  59. package/dist/model/read-helpers.d.ts +36 -0
  60. package/dist/model/read-helpers.js +275 -0
  61. package/dist/model/read-helpers.js.map +1 -0
  62. package/dist/model/safe-query.d.ts +23 -0
  63. package/dist/model/safe-query.js +138 -0
  64. package/dist/model/safe-query.js.map +1 -0
  65. package/dist/model/ttl.d.ts +9 -0
  66. package/dist/model/ttl.js +73 -0
  67. package/dist/model/ttl.js.map +1 -0
  68. package/dist/model/validation.d.ts +5 -0
  69. package/dist/model/validation.js +104 -0
  70. package/dist/model/validation.js.map +1 -0
  71. package/dist/model/write-helpers.d.ts +31 -0
  72. package/dist/model/write-helpers.js +220 -0
  73. package/dist/model/write-helpers.js.map +1 -0
  74. package/dist/pagination/index.d.ts +1 -0
  75. package/dist/pagination/index.js +1 -0
  76. package/dist/pagination/index.js.map +1 -1
  77. package/dist/pagination/pagination.d.ts +1 -8
  78. package/dist/pagination/pagination.js +16 -29
  79. package/dist/pagination/pagination.js.map +1 -1
  80. package/dist/pagination/safe-pagination.d.ts +15 -0
  81. package/dist/pagination/safe-pagination.js +221 -0
  82. package/dist/pagination/safe-pagination.js.map +1 -0
  83. package/dist/pagination/types.d.ts +11 -0
  84. package/dist/pagination/types.js +3 -0
  85. package/dist/pagination/types.js.map +1 -0
  86. package/dist/search/customQuery.d.ts +10 -3
  87. package/dist/search/customQuery.js +17 -18
  88. package/dist/search/customQuery.js.map +1 -1
  89. package/dist/shared/common.model.js +2 -2
  90. package/dist/shared/common.model.js.map +1 -1
  91. package/dist/timeseries/index.d.ts +1 -0
  92. package/dist/timeseries/index.js +18 -0
  93. package/dist/timeseries/index.js.map +1 -0
  94. package/dist/timeseries/time-series-model.d.ts +60 -0
  95. package/dist/timeseries/time-series-model.js +267 -0
  96. package/dist/timeseries/time-series-model.js.map +1 -0
  97. package/dist/utils/awaitTo.d.ts +1 -1
  98. package/dist/utils/awaitTo.js +1 -1
  99. package/dist/utils/awaitTo.js.map +1 -1
  100. package/docs/beta-migration.md +175 -0
  101. package/legacy/index.js +1 -0
  102. package/legacy/package.json +4 -0
  103. package/next/index.js +1 -0
  104. package/next/package.json +4 -0
  105. package/package.json +13 -8
  106. package/dist/connection.d.ts +0 -42
  107. package/dist/connection.js +0 -156
  108. 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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,2DAAqC;AACrC,gCAAqC;AAErC,6BAAkD;AAClD,2CAA6D;AA4B7D,IAAM,GAAG,GAAG,cAAY,OAAA,IAAI,IAAI,EAAE,EAAV,CAAU,CAAC;AAEnC,IAAM,aAAa,GAAG,UAClB,OAA0B,EAC1B,IAAO,EACP,SAAgB;IAEhB,IAAM,EAAE,GAAG,IAAA,mBAAY,GAAE,CAAC;IAC1B,IAAM,SAAS,GAAG,GAAG,EAAE,CAAC;IAExB,OAAO,oBACH,EAAE,IAAA,IACC,IAAI,KACP,SAAS,EAAE,SAAS,IAAI,SAAS,EACjC,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,OAAO,CAAC,cAAc,EAC7B,MAAM,EAAE,OAAO,CAAC,KAAK,GACD,CAAC;AAC7B,CAAC,CAAC;AAEF,IAAM,mBAAmB,GAAG,UACxB,OAA0B,EAC1B,EAAU,EACV,IAAO,EACP,OAAuB;IAEvB,IAAM,QAAQ,yBACP,IAAI,KACP,EAAE,IAAA,EACF,KAAK,EAAE,OAAO,CAAC,cAAc,EAC7B,MAAM,EAAE,OAAO,CAAC,KAAK,GACxB,CAAC;IAEF,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QAC9B,QAAQ,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC;IAC/B,CAAC;IAED,OAAO,QAAQ,CAAC;AACpB,CAAC,CAAC;AAEF,IAAM,UAAU,GAAG,UAAC,KAAsC;IACtD,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,OAAO,EAAE,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC7D,CAAC,CAAC;AAEK,IAAM,MAAM,GAAG,UAClB,OAA0B,EAC1B,IAAO,EACP,OAA4B;;;;;gBAEtB,QAAQ,GAAG,aAAa,CAAI,OAAO,EAAE,IAAI,CAAC,CAAC;gBAC/B,qBAAM,IAAA,4BAAe,EAAC,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC,EAAA;;gBAAnE,SAAS,GAAG,SAAuD;gBAEzE,qBAAM,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAA,qBAAe,EAAC,OAAO,CAAC,CAAC,EAAA;;gBAAlF,SAAkF,CAAC;gBAEnF,sBAAO,OAAO,CAAC,KAAK,CAAsB,SAAS,CAAC,EAAC;;;KACxD,CAAC;AAXW,QAAA,MAAM,UAWjB;AAEK,IAAM,MAAM,GAAG,UAClB,OAA0B,EAC1B,IAAO,EACP,OAA4B;;;;;gBAEtB,QAAQ,GAAG,aAAa,CAAI,OAAO,EAAE,IAAI,CAAC,CAAC;gBAC/B,qBAAM,IAAA,4BAAe,EAAC,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC,EAAA;;gBAAnE,SAAS,GAAG,SAAuD;gBAEzE,qBAAM,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAA,qBAAe,EAAC,OAAO,CAAC,CAAC,EAAA;;gBAAlF,SAAkF,CAAC;gBAEnF,sBAAO,OAAO,CAAC,KAAK,CAAsB,SAAS,CAAC,EAAC;;;KACxD,CAAC;AAXW,QAAA,MAAM,UAWjB;AAEK,IAAM,WAAW,GAAG,UACvB,OAA0B,EAC1B,EAAU,EACV,IAAO,EACP,OAAuB;;;;;gBAEjB,KAA8B,OAAO,IAAI,EAAE,EAA1C,MAAM,YAAA,EAAK,cAAc,cAA1B,UAA2B,CAAD,CAAkB;gBAC5C,QAAQ,GAAG,mBAAmB,CAAI,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAC,MAAM,QAAA,EAAC,CAAC,CAAC;gBACnD,qBAAM,IAAA,4BAAe,EAAC,QAAQ,EAAE,OAAO,CAAC,eAAe,CAAC,EAAA;;gBAApE,SAAS,GAAG,SAAwD;gBAE1E,qBAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,cAAgC,CAAC,EAAA;;gBAAjF,SAAiF,CAAC;gBAElF,sBAAO,OAAO,CAAC,KAAK,CAAsB,SAAS,CAAC,EAAC;;;KACxD,CAAC;AAbW,QAAA,WAAW,eAatB;AAEK,IAAM,UAAU,GAAG,UACtB,OAA0B,EAC1B,EAAU,EACV,KAAY,EACZ,OAAyB;;QAEzB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACtE,CAAC;QAED,sBAAO,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,EAAC;;KAC1D,CAAC;AAXW,QAAA,UAAU,cAWrB;AAEK,IAAM,SAAS,GAAG,UACrB,OAA0B,EAC1B,EAAU,EACV,KAAoB,EACpB,OAAyB;;;;;gBAEnB,KAAK,sEACJ,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,UAAC,IAAI;oBACtC,OAAA,mBAAS,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAArD,CAAqD,CACxD,kBACE,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,UAAC,IAAI,IAAK,OAAA,mBAAS,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,EAAnC,CAAmC,CAAC,kBAC3E,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,UAAC,IAAI;oBACtC,OAAA,mBAAS,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAAxD,CAAwD,CAC3D;oBACD,mBAAS,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC;yBACpD,CAAC;gBAEF,qBAAM,IAAA,kBAAU,EAAC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,EAAA;;gBAA7C,SAA6C,CAAC;gBACjC,qBAAM,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAA;;gBAAvC,IAAI,GAAG,SAAgC;gBAE7C,sBAAO,OAAO,CAAC,KAAK,CAAsB,IAAI,CAAC,OAAO,CAAC,EAAC;;;KAC3D,CAAC;AArBW,QAAA,SAAS,aAqBpB;AAEK,IAAM,aAAa,GAAG,UACzB,OAA0B,EAC1B,EAAU,EACV,KAAa,EACb,KAAa,EACb,OAAyB;;;QAEzB,sBAAO,IAAA,iBAAS,EAAI,OAAO,EAAE,EAAE,EAAE,EAAC,IAAI,YAAG,GAAC,KAAK,IAAG,KAAK,KAAC,EAAC,EAAE,OAAO,CAAC,EAAC;;KACvE,CAAC;AARW,QAAA,aAAa,iBAQxB;AAEK,IAAM,gBAAgB,GAAG,UAC5B,OAA0B,EAC1B,EAAU,EACV,OAAoB;;;;oBAEP,qBAAM,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,EAAA;;gBAAhD,IAAI,GAAG,SAAyC;gBAEtD,sBAAO;wBACH,OAAO,EAAE,OAAO,CAAC,KAAK,CAAsB,IAAI,CAAC,OAAO,CAAC;wBACzD,GAAG,EAAE,IAAI,CAAC,GAAG;wBACb,UAAU,EAAE,IAAI,CAAC,UAAU;qBAC9B,EAAC;;;KACL,CAAC;AAZW,QAAA,gBAAgB,oBAY3B","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"]}
@@ -1 +1,2 @@
1
1
  export * from './pagination';
2
+ export * from './types';
@@ -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"]}
@@ -1,11 +1,4 @@
1
- export interface PaginationArgs {
2
- bucketName: string;
3
- select?: any[] | string;
4
- where: any;
5
- page: number;
6
- limit: number;
7
- orderBy?: any;
8
- }
1
+ import { PaginationArgs } from './types';
9
2
  /**
10
3
  * Common pagination
11
4
  * where = {
@@ -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
- // select: ogSelected = '*',
58
- where, _c, page, _d, limit, _e, orderBy, cluster, select, offset, query, rows, completedRows, error_1;
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.where, where = _b === void 0 ? {
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
- select = args.select || '*';
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
- _f.trys.push([1, 3, , 4]);
74
- query = new query_1.QueryBuilder(where, bucketName)
75
- .select(select)
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 = (_f.sent()).rows;
68
+ rows = (_d.sent()).rows;
84
69
  completedRows = rows.map(function (r) {
85
- return select === '*' ? r[bucketName] : r;
70
+ return selectAll_1 ? r[resultKey] : r;
86
71
  });
87
72
  return [2 /*return*/, completedRows];
88
73
  case 3:
89
- error_1 = _f.sent();
90
- console.error('error running pagination', error_1);
91
- return [2 /*return*/, []];
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,kCAAsC;AACtC,6DAAgD;AAWhD;;;;;;;;;GASG;AACI,IAAM,UAAU,GAAG,UAAO,IAAoB;;;;;;;gBAE7C,KAQA,IAAI,WARmB,EAAvB,UAAU,mBAAG,UAAU,KAAA,EAEvB,KAMA,IAAI,MAJH,EAFD,KAAK,mBAAG;gBACJ,0DAA0D;iBAC7D,KAAA,EACD,KAGA,IAAI,KAHI,EAAR,IAAI,mBAAG,CAAC,KAAA,EACR,KAEA,IAAI,MAFM,EAAV,KAAK,mBAAG,EAAE,KAAA,EACV,KACA,IAAI,QADyB,EAA7B,OAAO,mBAAG,EAAC,SAAS,EAAE,MAAM,EAAC,KAAA,CACxB;gBAEH,OAAO,GAAG,oBAAmB,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAEjD,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC;gBAChC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;oBACxB,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,EAAC,MAAM,EAAE,CAAC,EAAC,CAAC,EAAb,CAAa,CAAC,CAAC;gBAC9C,CAAC;gBAEK,MAAM,GAAG,IAAI,GAAG,KAAK,CAAC;;;;gBAGlB,KAAK,GAAG,IAAI,oBAAY,CAAC,KAAK,EAAE,UAAU,CAAC;qBAC5C,MAAM,CAAC,MAAM,CAAC;qBACd,KAAK,CAAC,KAAK,CAAC;qBACZ,MAAM,CAAC,MAAM,CAAC;qBACd,OAAO,CAAC,OAAO,CAAC;qBAChB,KAAK,EAAE,CAAC;gBAEb,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBAEb,qBAAM,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAA;;gBAAlC,IAAI,GAAI,CAAA,SAA0B,CAAA,KAA9B;gBAEL,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,UAAC,CAAM;oBAClC,OAAO,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9C,CAAC,CAAC,CAAC;gBAEH,sBAAO,aAAa,EAAC;;;gBAErB,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,OAAK,CAAC,CAAC;gBACjD,sBAAO,EAAE,EAAC;;;;KAEjB,CAAC;AA1CW,QAAA,UAAU,cA0CrB","sourcesContent":["import {QueryBuilder} from '../query';\nimport CouchbaseConnection from '../connection';\n\nexport interface PaginationArgs {\n bucketName: string;\n select?: any[] | string;\n where: any;\n page: number;\n limit: number;\n orderBy?: any;\n}\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 {\n bucketName = '_default',\n // select: ogSelected = '*',\n where = {\n // where: {owner: {$eq: 'stoqey'}, _type: {$eq: 'Trade'}},\n },\n page = 0,\n limit = 10,\n orderBy = {createdAt: 'DESC'},\n } = args;\n\n const cluster = CouchbaseConnection.Instance.cluster;\n\n let select = args.select || '*';\n if (Array.isArray(select)) {\n select = select.map((i) => ({$field: i}));\n }\n\n const offset = page * limit;\n\n try {\n const query = new QueryBuilder(where, bucketName)\n .select(select)\n .limit(limit)\n .offset(offset)\n .orderBy(orderBy)\n .build();\n\n console.log('query', query);\n\n const {rows} = await cluster.query(query);\n\n const completedRows = rows.map((r: any) => {\n return select === '*' ? r[bucketName] : r;\n });\n\n return completedRows;\n } catch (error) {\n console.error('error running pagination', error);\n return [];\n }\n};\n"]}
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"]}