couchset 0.2.7 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/README.md +292 -152
  3. package/dist/connection/connection.d.ts +68 -0
  4. package/dist/connection/connection.js +495 -0
  5. package/dist/connection/connection.js.map +1 -0
  6. package/dist/connection/env.d.ts +2 -0
  7. package/dist/connection/env.js +16 -0
  8. package/dist/connection/env.js.map +1 -0
  9. package/dist/connection/index.d.ts +3 -0
  10. package/dist/connection/index.js +25 -0
  11. package/dist/connection/index.js.map +1 -0
  12. package/dist/connection/types.d.ts +25 -0
  13. package/dist/connection/types.js +3 -0
  14. package/dist/connection/types.js.map +1 -0
  15. package/dist/database.d.ts +9 -0
  16. package/dist/database.js +196 -0
  17. package/dist/database.js.map +1 -0
  18. package/dist/index.d.ts +20 -6
  19. package/dist/index.js +55 -8
  20. package/dist/index.js.map +1 -1
  21. package/dist/legacy/connection.d.ts +2 -0
  22. package/dist/legacy/connection.js +24 -0
  23. package/dist/legacy/connection.js.map +1 -0
  24. package/dist/legacy/index.d.ts +10 -0
  25. package/dist/legacy/index.js +93 -0
  26. package/dist/legacy/index.js.map +1 -0
  27. package/dist/legacy/model.d.ts +55 -0
  28. package/dist/legacy/model.js +282 -0
  29. package/dist/legacy/model.js.map +1 -0
  30. package/dist/legacy/pagination/index.d.ts +1 -0
  31. package/dist/legacy/pagination/index.js +18 -0
  32. package/dist/legacy/pagination/index.js.map +1 -0
  33. package/dist/legacy/pagination/pagination.d.ts +12 -0
  34. package/dist/legacy/pagination/pagination.js +85 -0
  35. package/dist/legacy/pagination/pagination.js.map +1 -0
  36. package/dist/legacy/search/customQuery.d.ts +13 -0
  37. package/dist/legacy/search/customQuery.js +73 -0
  38. package/dist/legacy/search/customQuery.js.map +1 -0
  39. package/dist/legacy/search/index.d.ts +1 -0
  40. package/dist/legacy/search/index.js +18 -0
  41. package/dist/legacy/search/index.js.map +1 -0
  42. package/dist/model/default-scope.d.ts +10 -0
  43. package/dist/model/default-scope.js +47 -0
  44. package/dist/model/default-scope.js.map +1 -0
  45. package/dist/model/hydrated-document.d.ts +30 -0
  46. package/dist/model/hydrated-document.js +118 -0
  47. package/dist/model/hydrated-document.js.map +1 -0
  48. package/dist/model/include.d.ts +33 -0
  49. package/dist/model/include.js +250 -0
  50. package/dist/model/include.js.map +1 -0
  51. package/dist/model/index.d.ts +192 -52
  52. package/dist/model/index.js +646 -172
  53. package/dist/model/index.js.map +1 -1
  54. package/dist/model/indexes.d.ts +18 -0
  55. package/dist/model/indexes.js +155 -0
  56. package/dist/model/indexes.js.map +1 -0
  57. package/dist/model/keyspace.d.ts +9 -0
  58. package/dist/model/keyspace.js +28 -0
  59. package/dist/model/keyspace.js.map +1 -0
  60. package/dist/model/read-helpers.d.ts +36 -0
  61. package/dist/model/read-helpers.js +275 -0
  62. package/dist/model/read-helpers.js.map +1 -0
  63. package/dist/model/safe-query.d.ts +23 -0
  64. package/dist/model/safe-query.js +138 -0
  65. package/dist/model/safe-query.js.map +1 -0
  66. package/dist/model/ttl.d.ts +9 -0
  67. package/dist/model/ttl.js +73 -0
  68. package/dist/model/ttl.js.map +1 -0
  69. package/dist/model/validation.d.ts +5 -0
  70. package/dist/model/validation.js +104 -0
  71. package/dist/model/validation.js.map +1 -0
  72. package/dist/model/write-helpers.d.ts +39 -0
  73. package/dist/model/write-helpers.js +245 -0
  74. package/dist/model/write-helpers.js.map +1 -0
  75. package/dist/next.d.ts +204 -0
  76. package/dist/next.js +1190 -0
  77. package/dist/next.js.map +1 -0
  78. package/dist/next.types.d.ts +1 -0
  79. package/dist/next.types.js +38 -0
  80. package/dist/next.types.js.map +1 -0
  81. package/dist/pagination/index.d.ts +1 -0
  82. package/dist/pagination/index.js +1 -0
  83. package/dist/pagination/index.js.map +1 -1
  84. package/dist/pagination/pagination.d.ts +1 -8
  85. package/dist/pagination/pagination.js +16 -29
  86. package/dist/pagination/pagination.js.map +1 -1
  87. package/dist/pagination/safe-pagination.d.ts +15 -0
  88. package/dist/pagination/safe-pagination.js +221 -0
  89. package/dist/pagination/safe-pagination.js.map +1 -0
  90. package/dist/pagination/types.d.ts +11 -0
  91. package/dist/pagination/types.js +3 -0
  92. package/dist/pagination/types.js.map +1 -0
  93. package/dist/search/customQuery.d.ts +10 -3
  94. package/dist/search/customQuery.js +17 -18
  95. package/dist/search/customQuery.js.map +1 -1
  96. package/dist/shared/common.model.js +2 -2
  97. package/dist/shared/common.model.js.map +1 -1
  98. package/dist/timeseries/index.d.ts +1 -0
  99. package/dist/timeseries/index.js +18 -0
  100. package/dist/timeseries/index.js.map +1 -0
  101. package/dist/timeseries/time-series-model.d.ts +60 -0
  102. package/dist/timeseries/time-series-model.js +267 -0
  103. package/dist/timeseries/time-series-model.js.map +1 -0
  104. package/dist/utils/awaitTo.d.ts +1 -1
  105. package/dist/utils/awaitTo.js +1 -1
  106. package/dist/utils/awaitTo.js.map +1 -1
  107. package/docs/beta-migration.md +175 -0
  108. package/docs/document-modeling.md +133 -0
  109. package/docs/next-primitives.md +81 -0
  110. package/legacy/index.js +1 -0
  111. package/legacy/package.json +4 -0
  112. package/next/index.js +1 -0
  113. package/next/package.json +4 -0
  114. package/package.json +18 -10
  115. package/dist/connection.d.ts +0 -42
  116. package/dist/connection.js +0 -156
  117. package/dist/connection.js.map +0 -1
@@ -0,0 +1,275 @@
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 __read = (this && this.__read) || function (o, n) {
50
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
51
+ if (!m) return o;
52
+ var i = m.call(o), r, ar = [], e;
53
+ try {
54
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
55
+ }
56
+ catch (error) { e = { error: error }; }
57
+ finally {
58
+ try {
59
+ if (r && !r.done && (m = i["return"])) m.call(i);
60
+ }
61
+ finally { if (e) throw e.error; }
62
+ }
63
+ return ar;
64
+ };
65
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
66
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
67
+ if (ar || !(i in from)) {
68
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
69
+ ar[i] = from[i];
70
+ }
71
+ }
72
+ return to.concat(ar || Array.prototype.slice.call(from));
73
+ };
74
+ Object.defineProperty(exports, "__esModule", { value: true });
75
+ exports.page = exports.count = exports.exists = exports.findOne = exports.findMany = void 0;
76
+ var safe_pagination_1 = require("../pagination/safe-pagination");
77
+ var include_1 = require("./include");
78
+ var scopedWhere = function (collectionName, where) {
79
+ var typeWhere = { _type: { $eq: collectionName } };
80
+ if (!where || !Object.keys(where).length) {
81
+ return typeWhere;
82
+ }
83
+ return { $and: [typeWhere, where] };
84
+ };
85
+ var shouldThrow = function (args) { return args.throwOnError !== false; };
86
+ var unwrapRows = function (rows, bucketName, selectAll, parse) {
87
+ return rows.map(function (row) {
88
+ var data = selectAll ? row[bucketName] : row;
89
+ return parse(data);
90
+ });
91
+ };
92
+ var runReadQuery = function (context, args, queryArgs) { return __awaiter(void 0, void 0, void 0, function () {
93
+ var hasIncludes, builtQuery, query, parameters, selectAll, resultKey, _a, rows, error_1;
94
+ return __generator(this, function (_b) {
95
+ switch (_b.label) {
96
+ case 0:
97
+ hasIncludes = Array.isArray(queryArgs.include) && queryArgs.include.length > 0;
98
+ builtQuery = hasIncludes
99
+ ? (0, include_1.buildIncludedSelectionQuery)({
100
+ keyspace: context.bucketName,
101
+ collectionName: context.collectionName,
102
+ select: queryArgs.select || '*',
103
+ where: scopedWhere(context.collectionName, queryArgs.where),
104
+ limit: queryArgs.limit,
105
+ page: queryArgs.page,
106
+ offset: queryArgs.offset,
107
+ orderBy: queryArgs.orderBy,
108
+ include: queryArgs.include,
109
+ })
110
+ : __assign(__assign({}, (0, safe_pagination_1.buildSelectionQuery)({
111
+ bucketName: context.bucketName,
112
+ select: queryArgs.select || '*',
113
+ where: { where: scopedWhere(context.collectionName, queryArgs.where) },
114
+ limit: queryArgs.limit,
115
+ page: queryArgs.page,
116
+ offset: queryArgs.offset,
117
+ orderBy: queryArgs.orderBy,
118
+ }, { includeLimitOffset: true })), { resultKey: undefined });
119
+ query = builtQuery.query, parameters = builtQuery.parameters, selectAll = builtQuery.selectAll, resultKey = builtQuery.resultKey;
120
+ _b.label = 1;
121
+ case 1:
122
+ _b.trys.push([1, 3, , 4]);
123
+ return [4 /*yield*/, context.cluster.query(query, { parameters: parameters })];
124
+ case 2:
125
+ _a = (_b.sent()).rows, rows = _a === void 0 ? [] : _a;
126
+ return [2 /*return*/, unwrapRows(rows, resultKey || context.resultKey || context.bucketName, selectAll, context.parse)];
127
+ case 3:
128
+ error_1 = _b.sent();
129
+ if (shouldThrow(args)) {
130
+ throw error_1;
131
+ }
132
+ return [2 /*return*/, []];
133
+ case 4: return [2 /*return*/];
134
+ }
135
+ });
136
+ }); };
137
+ var findMany = function (context_1) {
138
+ var args_1 = [];
139
+ for (var _i = 1; _i < arguments.length; _i++) {
140
+ args_1[_i - 1] = arguments[_i];
141
+ }
142
+ return __awaiter(void 0, __spreadArray([context_1], __read(args_1), false), void 0, function (context, args) {
143
+ if (args === void 0) { args = {}; }
144
+ return __generator(this, function (_a) {
145
+ return [2 /*return*/, runReadQuery(context, args, __assign(__assign({}, args), { limit: typeof args.limit === 'number' ? args.limit : 10, page: typeof args.page === 'number' ? args.page : 0 }))];
146
+ });
147
+ });
148
+ };
149
+ exports.findMany = findMany;
150
+ var findOne = function (context_1) {
151
+ var args_1 = [];
152
+ for (var _i = 1; _i < arguments.length; _i++) {
153
+ args_1[_i - 1] = arguments[_i];
154
+ }
155
+ return __awaiter(void 0, __spreadArray([context_1], __read(args_1), false), void 0, function (context, args) {
156
+ var rows;
157
+ if (args === void 0) { args = {}; }
158
+ return __generator(this, function (_a) {
159
+ switch (_a.label) {
160
+ case 0: return [4 /*yield*/, runReadQuery(context, args, __assign(__assign({}, args), { limit: 1, page: 0, offset: args.offset }))];
161
+ case 1:
162
+ rows = _a.sent();
163
+ return [2 /*return*/, rows.length ? rows[0] : null];
164
+ }
165
+ });
166
+ });
167
+ };
168
+ exports.findOne = findOne;
169
+ var exists = function (context_1) {
170
+ var args_1 = [];
171
+ for (var _i = 1; _i < arguments.length; _i++) {
172
+ args_1[_i - 1] = arguments[_i];
173
+ }
174
+ return __awaiter(void 0, __spreadArray([context_1], __read(args_1), false), void 0, function (context, args) {
175
+ var _a, query, parameters, _b, rows, error_2;
176
+ if (args === void 0) { args = {}; }
177
+ return __generator(this, function (_c) {
178
+ switch (_c.label) {
179
+ case 0:
180
+ _a = (0, safe_pagination_1.buildSelectionQuery)({
181
+ bucketName: context.bucketName,
182
+ select: 'RAW 1',
183
+ where: { where: scopedWhere(context.collectionName, args.where) },
184
+ limit: 1,
185
+ page: 0,
186
+ }, { includeLimitOffset: true }), query = _a.query, parameters = _a.parameters;
187
+ _c.label = 1;
188
+ case 1:
189
+ _c.trys.push([1, 3, , 4]);
190
+ return [4 /*yield*/, context.cluster.query(query, { parameters: parameters })];
191
+ case 2:
192
+ _b = (_c.sent()).rows, rows = _b === void 0 ? [] : _b;
193
+ return [2 /*return*/, rows.length > 0];
194
+ case 3:
195
+ error_2 = _c.sent();
196
+ if (shouldThrow(args)) {
197
+ throw error_2;
198
+ }
199
+ return [2 /*return*/, false];
200
+ case 4: return [2 /*return*/];
201
+ }
202
+ });
203
+ });
204
+ };
205
+ exports.exists = exists;
206
+ var count = function (context_1) {
207
+ var args_1 = [];
208
+ for (var _i = 1; _i < arguments.length; _i++) {
209
+ args_1[_i - 1] = arguments[_i];
210
+ }
211
+ return __awaiter(void 0, __spreadArray([context_1], __read(args_1), false), void 0, function (context, args) {
212
+ var _a, query, parameters, _b, rows, error_3;
213
+ if (args === void 0) { args = {}; }
214
+ return __generator(this, function (_c) {
215
+ switch (_c.label) {
216
+ case 0:
217
+ _a = (0, safe_pagination_1.buildSelectionQuery)({
218
+ bucketName: context.bucketName,
219
+ select: 'RAW COUNT(1)',
220
+ where: { where: scopedWhere(context.collectionName, args.where) },
221
+ }), query = _a.query, parameters = _a.parameters;
222
+ _c.label = 1;
223
+ case 1:
224
+ _c.trys.push([1, 3, , 4]);
225
+ return [4 /*yield*/, context.cluster.query(query, { parameters: parameters })];
226
+ case 2:
227
+ _b = (_c.sent()).rows, rows = _b === void 0 ? [] : _b;
228
+ return [2 /*return*/, Number(rows[0] || 0)];
229
+ case 3:
230
+ error_3 = _c.sent();
231
+ if (shouldThrow(args)) {
232
+ throw error_3;
233
+ }
234
+ return [2 /*return*/, 0];
235
+ case 4: return [2 /*return*/];
236
+ }
237
+ });
238
+ });
239
+ };
240
+ exports.count = count;
241
+ var page = function (context_1) {
242
+ var args_1 = [];
243
+ for (var _i = 1; _i < arguments.length; _i++) {
244
+ args_1[_i - 1] = arguments[_i];
245
+ }
246
+ return __awaiter(void 0, __spreadArray([context_1], __read(args_1), false), void 0, function (context, args) {
247
+ var limit, pageNumber, offset, rows, hasNext;
248
+ if (args === void 0) { args = {}; }
249
+ return __generator(this, function (_a) {
250
+ switch (_a.label) {
251
+ case 0:
252
+ limit = typeof args.limit === 'number' ? args.limit : 10;
253
+ pageNumber = typeof args.page === 'number' ? args.page : 0;
254
+ offset = typeof args.offset === 'number' ? args.offset : pageNumber * limit;
255
+ return [4 /*yield*/, runReadQuery(context, args, __assign(__assign({}, args), { limit: limit + 1, page: pageNumber, offset: offset }))];
256
+ case 1:
257
+ rows = _a.sent();
258
+ hasNext = rows.length > limit;
259
+ return [2 /*return*/, {
260
+ items: hasNext ? rows.slice(0, limit) : rows,
261
+ hasNext: hasNext,
262
+ pageInfo: {
263
+ limit: limit,
264
+ page: pageNumber,
265
+ offset: offset,
266
+ nextPage: hasNext ? pageNumber + 1 : null,
267
+ nextOffset: hasNext ? offset + limit : null,
268
+ },
269
+ }];
270
+ }
271
+ });
272
+ });
273
+ };
274
+ exports.page = page;
275
+ //# sourceMappingURL=read-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-helpers.js","sourceRoot":"","sources":["../../src/model/read-helpers.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,iEAAkE;AAElE,qCAAyE;AAmCzE,IAAM,WAAW,GAAG,UAAC,cAAsB,EAAE,KAAW;IACpD,IAAM,SAAS,GAAG,EAAC,KAAK,EAAE,EAAC,GAAG,EAAE,cAAc,EAAC,EAAC,CAAC;IAEjD,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;QACvC,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,OAAO,EAAC,IAAI,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,EAAC,CAAC;AACtC,CAAC,CAAC;AAEF,IAAM,WAAW,GAAG,UAAC,IAAmB,IAAc,OAAA,IAAI,CAAC,YAAY,KAAK,KAAK,EAA3B,CAA2B,CAAC;AAElF,IAAM,UAAU,GAAG,UACf,IAAW,EACX,UAAkB,EAClB,SAAkB,EAClB,KAAoC;IAEpC,OAAO,IAAI,CAAC,GAAG,CAAC,UAAC,GAAG;QAChB,IAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAE/C,OAAO,KAAK,CAAI,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,IAAM,YAAY,GAAG,UACjB,OAAyB,EACzB,IAAmB,EACnB,SAAwB;;;;;gBAElB,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;gBAC/E,UAAU,GAAG,WAAW;oBAC1B,CAAC,CAAC,IAAA,qCAA2B,EAAC;wBACxB,QAAQ,EAAE,OAAO,CAAC,UAAU;wBAC5B,cAAc,EAAE,OAAO,CAAC,cAAc;wBACtC,MAAM,EAAE,SAAS,CAAC,MAAM,IAAI,GAAG;wBAC/B,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,cAAc,EAAE,SAAS,CAAC,KAAK,CAAC;wBAC3D,KAAK,EAAE,SAAS,CAAC,KAAK;wBACtB,IAAI,EAAE,SAAS,CAAC,IAAI;wBACpB,MAAM,EAAE,SAAS,CAAC,MAAM;wBACxB,OAAO,EAAE,SAAS,CAAC,OAAO;wBAC1B,OAAO,EAAE,SAAS,CAAC,OAAO;qBAC7B,CAAC;oBACJ,CAAC,uBACQ,IAAA,qCAAmB,EAClB;wBACI,UAAU,EAAE,OAAO,CAAC,UAAU;wBAC9B,MAAM,EAAE,SAAS,CAAC,MAAM,IAAI,GAAG;wBAC/B,KAAK,EAAE,EAAC,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,cAAc,EAAE,SAAS,CAAC,KAAK,CAAC,EAAC;wBACpE,KAAK,EAAE,SAAS,CAAC,KAAK;wBACtB,IAAI,EAAE,SAAS,CAAC,IAAI;wBACpB,MAAM,EAAE,SAAS,CAAC,MAAM;wBACxB,OAAO,EAAE,SAAS,CAAC,OAAO;qBAC7B,EACD,EAAC,kBAAkB,EAAE,IAAI,EAAC,CAC7B,KACD,SAAS,EAAE,SAAS,GACvB,CAAC;gBACD,KAAK,GAAsC,UAAU,MAAhD,EAAE,UAAU,GAA0B,UAAU,WAApC,EAAE,SAAS,GAAe,UAAU,UAAzB,EAAE,SAAS,GAAI,UAAU,UAAd,CAAe;;;;gBAGrC,qBAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,EAAC,UAAU,YAAA,EAAC,CAAC,EAAA;;gBAA7D,KAAa,CAAA,SAAgD,CAAA,KAApD,EAAT,IAAI,mBAAG,EAAE,KAAA;gBAEhB,sBAAO,UAAU,CACb,IAAI,EACJ,SAAS,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,UAAU,EACpD,SAAS,EACT,OAAO,CAAC,KAAK,CAChB,EAAC;;;gBAEF,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;oBACpB,MAAM,OAAK,CAAC;gBAChB,CAAC;gBAED,sBAAO,EAAE,EAAC;;;;KAEjB,CAAC;AAEK,IAAM,QAAQ,GAAG;;;;;kGACpB,OAAyB,EACzB,IAAwB;QAAxB,qBAAA,EAAA,SAAwB;;YAExB,sBAAO,YAAY,CAAI,OAAO,EAAE,IAAI,wBAC7B,IAAI,KACP,KAAK,EAAE,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EACvD,IAAI,EAAE,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IACrD,EAAC;;;CACN,CAAC;AATW,QAAA,QAAQ,YASnB;AAEK,IAAM,OAAO,GAAG;;;;;kGACnB,OAAyB,EACzB,IAAwB;;QAAxB,qBAAA,EAAA,SAAwB;;;wBAEX,qBAAM,YAAY,CAAI,OAAO,EAAE,IAAI,wBACzC,IAAI,KACP,KAAK,EAAE,CAAC,EACR,IAAI,EAAE,CAAC,EACP,MAAM,EAAE,IAAI,CAAC,MAAM,IACrB,EAAA;;oBALI,IAAI,GAAG,SAKX;oBAEF,sBAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAC;;;;CACvC,CAAC;AAZW,QAAA,OAAO,WAYlB;AAEK,IAAM,MAAM,GAAG;;;;;kGAClB,OAAyB,EACzB,IAAwB;;QAAxB,qBAAA,EAAA,SAAwB;;;;oBAElB,KAAsB,IAAA,qCAAmB,EAC3C;wBACI,UAAU,EAAE,OAAO,CAAC,UAAU;wBAC9B,MAAM,EAAE,OAAO;wBACf,KAAK,EAAE,EAAC,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,EAAC;wBAC/D,KAAK,EAAE,CAAC;wBACR,IAAI,EAAE,CAAC;qBACV,EACD,EAAC,kBAAkB,EAAE,IAAI,EAAC,CAC7B,EATM,KAAK,WAAA,EAAE,UAAU,gBAAA,CAStB;;;;oBAGsB,qBAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,EAAC,UAAU,YAAA,EAAC,CAAC,EAAA;;oBAA7D,KAAa,CAAA,SAAgD,CAAA,KAApD,EAAT,IAAI,mBAAG,EAAE,KAAA;oBAEhB,sBAAO,IAAI,CAAC,MAAM,GAAG,CAAC,EAAC;;;oBAEvB,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;wBACpB,MAAM,OAAK,CAAC;oBAChB,CAAC;oBAED,sBAAO,KAAK,EAAC;;;;;CAEpB,CAAC;AA1BW,QAAA,MAAM,UA0BjB;AAEK,IAAM,KAAK,GAAG;;;;;kGACjB,OAAyB,EACzB,IAAwB;;QAAxB,qBAAA,EAAA,SAAwB;;;;oBAElB,KAAsB,IAAA,qCAAmB,EAAC;wBAC5C,UAAU,EAAE,OAAO,CAAC,UAAU;wBAC9B,MAAM,EAAE,cAAc;wBACtB,KAAK,EAAE,EAAC,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,EAAC;qBAClE,CAAC,EAJK,KAAK,WAAA,EAAE,UAAU,gBAAA,CAIrB;;;;oBAGqB,qBAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,EAAC,UAAU,YAAA,EAAC,CAAC,EAAA;;oBAA7D,KAAa,CAAA,SAAgD,CAAA,KAApD,EAAT,IAAI,mBAAG,EAAE,KAAA;oBAEhB,sBAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAC;;;oBAE5B,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;wBACpB,MAAM,OAAK,CAAC;oBAChB,CAAC;oBAED,sBAAO,CAAC,EAAC;;;;;CAEhB,CAAC;AArBW,QAAA,KAAK,SAqBhB;AAEK,IAAM,IAAI,GAAG;;;;;kGAChB,OAAyB,EACzB,IAAwB;;QAAxB,qBAAA,EAAA,SAAwB;;;;oBAElB,KAAK,GAAG,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;oBACzD,UAAU,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC3D,MAAM,GAAG,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,GAAG,KAAK,CAAC;oBACrE,qBAAM,YAAY,CAAI,OAAO,EAAE,IAAI,wBACzC,IAAI,KACP,KAAK,EAAE,KAAK,GAAG,CAAC,EAChB,IAAI,EAAE,UAAU,EAChB,MAAM,QAAA,IACR,EAAA;;oBALI,IAAI,GAAG,SAKX;oBACI,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;oBAEpC,sBAAO;4BACH,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI;4BAC5C,OAAO,SAAA;4BACP,QAAQ,EAAE;gCACN,KAAK,OAAA;gCACL,IAAI,EAAE,UAAU;gCAChB,MAAM,QAAA;gCACN,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;gCACzC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI;6BAC9C;yBACJ,EAAC;;;;CACL,CAAC;AA1BW,QAAA,IAAI,QA0Bf","sourcesContent":["import type {Cluster} from 'couchbase';\n\nimport {buildSelectionQuery} from '../pagination/safe-pagination';\n\nimport {buildIncludedSelectionQuery, IncludeDefinition} from './include';\n\nexport interface ModelReadArgs {\n select?: any[] | string;\n where?: any;\n orderBy?: any;\n limit?: number;\n page?: number;\n offset?: number;\n throwOnError?: boolean;\n include?: IncludeDefinition[];\n}\n\nexport interface ModelPageInfo {\n limit: number;\n page: number;\n offset: number;\n nextPage: number | null;\n nextOffset: number | null;\n}\n\nexport interface ModelPageResult<T> {\n items: T[];\n hasNext: boolean;\n pageInfo: ModelPageInfo;\n}\n\nexport interface ModelReadContext {\n bucketName: string;\n collectionName: string;\n cluster: Cluster;\n parse: <T>(data: T) => T;\n resultKey?: string;\n}\n\nconst scopedWhere = (collectionName: string, where?: any): any => {\n const typeWhere = {_type: {$eq: collectionName}};\n\n if (!where || !Object.keys(where).length) {\n return typeWhere;\n }\n\n return {$and: [typeWhere, where]};\n};\n\nconst shouldThrow = (args: ModelReadArgs): boolean => args.throwOnError !== false;\n\nconst unwrapRows = <T>(\n rows: any[],\n bucketName: string,\n selectAll: boolean,\n parse: <TItem>(data: TItem) => TItem\n): T[] => {\n return rows.map((row) => {\n const data = selectAll ? row[bucketName] : row;\n\n return parse<T>(data);\n });\n};\n\nconst runReadQuery = async <T>(\n context: ModelReadContext,\n args: ModelReadArgs,\n queryArgs: ModelReadArgs\n): Promise<T[]> => {\n const hasIncludes = Array.isArray(queryArgs.include) && queryArgs.include.length > 0;\n const builtQuery = hasIncludes\n ? buildIncludedSelectionQuery({\n keyspace: context.bucketName,\n collectionName: context.collectionName,\n select: queryArgs.select || '*',\n where: scopedWhere(context.collectionName, queryArgs.where),\n limit: queryArgs.limit,\n page: queryArgs.page,\n offset: queryArgs.offset,\n orderBy: queryArgs.orderBy,\n include: queryArgs.include,\n })\n : {\n ...buildSelectionQuery(\n {\n bucketName: context.bucketName,\n select: queryArgs.select || '*',\n where: {where: scopedWhere(context.collectionName, queryArgs.where)},\n limit: queryArgs.limit,\n page: queryArgs.page,\n offset: queryArgs.offset,\n orderBy: queryArgs.orderBy,\n },\n {includeLimitOffset: true}\n ),\n resultKey: undefined,\n };\n const {query, parameters, selectAll, resultKey} = builtQuery;\n\n try {\n const {rows = []} = await context.cluster.query(query, {parameters});\n\n return unwrapRows<T>(\n rows,\n resultKey || context.resultKey || context.bucketName,\n selectAll,\n context.parse\n );\n } catch (error) {\n if (shouldThrow(args)) {\n throw error;\n }\n\n return [];\n }\n};\n\nexport const findMany = async <T>(\n context: ModelReadContext,\n args: ModelReadArgs = {}\n): Promise<T[]> => {\n return runReadQuery<T>(context, args, {\n ...args,\n limit: typeof args.limit === 'number' ? args.limit : 10,\n page: typeof args.page === 'number' ? args.page : 0,\n });\n};\n\nexport const findOne = async <T>(\n context: ModelReadContext,\n args: ModelReadArgs = {}\n): Promise<T | null> => {\n const rows = await runReadQuery<T>(context, args, {\n ...args,\n limit: 1,\n page: 0,\n offset: args.offset,\n });\n\n return rows.length ? rows[0] : null;\n};\n\nexport const exists = async (\n context: ModelReadContext,\n args: ModelReadArgs = {}\n): Promise<boolean> => {\n const {query, parameters} = buildSelectionQuery(\n {\n bucketName: context.bucketName,\n select: 'RAW 1',\n where: {where: scopedWhere(context.collectionName, args.where)},\n limit: 1,\n page: 0,\n },\n {includeLimitOffset: true}\n );\n\n try {\n const {rows = []} = await context.cluster.query(query, {parameters});\n\n return rows.length > 0;\n } catch (error) {\n if (shouldThrow(args)) {\n throw error;\n }\n\n return false;\n }\n};\n\nexport const count = async (\n context: ModelReadContext,\n args: ModelReadArgs = {}\n): Promise<number> => {\n const {query, parameters} = buildSelectionQuery({\n bucketName: context.bucketName,\n select: 'RAW COUNT(1)',\n where: {where: scopedWhere(context.collectionName, args.where)},\n });\n\n try {\n const {rows = []} = await context.cluster.query(query, {parameters});\n\n return Number(rows[0] || 0);\n } catch (error) {\n if (shouldThrow(args)) {\n throw error;\n }\n\n return 0;\n }\n};\n\nexport const page = async <T>(\n context: ModelReadContext,\n args: ModelReadArgs = {}\n): Promise<ModelPageResult<T>> => {\n const limit = typeof args.limit === 'number' ? args.limit : 10;\n const pageNumber = typeof args.page === 'number' ? args.page : 0;\n const offset = typeof args.offset === 'number' ? args.offset : pageNumber * limit;\n const rows = await runReadQuery<T>(context, args, {\n ...args,\n limit: limit + 1,\n page: pageNumber,\n offset,\n });\n const hasNext = rows.length > limit;\n\n return {\n items: hasNext ? rows.slice(0, limit) : rows,\n hasNext,\n pageInfo: {\n limit,\n page: pageNumber,\n offset,\n nextPage: hasNext ? pageNumber + 1 : null,\n nextOffset: hasNext ? offset + limit : null,\n },\n };\n};\n"]}
@@ -0,0 +1,23 @@
1
+ import type { Cluster, QueryOptions } from 'couchbase';
2
+ import { bucketIdentifier, fromTarget } from './keyspace';
3
+ export type QueryParameters = {
4
+ [key: string]: any;
5
+ } | any[];
6
+ export type QueryLogger = (message: string, details?: any) => void;
7
+ export interface SafeQueryOptions extends Omit<QueryOptions, 'parameters'> {
8
+ debug?: boolean;
9
+ logger?: QueryLogger;
10
+ }
11
+ export interface QueryPageOptions extends SafeQueryOptions {
12
+ limit?: number;
13
+ limitParamIndex?: number;
14
+ }
15
+ export interface QueryPageResult<T> {
16
+ items: T[];
17
+ hasNext: boolean;
18
+ params?: any;
19
+ }
20
+ export { bucketIdentifier, fromTarget };
21
+ export declare const runQueryRows: <T>(cluster: Cluster, query: string, params?: QueryParameters, options?: SafeQueryOptions) => Promise<T[]>;
22
+ export declare const runQueryOne: <T>(cluster: Cluster, query: string, params?: QueryParameters, options?: SafeQueryOptions) => Promise<T | null>;
23
+ export declare const runQueryPage: <T>(cluster: Cluster, query: string, params?: QueryParameters, options?: QueryPageOptions) => Promise<QueryPageResult<T>>;
@@ -0,0 +1,138 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
50
+ exports.runQueryPage = exports.runQueryOne = exports.runQueryRows = exports.fromTarget = exports.bucketIdentifier = void 0;
51
+ var keyspace_1 = require("./keyspace");
52
+ Object.defineProperty(exports, "bucketIdentifier", { enumerable: true, get: function () { return keyspace_1.bucketIdentifier; } });
53
+ Object.defineProperty(exports, "fromTarget", { enumerable: true, get: function () { return keyspace_1.fromTarget; } });
54
+ var queryOptionsWithParameters = function (params, options) {
55
+ var queryOptions = __assign({}, (options || {}));
56
+ delete queryOptions.debug;
57
+ delete queryOptions.logger;
58
+ return __assign(__assign({}, queryOptions), (params === undefined ? {} : { parameters: params }));
59
+ };
60
+ var resolvePageLimit = function (params, options) {
61
+ var limit = options && typeof options.limit === 'number'
62
+ ? options.limit
63
+ : !Array.isArray(params) && params && typeof params.limit === 'number'
64
+ ? params.limit
65
+ : null;
66
+ if (!limit || limit < 1) {
67
+ throw new Error('queryPage requires a positive limit option or named params.limit');
68
+ }
69
+ return limit;
70
+ };
71
+ var pageParameters = function (params, limit, options) {
72
+ var nextLimit = limit + 1;
73
+ if (Array.isArray(params)) {
74
+ if (options && typeof options.limitParamIndex === 'number') {
75
+ var updatedParams = params.slice();
76
+ updatedParams[options.limitParamIndex] = nextLimit;
77
+ return updatedParams;
78
+ }
79
+ return params;
80
+ }
81
+ return __assign(__assign({}, (params || {})), { limit: nextLimit });
82
+ };
83
+ var queryPageOptions = function (options) {
84
+ var queryOptions = __assign({}, (options || {}));
85
+ delete queryOptions.limit;
86
+ delete queryOptions.limitParamIndex;
87
+ return queryOptions;
88
+ };
89
+ var runQueryRows = function (cluster, query, params, options) { return __awaiter(void 0, void 0, void 0, function () {
90
+ var queryOptions, _a, rows;
91
+ return __generator(this, function (_b) {
92
+ switch (_b.label) {
93
+ case 0:
94
+ queryOptions = queryOptionsWithParameters(params, options);
95
+ if (options && options.debug && options.logger) {
96
+ options.logger('couchset queryRows', { query: query, options: queryOptions });
97
+ }
98
+ return [4 /*yield*/, cluster.query(query, queryOptions)];
99
+ case 1:
100
+ _a = (_b.sent()).rows, rows = _a === void 0 ? [] : _a;
101
+ return [2 /*return*/, rows];
102
+ }
103
+ });
104
+ }); };
105
+ exports.runQueryRows = runQueryRows;
106
+ var runQueryOne = function (cluster, query, params, options) { return __awaiter(void 0, void 0, void 0, function () {
107
+ var rows;
108
+ return __generator(this, function (_a) {
109
+ switch (_a.label) {
110
+ case 0: return [4 /*yield*/, (0, exports.runQueryRows)(cluster, query, params, options)];
111
+ case 1:
112
+ rows = _a.sent();
113
+ return [2 /*return*/, rows.length ? rows[0] : null];
114
+ }
115
+ });
116
+ }); };
117
+ exports.runQueryOne = runQueryOne;
118
+ var runQueryPage = function (cluster, query, params, options) { return __awaiter(void 0, void 0, void 0, function () {
119
+ var limit, pagedParams, rows, hasNext;
120
+ return __generator(this, function (_a) {
121
+ switch (_a.label) {
122
+ case 0:
123
+ limit = resolvePageLimit(params, options);
124
+ pagedParams = pageParameters(params, limit, options);
125
+ return [4 /*yield*/, (0, exports.runQueryRows)(cluster, query, pagedParams, queryPageOptions(options))];
126
+ case 1:
127
+ rows = _a.sent();
128
+ hasNext = rows.length > limit;
129
+ return [2 /*return*/, {
130
+ items: hasNext ? rows.slice(0, limit) : rows,
131
+ hasNext: hasNext,
132
+ params: pagedParams,
133
+ }];
134
+ }
135
+ });
136
+ }); };
137
+ exports.runQueryPage = runQueryPage;
138
+ //# sourceMappingURL=safe-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe-query.js","sourceRoot":"","sources":["../../src/model/safe-query.ts"],"names":[],"mappings":"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","sourcesContent":["import type {Cluster, QueryOptions} from 'couchbase';\n\nimport {bucketIdentifier, fromTarget} from './keyspace';\n\nexport type QueryParameters = {[key: string]: any} | any[];\n\nexport type QueryLogger = (message: string, details?: any) => void;\n\nexport interface SafeQueryOptions extends Omit<QueryOptions, 'parameters'> {\n debug?: boolean;\n logger?: QueryLogger;\n}\n\nexport interface QueryPageOptions extends SafeQueryOptions {\n limit?: number;\n limitParamIndex?: number;\n}\n\nexport interface QueryPageResult<T> {\n items: T[];\n hasNext: boolean;\n params?: any;\n}\n\nconst queryOptionsWithParameters = (\n params?: QueryParameters,\n options?: SafeQueryOptions\n): QueryOptions => {\n const queryOptions: any = {...(options || {})};\n delete queryOptions.debug;\n delete queryOptions.logger;\n\n return {\n ...queryOptions,\n ...(params === undefined ? {} : {parameters: params}),\n };\n};\n\nconst resolvePageLimit = (params?: QueryParameters, options?: QueryPageOptions): number => {\n const limit =\n options && typeof options.limit === 'number'\n ? options.limit\n : !Array.isArray(params) && params && typeof params.limit === 'number'\n ? params.limit\n : null;\n\n if (!limit || limit < 1) {\n throw new Error('queryPage requires a positive limit option or named params.limit');\n }\n\n return limit;\n};\n\nconst pageParameters = (\n params: QueryParameters | undefined,\n limit: number,\n options?: QueryPageOptions\n): QueryParameters | undefined => {\n const nextLimit = limit + 1;\n\n if (Array.isArray(params)) {\n if (options && typeof options.limitParamIndex === 'number') {\n const updatedParams = params.slice();\n updatedParams[options.limitParamIndex] = nextLimit;\n return updatedParams;\n }\n\n return params;\n }\n\n return {...(params || {}), limit: nextLimit};\n};\n\nconst queryPageOptions = (options?: QueryPageOptions): SafeQueryOptions => {\n const queryOptions: any = {...(options || {})};\n delete queryOptions.limit;\n delete queryOptions.limitParamIndex;\n\n return queryOptions;\n};\n\nexport {bucketIdentifier, fromTarget};\n\nexport const runQueryRows = async <T>(\n cluster: Cluster,\n query: string,\n params?: QueryParameters,\n options?: SafeQueryOptions\n): Promise<T[]> => {\n const queryOptions = queryOptionsWithParameters(params, options);\n\n if (options && options.debug && options.logger) {\n options.logger('couchset queryRows', {query, options: queryOptions});\n }\n\n const {rows = []} = await cluster.query<T>(query, queryOptions);\n\n return rows;\n};\n\nexport const runQueryOne = async <T>(\n cluster: Cluster,\n query: string,\n params?: QueryParameters,\n options?: SafeQueryOptions\n): Promise<T | null> => {\n const rows = await runQueryRows<T>(cluster, query, params, options);\n\n return rows.length ? rows[0] : null;\n};\n\nexport const runQueryPage = async <T>(\n cluster: Cluster,\n query: string,\n params?: QueryParameters,\n options?: QueryPageOptions\n): Promise<QueryPageResult<T>> => {\n const limit = resolvePageLimit(params, options);\n const pagedParams = pageParameters(params, limit, options);\n const rows = await runQueryRows<T>(cluster, query, pagedParams, queryPageOptions(options));\n const hasNext = rows.length > limit;\n\n return {\n items: hasNext ? rows.slice(0, limit) : rows,\n hasNext,\n params: pagedParams,\n };\n};\n"]}
@@ -0,0 +1,9 @@
1
+ export interface TtlOptions {
2
+ ttl?: string | number;
3
+ ttlSeconds?: number;
4
+ strictTtl?: boolean;
5
+ }
6
+ export declare const ttlToSeconds: (ttl: string | number, strictTtl?: boolean) => number | undefined;
7
+ export declare const applyTtlOptions: <T extends {
8
+ expiry?: number | Date;
9
+ }>(options?: T & TtlOptions) => T | undefined;
@@ -0,0 +1,73 @@
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 __rest = (this && this.__rest) || function (s, e) {
14
+ var t = {};
15
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
16
+ t[p] = s[p];
17
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
18
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
19
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
20
+ t[p[i]] = s[p[i]];
21
+ }
22
+ return t;
23
+ };
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ exports.applyTtlOptions = exports.ttlToSeconds = void 0;
26
+ var unitSeconds = {
27
+ s: 1,
28
+ m: 60,
29
+ h: 60 * 60,
30
+ d: 60 * 60 * 24,
31
+ w: 60 * 60 * 24 * 7,
32
+ };
33
+ var parseTtlString = function (ttl, strictTtl) {
34
+ var match = ttl.trim().match(/^(\d+)([smhdw])$/i);
35
+ if (!match) {
36
+ if (strictTtl) {
37
+ throw new Error('ttl must include a supported unit: s, m, h, d, or w');
38
+ }
39
+ return undefined;
40
+ }
41
+ var amount = Number(match[1]);
42
+ var unit = match[2].toLowerCase();
43
+ return amount * unitSeconds[unit];
44
+ };
45
+ var ttlToSeconds = function (ttl, strictTtl) {
46
+ if (typeof ttl === 'number') {
47
+ if (strictTtl) {
48
+ throw new Error('numeric ttl is ambiguous; use ttlSeconds or a unit string');
49
+ }
50
+ return ttl;
51
+ }
52
+ return parseTtlString(ttl, strictTtl);
53
+ };
54
+ exports.ttlToSeconds = ttlToSeconds;
55
+ var applyTtlOptions = function (options) {
56
+ if (!options) {
57
+ return undefined;
58
+ }
59
+ var _a = options, ttl = _a.ttl, ttlSeconds = _a.ttlSeconds, strictTtl = _a.strictTtl, sdkOptions = __rest(_a, ["ttl", "ttlSeconds", "strictTtl"]);
60
+ var normalizedOptions = __assign({}, sdkOptions);
61
+ if (typeof ttlSeconds === 'number') {
62
+ normalizedOptions.expiry = ttlSeconds;
63
+ }
64
+ else if (ttl !== undefined) {
65
+ var expiry = (0, exports.ttlToSeconds)(ttl, strictTtl);
66
+ if (typeof expiry === 'number') {
67
+ normalizedOptions.expiry = expiry;
68
+ }
69
+ }
70
+ return normalizedOptions;
71
+ };
72
+ exports.applyTtlOptions = applyTtlOptions;
73
+ //# sourceMappingURL=ttl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ttl.js","sourceRoot":"","sources":["../../src/model/ttl.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAMA,IAAM,WAAW,GAA2B;IACxC,CAAC,EAAE,CAAC;IACJ,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE,GAAG,EAAE;IACV,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE;IACf,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;CACtB,CAAC;AAEF,IAAM,cAAc,GAAG,UAAC,GAAW,EAAE,SAAmB;IACpD,IAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAEpD,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,IAAI,SAAS,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QAC3E,CAAC;QAED,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,IAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,IAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAEpC,OAAO,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC,CAAC;AAEK,IAAM,YAAY,GAAG,UAAC,GAAoB,EAAE,SAAmB;IAClE,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC1B,IAAI,SAAS,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;QACjF,CAAC;QAED,OAAO,GAAG,CAAC;IACf,CAAC;IAED,OAAO,cAAc,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;AAC1C,CAAC,CAAC;AAVW,QAAA,YAAY,gBAUvB;AAEK,IAAM,eAAe,GAAG,UAC3B,OAAwB;IAExB,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,IAAM,KAA8C,OAAyB,EAAtE,GAAG,SAAA,EAAE,UAAU,gBAAA,EAAE,SAAS,eAAA,EAAK,UAAU,cAA1C,kCAA2C,CAA4B,CAAC;IAC9E,IAAM,iBAAiB,gBAAY,UAAU,CAAC,CAAC;IAE/C,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;QACjC,iBAAiB,CAAC,MAAM,GAAG,UAAU,CAAC;IAC1C,CAAC;SAAM,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QAC3B,IAAM,MAAM,GAAG,IAAA,oBAAY,EAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC5C,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC7B,iBAAiB,CAAC,MAAM,GAAG,MAAM,CAAC;QACtC,CAAC;IACL,CAAC;IAED,OAAO,iBAAiB,CAAC;AAC7B,CAAC,CAAC;AApBW,QAAA,eAAe,mBAoB1B","sourcesContent":["export interface TtlOptions {\n ttl?: string | number;\n ttlSeconds?: number;\n strictTtl?: boolean;\n}\n\nconst unitSeconds: Record<string, number> = {\n s: 1,\n m: 60,\n h: 60 * 60,\n d: 60 * 60 * 24,\n w: 60 * 60 * 24 * 7,\n};\n\nconst parseTtlString = (ttl: string, strictTtl?: boolean): number | undefined => {\n const match = ttl.trim().match(/^(\\d+)([smhdw])$/i);\n\n if (!match) {\n if (strictTtl) {\n throw new Error('ttl must include a supported unit: s, m, h, d, or w');\n }\n\n return undefined;\n }\n\n const amount = Number(match[1]);\n const unit = match[2].toLowerCase();\n\n return amount * unitSeconds[unit];\n};\n\nexport const ttlToSeconds = (ttl: string | number, strictTtl?: boolean): number | undefined => {\n if (typeof ttl === 'number') {\n if (strictTtl) {\n throw new Error('numeric ttl is ambiguous; use ttlSeconds or a unit string');\n }\n\n return ttl;\n }\n\n return parseTtlString(ttl, strictTtl);\n};\n\nexport const applyTtlOptions = <T extends {expiry?: number | Date}>(\n options?: T & TtlOptions\n): T | undefined => {\n if (!options) {\n return undefined;\n }\n\n const {ttl, ttlSeconds, strictTtl, ...sdkOptions} = options as T & TtlOptions;\n const normalizedOptions: any = {...sdkOptions};\n\n if (typeof ttlSeconds === 'number') {\n normalizedOptions.expiry = ttlSeconds;\n } else if (ttl !== undefined) {\n const expiry = ttlToSeconds(ttl, strictTtl);\n if (typeof expiry === 'number') {\n normalizedOptions.expiry = expiry;\n }\n }\n\n return normalizedOptions;\n};\n"]}
@@ -0,0 +1,5 @@
1
+ export type ValidationHook<T = any> = (document: T) => T | void | Promise<T | void>;
2
+ export type ParseHook<T = any> = (document: T) => T;
3
+ export declare const applyValidation: <T>(document: T, hook?: ValidationHook<T>) => Promise<T>;
4
+ export declare const schemaFromDateFields: (dateFields?: string[]) => Record<string, "date">;
5
+ export declare const parseDateFields: <T>(document: T, dateFields?: string[]) => T;