@@ -9,89 +9,92 @@ import {partial, memoize} from 'lodash/function'
9
9
* @param {Object } includes - Object with lists of Entry, Asset, DeletedEntry and DeletedAsset
10
10
*/
11
11
export default function mixinLinkGetters ( items , includes ) {
12
- each ( items , item => setLocalizedFieldGetters ( item . fields , includes , ! ! item . sys . locale ) )
13
- }
14
-
15
- /**
16
- * If a field does not have a locale defined in sys, the content of that field
17
- * is an object where the keys are each available locale, and we need to iterate
18
- * over each of those
19
- * @private
20
- * @param {Object } fields - Fields object
21
- * @param {Object } includes - Object with lists of Entry, Asset, DeletedEntry and DeletedAsset
22
- * @param {boolean } hasLocale - If entry has been requested with a locale
23
- */
24
- function setLocalizedFieldGetters ( fields , includes , hasLocale ) {
25
- if ( hasLocale ) {
26
- setFieldGettersForFields ( fields , includes )
27
- } else {
28
- each ( fields , localizedField => setFieldGettersForFields ( localizedField , includes ) )
29
- }
30
- }
12
+ const linkGetter = memoize ( getLinksFromIncludes , memoizationResolver )
13
+ each ( items , item => setLocalizedFieldGetters ( item . fields , ! ! item . sys . locale ) )
31
14
32
- /**
33
- * Sets getters on each link field or list of link fields for each item
34
- * @private
35
- * @param {Object } fields - Fields object
36
- * @param {Object } includes - Object with lists of Entry, Asset, DeletedEntry and DeletedAsset
37
- */
38
- function setFieldGettersForFields ( fields , includes ) {
39
- each ( fields , ( field , fieldKey ) => {
40
- if ( Array . isArray ( field ) ) {
41
- addGetterForLinkArray ( field , fieldKey , fields , includes )
15
+ /**
16
+ * If a field does not have a locale defined in sys, the content of that field
17
+ * is an object where the keys are each available locale, and we need to iterate
18
+ * over each of those
19
+ * @private
20
+ * @param {Object } fields - Fields object
21
+ * @param {boolean } hasLocale - If entry has been requested with a locale
22
+ */
23
+ function setLocalizedFieldGetters ( fields , hasLocale ) {
24
+ if ( hasLocale ) {
25
+ setFieldGettersForFields ( fields )
42
26
} else {
43
- addGetterForLink ( field , fieldKey , fields , includes )
27
+ each ( fields , localizedField => setFieldGettersForFields ( localizedField ) )
44
28
}
45
- } )
46
- }
29
+ }
47
30
48
- /**
49
- * Sets a getter which resolves the link of the given fieldKey in fields
50
- * @private
51
- * @param {Object } field - Field object
52
- * @param { string } fieldKey
53
- * @param { Object } fields - Fields object
54
- * @param { Object } includes - Object with lists of Entry, Asset, DeletedEntry and DeletedAsset
55
- */
56
- function addGetterForLink ( field , fieldKey , fields , includes ) {
57
- if ( get ( field , 'sys.type' ) === 'Link' ) {
58
- Object . defineProperty ( fields , fieldKey , {
59
- get : memoize ( partial ( linkGetter , includes , field ) )
31
+ /**
32
+ * Sets getters on each link field or list of link fields for each item
33
+ * @private
34
+ * @param {Object } fields - Fields object
35
+ */
36
+ function setFieldGettersForFields ( fields ) {
37
+ each ( fields , ( field , fieldKey ) => {
38
+ if ( Array . isArray ( field ) ) {
39
+ addGetterForLinkArray ( field , fieldKey , fields )
40
+ } else {
41
+ addGetterForLink ( field , fieldKey , fields )
42
+ }
60
43
} )
61
44
}
62
- }
63
45
64
- /**
65
- * Sets a getter which resolves the array of links of the given fieldKey in fields
66
- * @private
67
- * @param {Array<Object> } field - List field array
68
- * @param {string } fieldKey
69
- * @param {Object } fields - Fields object
70
- * @param {Object } includes - Object with lists of Entry, Asset, DeletedEntry and DeletedAsset
71
- */
72
- function addGetterForLinkArray ( listField , fieldKey , fields , includes ) {
73
- if ( get ( listField [ 0 ] , 'sys.type' ) === 'Link' ) {
74
- Object . defineProperty ( fields , fieldKey , {
75
- get : memoize ( function ( ) {
76
- return map ( listField , partial ( linkGetter , includes ) )
46
+ /**
47
+ * Sets a getter which resolves the link of the given fieldKey in fields
48
+ * @private
49
+ * @param {Object } field - Field object
50
+ * @param {string } fieldKey
51
+ * @param {Object } fields - Fields object
52
+ */
53
+ function addGetterForLink ( field , fieldKey , fields ) {
54
+ if ( get ( field , 'sys.type' ) === 'Link' ) {
55
+ Object . defineProperty ( fields , fieldKey , {
56
+ get : partial ( linkGetter , field )
77
57
} )
78
- } )
58
+ }
79
59
}
80
- }
81
60
82
- /**
83
- * Looks for given link field in includes.
84
- * If linked entity is not found, it returns the original link.
85
- * @private
86
- * @param {Object } field - Field object
87
- * @param {Object } includes - Object with lists of Entry, Asset, DeletedEntry and DeletedAsset
88
- * @return {Object } Field, or link if field not resolved
89
- */
90
- function linkGetter ( includes , field ) {
91
- var link = find ( includes [ field . sys . linkType ] , [ 'sys.id' , field . sys . id ] )
92
- if ( link && link . fields ) {
93
- setLocalizedFieldGetters ( link . fields , includes , ! ! link . sys . locale )
94
- return link
61
+ /**
62
+ * Sets a getter which resolves the array of links of the given fieldKey in fields
63
+ * @private
64
+ * @param {Array<Object> } field - List field array
65
+ * @param {string } fieldKey
66
+ * @param {Object } fields - Fields object
67
+ */
68
+ function addGetterForLinkArray ( listField , fieldKey , fields ) {
69
+ if ( get ( listField [ 0 ] , 'sys.type' ) === 'Link' ) {
70
+ Object . defineProperty ( fields , fieldKey , {
71
+ get : function ( ) {
72
+ return map ( listField , partial ( linkGetter ) )
73
+ }
74
+ } )
75
+ }
76
+ }
77
+
78
+ /**
79
+ * Looks for given link field in includes.
80
+ * If linked entity is not found, it returns the original link.
81
+ * This method shouldn't be used directly, and it's memoized whenever this
82
+ * module's main method is used.
83
+ * This is done to prevent the same link being resolved multiple times.
84
+ * @private
85
+ * @param {Object } field - Field object
86
+ * @return {Object } Field, or link if field not resolved
87
+ */
88
+ function getLinksFromIncludes ( field ) {
89
+ var link = find ( includes [ field . sys . linkType ] , [ 'sys.id' , field . sys . id ] )
90
+ if ( link && link . fields ) {
91
+ setLocalizedFieldGetters ( link . fields , ! ! link . sys . locale )
92
+ return link
93
+ }
94
+ return field
95
+ }
96
+
97
+ function memoizationResolver ( link ) {
98
+ return link . sys . id
95
99
}
96
- return field
97
100
}
0 commit comments