@thisisagile/easy 13.6.11 → 13.6.12
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/dist/data/InMemoryGateway.d.ts +4 -4
- package/dist/data/InMemoryGateway.js +2 -2
- package/dist/data/InMemoryGateway.js.map +1 -1
- package/dist/domain/Repo.js +5 -5
- package/dist/domain/Repo.js.map +1 -1
- package/dist/domain/Typo.js +6 -6
- package/dist/domain/Typo.js.map +1 -1
- package/dist/process/Search.d.ts +2 -2
- package/dist/process/Search.js +1 -1
- package/dist/process/Search.js.map +1 -1
- package/dist/services/MappedRouteGateway.d.ts +2 -2
- package/dist/services/MappedRouteGateway.js.map +1 -1
- package/dist/services/RouteGateway.js.map +1 -1
- package/dist/services/ViewRouteGateway.d.ts +2 -2
- package/dist/services/ViewRouteGateway.js.map +1 -1
- package/dist/sql/TableGateway.d.ts +2 -2
- package/dist/sql/TableGateway.js +1 -1
- package/dist/sql/TableGateway.js.map +1 -1
- package/dist/types/List.d.ts +24 -19
- package/dist/types/List.js +71 -30
- package/dist/types/List.js.map +1 -1
- package/dist/types/PageList.d.ts +43 -4
- package/dist/types/PageList.js +106 -9
- package/dist/types/PageList.js.map +1 -1
- package/dist/utils/If.js +1 -1
- package/dist/utils/If.js.map +1 -1
- package/dist/utils/View.js.map +1 -1
- package/package.json +2 -2
- package/src/data/InMemoryGateway.ts +5 -5
- package/src/domain/Repo.ts +6 -22
- package/src/domain/Typo.ts +7 -7
- package/src/process/Search.ts +3 -3
- package/src/services/MappedRouteGateway.ts +23 -23
- package/src/services/RouteGateway.ts +45 -45
- package/src/services/ViewRouteGateway.ts +31 -31
- package/src/sql/TableGateway.ts +8 -3
- package/src/types/List.ts +69 -22
- package/src/types/PageList.ts +148 -17
- package/src/utils/If.ts +5 -3
- package/src/utils/View.ts +5 -1
package/src/types/List.ts
CHANGED
|
@@ -11,9 +11,13 @@ import { meta } from './Meta';
|
|
|
11
11
|
import { Optional } from './Types';
|
|
12
12
|
|
|
13
13
|
export class List<T = unknown> extends Array<T> {
|
|
14
|
-
asc
|
|
14
|
+
asc(p: GetProperty<T, any>): List<T> {
|
|
15
|
+
return this.sort((e1, e2) => (ofProperty(e1, p) > ofProperty(e2, p) ? 1 : -1));
|
|
16
|
+
}
|
|
15
17
|
|
|
16
|
-
desc
|
|
18
|
+
desc(p: GetProperty<T, any>): List<T> {
|
|
19
|
+
return this.sort((e1, e2) => (ofProperty(e1, p) < ofProperty(e2, p) ? 1 : -1));
|
|
20
|
+
}
|
|
17
21
|
|
|
18
22
|
first = (p?: (value: T, index: number, array: T[]) => unknown, params?: unknown): T => (p ? this.find(p, params) : this[0]) as T;
|
|
19
23
|
|
|
@@ -31,13 +35,21 @@ export class List<T = unknown> extends Array<T> {
|
|
|
31
35
|
|
|
32
36
|
overlaps = (...items: ArrayLike<T>): boolean => toList<T>(...items).some(i => this.some(t => i === t));
|
|
33
37
|
|
|
34
|
-
diff
|
|
38
|
+
diff(others: ArrayLike<T>): List<T> {
|
|
39
|
+
return this.filter(i => !others.includes(i));
|
|
40
|
+
}
|
|
35
41
|
|
|
36
|
-
diffByKey
|
|
42
|
+
diffByKey(others: ArrayLike<T>, key: keyof T): List<T> {
|
|
43
|
+
return this.filter((i: any) => !others.some((o: any) => o[key] === i[key]));
|
|
44
|
+
}
|
|
37
45
|
|
|
38
|
-
intersect
|
|
46
|
+
intersect(others: ArrayLike<T>): List<T> {
|
|
47
|
+
return this.filter(i => others.includes(i));
|
|
48
|
+
}
|
|
39
49
|
|
|
40
|
-
intersectByKey
|
|
50
|
+
intersectByKey(others: ArrayLike<T>, key: keyof T): List<T> {
|
|
51
|
+
return this.filter((i: any) => others.some((o: any) => o[key] === i[key]));
|
|
52
|
+
}
|
|
41
53
|
|
|
42
54
|
toJSON = (): Json[] =>
|
|
43
55
|
this.reduce((a, i) => {
|
|
@@ -45,49 +57,82 @@ export class List<T = unknown> extends Array<T> {
|
|
|
45
57
|
return a;
|
|
46
58
|
}, new Array<Json>());
|
|
47
59
|
|
|
48
|
-
map
|
|
60
|
+
map<U>(f: (value: T, index: number, array: T[]) => U, params?: unknown): List<U> {
|
|
61
|
+
return toList<U>(super.map(f, params));
|
|
62
|
+
}
|
|
49
63
|
|
|
50
|
-
flatMap
|
|
51
|
-
toList<U>(super.flatMap(f, params));
|
|
64
|
+
flatMap<U, This = unknown>(f: (this: This, value: T, index: number, array: T[]) => ReadonlyArray<U> | U, params?: This): List<U> {
|
|
65
|
+
return toList<U>(super.flatMap(f, params));
|
|
66
|
+
}
|
|
52
67
|
|
|
53
|
-
mapDefined
|
|
68
|
+
mapDefined<U>(f: (value: T, index: number, array: T[]) => U, params?: unknown): List<NonNullable<U>> {
|
|
69
|
+
return this.map(f, params).defined();
|
|
70
|
+
}
|
|
54
71
|
|
|
55
|
-
mapAsync
|
|
72
|
+
mapAsync(f: (i: T) => Promise<T>): Promise<List<T>> {
|
|
73
|
+
return Promise.all(super.map(e => f(e))).then(a => toList<T>(a));
|
|
74
|
+
}
|
|
56
75
|
|
|
57
|
-
distinct
|
|
76
|
+
distinct(): List<T> {
|
|
77
|
+
return this.filter((i, index) => this.indexOf(i) === index);
|
|
78
|
+
}
|
|
58
79
|
|
|
59
|
-
distinctByKey
|
|
80
|
+
distinctByKey(key: keyof T): List<T> {
|
|
81
|
+
return meta(this.toObject(key)).values();
|
|
82
|
+
}
|
|
60
83
|
|
|
61
|
-
filter
|
|
84
|
+
filter(p: (value: T, index: number, array: T[]) => unknown, params?: unknown): List<T> {
|
|
85
|
+
return toList<T>(super.filter(p, params));
|
|
86
|
+
}
|
|
62
87
|
|
|
63
88
|
sum = (p: (t: T) => number): number => this.reduce((sum: number, i) => sum + p(i), 0);
|
|
64
89
|
|
|
65
90
|
byId = (id: Id): T => this.first(i => asString((i as any).id) === asString(id));
|
|
66
91
|
|
|
67
|
-
add = (...items:
|
|
92
|
+
add = (...items: ArrayLike<T>): this => {
|
|
68
93
|
super.push(...toArray(...items));
|
|
69
94
|
return this;
|
|
70
95
|
};
|
|
71
96
|
|
|
72
|
-
|
|
97
|
+
concat(...items: ConcatArray<T>[]): List<T>;
|
|
98
|
+
concat(...items: (T | ConcatArray<T>)[]): List<T>;
|
|
99
|
+
concat(...items: (T | ConcatArray<T>)[]): List<T> {
|
|
100
|
+
return toList<T>(super.concat(...items));
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
reverse(): List<T> {
|
|
104
|
+
return toList<T>(super.reverse());
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
splice(start: number, deleteCount?: number): List<T>;
|
|
108
|
+
splice(start: number, deleteCount: number, ...items: T[]): List<T>;
|
|
109
|
+
splice(start: number, deleteCount: number, ...items: T[]): List<T> {
|
|
110
|
+
return toList<T>(super.splice(start, deleteCount, ...items));
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
remove(item: T): List<T> {
|
|
73
114
|
const index = this.indexOf(item);
|
|
74
115
|
if (index > -1) {
|
|
75
116
|
this.splice(index, 1);
|
|
76
117
|
}
|
|
77
118
|
return this;
|
|
78
|
-
}
|
|
119
|
+
}
|
|
79
120
|
|
|
80
|
-
replace
|
|
121
|
+
replace(key: keyof T, item: T): List<T> {
|
|
81
122
|
tryTo(() => item[key])
|
|
82
123
|
.map(k => this.findIndex(i => i[key] === k))
|
|
83
124
|
.filter(i => i > -1)
|
|
84
125
|
.map(i => (this[i] = item));
|
|
85
126
|
return this;
|
|
86
|
-
}
|
|
127
|
+
}
|
|
87
128
|
|
|
88
|
-
switch
|
|
129
|
+
switch(item: T): List<T> {
|
|
130
|
+
return this.includes(item) ? this.remove(item) : this.add(item);
|
|
131
|
+
}
|
|
89
132
|
|
|
90
|
-
defined
|
|
133
|
+
defined(): List<NonNullable<T>> {
|
|
134
|
+
return this.reduce((l, v) => (isDefined(v) ? l.add(v) : l), toList<NonNullable<T>>());
|
|
135
|
+
}
|
|
91
136
|
|
|
92
137
|
toObject = (key: keyof T, options: { deleteKey?: boolean } = {}): Record<string | number | symbol, T> =>
|
|
93
138
|
this.reduce((o: any, i) => {
|
|
@@ -104,7 +149,9 @@ export class List<T = unknown> extends Array<T> {
|
|
|
104
149
|
return a;
|
|
105
150
|
}, {} as Record<string | number | symbol, List<T>>);
|
|
106
151
|
|
|
107
|
-
orElse
|
|
152
|
+
orElse(...alt: ArrayLike<T>): Optional<List<T>> {
|
|
153
|
+
return !isEmpty(this) ? this : !isEmpty(...alt) ? toList<T>(...alt) : undefined;
|
|
154
|
+
}
|
|
108
155
|
|
|
109
156
|
weave = (insertFrom: T[], interval: number): this => {
|
|
110
157
|
for (let i = interval, n = 0; i <= this.length && n < insertFrom.length; i += interval + 1) {
|
package/src/types/PageList.ts
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
|
-
import { isList, List
|
|
2
|
-
import { Construct, ofConstruct
|
|
1
|
+
import { isList, List } from './List';
|
|
2
|
+
import { Construct, ofConstruct } from './Constructor';
|
|
3
3
|
import { isA } from './IsA';
|
|
4
4
|
import { PlainSort, Sort } from './Sort';
|
|
5
|
+
import { GetProperty } from './Get';
|
|
6
|
+
import { ArrayLike } from './Array';
|
|
7
|
+
import { Optional } from './Types';
|
|
8
|
+
import { isNumber } from './Is';
|
|
9
|
+
import { choose } from './Case';
|
|
5
10
|
|
|
6
11
|
export type FilterValue = { label?: string; value: any };
|
|
7
12
|
export type Filter = { label?: string; field: string; shortField?: string; values: FilterValue[] };
|
|
@@ -14,21 +19,147 @@ export const toShortFilter = (field: string, shortField: string, value: any): Fi
|
|
|
14
19
|
});
|
|
15
20
|
|
|
16
21
|
export type PageOptions = { take?: number; skip?: number; sort?: Sort[]; sorts?: PlainSort; filters?: Filter[] };
|
|
17
|
-
|
|
22
|
+
|
|
23
|
+
export class PageList<T> extends List<T> {
|
|
24
|
+
private _take = 250;
|
|
25
|
+
private _skip = 0;
|
|
26
|
+
private _total?: number;
|
|
27
|
+
private _sorts?: PlainSort;
|
|
28
|
+
private _filters?: Filter[];
|
|
29
|
+
|
|
30
|
+
setPageOptions(options?: PageOptions & { total?: number }): this {
|
|
31
|
+
this._take = options?.take ?? 250;
|
|
32
|
+
this._skip = options?.skip ?? 0;
|
|
33
|
+
this._total = options?.total;
|
|
34
|
+
this._sorts = options?.sorts;
|
|
35
|
+
this._filters = options?.filters;
|
|
36
|
+
return this;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
get take(): number {
|
|
40
|
+
return this._take;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
get skip(): number {
|
|
44
|
+
return this._skip;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
get total(): Optional<number> {
|
|
48
|
+
return this._total;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
get sorts(): Optional<PlainSort> {
|
|
52
|
+
return this._sorts;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
get filters(): Optional<Filter[]> {
|
|
56
|
+
return this._filters;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
asc(p: GetProperty<T, any>): PageList<T> {
|
|
60
|
+
return toPageList(super.asc(p), this);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
desc(p: GetProperty<T, any>): PageList<T> {
|
|
64
|
+
return toPageList(super.desc(p), this);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
diff(others: ArrayLike<T>): PageList<T> {
|
|
68
|
+
return toPageList(super.diff(others), this);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
diffByKey(others: ArrayLike<T>, key: keyof T): PageList<T> {
|
|
72
|
+
return toPageList(super.diffByKey(others, key), this);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
intersect(others: ArrayLike<T>): PageList<T> {
|
|
76
|
+
return toPageList(super.intersect(others), this);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
intersectByKey(others: ArrayLike<T>, key: keyof T): PageList<T> {
|
|
80
|
+
return toPageList(super.intersectByKey(others, key), this);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
map<U>(f: (value: T, index: number, array: T[]) => U, params?: unknown): PageList<U> {
|
|
84
|
+
const items = super.map(f, params);
|
|
85
|
+
return toPageList(items, this);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
flatMap<U, This = unknown>(f: (this: This, value: T, index: number, array: T[]) => ReadonlyArray<U> | U, params?: This): PageList<U> {
|
|
89
|
+
return toPageList(super.flatMap(f, params), this);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
mapDefined<U>(f: (value: T, index: number, array: T[]) => U, params?: unknown): PageList<NonNullable<U>> {
|
|
93
|
+
return toPageList(super.mapDefined(f, params), this);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
mapAsync(f: (i: T) => Promise<T>): Promise<PageList<T>> {
|
|
97
|
+
return super.mapAsync(f).then(r => toPageList(r, this));
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
distinct(): PageList<T> {
|
|
101
|
+
return toPageList(super.distinct(), this);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
distinctByKey(key: keyof T): PageList<T> {
|
|
105
|
+
return toPageList(super.distinctByKey(key), this);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
filter(p: (value: T, index: number, array: T[]) => unknown, params?: unknown): PageList<T> {
|
|
109
|
+
return toPageList(super.filter(p, params), this);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
concat(...items: ConcatArray<T>[]): PageList<T>;
|
|
113
|
+
concat(...items: (T | ConcatArray<T>)[]): PageList<T>;
|
|
114
|
+
concat(...items: (T | ConcatArray<T>)[]): PageList<T> {
|
|
115
|
+
return toPageList(super.concat(...items), this);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
reverse(): PageList<T> {
|
|
119
|
+
return toPageList(super.reverse(), this);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
splice(start: number, deleteCount?: number): PageList<T>;
|
|
123
|
+
splice(start: number, deleteCount: number, ...items: T[]): PageList<T>;
|
|
124
|
+
splice(start: number, deleteCount: number, ...items: T[]): PageList<T> {
|
|
125
|
+
return toPageList(super.splice(start, deleteCount, ...items), this);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
remove(item: T): PageList<T> {
|
|
129
|
+
return toPageList(super.remove(item), this);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
replace(key: keyof T, item: T): PageList<T> {
|
|
133
|
+
return toPageList(super.replace(key, item), this);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
switch(item: T): PageList<T> {
|
|
137
|
+
return toPageList(super.switch(item), this);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
defined(): PageList<NonNullable<T>> {
|
|
141
|
+
return toPageList(super.defined(), this);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
orElse(...alt: ArrayLike<T>): Optional<PageList<T>> {
|
|
145
|
+
return toPageList(super.orElse(...alt), this);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
slice(start?: number, end?: number): PageList<T> {
|
|
149
|
+
return toPageList(super.slice(start, end), this);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
18
152
|
|
|
19
153
|
export const isPageList = <T>(l?: unknown): l is PageList<T> => isList<T>(l) && isA(l, 'total');
|
|
20
154
|
|
|
21
|
-
export const toPageList = <T>(items
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
items.map(i => ofConstruct(c, i)),
|
|
33
|
-
items
|
|
34
|
-
);
|
|
155
|
+
export const toPageList = <T>(items: T[] = [], options?: Omit<PageOptions, 'sort'> & { total?: number }): PageList<T> =>
|
|
156
|
+
choose(items)
|
|
157
|
+
.case(
|
|
158
|
+
i => i.length === 1 && isNumber(i[0]),
|
|
159
|
+
i => new PageList<T>().add(...i)
|
|
160
|
+
)
|
|
161
|
+
.else(i => new PageList<T>(...i))
|
|
162
|
+
.setPageOptions(options);
|
|
163
|
+
|
|
164
|
+
/* @deprecated No longer needed as the PageList is now a class that extends from List, use the map function */
|
|
165
|
+
export const asPageList = <T, U>(c: Construct<T>, items = toPageList<U>()): PageList<T> => items.map(i => ofConstruct(c, i));
|
package/src/utils/If.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import {Construct, isDefined, isNotEmpty, isTrue, ofConstruct, Optional} from '../types';
|
|
1
|
+
import { Construct, isDefined, isNotEmpty, isTrue, ofConstruct, Optional } from '../types';
|
|
2
2
|
|
|
3
3
|
export const ifTrue = <T>(o: unknown, f: Construct<T>, alt?: Construct<T>): Optional<T> => (isTrue(o) ? ofConstruct(f, o) : ofConstruct(alt, o));
|
|
4
4
|
export const ifFalse = <T>(o: unknown, f: Construct<T>, alt?: Construct<T>): Optional<T> => (!isTrue(o) ? ofConstruct(f, o) : ofConstruct(alt, o));
|
|
5
|
-
export const ifDefined = <Out, In = unknown>(o: Optional<In>, f: Construct<Out, NonNullable<In>>, alt?: Construct<Out>): Optional<Out> =>
|
|
6
|
-
|
|
5
|
+
export const ifDefined = <Out, In = unknown>(o: Optional<In>, f: Construct<Out, NonNullable<In>>, alt?: Construct<Out>): Optional<Out> =>
|
|
6
|
+
isDefined(o) ? ofConstruct(f, o) : ofConstruct(alt);
|
|
7
|
+
export const ifNotEmpty = <T>(o: unknown, f: Construct<T> = o => o, alt?: Construct<T>): Optional<T> =>
|
|
8
|
+
isNotEmpty(o) ? ofConstruct(f, o) : ofConstruct(alt, o);
|
package/src/utils/View.ts
CHANGED
|
@@ -80,7 +80,11 @@ export class View<V = Json> {
|
|
|
80
80
|
from<T = unknown>(source: T[]): V[];
|
|
81
81
|
from<T = unknown>(source: T): V;
|
|
82
82
|
from<T = unknown>(source: PageList<T> | List<T> | T[] | T): PageList<V> | List<V> | V[] | V {
|
|
83
|
-
if (isPageList(source))
|
|
83
|
+
if (isPageList(source))
|
|
84
|
+
return toPageList(
|
|
85
|
+
source.map(s => this.reduce(asJson(s))),
|
|
86
|
+
source
|
|
87
|
+
);
|
|
84
88
|
if (isArray(source)) return source.map(s => this.reduce(asJson(s)));
|
|
85
89
|
return this.reduce(asJson(source));
|
|
86
90
|
}
|