@datocms/cma-client 5.1.10 → 5.1.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.
Files changed (253) hide show
  1. package/README.md +569 -0
  2. package/dist/cjs/fieldTypes/boolean.js +2 -2
  3. package/dist/cjs/fieldTypes/boolean.js.map +1 -1
  4. package/dist/cjs/fieldTypes/color.js +2 -2
  5. package/dist/cjs/fieldTypes/color.js.map +1 -1
  6. package/dist/cjs/fieldTypes/date.js +2 -3
  7. package/dist/cjs/fieldTypes/date.js.map +1 -1
  8. package/dist/cjs/fieldTypes/date_time.js +2 -2
  9. package/dist/cjs/fieldTypes/date_time.js.map +1 -1
  10. package/dist/cjs/fieldTypes/file.js +33 -5
  11. package/dist/cjs/fieldTypes/file.js.map +1 -1
  12. package/dist/cjs/fieldTypes/float.js +2 -2
  13. package/dist/cjs/fieldTypes/float.js.map +1 -1
  14. package/dist/cjs/fieldTypes/gallery.js +20 -5
  15. package/dist/cjs/fieldTypes/gallery.js.map +1 -1
  16. package/dist/cjs/fieldTypes/index.js +2 -2
  17. package/dist/cjs/fieldTypes/index.js.map +1 -1
  18. package/dist/cjs/fieldTypes/integer.js +2 -2
  19. package/dist/cjs/fieldTypes/integer.js.map +1 -1
  20. package/dist/cjs/fieldTypes/json.js +2 -3
  21. package/dist/cjs/fieldTypes/json.js.map +1 -1
  22. package/dist/cjs/fieldTypes/lat_lon.js +2 -2
  23. package/dist/cjs/fieldTypes/lat_lon.js.map +1 -1
  24. package/dist/cjs/fieldTypes/link.js +4 -4
  25. package/dist/cjs/fieldTypes/link.js.map +1 -1
  26. package/dist/cjs/fieldTypes/links.js +5 -3
  27. package/dist/cjs/fieldTypes/links.js.map +1 -1
  28. package/dist/cjs/fieldTypes/rich_text.js +18 -18
  29. package/dist/cjs/fieldTypes/rich_text.js.map +1 -1
  30. package/dist/cjs/fieldTypes/schema.js +3 -0
  31. package/dist/cjs/fieldTypes/schema.js.map +1 -0
  32. package/dist/cjs/fieldTypes/seo.js +2 -3
  33. package/dist/cjs/fieldTypes/seo.js.map +1 -1
  34. package/dist/cjs/fieldTypes/single_block.js +20 -19
  35. package/dist/cjs/fieldTypes/single_block.js.map +1 -1
  36. package/dist/cjs/fieldTypes/slug.js +2 -3
  37. package/dist/cjs/fieldTypes/slug.js.map +1 -1
  38. package/dist/cjs/fieldTypes/string.js +2 -2
  39. package/dist/cjs/fieldTypes/string.js.map +1 -1
  40. package/dist/cjs/fieldTypes/structured_text.js +17 -18
  41. package/dist/cjs/fieldTypes/structured_text.js.map +1 -1
  42. package/dist/cjs/fieldTypes/text.js +2 -3
  43. package/dist/cjs/fieldTypes/text.js.map +1 -1
  44. package/dist/cjs/fieldTypes/video.js +2 -2
  45. package/dist/cjs/fieldTypes/video.js.map +1 -1
  46. package/dist/cjs/generated/Client.js +1 -1
  47. package/dist/cjs/generated/resources/Item.js.map +1 -1
  48. package/dist/cjs/generated/resources/ScheduledPublication.js.map +1 -1
  49. package/dist/cjs/generated/resources/ScheduledUnpublishing.js.map +1 -1
  50. package/dist/cjs/generated/resources/Upload.js.map +1 -1
  51. package/dist/cjs/index.js +5 -4
  52. package/dist/cjs/index.js.map +1 -1
  53. package/dist/cjs/utilities/buildBlockRecord.js +1 -45
  54. package/dist/cjs/utilities/buildBlockRecord.js.map +1 -1
  55. package/dist/cjs/utilities/duplicateBlockRecord.js +49 -0
  56. package/dist/cjs/utilities/duplicateBlockRecord.js.map +1 -0
  57. package/dist/cjs/utilities/inspectItem.js +427 -0
  58. package/dist/cjs/utilities/inspectItem.js.map +1 -0
  59. package/dist/cjs/utilities/{blocks.js → nonRecursiveBlocks.js} +60 -234
  60. package/dist/cjs/utilities/nonRecursiveBlocks.js.map +1 -0
  61. package/dist/cjs/utilities/{fieldValue.js → normalizedFieldValues.js} +53 -41
  62. package/dist/cjs/utilities/normalizedFieldValues.js.map +1 -0
  63. package/dist/cjs/utilities/recursiveBlocks.js +73 -92
  64. package/dist/cjs/utilities/recursiveBlocks.js.map +1 -1
  65. package/dist/cjs/utilities/schemaRepository.js +2 -2
  66. package/dist/esm/fieldTypes/boolean.d.ts +1 -1
  67. package/dist/esm/fieldTypes/boolean.js +2 -2
  68. package/dist/esm/fieldTypes/boolean.js.map +1 -1
  69. package/dist/esm/fieldTypes/color.d.ts +1 -1
  70. package/dist/esm/fieldTypes/color.js +2 -2
  71. package/dist/esm/fieldTypes/color.js.map +1 -1
  72. package/dist/esm/fieldTypes/date.d.ts +1 -1
  73. package/dist/esm/fieldTypes/date.js +2 -3
  74. package/dist/esm/fieldTypes/date.js.map +1 -1
  75. package/dist/esm/fieldTypes/date_time.d.ts +1 -1
  76. package/dist/esm/fieldTypes/date_time.js +2 -2
  77. package/dist/esm/fieldTypes/date_time.js.map +1 -1
  78. package/dist/esm/fieldTypes/file.d.ts +68 -1
  79. package/dist/esm/fieldTypes/file.js +29 -3
  80. package/dist/esm/fieldTypes/file.js.map +1 -1
  81. package/dist/esm/fieldTypes/float.d.ts +1 -1
  82. package/dist/esm/fieldTypes/float.js +2 -2
  83. package/dist/esm/fieldTypes/float.js.map +1 -1
  84. package/dist/esm/fieldTypes/gallery.d.ts +27 -11
  85. package/dist/esm/fieldTypes/gallery.js +17 -4
  86. package/dist/esm/fieldTypes/gallery.js.map +1 -1
  87. package/dist/esm/fieldTypes/index.d.ts +2 -2
  88. package/dist/esm/fieldTypes/index.js +2 -2
  89. package/dist/esm/fieldTypes/index.js.map +1 -1
  90. package/dist/esm/fieldTypes/integer.d.ts +1 -1
  91. package/dist/esm/fieldTypes/integer.js +2 -2
  92. package/dist/esm/fieldTypes/integer.js.map +1 -1
  93. package/dist/esm/fieldTypes/json.d.ts +1 -1
  94. package/dist/esm/fieldTypes/json.js +2 -3
  95. package/dist/esm/fieldTypes/json.js.map +1 -1
  96. package/dist/esm/fieldTypes/lat_lon.d.ts +1 -1
  97. package/dist/esm/fieldTypes/lat_lon.js +2 -2
  98. package/dist/esm/fieldTypes/lat_lon.js.map +1 -1
  99. package/dist/esm/fieldTypes/link.d.ts +1 -1
  100. package/dist/esm/fieldTypes/link.js +4 -4
  101. package/dist/esm/fieldTypes/link.js.map +1 -1
  102. package/dist/esm/fieldTypes/links.d.ts +1 -1
  103. package/dist/esm/fieldTypes/links.js +5 -3
  104. package/dist/esm/fieldTypes/links.js.map +1 -1
  105. package/dist/esm/fieldTypes/rich_text.d.ts +9 -10
  106. package/dist/esm/fieldTypes/rich_text.js +13 -13
  107. package/dist/esm/fieldTypes/rich_text.js.map +1 -1
  108. package/dist/esm/fieldTypes/schema.d.ts +59 -0
  109. package/dist/esm/fieldTypes/schema.js +2 -0
  110. package/dist/esm/fieldTypes/schema.js.map +1 -0
  111. package/dist/esm/fieldTypes/seo.d.ts +1 -1
  112. package/dist/esm/fieldTypes/seo.js +2 -3
  113. package/dist/esm/fieldTypes/seo.js.map +1 -1
  114. package/dist/esm/fieldTypes/single_block.d.ts +31 -16
  115. package/dist/esm/fieldTypes/single_block.js +15 -14
  116. package/dist/esm/fieldTypes/single_block.js.map +1 -1
  117. package/dist/esm/fieldTypes/slug.d.ts +1 -1
  118. package/dist/esm/fieldTypes/slug.js +2 -3
  119. package/dist/esm/fieldTypes/slug.js.map +1 -1
  120. package/dist/esm/fieldTypes/string.d.ts +1 -1
  121. package/dist/esm/fieldTypes/string.js +2 -2
  122. package/dist/esm/fieldTypes/string.js.map +1 -1
  123. package/dist/esm/fieldTypes/structured_text.d.ts +15 -16
  124. package/dist/esm/fieldTypes/structured_text.js +12 -13
  125. package/dist/esm/fieldTypes/structured_text.js.map +1 -1
  126. package/dist/esm/fieldTypes/text.d.ts +1 -1
  127. package/dist/esm/fieldTypes/text.js +2 -3
  128. package/dist/esm/fieldTypes/text.js.map +1 -1
  129. package/dist/esm/fieldTypes/video.d.ts +1 -1
  130. package/dist/esm/fieldTypes/video.js +2 -2
  131. package/dist/esm/fieldTypes/video.js.map +1 -1
  132. package/dist/esm/generated/ApiTypes.d.ts +90 -980
  133. package/dist/esm/generated/Client.js +1 -1
  134. package/dist/esm/generated/RawApiTypes.d.ts +156 -999
  135. package/dist/esm/generated/resources/Field.d.ts +200 -200
  136. package/dist/esm/generated/resources/Item.d.ts +34 -34
  137. package/dist/esm/generated/resources/Item.js.map +1 -1
  138. package/dist/esm/generated/resources/ItemVersion.d.ts +3 -1
  139. package/dist/esm/generated/resources/ScheduledPublication.d.ts +3 -3
  140. package/dist/esm/generated/resources/ScheduledPublication.js.map +1 -1
  141. package/dist/esm/generated/resources/ScheduledUnpublishing.d.ts +3 -3
  142. package/dist/esm/generated/resources/ScheduledUnpublishing.js.map +1 -1
  143. package/dist/esm/generated/resources/Upload.d.ts +6 -6
  144. package/dist/esm/generated/resources/Upload.js.map +1 -1
  145. package/dist/esm/index.d.ts +5 -4
  146. package/dist/esm/index.js +5 -4
  147. package/dist/esm/index.js.map +1 -1
  148. package/dist/esm/utilities/buildBlockRecord.d.ts +3 -5
  149. package/dist/esm/utilities/buildBlockRecord.js +0 -43
  150. package/dist/esm/utilities/buildBlockRecord.js.map +1 -1
  151. package/dist/esm/utilities/duplicateBlockRecord.d.ts +6 -0
  152. package/dist/esm/utilities/duplicateBlockRecord.js +45 -0
  153. package/dist/esm/utilities/duplicateBlockRecord.js.map +1 -0
  154. package/dist/esm/utilities/inspectItem.d.ts +8 -0
  155. package/dist/esm/utilities/inspectItem.js +400 -0
  156. package/dist/esm/utilities/inspectItem.js.map +1 -0
  157. package/dist/esm/utilities/itemDefinition.d.ts +45 -23
  158. package/dist/esm/utilities/nonRecursiveBlocks.d.ts +114 -0
  159. package/dist/esm/utilities/{blocks.js → nonRecursiveBlocks.js} +52 -220
  160. package/dist/esm/utilities/nonRecursiveBlocks.js.map +1 -0
  161. package/dist/{types/utilities/fieldValue.d.ts → esm/utilities/normalizedFieldValues.d.ts} +15 -14
  162. package/dist/esm/utilities/{fieldValue.js → normalizedFieldValues.js} +39 -28
  163. package/dist/esm/utilities/normalizedFieldValues.js.map +1 -0
  164. package/dist/esm/utilities/recursiveBlocks.d.ts +124 -11
  165. package/dist/esm/utilities/recursiveBlocks.js +65 -84
  166. package/dist/esm/utilities/recursiveBlocks.js.map +1 -1
  167. package/dist/esm/utilities/schemaRepository.d.ts +2 -2
  168. package/dist/esm/utilities/schemaRepository.js +2 -2
  169. package/dist/types/fieldTypes/boolean.d.ts +1 -1
  170. package/dist/types/fieldTypes/color.d.ts +1 -1
  171. package/dist/types/fieldTypes/date.d.ts +1 -1
  172. package/dist/types/fieldTypes/date_time.d.ts +1 -1
  173. package/dist/types/fieldTypes/file.d.ts +68 -1
  174. package/dist/types/fieldTypes/float.d.ts +1 -1
  175. package/dist/types/fieldTypes/gallery.d.ts +27 -11
  176. package/dist/types/fieldTypes/index.d.ts +2 -2
  177. package/dist/types/fieldTypes/integer.d.ts +1 -1
  178. package/dist/types/fieldTypes/json.d.ts +1 -1
  179. package/dist/types/fieldTypes/lat_lon.d.ts +1 -1
  180. package/dist/types/fieldTypes/link.d.ts +1 -1
  181. package/dist/types/fieldTypes/links.d.ts +1 -1
  182. package/dist/types/fieldTypes/rich_text.d.ts +9 -10
  183. package/dist/types/fieldTypes/schema.d.ts +59 -0
  184. package/dist/types/fieldTypes/seo.d.ts +1 -1
  185. package/dist/types/fieldTypes/single_block.d.ts +31 -16
  186. package/dist/types/fieldTypes/slug.d.ts +1 -1
  187. package/dist/types/fieldTypes/string.d.ts +1 -1
  188. package/dist/types/fieldTypes/structured_text.d.ts +15 -16
  189. package/dist/types/fieldTypes/text.d.ts +1 -1
  190. package/dist/types/fieldTypes/video.d.ts +1 -1
  191. package/dist/types/generated/ApiTypes.d.ts +90 -980
  192. package/dist/types/generated/RawApiTypes.d.ts +156 -999
  193. package/dist/types/generated/resources/Field.d.ts +200 -200
  194. package/dist/types/generated/resources/Item.d.ts +34 -34
  195. package/dist/types/generated/resources/ItemVersion.d.ts +3 -1
  196. package/dist/types/generated/resources/ScheduledPublication.d.ts +3 -3
  197. package/dist/types/generated/resources/ScheduledUnpublishing.d.ts +3 -3
  198. package/dist/types/generated/resources/Upload.d.ts +6 -6
  199. package/dist/types/index.d.ts +5 -4
  200. package/dist/types/utilities/buildBlockRecord.d.ts +3 -5
  201. package/dist/types/utilities/duplicateBlockRecord.d.ts +6 -0
  202. package/dist/types/utilities/inspectItem.d.ts +8 -0
  203. package/dist/types/utilities/itemDefinition.d.ts +45 -23
  204. package/dist/types/utilities/nonRecursiveBlocks.d.ts +114 -0
  205. package/dist/{esm/utilities/fieldValue.d.ts → types/utilities/normalizedFieldValues.d.ts} +15 -14
  206. package/dist/types/utilities/recursiveBlocks.d.ts +124 -11
  207. package/dist/types/utilities/schemaRepository.d.ts +2 -2
  208. package/package.json +4 -4
  209. package/src/fieldTypes/boolean.ts +5 -3
  210. package/src/fieldTypes/color.ts +5 -3
  211. package/src/fieldTypes/date.ts +5 -4
  212. package/src/fieldTypes/date_time.ts +5 -3
  213. package/src/fieldTypes/file.ts +98 -4
  214. package/src/fieldTypes/float.ts +5 -3
  215. package/src/fieldTypes/gallery.ts +53 -20
  216. package/src/fieldTypes/index.ts +2 -3
  217. package/src/fieldTypes/integer.ts +5 -3
  218. package/src/fieldTypes/json.ts +5 -4
  219. package/src/fieldTypes/lat_lon.ts +5 -3
  220. package/src/fieldTypes/link.ts +7 -5
  221. package/src/fieldTypes/links.ts +8 -4
  222. package/src/fieldTypes/rich_text.ts +33 -31
  223. package/src/fieldTypes/schema.ts +657 -0
  224. package/src/fieldTypes/seo.ts +5 -4
  225. package/src/fieldTypes/single_block.ts +71 -46
  226. package/src/fieldTypes/slug.ts +5 -4
  227. package/src/fieldTypes/string.ts +5 -3
  228. package/src/fieldTypes/structured_text.ts +64 -58
  229. package/src/fieldTypes/text.ts +5 -4
  230. package/src/fieldTypes/video.ts +5 -3
  231. package/src/generated/ApiTypes.ts +217 -1880
  232. package/src/generated/Client.ts +1 -1
  233. package/src/generated/RawApiTypes.ts +272 -2113
  234. package/src/generated/resources/Item.ts +93 -187
  235. package/src/generated/resources/ScheduledPublication.ts +4 -15
  236. package/src/generated/resources/ScheduledUnpublishing.ts +4 -15
  237. package/src/generated/resources/Upload.ts +9 -32
  238. package/src/index.ts +5 -4
  239. package/src/utilities/buildBlockRecord.ts +4 -59
  240. package/src/utilities/duplicateBlockRecord.ts +52 -0
  241. package/src/utilities/inspectItem.ts +602 -0
  242. package/src/utilities/itemDefinition.ts +130 -92
  243. package/src/utilities/nonRecursiveBlocks.ts +406 -0
  244. package/src/utilities/{fieldValue.ts → normalizedFieldValues.ts} +70 -30
  245. package/src/utilities/recursiveBlocks.ts +484 -204
  246. package/src/utilities/schemaRepository.ts +2 -2
  247. package/dist/cjs/utilities/blocks.js.map +0 -1
  248. package/dist/cjs/utilities/fieldValue.js.map +0 -1
  249. package/dist/esm/utilities/blocks.d.ts +0 -180
  250. package/dist/esm/utilities/blocks.js.map +0 -1
  251. package/dist/esm/utilities/fieldValue.js.map +0 -1
  252. package/dist/types/utilities/blocks.d.ts +0 -180
  253. package/src/utilities/blocks.ts +0 -626
@@ -0,0 +1,602 @@
1
+ import * as Utils from '@datocms/rest-client-utils';
2
+ import {
3
+ type TreeNode,
4
+ formatAsTree,
5
+ inspectionTreeNodes,
6
+ } from 'datocms-structured-text-utils';
7
+ import {
8
+ type BlockInRequest,
9
+ type BooleanFieldValue,
10
+ type ColorFieldValue,
11
+ type DateFieldValue,
12
+ type DateTimeFieldValue,
13
+ type FileFieldValue,
14
+ type FileFieldValueInRequest,
15
+ type FloatFieldValue,
16
+ type GalleryFieldValue,
17
+ type GalleryFieldValueInRequest,
18
+ type IntegerFieldValue,
19
+ type JsonFieldValue,
20
+ type LatLonFieldValue,
21
+ type LinkFieldValue,
22
+ type LinksFieldValue,
23
+ type NewBlockInRequest,
24
+ type RichTextFieldValue,
25
+ type RichTextFieldValueInNestedResponse,
26
+ type RichTextFieldValueInRequest,
27
+ type SeoFieldValue,
28
+ type SingleBlockFieldValue,
29
+ type SingleBlockFieldValueInNestedResponse,
30
+ type SingleBlockFieldValueInRequest,
31
+ type SlugFieldValue,
32
+ type StringFieldValue,
33
+ type StructuredTextFieldValue,
34
+ type StructuredTextFieldValueInNestedResponse,
35
+ type StructuredTextFieldValueInRequest,
36
+ type TextFieldValue,
37
+ type UpdatedBlockInRequest,
38
+ type VideoFieldValue,
39
+ isBooleanFieldValue,
40
+ isColorFieldValue,
41
+ isDateFieldValue,
42
+ isDateTimeFieldValue,
43
+ isFileFieldValue,
44
+ isFileFieldValueInRequest,
45
+ isFloatFieldValue,
46
+ isGalleryFieldValue,
47
+ isGalleryFieldValueInRequest,
48
+ isIntegerFieldValue,
49
+ isJsonFieldValue,
50
+ isLatLonFieldValue,
51
+ isLinkFieldValue,
52
+ isLinksFieldValue,
53
+ isRichTextFieldValue,
54
+ isRichTextFieldValueInNestedResponse,
55
+ isRichTextFieldValueInRequest,
56
+ isSeoFieldValue,
57
+ isSingleBlockFieldValue,
58
+ isSingleBlockFieldValueInNestedResponse,
59
+ isSingleBlockFieldValueInRequest,
60
+ isSlugFieldValue,
61
+ isStringFieldValue,
62
+ isStructuredTextFieldValue,
63
+ isStructuredTextFieldValueInNestedResponse,
64
+ isStructuredTextFieldValueInRequest,
65
+ isTextFieldValue,
66
+ isVideoFieldValue,
67
+ } from '../fieldTypes';
68
+ import { Item as ItemResource } from '../generated/resources';
69
+
70
+ import type { ApiTypes, RawApiTypes } from '../index';
71
+ import type { LocalizedFieldValue } from './normalizedFieldValues';
72
+ import { isLocalizedFieldValue } from './normalizedFieldValues';
73
+
74
+ type Item =
75
+ | ApiTypes.Item
76
+ | RawApiTypes.Item
77
+ | NewBlockInRequest
78
+ | UpdatedBlockInRequest
79
+ | RawApiTypes.ItemCreateSchema
80
+ | RawApiTypes.ItemUpdateSchema
81
+ | ApiTypes.ItemCreateSchema
82
+ | ApiTypes.ItemUpdateSchema;
83
+
84
+ interface FieldTypeHandler {
85
+ guard: (value: unknown) => boolean;
86
+ inspect: (
87
+ value: any,
88
+ options?: InspectItemOptions,
89
+ ) => string | TreeNode | TreeNode[];
90
+ }
91
+
92
+ const fieldTypeHandlers: FieldTypeHandler[] = [
93
+ { guard: isBooleanFieldValue, inspect: booleanInspectionTreeNodes },
94
+ { guard: isFloatFieldValue, inspect: floatInspectionTreeNodes },
95
+ { guard: isIntegerFieldValue, inspect: integerInspectionTreeNodes },
96
+ { guard: isColorFieldValue, inspect: colorInspectionTreeNodes },
97
+ { guard: isDateFieldValue, inspect: dateInspectionTreeNodes },
98
+ { guard: isDateTimeFieldValue, inspect: dateTimeInspectionTreeNodes },
99
+ { guard: isGalleryFieldValue, inspect: galleryInspectionTreeNodes },
100
+ { guard: isGalleryFieldValueInRequest, inspect: galleryInspectionTreeNodes },
101
+ { guard: isFileFieldValue, inspect: fileInspectionTreeNodes },
102
+ { guard: isFileFieldValueInRequest, inspect: fileInspectionTreeNodes },
103
+ { guard: isJsonFieldValue, inspect: jsonInspectionTreeNodes },
104
+ { guard: isSlugFieldValue, inspect: slugInspectionTreeNodes },
105
+ { guard: isStringFieldValue, inspect: stringInspectionTreeNodes },
106
+ { guard: isTextFieldValue, inspect: textInspectionTreeNodes },
107
+ { guard: isLatLonFieldValue, inspect: latLonInspectionTreeNodes },
108
+ { guard: isLinkFieldValue, inspect: linkInspectionTreeNodes },
109
+ { guard: isLinksFieldValue, inspect: linksInspectionTreeNodes },
110
+ { guard: isSeoFieldValue, inspect: seoFieldInspectionTreeNodes },
111
+ { guard: isVideoFieldValue, inspect: videoFieldInspectionTreeNodes },
112
+ {
113
+ guard: isStructuredTextFieldValue,
114
+ inspect: structuredTextInspectionTreeNodes,
115
+ },
116
+ {
117
+ guard: isStructuredTextFieldValueInRequest,
118
+ inspect: structuredTextInspectionTreeNodes,
119
+ },
120
+ {
121
+ guard: isStructuredTextFieldValueInNestedResponse,
122
+ inspect: structuredTextInspectionTreeNodes,
123
+ },
124
+ { guard: isSingleBlockFieldValue, inspect: singleBlockInspectionTreeNodes },
125
+ {
126
+ guard: isSingleBlockFieldValueInRequest,
127
+ inspect: singleBlockInspectionTreeNodes,
128
+ },
129
+ {
130
+ guard: isSingleBlockFieldValueInNestedResponse,
131
+ inspect: singleBlockInspectionTreeNodes,
132
+ },
133
+ { guard: isRichTextFieldValue, inspect: richTextInspectionTreeNodes },
134
+ {
135
+ guard: isRichTextFieldValueInRequest,
136
+ inspect: richTextInspectionTreeNodes,
137
+ },
138
+ {
139
+ guard: isRichTextFieldValueInNestedResponse,
140
+ inspect: richTextInspectionTreeNodes,
141
+ },
142
+ ];
143
+
144
+ function createChildNode(
145
+ attributeName: string,
146
+ inspectResult: string | TreeNode | TreeNode[],
147
+ ): TreeNode {
148
+ if (typeof inspectResult === 'string') {
149
+ return { label: `${attributeName}: ${inspectResult}` };
150
+ }
151
+
152
+ if (Array.isArray(inspectResult)) {
153
+ return {
154
+ label: attributeName,
155
+ nodes: inspectResult,
156
+ };
157
+ }
158
+
159
+ // Single TreeNode
160
+ return {
161
+ label: attributeName,
162
+ nodes: [inspectResult],
163
+ };
164
+ }
165
+
166
+ function inspectFieldValue(
167
+ value: unknown,
168
+ options?: InspectItemOptions,
169
+ ): string | TreeNode | TreeNode[] {
170
+ if (isLocalizedFieldValue(value)) {
171
+ for (const handler of fieldTypeHandlers) {
172
+ if (
173
+ Object.values(value).every((localeValue) => handler.guard(localeValue))
174
+ ) {
175
+ const localeEntries = Object.entries(value).sort(([a], [b]) =>
176
+ a.localeCompare(b),
177
+ );
178
+
179
+ return localeEntries.map(([locale, localeValue]) => {
180
+ const inspectResult = handler.inspect(localeValue, options);
181
+
182
+ if (typeof inspectResult === 'string') {
183
+ return { label: `${locale}: ${inspectResult}` };
184
+ }
185
+
186
+ if (Array.isArray(inspectResult)) {
187
+ return {
188
+ label: locale,
189
+ nodes: inspectResult,
190
+ };
191
+ }
192
+
193
+ // Single TreeNode
194
+ return {
195
+ label: locale,
196
+ nodes: [inspectResult],
197
+ };
198
+ });
199
+ }
200
+ }
201
+ }
202
+
203
+ for (const handler of fieldTypeHandlers) {
204
+ if (handler.guard(value)) {
205
+ return handler.inspect(value, options);
206
+ }
207
+ }
208
+
209
+ // Fallback for unknown field types
210
+ return `UNKNOWN: ${JSON.stringify(value)}`;
211
+ }
212
+
213
+ function normalizeItem(item: any): RawApiTypes.Item {
214
+ if ('attributes' in item) {
215
+ return item;
216
+ }
217
+
218
+ const { __itemTypeId, ...itemWithoutItemTypeId } = item;
219
+
220
+ return Utils.serializeRequestBody<{
221
+ data: RawApiTypes.Item;
222
+ }>(itemWithoutItemTypeId, {
223
+ type: ItemResource.TYPE,
224
+ attributes: '*',
225
+ relationships: ['item_type', 'creator'],
226
+ }).data;
227
+ }
228
+
229
+ export type InspectItemOptions = {
230
+ maxWidth?: number;
231
+ };
232
+
233
+ export function inspectItem(item: Item, options?: InspectItemOptions): string {
234
+ return formatAsTree(itemInspectionTreeNodes(item, options));
235
+ }
236
+
237
+ function itemInspectionTreeNodes(
238
+ item: Item,
239
+ options?: InspectItemOptions,
240
+ ): TreeNode {
241
+ let itemTypeId: string | undefined;
242
+
243
+ const normalizedItem = normalizeItem(item);
244
+
245
+ if ('relationships' in normalizedItem && normalizedItem.relationships) {
246
+ const relationships = normalizedItem.relationships as any;
247
+ if (relationships.item_type?.data?.id) {
248
+ itemTypeId = relationships.item_type.data.id;
249
+ }
250
+ }
251
+
252
+ const rootLabel = [
253
+ 'Item',
254
+ 'id' in item ? JSON.stringify(normalizedItem.id) : null,
255
+ itemTypeId ? `(item_type: ${JSON.stringify(itemTypeId)})` : null,
256
+ ]
257
+ .filter(Boolean)
258
+ .join(' ');
259
+
260
+ const nodes: TreeNode[] = [];
261
+
262
+ if ('attributes' in normalizedItem) {
263
+ for (const [attributeName, attributeValue] of Object.entries(
264
+ normalizedItem.attributes,
265
+ )) {
266
+ const inspectResult = inspectFieldValue(attributeValue, options);
267
+ nodes.push(createChildNode(attributeName, inspectResult));
268
+ }
269
+ }
270
+
271
+ return {
272
+ label: rootLabel,
273
+ nodes: nodes.length > 0 ? nodes : undefined,
274
+ };
275
+ }
276
+
277
+ function structuredTextInspectionTreeNodes(
278
+ value:
279
+ | StructuredTextFieldValue
280
+ | StructuredTextFieldValueInRequest
281
+ | StructuredTextFieldValueInNestedResponse,
282
+ options?: InspectItemOptions,
283
+ ) {
284
+ if (value === null) return 'null';
285
+
286
+ return inspectionTreeNodes<BlockInRequest, BlockInRequest>(value, {
287
+ maxWidth: options?.maxWidth || 80,
288
+ blockFormatter: (block, maxWidth) => {
289
+ if (typeof block === 'string') {
290
+ return JSON.stringify(block);
291
+ }
292
+
293
+ return itemInspectionTreeNodes(block, options);
294
+ },
295
+ });
296
+ }
297
+
298
+ function singleBlockInspectionTreeNodes(
299
+ value:
300
+ | SingleBlockFieldValue
301
+ | SingleBlockFieldValueInRequest
302
+ | SingleBlockFieldValueInNestedResponse,
303
+ options?: InspectItemOptions,
304
+ ) {
305
+ if (value === null) return 'null';
306
+ if (typeof value === 'string') return JSON.stringify(value);
307
+ return itemInspectionTreeNodes(value, options);
308
+ }
309
+
310
+ function richTextInspectionTreeNodes(
311
+ value:
312
+ | RichTextFieldValue
313
+ | RichTextFieldValueInRequest
314
+ | RichTextFieldValueInNestedResponse,
315
+ options?: InspectItemOptions,
316
+ ): string | TreeNode[] {
317
+ if (value === null) return 'null';
318
+
319
+ return value.map<TreeNode>((item, index) => {
320
+ const result = singleBlockInspectionTreeNodes(item, options);
321
+ if (typeof result === 'string') {
322
+ return { label: `[${index}] ${result}` };
323
+ }
324
+ result.label = `[${index}] ${result.label}`;
325
+ return result;
326
+ });
327
+ }
328
+
329
+ function booleanInspectionTreeNodes(value: BooleanFieldValue): string {
330
+ return JSON.stringify(value);
331
+ }
332
+
333
+ function colorInspectionTreeNodes(value: ColorFieldValue): string {
334
+ if (value === null) return 'null';
335
+
336
+ const { red, green, blue, alpha } = value;
337
+ const hex = `#${red.toString(16).padStart(2, '0').toUpperCase()}${green.toString(16).padStart(2, '0').toUpperCase()}${blue.toString(16).padStart(2, '0').toUpperCase()}`;
338
+
339
+ if (alpha === 255) {
340
+ return hex;
341
+ }
342
+ const alphaPercent = Math.round((alpha / 255) * 100);
343
+ return `${hex} ${alphaPercent}%`;
344
+ }
345
+
346
+ function dateInspectionTreeNodes(value: DateFieldValue): string {
347
+ if (value === null) return 'null';
348
+ return value;
349
+ }
350
+
351
+ function dateTimeInspectionTreeNodes(value: DateTimeFieldValue): string {
352
+ if (value === null) return 'null';
353
+ return value;
354
+ }
355
+
356
+ function fileInspectionTreeNodes(
357
+ value: FileFieldValue | FileFieldValueInRequest,
358
+ options?: InspectItemOptions,
359
+ ): string | TreeNode[] {
360
+ if (value === null) return 'null';
361
+
362
+ const nodes: TreeNode[] = [];
363
+
364
+ nodes.push({ label: `upload_id: ${JSON.stringify(value.upload_id)}` });
365
+
366
+ if (value.alt) {
367
+ nodes.push({
368
+ label: `alt: ${JSON.stringify(truncate(value.alt, options?.maxWidth || 80))}`,
369
+ });
370
+ }
371
+
372
+ if (value.title) {
373
+ nodes.push({
374
+ label: `title: ${JSON.stringify(truncate(value.title, options?.maxWidth || 80))}`,
375
+ });
376
+ }
377
+
378
+ if (value.custom_data && Object.keys(value.custom_data).length > 0) {
379
+ nodes.push({
380
+ label: `custom_data: ${truncate(JSON.stringify(value.custom_data), options?.maxWidth || 80)}`,
381
+ });
382
+ }
383
+
384
+ if (value.focal_point) {
385
+ const x = value.focal_point.x * 100;
386
+ const y = value.focal_point.y * 100;
387
+ nodes.push({ label: `focal_point: x=${x}% y=${y}%` });
388
+ }
389
+
390
+ return nodes;
391
+ }
392
+
393
+ function floatInspectionTreeNodes(value: FloatFieldValue): string {
394
+ if (value === null) return 'null';
395
+ return value.toString();
396
+ }
397
+
398
+ function galleryInspectionTreeNodes(
399
+ value: GalleryFieldValue | GalleryFieldValueInRequest,
400
+ options?: InspectItemOptions,
401
+ ): string | TreeNode[] {
402
+ if (!value || value.length === 0) return '[]';
403
+
404
+ const itemNodes: TreeNode[] = value.map((item, index) => {
405
+ const nodes: TreeNode[] = [];
406
+
407
+ nodes.push({
408
+ label: `upload_id: ${JSON.stringify(item.upload_id)}`,
409
+ });
410
+
411
+ if (item.alt) {
412
+ nodes.push({
413
+ label: `alt: ${JSON.stringify(truncate(item.alt, options?.maxWidth || 80))}`,
414
+ });
415
+ }
416
+
417
+ if (item.title) {
418
+ nodes.push({
419
+ label: `title: ${JSON.stringify(truncate(item.title, options?.maxWidth || 80))}`,
420
+ });
421
+ }
422
+
423
+ if (item.custom_data && Object.keys(item.custom_data).length > 0) {
424
+ nodes.push({
425
+ label: `custom_data: ${truncate(JSON.stringify(item.custom_data), options?.maxWidth || 80)}`,
426
+ });
427
+ }
428
+
429
+ if (item.focal_point) {
430
+ const x = item.focal_point.x * 100;
431
+ const y = item.focal_point.y * 100;
432
+ nodes.push({ label: `focal_point: x=${x}% y=${y}%` });
433
+ }
434
+
435
+ return {
436
+ label: `[${index}]`,
437
+ nodes: nodes,
438
+ };
439
+ });
440
+
441
+ return itemNodes;
442
+ }
443
+
444
+ function integerInspectionTreeNodes(value: IntegerFieldValue): string {
445
+ if (value === null) return 'null';
446
+ return value.toString();
447
+ }
448
+
449
+ function jsonInspectionTreeNodes(
450
+ value: JsonFieldValue,
451
+ options?: InspectItemOptions,
452
+ ): string {
453
+ if (value === null) return 'null';
454
+ return truncate(JSON.stringify(JSON.parse(value)), options?.maxWidth || 80);
455
+ }
456
+
457
+ function latLonInspectionTreeNodes(
458
+ value: LatLonFieldValue,
459
+ ): string | TreeNode[] {
460
+ if (value === null) return 'null';
461
+
462
+ return [
463
+ { label: `latitude: ${value.latitude}` },
464
+ { label: `longitude: ${value.longitude}` },
465
+ ];
466
+ }
467
+
468
+ function linkInspectionTreeNodes(value: LinkFieldValue): string {
469
+ if (value === null) return 'null';
470
+ return JSON.stringify(value);
471
+ }
472
+
473
+ function linksInspectionTreeNodes(value: LinksFieldValue): string | TreeNode[] {
474
+ if (value === null) return 'null';
475
+
476
+ return value.map<TreeNode>((itemId, index) => ({
477
+ label: `[${index}]: ${JSON.stringify(itemId)}`,
478
+ }));
479
+ }
480
+
481
+ function seoFieldInspectionTreeNodes(
482
+ value: SeoFieldValue,
483
+ options?: InspectItemOptions,
484
+ ): string | TreeNode[] {
485
+ if (value === null) return 'null';
486
+
487
+ const nodes: TreeNode[] = [];
488
+
489
+ if (value.title) {
490
+ nodes.push({
491
+ label: `title: ${JSON.stringify(truncate(value.title, options?.maxWidth || 80))}`,
492
+ });
493
+ }
494
+
495
+ if (value.description) {
496
+ nodes.push({
497
+ label: `description: ${JSON.stringify(truncate(value.description, options?.maxWidth || 80))}`,
498
+ });
499
+ }
500
+
501
+ if (value.image) {
502
+ nodes.push({
503
+ label: `image: ${value.image}`,
504
+ });
505
+ }
506
+
507
+ if (value.twitter_card) {
508
+ nodes.push({
509
+ label: `twitter_card: ${value.twitter_card}`,
510
+ });
511
+ }
512
+
513
+ if (value.no_index !== undefined) {
514
+ nodes.push({
515
+ label: `no_index: ${value.no_index}`,
516
+ });
517
+ }
518
+
519
+ return nodes;
520
+ }
521
+
522
+ function slugInspectionTreeNodes(
523
+ value: SlugFieldValue,
524
+ options?: InspectItemOptions,
525
+ ): string {
526
+ if (value === null) return 'null';
527
+ return JSON.stringify(truncate(value, options?.maxWidth || 80));
528
+ }
529
+
530
+ function stringInspectionTreeNodes(
531
+ value: StringFieldValue,
532
+ options?: InspectItemOptions,
533
+ ): string {
534
+ if (value === null) return 'null';
535
+ return JSON.stringify(truncate(value, options?.maxWidth || 80));
536
+ }
537
+
538
+ function textInspectionTreeNodes(
539
+ value: TextFieldValue,
540
+ options?: InspectItemOptions,
541
+ ): string {
542
+ if (value === null) return 'null';
543
+ return JSON.stringify(truncate(value, options?.maxWidth || 80));
544
+ }
545
+
546
+ function videoFieldInspectionTreeNodes(
547
+ value: VideoFieldValue,
548
+ options?: InspectItemOptions,
549
+ ): string | TreeNode[] {
550
+ if (value === null) return 'null';
551
+
552
+ const nodes: TreeNode[] = [];
553
+
554
+ nodes.push({ label: `provider: ${value.provider}` });
555
+ nodes.push({ label: `provider_uid: ${value.provider_uid}` });
556
+ nodes.push({ label: `url: ${value.url}` });
557
+ nodes.push({ label: `size: ${value.width}⨯${value.height}px` });
558
+ nodes.push({ label: `thumbnail_url: ${value.thumbnail_url}` });
559
+
560
+ if (value.title) {
561
+ nodes.push({
562
+ label: `title: ${JSON.stringify(truncate(value.title, options?.maxWidth || 80))}`,
563
+ });
564
+ }
565
+
566
+ return nodes;
567
+ }
568
+
569
+ function localizedFieldValueInspectionTreeNodes(
570
+ value: LocalizedFieldValue<unknown>,
571
+ options?: InspectItemOptions,
572
+ ): TreeNode[] {
573
+ const localeEntries = Object.entries(value).sort(([a], [b]) =>
574
+ a.localeCompare(b),
575
+ );
576
+
577
+ return localeEntries.map(([locale, localeValue]) => {
578
+ const inspectResult = inspectFieldValue(localeValue, options);
579
+
580
+ if (typeof inspectResult === 'string') {
581
+ return { label: `${locale}: ${inspectResult}` };
582
+ }
583
+
584
+ if (Array.isArray(inspectResult)) {
585
+ return {
586
+ label: locale,
587
+ nodes: inspectResult,
588
+ };
589
+ }
590
+
591
+ // Single TreeNode
592
+ return {
593
+ label: locale,
594
+ nodes: [inspectResult],
595
+ };
596
+ });
597
+ }
598
+
599
+ function truncate(text: string, maxWidth: number): string {
600
+ if (text.length <= maxWidth) return text;
601
+ return `${text.slice(0, maxWidth - 3)}...`;
602
+ }