@terminalfour/terminalfour-js 1.0.0-rc.1

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/LICENSE.md +106 -0
  2. package/README.md +169 -0
  3. package/dist/cjs/element-resolver.d.ts +115 -0
  4. package/dist/cjs/element-resolver.d.ts.map +1 -0
  5. package/dist/cjs/element-resolver.js +391 -0
  6. package/dist/cjs/element-resolver.js.map +1 -0
  7. package/dist/cjs/errors.d.ts +21 -0
  8. package/dist/cjs/errors.d.ts.map +1 -0
  9. package/dist/cjs/errors.js +21 -0
  10. package/dist/cjs/errors.js.map +1 -0
  11. package/dist/cjs/handlebars.d.ts +123 -0
  12. package/dist/cjs/handlebars.d.ts.map +1 -0
  13. package/dist/cjs/handlebars.js +306 -0
  14. package/dist/cjs/handlebars.js.map +1 -0
  15. package/dist/cjs/http-client.d.ts +21 -0
  16. package/dist/cjs/http-client.d.ts.map +1 -0
  17. package/dist/cjs/http-client.js +126 -0
  18. package/dist/cjs/http-client.js.map +1 -0
  19. package/dist/cjs/index.d.ts +37 -0
  20. package/dist/cjs/index.d.ts.map +1 -0
  21. package/dist/cjs/index.js +55 -0
  22. package/dist/cjs/index.js.map +1 -0
  23. package/dist/cjs/media-category-ref.d.ts +78 -0
  24. package/dist/cjs/media-category-ref.d.ts.map +1 -0
  25. package/dist/cjs/media-category-ref.js +184 -0
  26. package/dist/cjs/media-category-ref.js.map +1 -0
  27. package/dist/cjs/media-library.d.ts +30 -0
  28. package/dist/cjs/media-library.d.ts.map +1 -0
  29. package/dist/cjs/media-library.js +77 -0
  30. package/dist/cjs/media-library.js.map +1 -0
  31. package/dist/cjs/models/content-item.d.ts +80 -0
  32. package/dist/cjs/models/content-item.d.ts.map +1 -0
  33. package/dist/cjs/models/content-item.js +682 -0
  34. package/dist/cjs/models/content-item.js.map +1 -0
  35. package/dist/cjs/models/media-category-item.d.ts +29 -0
  36. package/dist/cjs/models/media-category-item.d.ts.map +1 -0
  37. package/dist/cjs/models/media-category-item.js +33 -0
  38. package/dist/cjs/models/media-category-item.js.map +1 -0
  39. package/dist/cjs/models/media-item.d.ts +74 -0
  40. package/dist/cjs/models/media-item.d.ts.map +1 -0
  41. package/dist/cjs/models/media-item.js +188 -0
  42. package/dist/cjs/models/media-item.js.map +1 -0
  43. package/dist/cjs/models/section-item.d.ts +58 -0
  44. package/dist/cjs/models/section-item.d.ts.map +1 -0
  45. package/dist/cjs/models/section-item.js +166 -0
  46. package/dist/cjs/models/section-item.js.map +1 -0
  47. package/dist/cjs/package.json +1 -0
  48. package/dist/cjs/resources/channel-resource.d.ts +112 -0
  49. package/dist/cjs/resources/channel-resource.d.ts.map +1 -0
  50. package/dist/cjs/resources/channel-resource.js +107 -0
  51. package/dist/cjs/resources/channel-resource.js.map +1 -0
  52. package/dist/cjs/resources/content-resource.d.ts +50 -0
  53. package/dist/cjs/resources/content-resource.d.ts.map +1 -0
  54. package/dist/cjs/resources/content-resource.js +286 -0
  55. package/dist/cjs/resources/content-resource.js.map +1 -0
  56. package/dist/cjs/resources/content-type-resource.d.ts +283 -0
  57. package/dist/cjs/resources/content-type-resource.d.ts.map +1 -0
  58. package/dist/cjs/resources/content-type-resource.js +970 -0
  59. package/dist/cjs/resources/content-type-resource.js.map +1 -0
  60. package/dist/cjs/resources/group-resource.d.ts +96 -0
  61. package/dist/cjs/resources/group-resource.d.ts.map +1 -0
  62. package/dist/cjs/resources/group-resource.js +213 -0
  63. package/dist/cjs/resources/group-resource.js.map +1 -0
  64. package/dist/cjs/resources/list-resource.d.ts +111 -0
  65. package/dist/cjs/resources/list-resource.d.ts.map +1 -0
  66. package/dist/cjs/resources/list-resource.js +179 -0
  67. package/dist/cjs/resources/list-resource.js.map +1 -0
  68. package/dist/cjs/resources/media-resource.d.ts +69 -0
  69. package/dist/cjs/resources/media-resource.d.ts.map +1 -0
  70. package/dist/cjs/resources/media-resource.js +210 -0
  71. package/dist/cjs/resources/media-resource.js.map +1 -0
  72. package/dist/cjs/resources/media-type-resource.d.ts +70 -0
  73. package/dist/cjs/resources/media-type-resource.d.ts.map +1 -0
  74. package/dist/cjs/resources/media-type-resource.js +195 -0
  75. package/dist/cjs/resources/media-type-resource.js.map +1 -0
  76. package/dist/cjs/resources/navigation-resource.d.ts +664 -0
  77. package/dist/cjs/resources/navigation-resource.d.ts.map +1 -0
  78. package/dist/cjs/resources/navigation-resource.js +2349 -0
  79. package/dist/cjs/resources/navigation-resource.js.map +1 -0
  80. package/dist/cjs/resources/page-layout-resource.d.ts +83 -0
  81. package/dist/cjs/resources/page-layout-resource.d.ts.map +1 -0
  82. package/dist/cjs/resources/page-layout-resource.js +214 -0
  83. package/dist/cjs/resources/page-layout-resource.js.map +1 -0
  84. package/dist/cjs/resources/user-resource.d.ts +126 -0
  85. package/dist/cjs/resources/user-resource.d.ts.map +1 -0
  86. package/dist/cjs/resources/user-resource.js +317 -0
  87. package/dist/cjs/resources/user-resource.js.map +1 -0
  88. package/dist/cjs/section-ref.d.ts +185 -0
  89. package/dist/cjs/section-ref.d.ts.map +1 -0
  90. package/dist/cjs/section-ref.js +813 -0
  91. package/dist/cjs/section-ref.js.map +1 -0
  92. package/dist/cjs/site-structure.d.ts +18 -0
  93. package/dist/cjs/site-structure.d.ts.map +1 -0
  94. package/dist/cjs/site-structure.js +57 -0
  95. package/dist/cjs/site-structure.js.map +1 -0
  96. package/dist/cjs/t4-client.d.ts +121 -0
  97. package/dist/cjs/t4-client.d.ts.map +1 -0
  98. package/dist/cjs/t4-client.js +190 -0
  99. package/dist/cjs/t4-client.js.map +1 -0
  100. package/dist/cjs/type-registry.d.ts +31 -0
  101. package/dist/cjs/type-registry.d.ts.map +1 -0
  102. package/dist/cjs/type-registry.js +76 -0
  103. package/dist/cjs/type-registry.js.map +1 -0
  104. package/dist/cjs/types.d.ts +211 -0
  105. package/dist/cjs/types.d.ts.map +1 -0
  106. package/dist/cjs/types.js +3 -0
  107. package/dist/cjs/types.js.map +1 -0
  108. package/dist/cjs/utils.d.ts +147 -0
  109. package/dist/cjs/utils.d.ts.map +1 -0
  110. package/dist/cjs/utils.js +408 -0
  111. package/dist/cjs/utils.js.map +1 -0
  112. package/dist/esm/element-resolver.d.ts +115 -0
  113. package/dist/esm/element-resolver.d.ts.map +1 -0
  114. package/dist/esm/element-resolver.js +387 -0
  115. package/dist/esm/element-resolver.js.map +1 -0
  116. package/dist/esm/errors.d.ts +21 -0
  117. package/dist/esm/errors.d.ts.map +1 -0
  118. package/dist/esm/errors.js +17 -0
  119. package/dist/esm/errors.js.map +1 -0
  120. package/dist/esm/handlebars.d.ts +123 -0
  121. package/dist/esm/handlebars.d.ts.map +1 -0
  122. package/dist/esm/handlebars.js +300 -0
  123. package/dist/esm/handlebars.js.map +1 -0
  124. package/dist/esm/http-client.d.ts +21 -0
  125. package/dist/esm/http-client.d.ts.map +1 -0
  126. package/dist/esm/http-client.js +122 -0
  127. package/dist/esm/http-client.js.map +1 -0
  128. package/dist/esm/index.d.ts +37 -0
  129. package/dist/esm/index.d.ts.map +1 -0
  130. package/dist/esm/index.js +26 -0
  131. package/dist/esm/index.js.map +1 -0
  132. package/dist/esm/media-category-ref.d.ts +78 -0
  133. package/dist/esm/media-category-ref.d.ts.map +1 -0
  134. package/dist/esm/media-category-ref.js +180 -0
  135. package/dist/esm/media-category-ref.js.map +1 -0
  136. package/dist/esm/media-library.d.ts +30 -0
  137. package/dist/esm/media-library.d.ts.map +1 -0
  138. package/dist/esm/media-library.js +73 -0
  139. package/dist/esm/media-library.js.map +1 -0
  140. package/dist/esm/models/content-item.d.ts +80 -0
  141. package/dist/esm/models/content-item.d.ts.map +1 -0
  142. package/dist/esm/models/content-item.js +676 -0
  143. package/dist/esm/models/content-item.js.map +1 -0
  144. package/dist/esm/models/media-category-item.d.ts +29 -0
  145. package/dist/esm/models/media-category-item.d.ts.map +1 -0
  146. package/dist/esm/models/media-category-item.js +29 -0
  147. package/dist/esm/models/media-category-item.js.map +1 -0
  148. package/dist/esm/models/media-item.d.ts +74 -0
  149. package/dist/esm/models/media-item.d.ts.map +1 -0
  150. package/dist/esm/models/media-item.js +184 -0
  151. package/dist/esm/models/media-item.js.map +1 -0
  152. package/dist/esm/models/section-item.d.ts +58 -0
  153. package/dist/esm/models/section-item.d.ts.map +1 -0
  154. package/dist/esm/models/section-item.js +162 -0
  155. package/dist/esm/models/section-item.js.map +1 -0
  156. package/dist/esm/resources/channel-resource.d.ts +112 -0
  157. package/dist/esm/resources/channel-resource.d.ts.map +1 -0
  158. package/dist/esm/resources/channel-resource.js +102 -0
  159. package/dist/esm/resources/channel-resource.js.map +1 -0
  160. package/dist/esm/resources/content-resource.d.ts +50 -0
  161. package/dist/esm/resources/content-resource.d.ts.map +1 -0
  162. package/dist/esm/resources/content-resource.js +282 -0
  163. package/dist/esm/resources/content-resource.js.map +1 -0
  164. package/dist/esm/resources/content-type-resource.d.ts +283 -0
  165. package/dist/esm/resources/content-type-resource.d.ts.map +1 -0
  166. package/dist/esm/resources/content-type-resource.js +964 -0
  167. package/dist/esm/resources/content-type-resource.js.map +1 -0
  168. package/dist/esm/resources/group-resource.d.ts +96 -0
  169. package/dist/esm/resources/group-resource.d.ts.map +1 -0
  170. package/dist/esm/resources/group-resource.js +208 -0
  171. package/dist/esm/resources/group-resource.js.map +1 -0
  172. package/dist/esm/resources/list-resource.d.ts +111 -0
  173. package/dist/esm/resources/list-resource.d.ts.map +1 -0
  174. package/dist/esm/resources/list-resource.js +174 -0
  175. package/dist/esm/resources/list-resource.js.map +1 -0
  176. package/dist/esm/resources/media-resource.d.ts +69 -0
  177. package/dist/esm/resources/media-resource.d.ts.map +1 -0
  178. package/dist/esm/resources/media-resource.js +206 -0
  179. package/dist/esm/resources/media-resource.js.map +1 -0
  180. package/dist/esm/resources/media-type-resource.d.ts +70 -0
  181. package/dist/esm/resources/media-type-resource.d.ts.map +1 -0
  182. package/dist/esm/resources/media-type-resource.js +190 -0
  183. package/dist/esm/resources/media-type-resource.js.map +1 -0
  184. package/dist/esm/resources/navigation-resource.d.ts +664 -0
  185. package/dist/esm/resources/navigation-resource.d.ts.map +1 -0
  186. package/dist/esm/resources/navigation-resource.js +2344 -0
  187. package/dist/esm/resources/navigation-resource.js.map +1 -0
  188. package/dist/esm/resources/page-layout-resource.d.ts +83 -0
  189. package/dist/esm/resources/page-layout-resource.d.ts.map +1 -0
  190. package/dist/esm/resources/page-layout-resource.js +209 -0
  191. package/dist/esm/resources/page-layout-resource.js.map +1 -0
  192. package/dist/esm/resources/user-resource.d.ts +126 -0
  193. package/dist/esm/resources/user-resource.d.ts.map +1 -0
  194. package/dist/esm/resources/user-resource.js +312 -0
  195. package/dist/esm/resources/user-resource.js.map +1 -0
  196. package/dist/esm/section-ref.d.ts +185 -0
  197. package/dist/esm/section-ref.d.ts.map +1 -0
  198. package/dist/esm/section-ref.js +808 -0
  199. package/dist/esm/section-ref.js.map +1 -0
  200. package/dist/esm/site-structure.d.ts +18 -0
  201. package/dist/esm/site-structure.d.ts.map +1 -0
  202. package/dist/esm/site-structure.js +53 -0
  203. package/dist/esm/site-structure.js.map +1 -0
  204. package/dist/esm/t4-client.d.ts +121 -0
  205. package/dist/esm/t4-client.d.ts.map +1 -0
  206. package/dist/esm/t4-client.js +186 -0
  207. package/dist/esm/t4-client.js.map +1 -0
  208. package/dist/esm/type-registry.d.ts +31 -0
  209. package/dist/esm/type-registry.d.ts.map +1 -0
  210. package/dist/esm/type-registry.js +72 -0
  211. package/dist/esm/type-registry.js.map +1 -0
  212. package/dist/esm/types.d.ts +211 -0
  213. package/dist/esm/types.d.ts.map +1 -0
  214. package/dist/esm/types.js +2 -0
  215. package/dist/esm/types.js.map +1 -0
  216. package/dist/esm/utils.d.ts +147 -0
  217. package/dist/esm/utils.d.ts.map +1 -0
  218. package/dist/esm/utils.js +355 -0
  219. package/dist/esm/utils.js.map +1 -0
  220. package/docs/channels.md +62 -0
  221. package/docs/content-types.md +313 -0
  222. package/docs/content.md +199 -0
  223. package/docs/error-handling.md +86 -0
  224. package/docs/getting-started.md +146 -0
  225. package/docs/groups-and-users.md +167 -0
  226. package/docs/handlebars.md +145 -0
  227. package/docs/lists.md +98 -0
  228. package/docs/media-types.md +111 -0
  229. package/docs/media.md +169 -0
  230. package/docs/navigation/a-to-z.md +62 -0
  231. package/docs/navigation/breadcrumbs.md +67 -0
  232. package/docs/navigation/css-selector.md +53 -0
  233. package/docs/navigation/generate-file.md +48 -0
  234. package/docs/navigation/keyword-search.md +134 -0
  235. package/docs/navigation/language-switcher.md +37 -0
  236. package/docs/navigation/link-menu.md +105 -0
  237. package/docs/navigation/pagination.md +80 -0
  238. package/docs/navigation/previous-next-fulltext.md +43 -0
  239. package/docs/navigation/publish-to-one-file.md +93 -0
  240. package/docs/navigation/related-content.md +79 -0
  241. package/docs/navigation/related-section-branch.md +31 -0
  242. package/docs/navigation/return-to-index.md +35 -0
  243. package/docs/navigation/section-details.md +51 -0
  244. package/docs/navigation/section-iterator.md +33 -0
  245. package/docs/navigation/section-meta-info.md +39 -0
  246. package/docs/navigation/site-map.md +58 -0
  247. package/docs/navigation/top-content.md +80 -0
  248. package/docs/navigation/top-stories.md +47 -0
  249. package/docs/navigation.md +134 -0
  250. package/docs/page-layouts.md +71 -0
  251. package/docs/sections.md +224 -0
  252. package/docs/typescript.md +124 -0
  253. package/package.json +64 -0
@@ -0,0 +1,391 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ElementResolver = void 0;
4
+ const utils_js_1 = require("./utils.js");
5
+ /** Checks if a value is a SectionContentLinkInput */
6
+ function isSectionContentLinkInput(value) {
7
+ return (value !== null &&
8
+ typeof value === 'object' &&
9
+ 'sectionId' in value);
10
+ }
11
+ /** Checks if a value is a FileInput object (has a `file` property) */
12
+ function isFileInput(value) {
13
+ return (value !== null &&
14
+ typeof value === 'object' &&
15
+ 'file' in value);
16
+ }
17
+ /** Checks if a value is a MediaElementUpload */
18
+ function isMediaElementUpload(value) {
19
+ return (value !== null &&
20
+ typeof value === 'object' &&
21
+ 'file' in value &&
22
+ 'name' in value &&
23
+ 'category' in value);
24
+ }
25
+ /**
26
+ * Resolves developer-friendly field values to T4 API element format.
27
+ * Handles list lookups, date conversion, repeater building, etc.
28
+ */
29
+ class ElementResolver {
30
+ constructor(httpClient, _defaultLanguage, typeRegistry, mediaCreateFn) {
31
+ this.listCache = new utils_js_1.TtlMap();
32
+ this.httpClient = httpClient;
33
+ this.typeRegistry = typeRegistry;
34
+ this.mediaCreateFn = mediaCreateFn ?? null;
35
+ }
36
+ /**
37
+ * Resolves a single field value based on its element type.
38
+ * Uses the TypeRegistry to look up type names instead of hardcoded IDs.
39
+ */
40
+ async resolveValue(value, element, language, allElements, context) {
41
+ const typeName = await this.typeRegistry.getNameById(element.type);
42
+ switch (typeName) {
43
+ case 'Plain Text':
44
+ return value;
45
+ case 'HTML':
46
+ return this.revertHtmlSsLinks(value, language, context);
47
+ case 'Image':
48
+ case 'File':
49
+ return this.resolveFileUpload(value, element);
50
+ case 'Date':
51
+ return this.resolveDate(value);
52
+ case 'Check Box':
53
+ case 'Multiple Select':
54
+ return this.resolveCheckbox(value, element.listId, language, element.alias || element.name);
55
+ case 'Select Box':
56
+ return this.resolveSingleList(value, element.listId, language, element.alias || element.name);
57
+ case 'Radio Button':
58
+ return this.resolveSingleList(value, element.listId, language, element.alias || element.name);
59
+ case 'Cascading List':
60
+ return this.resolveCascadingList(value, element.listId, language, element.alias || element.name);
61
+ case 'Media':
62
+ if (isMediaElementUpload(value)) {
63
+ if (!this.mediaCreateFn) {
64
+ throw new Error('Inline media upload is not available. Pass a media ID instead.');
65
+ }
66
+ const mediaId = await this.mediaCreateFn(value);
67
+ return String(mediaId);
68
+ }
69
+ return String(value);
70
+ case 'Decimal Number':
71
+ return value;
72
+ case 'Whole Number':
73
+ return value;
74
+ case 'Section/Content Link':
75
+ return this.resolveSectionContentLink(value, language, context);
76
+ case 'Multi-select List':
77
+ return this.resolveMultiSelect(value, element.listId, language, element.alias || element.name);
78
+ case 'Content Owner':
79
+ return String(value);
80
+ case 'Group Select':
81
+ return this.resolveGroupSelect(value);
82
+ case 'Keyword Selector':
83
+ return this.resolveKeywordSelector(value, element.listId, language);
84
+ case 'Repeater':
85
+ return value; // handled separately in buildElements
86
+ default:
87
+ return value;
88
+ }
89
+ }
90
+ // ── List fetching ──
91
+ async getList(listId, language) {
92
+ const cached = this.listCache.get(listId);
93
+ if (cached)
94
+ return cached;
95
+ const list = await this.httpClient.request({
96
+ method: 'GET',
97
+ path: `/list/${listId}/${language}?override=false`,
98
+ });
99
+ this.listCache.set(listId, list);
100
+ return list;
101
+ }
102
+ async resolveItemName(name, listId, language, elementName, allowFreeText = false) {
103
+ // Already in listId:itemId format
104
+ if (/^\d+:\d+$/.test(name))
105
+ return name;
106
+ const list = await this.getList(listId, language);
107
+ const item = list.items.find((i) => i.name.toLowerCase() === name.toLowerCase());
108
+ if (!item) {
109
+ // Keyword selectors allow free text values that aren't in the list
110
+ if (allowFreeText)
111
+ return name;
112
+ const validNames = list.items.map((i) => `"${i.name}"`).join(', ');
113
+ const fieldContext = elementName ? ` for field "${elementName}"` : '';
114
+ throw new Error(`Invalid list value "${name}"${fieldContext}. Valid options are: ${validNames}`);
115
+ }
116
+ return `${list.id}:${item.id}`;
117
+ }
118
+ // ── Type resolvers ──
119
+ resolveDate(value) {
120
+ if (value instanceof Date)
121
+ return value.getTime();
122
+ if (typeof value === 'number')
123
+ return value;
124
+ if (typeof value === 'string')
125
+ return new Date(value).getTime();
126
+ return 0;
127
+ }
128
+ /** Select Box, Radio Button — single list value: "listId:itemId" */
129
+ async resolveSingleList(value, listId, language, elementName) {
130
+ return this.resolveItemName(String(value), listId, language, elementName);
131
+ }
132
+ /** Checkbox, Multiple Select — "listId:id1,id2" */
133
+ async resolveCheckbox(value, listId, language, elementName) {
134
+ const items = Array.isArray(value) ? value : [value];
135
+ const list = await this.getList(listId, language);
136
+ const ids = [];
137
+ for (const item of items) {
138
+ const str = String(item);
139
+ const found = list.items.find((i) => i.name.toLowerCase() === str.toLowerCase());
140
+ if (!found) {
141
+ const validNames = list.items.map((i) => `"${i.name}"`).join(', ');
142
+ const fieldContext = elementName ? ` for field "${elementName}"` : '';
143
+ throw new Error(`Invalid list value "${str}"${fieldContext}. Valid options are: ${validNames}`);
144
+ }
145
+ ids.push(found.id);
146
+ }
147
+ return ids.length > 0 ? `${list.id}:${ids.join(',')}` : '';
148
+ }
149
+ /** Multi-Select — "listId:id1;listId:id2" */
150
+ async resolveMultiSelect(value, listId, language, elementName) {
151
+ const items = Array.isArray(value) ? value : [value];
152
+ const list = await this.getList(listId, language);
153
+ const parts = [];
154
+ for (const item of items) {
155
+ const str = String(item);
156
+ const found = list.items.find((i) => i.name.toLowerCase() === str.toLowerCase());
157
+ if (!found) {
158
+ const validNames = list.items.map((i) => `"${i.name}"`).join(', ');
159
+ const fieldContext = elementName ? ` for field "${elementName}"` : '';
160
+ throw new Error(`Invalid list value "${str}"${fieldContext}. Valid options are: ${validNames}`);
161
+ }
162
+ parts.push(`${list.id}:${found.id}`);
163
+ }
164
+ return parts.join(';');
165
+ }
166
+ /** Cascading List — "listId1:itemId1, listId2:itemId2" */
167
+ async resolveCascadingList(value, listId, language, elementName) {
168
+ const items = Array.isArray(value) ? value : [value];
169
+ const parts = [];
170
+ let currentListId = listId;
171
+ for (const item of items) {
172
+ const str = String(item);
173
+ if (/^\d+:\d+$/.test(str)) {
174
+ parts.push(str);
175
+ const list = await this.getList(currentListId, language);
176
+ const matched = list.items.find((i) => `${list.id}:${i.id}` === str);
177
+ if (matched && matched.sublist)
178
+ currentListId = matched.sublist;
179
+ continue;
180
+ }
181
+ const list = await this.getList(currentListId, language);
182
+ const found = list.items.find((i) => i.name.toLowerCase() === str.toLowerCase());
183
+ if (!found) {
184
+ const validNames = list.items.map((i) => `"${i.name}"`).join(', ');
185
+ const fieldContext = elementName ? ` for field "${elementName}"` : '';
186
+ throw new Error(`Invalid cascading list value "${str}"${fieldContext}. Valid options at this level are: ${validNames}`);
187
+ }
188
+ parts.push(`${list.id}:${found.id}`);
189
+ if (found.sublist)
190
+ currentListId = found.sublist;
191
+ }
192
+ return parts.join(', ');
193
+ }
194
+ /** Group Select — comma-separated group IDs */
195
+ resolveGroupSelect(value) {
196
+ if (Array.isArray(value))
197
+ return value.join(',');
198
+ return String(value);
199
+ }
200
+ /** Keyword Selector — OR items comma-separated, AND groups with && */
201
+ async resolveKeywordSelector(value, listId, language) {
202
+ // If it's a plain string, pass through (already formatted or simple free text)
203
+ if (typeof value === 'string')
204
+ return value;
205
+ const input = value;
206
+ if (!input?.or)
207
+ return String(value);
208
+ const parts = [];
209
+ for (const item of input.or) {
210
+ if (typeof item === 'string') {
211
+ // Single OR item — resolve from list or pass as free text
212
+ parts.push(await this.resolveItemName(item, listId, language, undefined, true));
213
+ }
214
+ else if (item && typeof item === 'object' && 'and' in item) {
215
+ // AND group — resolve each item and join with &&
216
+ const andParts = [];
217
+ for (const andItem of item.and) {
218
+ andParts.push(await this.resolveItemName(andItem, listId, language, undefined, true));
219
+ }
220
+ parts.push(andParts.join('&&'));
221
+ }
222
+ }
223
+ return parts.join(',');
224
+ }
225
+ /** File/Image — upload file via POST /upload/ and return element value */
226
+ async resolveFileUpload(value, element) {
227
+ // If already in the API format (has code property), pass through
228
+ if (value && typeof value === 'object' && 'code' in value) {
229
+ return value;
230
+ }
231
+ // If it's just a file path string, wrap it as FileInput
232
+ if (typeof value === 'string' && !value.startsWith('{')) {
233
+ value = { file: value };
234
+ }
235
+ if (!isFileInput(value))
236
+ return value;
237
+ const filename = (0, utils_js_1.deriveFilename)(value);
238
+ const blob = await (0, utils_js_1.resolveFileToBlob)(value.file);
239
+ const formData = new FormData();
240
+ formData.append('file', blob, filename);
241
+ formData.append('filename', filename);
242
+ formData.append('elementID', String(element.id));
243
+ const response = await this.httpClient.request({
244
+ method: 'POST',
245
+ path: '/upload/',
246
+ multipart: true,
247
+ formData,
248
+ });
249
+ return {
250
+ existingFile: false,
251
+ code: response.code,
252
+ preferredFilename: response.name,
253
+ };
254
+ }
255
+ /** Section/Content Link — create SS record and return T4 tag */
256
+ async resolveSectionContentLink(value, language, context) {
257
+ // Already a T4 tag string — pass through
258
+ if (typeof value === 'string')
259
+ return value;
260
+ if (!isSectionContentLinkInput(value) || !context)
261
+ return String(value ?? '');
262
+ const toSectionId = value.sectionId;
263
+ const toContentId = value.contentId ?? 0;
264
+ // Get the target section's path and name
265
+ const targetSection = await this.httpClient.request({
266
+ method: 'GET',
267
+ path: `/hierarchy/${toSectionId}/${language}`,
268
+ });
269
+ // Build link text: use provided, or content name, or section name
270
+ let linkText = value.linkText;
271
+ if (!linkText) {
272
+ if (toContentId) {
273
+ // Fetch content name
274
+ const content = await this.httpClient.request({
275
+ method: 'GET',
276
+ path: `/content/${toSectionId}/${toContentId}/${language}`,
277
+ });
278
+ linkText = content.name;
279
+ }
280
+ else {
281
+ linkText = targetSection.name;
282
+ }
283
+ }
284
+ // Build path — append content name for content links
285
+ let path = targetSection.path || targetSection.name;
286
+ if (toContentId && linkText) {
287
+ path = `${path} » ${linkText}`;
288
+ }
289
+ // Create the SS record
290
+ const sslResponse = await this.httpClient.request({
291
+ method: 'PUT',
292
+ path: '/ssl',
293
+ body: {
294
+ useDefaultLinkText: false,
295
+ fromSection: context.fromSectionId,
296
+ toSection: toSectionId,
297
+ fromContent: context.fromContentId,
298
+ toContent: toContentId,
299
+ linkText,
300
+ language,
301
+ toLanguage: language,
302
+ attributes: null,
303
+ path,
304
+ active: true,
305
+ },
306
+ });
307
+ return `<t4 sslink_id="${sslResponse.id}" type="sslink" />`;
308
+ }
309
+ /**
310
+ * Reverts friendly anchor elements in HTML back to T4 SS link tags.
311
+ * - Existing links (data-t4-sslink="39") → `<t4 type="sslink" sslink_id="39"/>`
312
+ * - New links (no data-t4-sslink or data-t4-sslink="new") → creates SS record via PUT /ssl, then inserts the tag
313
+ */
314
+ async revertHtmlSsLinks(value, language, context) {
315
+ if (typeof value !== 'string')
316
+ return value;
317
+ // Quick check — if no data-section-id attribute, pass through unchanged
318
+ if (!value.includes('data-section-id'))
319
+ return value;
320
+ const regex = new RegExp(ElementResolver.SSLINK_ANCHOR_REGEX.source, ElementResolver.SSLINK_ANCHOR_REGEX.flags);
321
+ const matches = [];
322
+ let match;
323
+ while ((match = regex.exec(value)) !== null) {
324
+ const full = match[0];
325
+ const innerText = match[2];
326
+ const sectionId = parseInt(match[1], 10);
327
+ // Extract data-t4-sslink, data-content-id, and data-linktext from the tag
328
+ const sslIdMatch = full.match(/data-t4-sslink="([^"]*)"/);
329
+ const contentMatch = full.match(/data-content-id="(\d+)"/);
330
+ const linkTextMatch = full.match(/data-linktext="([^"]*)"/);
331
+ // data-linktext takes priority (even if empty string) over inner text
332
+ const linkText = linkTextMatch !== null ? linkTextMatch[1] : innerText;
333
+ matches.push({
334
+ full,
335
+ sslId: sslIdMatch ? sslIdMatch[1] : '',
336
+ linkText,
337
+ sectionId,
338
+ contentId: contentMatch ? parseInt(contentMatch[1], 10) : 0,
339
+ });
340
+ }
341
+ if (matches.length === 0)
342
+ return value;
343
+ // Process each match
344
+ let result = value;
345
+ for (const { full, sslId, linkText, sectionId, contentId } of matches) {
346
+ let t4Tag;
347
+ if (sslId && sslId !== 'new' && /^\d+$/.test(sslId)) {
348
+ // Existing SS link — just revert to T4 tag with the known ID
349
+ t4Tag = `<t4 type="sslink" sslink_id="${sslId}"/>`;
350
+ }
351
+ else if (context && sectionId) {
352
+ // New SS link — create the SS record
353
+ const targetSection = await this.httpClient.request({
354
+ method: 'GET',
355
+ path: `/hierarchy/${sectionId}/${language}`,
356
+ });
357
+ const path = contentId && linkText
358
+ ? `${targetSection.path || targetSection.name} &raquo; ${linkText}`
359
+ : targetSection.path || targetSection.name;
360
+ const sslResponse = await this.httpClient.request({
361
+ method: 'PUT',
362
+ path: '/ssl',
363
+ body: {
364
+ useDefaultLinkText: false,
365
+ fromSection: context.fromSectionId,
366
+ toSection: sectionId,
367
+ fromContent: context.fromContentId,
368
+ toContent: contentId,
369
+ linkText,
370
+ language,
371
+ toLanguage: language,
372
+ attributes: null,
373
+ path,
374
+ active: true,
375
+ },
376
+ });
377
+ t4Tag = `<t4 type="sslink" sslink_id="${sslResponse.id}"/>`;
378
+ }
379
+ else {
380
+ // No context to create — leave as-is (shouldn't happen in normal flow)
381
+ continue;
382
+ }
383
+ result = result.replace(full, t4Tag);
384
+ }
385
+ return result;
386
+ }
387
+ }
388
+ exports.ElementResolver = ElementResolver;
389
+ /** Regex to match anchor tags that are SS link markers (have data-section-id attribute) */
390
+ ElementResolver.SSLINK_ANCHOR_REGEX = /<a\s+[^>]*data-section-id="(\d+)"[^>]*>([^<]*)<\/a>/gi;
391
+ //# sourceMappingURL=element-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"element-resolver.js","sourceRoot":"","sources":["../../src/element-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Error class for T4 API errors.
3
+ * Thrown when the API returns a non-ok HTTP response or a network error occurs.
4
+ */
5
+ export declare class T4ApiError extends Error {
6
+ readonly statusCode: number;
7
+ readonly statusText: string;
8
+ readonly responseBody: unknown;
9
+ readonly requestUrl: string;
10
+ readonly requestMethod: string;
11
+ constructor(params: {
12
+ statusCode: number;
13
+ statusText: string;
14
+ responseBody: unknown;
15
+ requestUrl: string;
16
+ requestMethod: string;
17
+ /** The original error that caused this API error (e.g. network failure). */
18
+ cause?: Error;
19
+ });
20
+ }
21
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,UAAW,SAAQ,KAAK;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;gBAEnB,MAAM,EAAE;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,OAAO,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC;QACnB,aAAa,EAAE,MAAM,CAAC;QACtB,4EAA4E;QAC5E,KAAK,CAAC,EAAE,KAAK,CAAC;KACf;CAUF"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.T4ApiError = void 0;
4
+ /**
5
+ * Error class for T4 API errors.
6
+ * Thrown when the API returns a non-ok HTTP response or a network error occurs.
7
+ */
8
+ class T4ApiError extends Error {
9
+ constructor(params) {
10
+ const message = `T4 API error: ${params.requestMethod} ${params.requestUrl} responded with ${params.statusCode} ${params.statusText}`;
11
+ super(message, params.cause ? { cause: params.cause } : undefined);
12
+ this.name = 'T4ApiError';
13
+ this.statusCode = params.statusCode;
14
+ this.statusText = params.statusText;
15
+ this.responseBody = params.responseBody;
16
+ this.requestUrl = params.requestUrl;
17
+ this.requestMethod = params.requestMethod;
18
+ }
19
+ }
20
+ exports.T4ApiError = T4ApiError;
21
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,MAAa,UAAW,SAAQ,KAAK;IAOnC,YAAY,MAQX;QACC,MAAM,OAAO,GAAG,iBAAiB,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,UAAU,mBAAmB,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtI,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACnE,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QACpC,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QACpC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QACxC,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QACpC,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;IAC5C,CAAC;CACF;AAzBD,gCAyBC"}
@@ -0,0 +1,123 @@
1
+ import { HttpClient } from './http-client.js';
2
+ import { ContentDTO } from './types.js';
3
+ /** Summary returned from list() */
4
+ export interface HandlebarsItemSummary {
5
+ id: number;
6
+ name: string;
7
+ lastModified: Date | null;
8
+ }
9
+ /** Configuration for a handlebars content resource (helpers or partials) */
10
+ interface HandlebarsResourceConfig {
11
+ /** Config endpoint path for the section ID (e.g. '/config/handlebars.helpersSectionId') */
12
+ sectionIdConfigPath: string;
13
+ /** Config option name for the section ID (e.g. 'handlebars.helpersSectionId') */
14
+ sectionIdOptionName: string;
15
+ /** Config endpoint path for the content type ID */
16
+ contentTypeIdConfigPath: string;
17
+ /** Config option name for the content type ID */
18
+ contentTypeIdOptionName: string;
19
+ /** The element name that holds the code (e.g. 'function code' or 'code') */
20
+ codeElementName: string;
21
+ /** Display name for error messages (e.g. 'Helper' or 'Partial') */
22
+ displayName: string;
23
+ }
24
+ /**
25
+ * A mutable Handlebars item (helper or partial).
26
+ * Modify `name` and/or `code`, then call `save()` to persist.
27
+ * All saves are automatically set to approved status.
28
+ */
29
+ export declare class HandlebarsItem {
30
+ readonly id: number;
31
+ name: string;
32
+ code: string;
33
+ readonly lastModified: Date | null;
34
+ private readonly _httpClient;
35
+ private readonly _sectionId;
36
+ private readonly _language;
37
+ private readonly _codeElementName;
38
+ private _rawDTO;
39
+ constructor(dto: ContentDTO, httpClient: HttpClient, sectionId: number, language: string, codeElementName: string);
40
+ /**
41
+ * Persists changes to name and/or code back to the server.
42
+ * Always saves with approved status.
43
+ */
44
+ save(): Promise<void>;
45
+ /** Extracts the code value from the raw elements map */
46
+ private extractCode;
47
+ }
48
+ /**
49
+ * Generic resource for managing Handlebars content items (helpers or partials).
50
+ * Both share the same pattern: content in a hidden section with name + code fields.
51
+ */
52
+ export declare class HandlebarsContentResource {
53
+ private readonly httpClient;
54
+ private readonly config;
55
+ private sectionIdPromise;
56
+ private sectionIdExpiresAt;
57
+ private sectionIdEpoch;
58
+ private contentTypeIdPromise;
59
+ private contentTypeIdExpiresAt;
60
+ private contentTypeIdEpoch;
61
+ constructor(httpClient: HttpClient, config: HandlebarsResourceConfig);
62
+ /** Fetches and caches the section ID */
63
+ private getSectionId;
64
+ /** Fetches and caches the content type ID */
65
+ private getContentTypeId;
66
+ /**
67
+ * Lists all items (summaries only: id, name, lastModified).
68
+ */
69
+ list(): Promise<HandlebarsItemSummary[]>;
70
+ /**
71
+ * Resolves a name or ID to a numeric content ID.
72
+ * If a string is passed, lists all items and finds by name.
73
+ * Throws if the name is not found or if multiple items share the same name.
74
+ */
75
+ private resolveId;
76
+ /**
77
+ * Retrieves a single item by name or ID. Returns a mutable HandlebarsItem.
78
+ */
79
+ get(nameOrId: string | number): Promise<HandlebarsItem>;
80
+ /**
81
+ * Creates a new item. Always created as approved.
82
+ * Throws if an item with the same name already exists.
83
+ * Returns a mutable HandlebarsItem.
84
+ */
85
+ create(data: {
86
+ name: string;
87
+ code: string;
88
+ }): Promise<HandlebarsItem>;
89
+ /**
90
+ * Updates an item's name and/or code (immutable pattern).
91
+ * Accepts a name or ID. Fetches existing, merges changes, saves. Always approved.
92
+ */
93
+ update(nameOrId: string | number, data: {
94
+ name?: string;
95
+ code?: string;
96
+ }): Promise<HandlebarsItem>;
97
+ /**
98
+ * Deletes an item by name or ID (soft delete — sets to inactive).
99
+ */
100
+ delete(nameOrId: string | number): Promise<void>;
101
+ /**
102
+ * Permanently removes an item by name or ID.
103
+ */
104
+ purge(nameOrId: string | number): Promise<void>;
105
+ }
106
+ /** A mutable Handlebars Custom Helper (alias for HandlebarsItem) */
107
+ export type Helper = HandlebarsItem;
108
+ /** A mutable Handlebars Partial (alias for HandlebarsItem) */
109
+ export type Partial = HandlebarsItem;
110
+ /** Summary returned from helpers.list() */
111
+ export type HelperSummary = HandlebarsItemSummary;
112
+ /** Summary returned from partials.list() */
113
+ export type PartialSummary = HandlebarsItemSummary;
114
+ /**
115
+ * The `t4.handlebars` namespace — provides access to helpers and partials.
116
+ */
117
+ export declare class Handlebars {
118
+ readonly helpers: HandlebarsContentResource;
119
+ readonly partials: HandlebarsContentResource;
120
+ constructor(httpClient: HttpClient);
121
+ }
122
+ export {};
123
+ //# sourceMappingURL=handlebars.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlebars.d.ts","sourceRoot":"","sources":["../../src/handlebars.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAQxC,mCAAmC;AACnC,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,IAAI,GAAG,IAAI,CAAC;CAC3B;AAaD,4EAA4E;AAC5E,UAAU,wBAAwB;IAChC,2FAA2F;IAC3F,mBAAmB,EAAE,MAAM,CAAC;IAC5B,iFAAiF;IACjF,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mDAAmD;IACnD,uBAAuB,EAAE,MAAM,CAAC;IAChC,iDAAiD;IACjD,uBAAuB,EAAE,MAAM,CAAC;IAChC,4EAA4E;IAC5E,eAAe,EAAE,MAAM,CAAC;IACxB,mEAAmE;IACnE,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,qBAAa,cAAc;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,YAAY,EAAE,IAAI,GAAG,IAAI,CAAC;IAEnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAU;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAU;IACpC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAU;IAC3C,OAAO,CAAC,OAAO,CAAc;gBAEjB,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM;IAejH;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA4C3B,wDAAwD;IACxD,OAAO,CAAC,WAAW;CAQpB;AAED;;;GAGG;AACH,qBAAa,yBAAyB;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2B;IAGlD,OAAO,CAAC,gBAAgB,CAAgC;IACxD,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,cAAc,CAAM;IAE5B,OAAO,CAAC,oBAAoB,CAAgC;IAC5D,OAAO,CAAC,sBAAsB,CAAK;IACnC,OAAO,CAAC,kBAAkB,CAAM;gBAEpB,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,wBAAwB;IAKpE,wCAAwC;IACxC,OAAO,CAAC,YAAY;IAiBpB,6CAA6C;IAC7C,OAAO,CAAC,gBAAgB;IAiBxB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAgB9C;;;;OAIG;YACW,SAAS;IAqBvB;;OAEG;IACG,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAa7D;;;;OAIG;IACG,MAAM,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,cAAc,CAAC;IAiE3E;;;OAGG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,IAAI,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,cAAc,CAAC;IAQxG;;OAEG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWtD;;OAEG;IACG,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAatD;AAID,oEAAoE;AACpE,MAAM,MAAM,MAAM,GAAG,cAAc,CAAC;AACpC,8DAA8D;AAC9D,MAAM,MAAM,OAAO,GAAG,cAAc,CAAC;AAErC,2CAA2C;AAC3C,MAAM,MAAM,aAAa,GAAG,qBAAqB,CAAC;AAClD,4CAA4C;AAC5C,MAAM,MAAM,cAAc,GAAG,qBAAqB,CAAC;AAEnD;;GAEG;AACH,qBAAa,UAAU;IACrB,QAAQ,CAAC,OAAO,EAAE,yBAAyB,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,yBAAyB,CAAC;gBAEjC,UAAU,EAAE,UAAU;CAmBnC"}