couchset 0.2.7 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +284 -153
- package/dist/connection/connection.d.ts +68 -0
- package/dist/connection/connection.js +485 -0
- package/dist/connection/connection.js.map +1 -0
- package/dist/connection/env.d.ts +2 -0
- package/dist/connection/env.js +16 -0
- package/dist/connection/env.js.map +1 -0
- package/dist/connection/index.d.ts +3 -0
- package/dist/connection/index.js +25 -0
- package/dist/connection/index.js.map +1 -0
- package/dist/connection/types.d.ts +25 -0
- package/dist/connection/types.js +3 -0
- package/dist/connection/types.js.map +1 -0
- package/dist/database.d.ts +9 -0
- package/dist/database.js +196 -0
- package/dist/database.js.map +1 -0
- package/dist/index.d.ts +18 -6
- package/dist/index.js +53 -8
- package/dist/index.js.map +1 -1
- package/dist/legacy/connection.d.ts +2 -0
- package/dist/legacy/connection.js +24 -0
- package/dist/legacy/connection.js.map +1 -0
- package/dist/legacy/index.d.ts +10 -0
- package/dist/legacy/index.js +93 -0
- package/dist/legacy/index.js.map +1 -0
- package/dist/legacy/model.d.ts +55 -0
- package/dist/legacy/model.js +282 -0
- package/dist/legacy/model.js.map +1 -0
- package/dist/legacy/pagination/index.d.ts +1 -0
- package/dist/legacy/pagination/index.js +18 -0
- package/dist/legacy/pagination/index.js.map +1 -0
- package/dist/legacy/pagination/pagination.d.ts +12 -0
- package/dist/legacy/pagination/pagination.js +85 -0
- package/dist/legacy/pagination/pagination.js.map +1 -0
- package/dist/legacy/search/customQuery.d.ts +13 -0
- package/dist/legacy/search/customQuery.js +73 -0
- package/dist/legacy/search/customQuery.js.map +1 -0
- package/dist/legacy/search/index.d.ts +1 -0
- package/dist/legacy/search/index.js +18 -0
- package/dist/legacy/search/index.js.map +1 -0
- package/dist/model/default-scope.d.ts +10 -0
- package/dist/model/default-scope.js +47 -0
- package/dist/model/default-scope.js.map +1 -0
- package/dist/model/hydrated-document.d.ts +30 -0
- package/dist/model/hydrated-document.js +118 -0
- package/dist/model/hydrated-document.js.map +1 -0
- package/dist/model/include.d.ts +33 -0
- package/dist/model/include.js +250 -0
- package/dist/model/include.js.map +1 -0
- package/dist/model/index.d.ts +137 -51
- package/dist/model/index.js +519 -174
- package/dist/model/index.js.map +1 -1
- package/dist/model/indexes.d.ts +16 -0
- package/dist/model/indexes.js +155 -0
- package/dist/model/indexes.js.map +1 -0
- package/dist/model/keyspace.d.ts +9 -0
- package/dist/model/keyspace.js +28 -0
- package/dist/model/keyspace.js.map +1 -0
- package/dist/model/read-helpers.d.ts +36 -0
- package/dist/model/read-helpers.js +275 -0
- package/dist/model/read-helpers.js.map +1 -0
- package/dist/model/safe-query.d.ts +23 -0
- package/dist/model/safe-query.js +138 -0
- package/dist/model/safe-query.js.map +1 -0
- package/dist/model/ttl.d.ts +9 -0
- package/dist/model/ttl.js +73 -0
- package/dist/model/ttl.js.map +1 -0
- package/dist/model/validation.d.ts +5 -0
- package/dist/model/validation.js +104 -0
- package/dist/model/validation.js.map +1 -0
- package/dist/model/write-helpers.d.ts +31 -0
- package/dist/model/write-helpers.js +220 -0
- package/dist/model/write-helpers.js.map +1 -0
- package/dist/pagination/index.d.ts +1 -0
- package/dist/pagination/index.js +1 -0
- package/dist/pagination/index.js.map +1 -1
- package/dist/pagination/pagination.d.ts +1 -8
- package/dist/pagination/pagination.js +16 -29
- package/dist/pagination/pagination.js.map +1 -1
- package/dist/pagination/safe-pagination.d.ts +15 -0
- package/dist/pagination/safe-pagination.js +221 -0
- package/dist/pagination/safe-pagination.js.map +1 -0
- package/dist/pagination/types.d.ts +11 -0
- package/dist/pagination/types.js +3 -0
- package/dist/pagination/types.js.map +1 -0
- package/dist/search/customQuery.d.ts +10 -3
- package/dist/search/customQuery.js +17 -18
- package/dist/search/customQuery.js.map +1 -1
- package/dist/shared/common.model.js +2 -2
- package/dist/shared/common.model.js.map +1 -1
- package/dist/timeseries/index.d.ts +1 -0
- package/dist/timeseries/index.js +18 -0
- package/dist/timeseries/index.js.map +1 -0
- package/dist/timeseries/time-series-model.d.ts +60 -0
- package/dist/timeseries/time-series-model.js +267 -0
- package/dist/timeseries/time-series-model.js.map +1 -0
- package/dist/utils/awaitTo.d.ts +1 -1
- package/dist/utils/awaitTo.js +1 -1
- package/dist/utils/awaitTo.js.map +1 -1
- package/docs/beta-migration.md +175 -0
- package/legacy/index.js +1 -0
- package/legacy/package.json +4 -0
- package/next/index.js +1 -0
- package/next/package.json +4 -0
- package/package.json +13 -8
- package/dist/connection.d.ts +0 -42
- package/dist/connection.js +0 -156
- package/dist/connection.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-helpers.js","sourceRoot":"","sources":["../../src/model/read-helpers.ts"],"names":[],"mappings":"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","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;
|
|
@@ -0,0 +1,104 @@
|
|
|
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.parseDateFields = exports.schemaFromDateFields = exports.applyValidation = void 0;
|
|
51
|
+
var applyValidation = function (document, hook) { return __awaiter(void 0, void 0, void 0, function () {
|
|
52
|
+
var result;
|
|
53
|
+
return __generator(this, function (_a) {
|
|
54
|
+
switch (_a.label) {
|
|
55
|
+
case 0:
|
|
56
|
+
if (!hook) {
|
|
57
|
+
return [2 /*return*/, document];
|
|
58
|
+
}
|
|
59
|
+
return [4 /*yield*/, hook(document)];
|
|
60
|
+
case 1:
|
|
61
|
+
result = _a.sent();
|
|
62
|
+
return [2 /*return*/, result === undefined ? document : result];
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
}); };
|
|
66
|
+
exports.applyValidation = applyValidation;
|
|
67
|
+
var schemaFromDateFields = function (dateFields) {
|
|
68
|
+
return (dateFields || []).reduce(function (schema, field) {
|
|
69
|
+
schema[field] = 'date';
|
|
70
|
+
return schema;
|
|
71
|
+
}, {});
|
|
72
|
+
};
|
|
73
|
+
exports.schemaFromDateFields = schemaFromDateFields;
|
|
74
|
+
var parseDateValue = function (value) {
|
|
75
|
+
if (value === undefined || value === null || value instanceof Date) {
|
|
76
|
+
return value;
|
|
77
|
+
}
|
|
78
|
+
return new Date(value);
|
|
79
|
+
};
|
|
80
|
+
var parseDateFields = function (document, dateFields) {
|
|
81
|
+
if (!dateFields || !dateFields.length || !document) {
|
|
82
|
+
return document;
|
|
83
|
+
}
|
|
84
|
+
var cloned = __assign({}, document);
|
|
85
|
+
dateFields.forEach(function (field) {
|
|
86
|
+
var parts = field.split('.');
|
|
87
|
+
var target = cloned;
|
|
88
|
+
for (var index = 0; index < parts.length - 1; index += 1) {
|
|
89
|
+
var part = parts[index];
|
|
90
|
+
if (!target[part]) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
target[part] = __assign({}, target[part]);
|
|
94
|
+
target = target[part];
|
|
95
|
+
}
|
|
96
|
+
var leaf = parts[parts.length - 1];
|
|
97
|
+
if (Object.prototype.hasOwnProperty.call(target, leaf)) {
|
|
98
|
+
target[leaf] = parseDateValue(target[leaf]);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
return cloned;
|
|
102
|
+
};
|
|
103
|
+
exports.parseDateFields = parseDateFields;
|
|
104
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/model/validation.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGO,IAAM,eAAe,GAAG,UAAU,QAAW,EAAE,IAAwB;;;;;gBAC1E,IAAI,CAAC,IAAI,EAAE,CAAC;oBACR,sBAAO,QAAQ,EAAC;gBACpB,CAAC;gBAEc,qBAAM,IAAI,CAAC,QAAQ,CAAC,EAAA;;gBAA7B,MAAM,GAAG,SAAoB;gBAEnC,sBAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAE,MAAY,EAAC;;;KAC1D,CAAC;AARW,QAAA,eAAe,mBAQ1B;AAEK,IAAM,oBAAoB,GAAG,UAAC,UAAqB;IACtD,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,UAAC,MAAM,EAAE,KAAK;QAC3C,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;QAEvB,OAAO,MAAM,CAAC;IAClB,CAAC,EAAE,EAA4B,CAAC,CAAC;AACrC,CAAC,CAAC;AANW,QAAA,oBAAoB,wBAM/B;AAEF,IAAM,cAAc,GAAG,UAAC,KAAU;IAC9B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;QACjE,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC,CAAC;AAEK,IAAM,eAAe,GAAG,UAAI,QAAW,EAAE,UAAqB;IACjE,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACjD,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,IAAM,MAAM,gBAAa,QAAgB,CAAC,CAAC;IAE3C,UAAU,CAAC,OAAO,CAAC,UAAC,KAAK;QACrB,IAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,MAAM,GAAG,MAAM,CAAC;QAEpB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YACvD,IAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChB,OAAO;YACX,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,gBAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YACjC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAED,IAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACrC,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;YACrD,MAAM,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAChD,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC;AA3BW,QAAA,eAAe,mBA2B1B","sourcesContent":["export type ValidationHook<T = any> = (document: T) => T | void | Promise<T | void>;\nexport type ParseHook<T = any> = (document: T) => T;\n\nexport const applyValidation = async <T>(document: T, hook?: ValidationHook<T>): Promise<T> => {\n if (!hook) {\n return document;\n }\n\n const result = await hook(document);\n\n return result === undefined ? document : (result as T);\n};\n\nexport const schemaFromDateFields = (dateFields?: string[]): Record<string, 'date'> => {\n return (dateFields || []).reduce((schema, field) => {\n schema[field] = 'date';\n\n return schema;\n }, {} as Record<string, 'date'>);\n};\n\nconst parseDateValue = (value: any): any => {\n if (value === undefined || value === null || value instanceof Date) {\n return value;\n }\n\n return new Date(value);\n};\n\nexport const parseDateFields = <T>(document: T, dateFields?: string[]): T => {\n if (!dateFields || !dateFields.length || !document) {\n return document;\n }\n\n const cloned: any = {...(document as any)};\n\n dateFields.forEach((field) => {\n const parts = field.split('.');\n let target = cloned;\n\n for (let index = 0; index < parts.length - 1; index += 1) {\n const part = parts[index];\n if (!target[part]) {\n return;\n }\n target[part] = {...target[part]};\n target = target[part];\n }\n\n const leaf = parts[parts.length - 1];\n if (Object.prototype.hasOwnProperty.call(target, leaf)) {\n target[leaf] = parseDateValue(target[leaf]);\n }\n });\n\n return cloned;\n};\n"]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Collection, GetOptions, InsertOptions, MutateInOptions, UpsertOptions } from 'couchbase';
|
|
2
|
+
import { TtlOptions } from './ttl';
|
|
3
|
+
import { ValidationHook } from './validation';
|
|
4
|
+
import type { AutoModelFields, UpdateOptions } from './index';
|
|
5
|
+
export interface ModelWriteContext {
|
|
6
|
+
collection: Collection;
|
|
7
|
+
collectionName: string;
|
|
8
|
+
scope: string;
|
|
9
|
+
parse: <T>(data: T) => T;
|
|
10
|
+
validateCreate?: ValidationHook;
|
|
11
|
+
validateReplace?: ValidationHook;
|
|
12
|
+
}
|
|
13
|
+
export interface PatchByIdArgs {
|
|
14
|
+
$set?: Record<string, any>;
|
|
15
|
+
$unset?: string[] | Record<string, any>;
|
|
16
|
+
$inc?: Record<string, number>;
|
|
17
|
+
}
|
|
18
|
+
export interface FindByIdWithMetaResult<T> {
|
|
19
|
+
content: T & AutoModelFields;
|
|
20
|
+
cas: any;
|
|
21
|
+
expiryTime?: any;
|
|
22
|
+
}
|
|
23
|
+
export type InsertWriteOptions = InsertOptions & TtlOptions;
|
|
24
|
+
export type UpsertWriteOptions = UpsertOptions & TtlOptions;
|
|
25
|
+
export declare const insert: <T>(context: ModelWriteContext, data: T, options?: InsertWriteOptions) => Promise<T & AutoModelFields>;
|
|
26
|
+
export declare const upsert: <T>(context: ModelWriteContext, data: T, options?: UpsertWriteOptions) => Promise<T & AutoModelFields>;
|
|
27
|
+
export declare const replaceById: <T>(context: ModelWriteContext, id: string, data: T, options?: UpdateOptions) => Promise<T & AutoModelFields>;
|
|
28
|
+
export declare const mutateById: (context: ModelWriteContext, id: string, specs: any[], options?: MutateInOptions) => Promise<any>;
|
|
29
|
+
export declare const patchById: <T>(context: ModelWriteContext, id: string, patch: PatchByIdArgs, options?: MutateInOptions) => Promise<T & AutoModelFields>;
|
|
30
|
+
export declare const incrementById: <T>(context: ModelWriteContext, id: string, field: string, delta: number, options?: MutateInOptions) => Promise<T & AutoModelFields>;
|
|
31
|
+
export declare const findByIdWithMeta: <T>(context: ModelWriteContext, id: string, options?: GetOptions) => Promise<FindByIdWithMetaResult<T>>;
|