|
1 | 1 | import { JSONSchema7 } from 'json-schema'; |
2 | 2 | import { Observable as obs } from 'rxjs'; |
3 | | -import { HalLink, HalResource } from '../../types'; |
4 | | -import { resolveLinks } from '../../utils'; |
| 3 | +import { HalResource } from '../../types'; |
| 4 | +import { hal } from '../../utils'; |
5 | 5 | import mediaTypes from '../../utils/mediaTypes'; |
6 | 6 | import actions from '../actions'; |
7 | 7 | import mediaType$ from './mediaType'; |
8 | 8 |
|
9 | | -interface Links { |
10 | | - [rel: string]: HalLink | HalLink[]; |
11 | | -} |
12 | | - |
13 | | -interface Embedded { |
14 | | - [rel: string]: HalResource | HalResource[]; |
15 | | -} |
16 | | - |
17 | | -const normalizeEmbedded = ( |
18 | | - maybeArray: HalResource | HalResource[], |
19 | | -): HalResource[] => (Array.isArray(maybeArray) ? maybeArray : [maybeArray]); |
20 | | - |
21 | | -const normalizeLinks = (maybeArray: HalLink | HalLink[]): HalLink[] => |
22 | | - Array.isArray(maybeArray) ? maybeArray : [maybeArray]; |
23 | | - |
24 | | -const normalize = ({ |
25 | | - _links, |
26 | | - _embedded, |
27 | | - ...resource |
28 | | -}: { |
29 | | - _links: Links; |
30 | | - _embedded: Embedded; |
31 | | -}): HalResource => ({ |
32 | | - ...resource, |
33 | | - _embedded: Object.keys(_embedded || {}).reduce( |
34 | | - (akk, rel) => ({ |
35 | | - ...akk, |
36 | | - [rel]: normalizeEmbedded(_embedded[rel]).map(normalize), |
37 | | - }), |
38 | | - {}, |
39 | | - ), |
40 | | - _links: Object.keys(_links || {}).reduce( |
41 | | - (akk, rel) => ({ |
42 | | - ...akk, |
43 | | - [rel]: normalizeLinks(_links[rel]), |
44 | | - }), |
45 | | - {}, |
46 | | - ), |
47 | | -}); |
48 | | - |
49 | 9 | const body$ = actions.get.response |
50 | 10 | .zip(mediaType$) |
51 | 11 | .filter(([body, mediaType]) => mediaType === mediaTypes.hal) |
52 | | - .map(([{ body }]) => normalize(body as HalResource)); |
| 12 | + .map(([{ body }]) => hal.normalizeResource(body as HalResource)); |
53 | 13 |
|
54 | 14 | const url$ = actions.get.response.map(({ url }) => url); |
55 | 15 |
|
56 | 16 | const links$ = body$ |
57 | 17 | .zip(url$) |
58 | | - .map(([{ _links }, url]) => resolveLinks(url, _links)); |
| 18 | + .map(([{ _links }, url]) => hal.resolveLinks(url, _links)); |
59 | 19 |
|
60 | 20 | const isJsonSchema = (schema: JSONSchema7 & HalResource) => |
61 | 21 | schema && schema.$schema && schema.$schema.endsWith('schema#'); |
|
0 commit comments