express-ext 0.2.6 → 0.2.7
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/lib/resources.js +3 -0
- package/lib/search.js +59 -8
- package/package.json +1 -1
- package/src/resources.ts +7 -1
- package/src/search.ts +50 -0
package/lib/resources.js
CHANGED
|
@@ -5,7 +5,10 @@ var http = require('http');
|
|
|
5
5
|
var https = require('https');
|
|
6
6
|
var resources = (function () {
|
|
7
7
|
function resources() {}
|
|
8
|
+
resources.pageSizes = [12, 24, 60, 100, 120, 180, 300, 600];
|
|
8
9
|
resources.page = 'page';
|
|
10
|
+
resources.limit = 'limit';
|
|
11
|
+
resources.defaultLimit = 12;
|
|
9
12
|
resources.sort = 'sort';
|
|
10
13
|
resources.partial = 'partial';
|
|
11
14
|
resources.encoding = 'utf-8';
|
package/lib/search.js
CHANGED
|
@@ -144,6 +144,57 @@ function buildSortSearch(search, fields, sort) {
|
|
|
144
144
|
return sorts;
|
|
145
145
|
}
|
|
146
146
|
exports.buildSortSearch = buildSortSearch;
|
|
147
|
+
function clone(obj) {
|
|
148
|
+
if (!obj) {
|
|
149
|
+
return obj;
|
|
150
|
+
}
|
|
151
|
+
if (obj instanceof Date) {
|
|
152
|
+
return new Date(obj.getTime());
|
|
153
|
+
}
|
|
154
|
+
if (typeof obj !== 'object') {
|
|
155
|
+
return obj;
|
|
156
|
+
}
|
|
157
|
+
if (Array.isArray(obj)) {
|
|
158
|
+
var arr = [];
|
|
159
|
+
for (var _i = 0, obj_1 = obj; _i < obj_1.length; _i++) {
|
|
160
|
+
var sub = obj_1[_i];
|
|
161
|
+
var c = clone(sub);
|
|
162
|
+
arr.push(c);
|
|
163
|
+
}
|
|
164
|
+
return arr;
|
|
165
|
+
}
|
|
166
|
+
var x = {};
|
|
167
|
+
var keys = Object.keys(obj);
|
|
168
|
+
for (var _a = 0, keys_1 = keys; _a < keys_1.length; _a++) {
|
|
169
|
+
var k = keys_1[_a];
|
|
170
|
+
var v = obj[k];
|
|
171
|
+
if (v instanceof Date) {
|
|
172
|
+
x[k] = new Date(v.getTime());
|
|
173
|
+
} else {
|
|
174
|
+
switch (typeof v) {
|
|
175
|
+
case 'object':
|
|
176
|
+
x[k] = clone(v);
|
|
177
|
+
break;
|
|
178
|
+
default:
|
|
179
|
+
x[k] = v;
|
|
180
|
+
break;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return x;
|
|
185
|
+
}
|
|
186
|
+
exports.clone = clone;
|
|
187
|
+
function cloneFilter(obj, page, limit) {
|
|
188
|
+
var f = clone(obj);
|
|
189
|
+
if (!obj.hasOwnProperty(resources_1.resources.page)) {
|
|
190
|
+
obj[resources_1.resources.page] = page;
|
|
191
|
+
}
|
|
192
|
+
if (!obj.hasOwnProperty(resources_1.resources.limit)) {
|
|
193
|
+
obj[resources_1.resources.limit] = limit;
|
|
194
|
+
}
|
|
195
|
+
return f;
|
|
196
|
+
}
|
|
197
|
+
exports.cloneFilter = cloneFilter;
|
|
147
198
|
function jsonResult(res, result, quick, fields, config) {
|
|
148
199
|
if (quick && fields && fields.length > 0) {
|
|
149
200
|
res.status(200).json(toCsv(fields, result)).end();
|
|
@@ -255,8 +306,8 @@ function fromUrl(req, arr) {
|
|
|
255
306
|
var s = {};
|
|
256
307
|
var obj = req.query;
|
|
257
308
|
var keys = Object.keys(obj);
|
|
258
|
-
for (var _i = 0,
|
|
259
|
-
var key =
|
|
309
|
+
for (var _i = 0, keys_2 = keys; _i < keys_2.length; _i++) {
|
|
310
|
+
var key = keys_2[_i];
|
|
260
311
|
if (inArray(key, arr)) {
|
|
261
312
|
var x = obj[key].split(',');
|
|
262
313
|
setValue(s, key, x);
|
|
@@ -545,8 +596,8 @@ function buildMetadata(attributes, includeDate) {
|
|
|
545
596
|
var keys = Object.keys(attributes);
|
|
546
597
|
var dates = [];
|
|
547
598
|
var numbers = [];
|
|
548
|
-
for (var _i = 0,
|
|
549
|
-
var key =
|
|
599
|
+
for (var _i = 0, keys_3 = keys; _i < keys_3.length; _i++) {
|
|
600
|
+
var key = keys_3[_i];
|
|
550
601
|
var attr = attributes[key];
|
|
551
602
|
if (attr.type === 'number' || attr.type === 'integer') {
|
|
552
603
|
numbers.push(key);
|
|
@@ -614,8 +665,8 @@ function format(obj, dates, nums) {
|
|
|
614
665
|
}
|
|
615
666
|
} else if (typeof v === 'object') {
|
|
616
667
|
var keys = Object.keys(v);
|
|
617
|
-
for (var _a = 0,
|
|
618
|
-
var key =
|
|
668
|
+
for (var _a = 0, keys_4 = keys; _a < keys_4.length; _a++) {
|
|
669
|
+
var key = keys_4[_a];
|
|
619
670
|
var v2 = v[key];
|
|
620
671
|
if (v2 instanceof Date) {
|
|
621
672
|
continue;
|
|
@@ -657,8 +708,8 @@ function format(obj, dates, nums) {
|
|
|
657
708
|
}
|
|
658
709
|
} else if (typeof v === 'object') {
|
|
659
710
|
var keys = Object.keys(v);
|
|
660
|
-
for (var _c = 0,
|
|
661
|
-
var key =
|
|
711
|
+
for (var _c = 0, keys_5 = keys; _c < keys_5.length; _c++) {
|
|
712
|
+
var key = keys_5[_c];
|
|
662
713
|
var v2 = v[key];
|
|
663
714
|
if (v2 instanceof Date) {
|
|
664
715
|
delete o[key];
|
package/package.json
CHANGED
package/src/resources.ts
CHANGED
|
@@ -4,9 +4,15 @@ import * as http from 'http';
|
|
|
4
4
|
import * as https from 'https';
|
|
5
5
|
import { Attributes, ErrorMessage } from './metadata';
|
|
6
6
|
|
|
7
|
+
export interface StringMap {
|
|
8
|
+
[key: string]: string;
|
|
9
|
+
}
|
|
7
10
|
// tslint:disable-next-line:class-name
|
|
8
11
|
export class resources {
|
|
12
|
+
static pageSizes = [12, 24, 60, 100, 120, 180, 300, 600];
|
|
9
13
|
static page = 'page';
|
|
14
|
+
static limit = 'limit';
|
|
15
|
+
static defaultLimit = 12;
|
|
10
16
|
static sort = 'sort';
|
|
11
17
|
static partial = 'partial';
|
|
12
18
|
static createValidator?: <T>(attributes: Attributes, allowUndefined?: boolean, max?: number) => Validator<T>;
|
|
@@ -15,7 +21,7 @@ export class resources {
|
|
|
15
21
|
}
|
|
16
22
|
|
|
17
23
|
export interface Validator<T> {
|
|
18
|
-
validate(obj: T, patch?: boolean): Promise<ErrorMessage[]>;
|
|
24
|
+
validate(obj: T, patch?: boolean, resource?: StringMap): Promise<ErrorMessage[]>;
|
|
19
25
|
}
|
|
20
26
|
|
|
21
27
|
// tslint:disable-next-line:max-classes-per-file
|
package/src/search.ts
CHANGED
|
@@ -6,6 +6,9 @@ import { resources } from './resources';
|
|
|
6
6
|
const et = '';
|
|
7
7
|
|
|
8
8
|
export interface Filter {
|
|
9
|
+
page?: number;
|
|
10
|
+
limit?: number;
|
|
11
|
+
|
|
9
12
|
fields?: string[];
|
|
10
13
|
sort?: string;
|
|
11
14
|
|
|
@@ -170,6 +173,53 @@ export function buildSortSearch(search: string, fields: string[], sort: Sort): S
|
|
|
170
173
|
}
|
|
171
174
|
return sorts;
|
|
172
175
|
}
|
|
176
|
+
export function clone(obj: any): any {
|
|
177
|
+
if (!obj) {
|
|
178
|
+
return obj;
|
|
179
|
+
}
|
|
180
|
+
if (obj instanceof Date) {
|
|
181
|
+
return new Date(obj.getTime());
|
|
182
|
+
}
|
|
183
|
+
if (typeof obj !== 'object') {
|
|
184
|
+
return obj;
|
|
185
|
+
}
|
|
186
|
+
if (Array.isArray(obj)) {
|
|
187
|
+
const arr = [];
|
|
188
|
+
for (const sub of obj) {
|
|
189
|
+
const c = clone(sub);
|
|
190
|
+
arr.push(c);
|
|
191
|
+
}
|
|
192
|
+
return arr;
|
|
193
|
+
}
|
|
194
|
+
const x: any = {};
|
|
195
|
+
const keys = Object.keys(obj);
|
|
196
|
+
for (const k of keys) {
|
|
197
|
+
const v = obj[k];
|
|
198
|
+
if (v instanceof Date) {
|
|
199
|
+
x[k] = new Date(v.getTime());
|
|
200
|
+
} else {
|
|
201
|
+
switch (typeof v) {
|
|
202
|
+
case 'object':
|
|
203
|
+
x[k] = clone(v);
|
|
204
|
+
break;
|
|
205
|
+
default:
|
|
206
|
+
x[k] = v;
|
|
207
|
+
break;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return x;
|
|
212
|
+
}
|
|
213
|
+
export function cloneFilter<F extends Filter>(obj: F, page: number, limit: number): F {
|
|
214
|
+
const f = clone(obj);
|
|
215
|
+
if (!obj.hasOwnProperty(resources.page)) {
|
|
216
|
+
(obj as any)[resources.page] = page;
|
|
217
|
+
}
|
|
218
|
+
if (!obj.hasOwnProperty(resources.limit)) {
|
|
219
|
+
(obj as any)[resources.limit] = limit;
|
|
220
|
+
}
|
|
221
|
+
return f;
|
|
222
|
+
}
|
|
173
223
|
|
|
174
224
|
export function jsonResult<T>(res: Response, result: SearchResult<T>, quick?: boolean, fields?: string[], config?: SearchConfig): void {
|
|
175
225
|
if (quick && fields && fields.length > 0) {
|