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 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, keys_1 = keys; _i < keys_1.length; _i++) {
259
- var key = keys_1[_i];
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, keys_2 = keys; _i < keys_2.length; _i++) {
549
- var key = keys_2[_i];
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, keys_3 = keys; _a < keys_3.length; _a++) {
618
- var key = keys_3[_a];
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, keys_4 = keys; _c < keys_4.length; _c++) {
661
- var key = keys_4[_c];
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "express-ext",
3
- "version": "0.2.6",
3
+ "version": "0.2.7",
4
4
  "description": "express-ext",
5
5
  "main": "./lib/index.js",
6
6
  "types": "./src/index.ts",
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) {