@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,300 @@
1
+ import { DEFAULT_CACHE_TTL, getCacheEpoch } from './utils.js';
2
+ /**
3
+ * A mutable Handlebars item (helper or partial).
4
+ * Modify `name` and/or `code`, then call `save()` to persist.
5
+ * All saves are automatically set to approved status.
6
+ */
7
+ export class HandlebarsItem {
8
+ constructor(dto, httpClient, sectionId, language, codeElementName) {
9
+ this.id = dto.id;
10
+ this.name = dto.name;
11
+ this.lastModified = dto.lastModified ? new Date(dto.lastModified) : null;
12
+ // Extract the code field value from elements
13
+ this.code = this.extractCode(dto.elements, codeElementName) ?? '';
14
+ Object.defineProperty(this, '_httpClient', { value: httpClient, enumerable: false });
15
+ Object.defineProperty(this, '_sectionId', { value: sectionId, enumerable: false });
16
+ Object.defineProperty(this, '_language', { value: language, enumerable: false });
17
+ Object.defineProperty(this, '_codeElementName', { value: codeElementName, enumerable: false });
18
+ Object.defineProperty(this, '_rawDTO', { value: dto, enumerable: false, writable: true });
19
+ }
20
+ /**
21
+ * Persists changes to name and/or code back to the server.
22
+ * Always saves with approved status.
23
+ */
24
+ async save() {
25
+ // Update elements with current name and code
26
+ const elements = { ...this._rawDTO.elements };
27
+ for (const key of Object.keys(elements)) {
28
+ if (key.toLowerCase().startsWith('name#')) {
29
+ elements[key] = this.name;
30
+ }
31
+ else if (key.toLowerCase().startsWith(this._codeElementName + '#')) {
32
+ elements[key] = this.code;
33
+ }
34
+ }
35
+ const response = await this._httpClient.request({
36
+ method: 'POST',
37
+ path: `/content/${this._sectionId}/${this.id}/${this._language}`,
38
+ body: {
39
+ id: this.id,
40
+ contentTypeID: this._rawDTO.contentTypeID,
41
+ name: this.name,
42
+ language: this._language,
43
+ status: 0, // approved
44
+ elements,
45
+ channels: this._rawDTO.channels,
46
+ canPublishNow: true,
47
+ canSaveAndApprove: true,
48
+ publishDate: this._rawDTO.publishDate ?? null,
49
+ expiryDate: this._rawDTO.expiryDate ?? null,
50
+ reviewDate: this._rawDTO.reviewDate ?? null,
51
+ archiveSection: this._rawDTO.archiveSection ?? null,
52
+ owner: this._rawDTO.owner ?? { id: 0, type: 'USER' },
53
+ excludedMirrorSectionIds: [],
54
+ sectionIDs: [this._sectionId],
55
+ version: this._rawDTO.version,
56
+ lastModified: this._rawDTO.lastModified,
57
+ },
58
+ });
59
+ // Update internal state from response
60
+ this.id = response.id;
61
+ this.name = response.name;
62
+ this.lastModified = response.lastModified ? new Date(response.lastModified) : null;
63
+ this.code = this.extractCode(response.elements, this._codeElementName) ?? this.code;
64
+ this._rawDTO = response;
65
+ }
66
+ /** Extracts the code value from the raw elements map */
67
+ extractCode(elements, codeElementName) {
68
+ for (const [key, value] of Object.entries(elements)) {
69
+ if (key.toLowerCase().startsWith(codeElementName + '#')) {
70
+ return value ?? null;
71
+ }
72
+ }
73
+ return null;
74
+ }
75
+ }
76
+ /**
77
+ * Generic resource for managing Handlebars content items (helpers or partials).
78
+ * Both share the same pattern: content in a hidden section with name + code fields.
79
+ */
80
+ export class HandlebarsContentResource {
81
+ constructor(httpClient, config) {
82
+ // Cached config values
83
+ this.sectionIdPromise = null;
84
+ this.sectionIdExpiresAt = 0;
85
+ this.sectionIdEpoch = -1;
86
+ this.contentTypeIdPromise = null;
87
+ this.contentTypeIdExpiresAt = 0;
88
+ this.contentTypeIdEpoch = -1;
89
+ this.httpClient = httpClient;
90
+ this.config = config;
91
+ }
92
+ /** Fetches and caches the section ID */
93
+ getSectionId() {
94
+ if (!this.sectionIdPromise || Date.now() > this.sectionIdExpiresAt || this.sectionIdEpoch < getCacheEpoch()) {
95
+ this.sectionIdExpiresAt = Date.now() + DEFAULT_CACHE_TTL;
96
+ this.sectionIdEpoch = getCacheEpoch();
97
+ this.sectionIdPromise = this.httpClient.request({
98
+ method: 'POST',
99
+ path: this.config.sectionIdConfigPath,
100
+ body: {},
101
+ }).then((res) => {
102
+ const opt = res.options.find((o) => o.name === this.config.sectionIdOptionName);
103
+ if (!opt)
104
+ throw new Error(`Could not resolve ${this.config.displayName.toLowerCase()} section ID from config`);
105
+ return Number(opt.value);
106
+ });
107
+ }
108
+ return this.sectionIdPromise;
109
+ }
110
+ /** Fetches and caches the content type ID */
111
+ getContentTypeId() {
112
+ if (!this.contentTypeIdPromise || Date.now() > this.contentTypeIdExpiresAt || this.contentTypeIdEpoch < getCacheEpoch()) {
113
+ this.contentTypeIdExpiresAt = Date.now() + DEFAULT_CACHE_TTL;
114
+ this.contentTypeIdEpoch = getCacheEpoch();
115
+ this.contentTypeIdPromise = this.httpClient.request({
116
+ method: 'POST',
117
+ path: this.config.contentTypeIdConfigPath,
118
+ body: {},
119
+ }).then((res) => {
120
+ const opt = res.options.find((o) => o.name === this.config.contentTypeIdOptionName);
121
+ if (!opt)
122
+ throw new Error(`Could not resolve ${this.config.displayName.toLowerCase()} content type ID from config`);
123
+ return Number(opt.value);
124
+ });
125
+ }
126
+ return this.contentTypeIdPromise;
127
+ }
128
+ /**
129
+ * Lists all items (summaries only: id, name, lastModified).
130
+ */
131
+ async list() {
132
+ const sectionId = await this.getSectionId();
133
+ const language = 'en';
134
+ const response = await this.httpClient.request({
135
+ method: 'GET',
136
+ path: `/hierarchy/${sectionId}/${language}/contents?showAll=false&removeNonTranslated=false`,
137
+ });
138
+ return (response.children ?? []).map((child) => ({
139
+ id: child.content.id,
140
+ name: child.content.name,
141
+ lastModified: child.content.lastModified ? new Date(child.content.lastModified) : null,
142
+ }));
143
+ }
144
+ /**
145
+ * Resolves a name or ID to a numeric content ID.
146
+ * If a string is passed, lists all items and finds by name.
147
+ * Throws if the name is not found or if multiple items share the same name.
148
+ */
149
+ async resolveId(nameOrId) {
150
+ if (typeof nameOrId === 'number')
151
+ return nameOrId;
152
+ const items = await this.list();
153
+ const matches = items.filter((item) => item.name === nameOrId);
154
+ if (matches.length === 0) {
155
+ const available = items.map((i) => `"${i.name}"`).join(', ');
156
+ throw new Error(`${this.config.displayName} "${nameOrId}" not found. Available: ${available}`);
157
+ }
158
+ if (matches.length > 1) {
159
+ throw new Error(`Multiple ${this.config.displayName.toLowerCase()}s found with name "${nameOrId}" (IDs: ${matches.map((m) => m.id).join(', ')}). Use an ID instead.`);
160
+ }
161
+ return matches[0].id;
162
+ }
163
+ /**
164
+ * Retrieves a single item by name or ID. Returns a mutable HandlebarsItem.
165
+ */
166
+ async get(nameOrId) {
167
+ const id = await this.resolveId(nameOrId);
168
+ const sectionId = await this.getSectionId();
169
+ const language = 'en';
170
+ const dto = await this.httpClient.request({
171
+ method: 'GET',
172
+ path: `/content/${sectionId}/${id}/${language}`,
173
+ });
174
+ return new HandlebarsItem(dto, this.httpClient, sectionId, language, this.config.codeElementName);
175
+ }
176
+ /**
177
+ * Creates a new item. Always created as approved.
178
+ * Throws if an item with the same name already exists.
179
+ * Returns a mutable HandlebarsItem.
180
+ */
181
+ async create(data) {
182
+ if (!data.name?.trim())
183
+ throw new Error(`${this.config.displayName} name is required`);
184
+ if (!data.code?.trim())
185
+ throw new Error(`${this.config.displayName} code is required`);
186
+ // Check for duplicate names
187
+ const existing = await this.list();
188
+ const duplicate = existing.find((item) => item.name === data.name);
189
+ if (duplicate) {
190
+ throw new Error(`A ${this.config.displayName.toLowerCase()} named "${data.name}" already exists (ID: ${duplicate.id})`);
191
+ }
192
+ const [sectionId, contentTypeId] = await Promise.all([
193
+ this.getSectionId(),
194
+ this.getContentTypeId(),
195
+ ]);
196
+ const language = 'en';
197
+ // Fetch the content type template to get element keys
198
+ const template = await this.httpClient.request({
199
+ method: 'GET',
200
+ path: `/content/type/${contentTypeId}/${sectionId}`,
201
+ });
202
+ const elements = {};
203
+ for (const el of template.contentType.contentTypeElements) {
204
+ const key = `${el.name}#${el.id}:${el.type}`;
205
+ if (el.name.toLowerCase() === 'name') {
206
+ elements[key] = data.name;
207
+ }
208
+ else if (el.name.toLowerCase() === this.config.codeElementName) {
209
+ elements[key] = data.code;
210
+ }
211
+ }
212
+ const contentId = -Math.floor(Math.random() * 1000000);
213
+ const dto = await this.httpClient.request({
214
+ method: 'POST',
215
+ path: `/content/${sectionId}/${language}`,
216
+ body: {
217
+ id: contentId,
218
+ contentTypeID: contentTypeId,
219
+ name: data.name,
220
+ language,
221
+ status: 0, // approved
222
+ elements,
223
+ channels: template.channels,
224
+ canPublishNow: true,
225
+ canSaveAndApprove: true,
226
+ publishDate: null,
227
+ expiryDate: null,
228
+ reviewDate: null,
229
+ archiveSection: null,
230
+ owner: { id: 0, type: 'USER' },
231
+ excludedMirrorSectionIds: [],
232
+ },
233
+ });
234
+ return new HandlebarsItem(dto, this.httpClient, sectionId, language, this.config.codeElementName);
235
+ }
236
+ /**
237
+ * Updates an item's name and/or code (immutable pattern).
238
+ * Accepts a name or ID. Fetches existing, merges changes, saves. Always approved.
239
+ */
240
+ async update(nameOrId, data) {
241
+ const item = await this.get(nameOrId);
242
+ if (data.name !== undefined)
243
+ item.name = data.name;
244
+ if (data.code !== undefined)
245
+ item.code = data.code;
246
+ await item.save();
247
+ return item;
248
+ }
249
+ /**
250
+ * Deletes an item by name or ID (soft delete — sets to inactive).
251
+ */
252
+ async delete(nameOrId) {
253
+ const id = await this.resolveId(nameOrId);
254
+ const sectionId = await this.getSectionId();
255
+ const language = 'en';
256
+ await this.httpClient.request({
257
+ method: 'DELETE',
258
+ path: `/content/${sectionId}/${id}/${language}`,
259
+ });
260
+ }
261
+ /**
262
+ * Permanently removes an item by name or ID.
263
+ */
264
+ async purge(nameOrId) {
265
+ const id = await this.resolveId(nameOrId);
266
+ const language = 'en';
267
+ await this.httpClient.request({
268
+ method: 'POST',
269
+ path: '/content/purge',
270
+ body: {
271
+ languageCode: language,
272
+ contentIds: [String(id)],
273
+ },
274
+ });
275
+ }
276
+ }
277
+ /**
278
+ * The `t4.handlebars` namespace — provides access to helpers and partials.
279
+ */
280
+ export class Handlebars {
281
+ constructor(httpClient) {
282
+ this.helpers = new HandlebarsContentResource(httpClient, {
283
+ sectionIdConfigPath: '/config/handlebars.helpersSectionId',
284
+ sectionIdOptionName: 'handlebars.helpersSectionId',
285
+ contentTypeIdConfigPath: '/config/handlebars.helpersContentTypeId',
286
+ contentTypeIdOptionName: 'handlebars.helpersContentTypeId',
287
+ codeElementName: 'function code',
288
+ displayName: 'Helper',
289
+ });
290
+ this.partials = new HandlebarsContentResource(httpClient, {
291
+ sectionIdConfigPath: '/config/handlebars.partialsSectionId',
292
+ sectionIdOptionName: 'handlebars.partialsSectionId',
293
+ contentTypeIdConfigPath: '/config/handlebars.partialsContentTypeId',
294
+ contentTypeIdOptionName: 'handlebars.partialsContentTypeId',
295
+ codeElementName: 'code',
296
+ displayName: 'Partial',
297
+ });
298
+ }
299
+ }
300
+ //# sourceMappingURL=handlebars.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlebars.js","sourceRoot":"","sources":["../../src/handlebars.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { HttpRequestOptions } from './types.js';
2
+ /**
3
+ * Internal HTTP client that handles authentication, URL construction,
4
+ * content-type headers, JSON/multipart encoding, error wrapping,
5
+ * and concurrency limiting.
6
+ */
7
+ export declare class HttpClient {
8
+ private readonly baseUrl;
9
+ private readonly apiToken;
10
+ private readonly maxConcurrency;
11
+ private inFlight;
12
+ private waitQueue;
13
+ constructor(baseUrl: string, apiToken: string, concurrency?: number);
14
+ request<T>(options: HttpRequestOptions): Promise<T>;
15
+ /** Waits until a concurrency slot is available */
16
+ private acquireSlot;
17
+ /** Releases a concurrency slot and wakes the next waiter */
18
+ private releaseSlot;
19
+ private executeRequest;
20
+ }
21
+ //# sourceMappingURL=http-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../../src/http-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAOhD;;;;GAIG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,SAAS,CAAyB;gBAE9B,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;IAM7D,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IASzD,kDAAkD;IAClD,OAAO,CAAC,WAAW;IAanB,4DAA4D;IAC5D,OAAO,CAAC,WAAW;YAML,cAAc;CA4E7B"}
@@ -0,0 +1,122 @@
1
+ import { T4ApiError } from './errors.js';
2
+ import { debugWarn } from './utils.js';
3
+ /** Default maximum concurrent requests */
4
+ const DEFAULT_CONCURRENCY = 10;
5
+ /**
6
+ * Internal HTTP client that handles authentication, URL construction,
7
+ * content-type headers, JSON/multipart encoding, error wrapping,
8
+ * and concurrency limiting.
9
+ */
10
+ export class HttpClient {
11
+ constructor(baseUrl, apiToken, concurrency) {
12
+ this.inFlight = 0;
13
+ this.waitQueue = [];
14
+ this.baseUrl = baseUrl;
15
+ this.apiToken = apiToken;
16
+ this.maxConcurrency = concurrency ?? DEFAULT_CONCURRENCY;
17
+ }
18
+ async request(options) {
19
+ await this.acquireSlot();
20
+ try {
21
+ return await this.executeRequest(options);
22
+ }
23
+ finally {
24
+ this.releaseSlot();
25
+ }
26
+ }
27
+ /** Waits until a concurrency slot is available */
28
+ acquireSlot() {
29
+ if (this.inFlight < this.maxConcurrency) {
30
+ this.inFlight++;
31
+ return Promise.resolve();
32
+ }
33
+ return new Promise((resolve) => {
34
+ this.waitQueue.push(() => {
35
+ this.inFlight++;
36
+ resolve();
37
+ });
38
+ });
39
+ }
40
+ /** Releases a concurrency slot and wakes the next waiter */
41
+ releaseSlot() {
42
+ this.inFlight--;
43
+ const next = this.waitQueue.shift();
44
+ if (next)
45
+ next();
46
+ }
47
+ async executeRequest(options) {
48
+ const url = this.baseUrl + options.path;
49
+ const headers = {
50
+ Authorization: this.apiToken,
51
+ Accept: 'application/json',
52
+ ...options.headers,
53
+ };
54
+ let body;
55
+ if (options.multipart && options.formData) {
56
+ // Let the runtime set Content-Type with the correct boundary
57
+ body = options.formData;
58
+ }
59
+ else if (options.headers?.['Content-Type']?.includes('x-www-form-urlencoded') && typeof options.body === 'string') {
60
+ // Form-encoded body — pass through as-is, Content-Type already set in headers
61
+ body = options.body;
62
+ }
63
+ else {
64
+ headers['Content-Type'] = 'application/json;charset=UTF-8';
65
+ if (options.body !== undefined) {
66
+ body = JSON.stringify(options.body);
67
+ }
68
+ }
69
+ let response;
70
+ try {
71
+ // Debug logging when T4_DEBUG env var is set
72
+ if (typeof process !== 'undefined' && process.env?.T4_DEBUG === '1') {
73
+ console.log(`\n[DEBUG] ${options.method} ${url}`);
74
+ if (body && typeof body === 'string') {
75
+ console.log('[DEBUG] Body:', body.substring(0, 3000));
76
+ }
77
+ }
78
+ response = await fetch(url, {
79
+ method: options.method,
80
+ headers,
81
+ body,
82
+ });
83
+ }
84
+ catch (error) {
85
+ throw new T4ApiError({
86
+ statusCode: 0,
87
+ statusText: 'Network Error',
88
+ responseBody: error instanceof Error ? error.message : String(error),
89
+ requestUrl: url,
90
+ requestMethod: options.method,
91
+ cause: error instanceof Error ? error : undefined,
92
+ });
93
+ }
94
+ if (!response.ok) {
95
+ let responseBody;
96
+ try {
97
+ responseBody = await response.json();
98
+ }
99
+ catch {
100
+ responseBody = await response.text().catch(() => null);
101
+ }
102
+ throw new T4ApiError({
103
+ statusCode: response.status,
104
+ statusText: response.statusText,
105
+ responseBody,
106
+ requestUrl: url,
107
+ requestMethod: options.method,
108
+ });
109
+ }
110
+ const text = await response.text();
111
+ if (!text)
112
+ return undefined;
113
+ try {
114
+ return JSON.parse(text);
115
+ }
116
+ catch {
117
+ debugWarn(`Response from ${options.method} ${options.path} is not valid JSON, returning raw text`);
118
+ return text;
119
+ }
120
+ }
121
+ }
122
+ //# sourceMappingURL=http-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../src/http-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ export { T4Client } from './t4-client.js';
2
+ export { T4ApiError } from './errors.js';
3
+ export { ContentItem } from './models/content-item.js';
4
+ export { SectionItem } from './models/section-item.js';
5
+ export { MediaItem } from './models/media-item.js';
6
+ export type { MediaFileInput } from './models/media-item.js';
7
+ export { ContentType } from './resources/content-type-resource.js';
8
+ export { Layout } from './resources/content-type-resource.js';
9
+ export type { ListSummary, ListItemData } from './resources/list-resource.js';
10
+ export { List } from './resources/list-resource.js';
11
+ export type { GroupData, GroupMember } from './resources/group-resource.js';
12
+ export { Group } from './resources/group-resource.js';
13
+ export type { UserData } from './resources/user-resource.js';
14
+ export type { AuthMethods, AuthMethodValue } from './resources/user-resource.js';
15
+ export { User } from './resources/user-resource.js';
16
+ export type { PageLayoutSummary } from './resources/page-layout-resource.js';
17
+ export { PageLayout } from './resources/page-layout-resource.js';
18
+ export type { MediaTypeLayout, MediaTypeData } from './resources/media-type-resource.js';
19
+ export { MediaType, MediaTypeResource } from './resources/media-type-resource.js';
20
+ export type { NavigationType, NavigationSummary, CreateNavigationData, UpdateNavigationData } from './resources/navigation-resource.js';
21
+ export { NavigationResource, NavigationObject, NAVIGATION_TYPE_NAMES } from './resources/navigation-resource.js';
22
+ export { ChannelResource, Channel } from './resources/channel-resource.js';
23
+ export type { ChannelSummary, ChannelLanguage, Microsite } from './resources/channel-resource.js';
24
+ export { Handlebars, HandlebarsItem, HandlebarsContentResource } from './handlebars.js';
25
+ export type { HandlebarsItemSummary, HelperSummary, PartialSummary, Helper, Partial } from './handlebars.js';
26
+ export { SectionRef } from './section-ref.js';
27
+ export type { SectionTreeNode } from './section-ref.js';
28
+ export { SiteStructure } from './site-structure.js';
29
+ export { MediaCategoryRef } from './media-category-ref.js';
30
+ export { MediaCategoryItem } from './models/media-category-item.js';
31
+ export { MediaLibrary } from './media-library.js';
32
+ export type { MediaCategoryNode } from './media-library.js';
33
+ export type { MediaListItem } from './media-category-ref.js';
34
+ export type { T4ClientConfig, LanguageOption, ContentDTO, ContentTypeData, ContentTypeFieldDef, HierarchyNode, GetTreeOptions, AddSectionData, Owner, DateInput, CreateContentData, UpdateContentData, } from './types.js';
35
+ export type { SectionContentLinkInput, MediaElementUpload } from './element-resolver.js';
36
+ export type { FileInput } from './utils.js';
37
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG1C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,YAAY,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,sCAAsC,CAAC;AAC9D,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,IAAI,EAAE,MAAM,8BAA8B,CAAC;AACpD,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AACtD,YAAY,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAC7D,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACjF,OAAO,EAAE,IAAI,EAAE,MAAM,8BAA8B,CAAC;AACpD,YAAY,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AACjE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACzF,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAClF,YAAY,EAAE,cAAc,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AACxI,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AACjH,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAC3E,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAClG,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AACxF,YAAY,EAAE,qBAAqB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAG7G,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,YAAY,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAG7D,YAAY,EACV,cAAc,EACd,cAAc,EACd,UAAU,EACV,eAAe,EACf,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,cAAc,EACd,KAAK,EACL,SAAS,EACT,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAGpB,YAAY,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAGzF,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,26 @@
1
+ // Main client
2
+ export { T4Client } from './t4-client.js';
3
+ // Error class
4
+ export { T4ApiError } from './errors.js';
5
+ // Models
6
+ export { ContentItem } from './models/content-item.js';
7
+ export { SectionItem } from './models/section-item.js';
8
+ export { MediaItem } from './models/media-item.js';
9
+ export { ContentType } from './resources/content-type-resource.js';
10
+ export { Layout } from './resources/content-type-resource.js';
11
+ export { List } from './resources/list-resource.js';
12
+ export { Group } from './resources/group-resource.js';
13
+ export { User } from './resources/user-resource.js';
14
+ export { PageLayout } from './resources/page-layout-resource.js';
15
+ export { MediaType, MediaTypeResource } from './resources/media-type-resource.js';
16
+ export { NavigationResource, NavigationObject, NAVIGATION_TYPE_NAMES } from './resources/navigation-resource.js';
17
+ export { ChannelResource, Channel } from './resources/channel-resource.js';
18
+ export { Handlebars, HandlebarsItem, HandlebarsContentResource } from './handlebars.js';
19
+ // Section reference
20
+ export { SectionRef } from './section-ref.js';
21
+ export { SiteStructure } from './site-structure.js';
22
+ // Media category reference
23
+ export { MediaCategoryRef } from './media-category-ref.js';
24
+ export { MediaCategoryItem } from './models/media-category-item.js';
25
+ export { MediaLibrary } from './media-library.js';
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc;AACd,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,cAAc;AACd,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,SAAS;AACT,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,sCAAsC,CAAC;AAE9D,OAAO,EAAE,IAAI,EAAE,MAAM,8BAA8B,CAAC;AAEpD,OAAO,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AAGtD,OAAO,EAAE,IAAI,EAAE,MAAM,8BAA8B,CAAC;AAEpD,OAAO,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AAEjE,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAElF,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AACjH,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAE3E,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAGxF,oBAAoB;AACpB,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,2BAA2B;AAC3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,78 @@
1
+ import { HttpClient } from './http-client.js';
2
+ import { LanguageOption } from './types.js';
3
+ import { MediaCategoryItem } from './models/media-category-item.js';
4
+ /** A media item as returned from the category list endpoint */
5
+ export interface MediaListItem {
6
+ id: number;
7
+ name: string;
8
+ description: string;
9
+ fileName: string;
10
+ fileSize: string;
11
+ mediaType: string;
12
+ language: string;
13
+ version: string;
14
+ status: string;
15
+ lastModified: Date | null;
16
+ }
17
+ /**
18
+ * A media category reference scoped to a specific category ID.
19
+ * Provides listing of media items within the category.
20
+ *
21
+ * Usage: `t4.mediaCategory(367).list()`
22
+ */
23
+ export declare class MediaCategoryRef {
24
+ private readonly httpClient;
25
+ private readonly categoryId;
26
+ constructor(httpClient: HttpClient, categoryId: number);
27
+ /**
28
+ * Returns a mutable media category object. Modify properties and call save() to persist.
29
+ */
30
+ get(options?: LanguageOption): Promise<MediaCategoryItem>;
31
+ /**
32
+ * Lists direct child categories (one level below).
33
+ */
34
+ subcategories(options?: LanguageOption): Promise<Array<{
35
+ id: number;
36
+ name: string;
37
+ lastModified: Date | null;
38
+ }>>;
39
+ /**
40
+ * Updates this media category's name. Fetches the current category,
41
+ * merges the change, and PUTs the full body back.
42
+ * Returns the updated MediaCategoryItem.
43
+ */
44
+ update(data: {
45
+ name: string;
46
+ }, options?: LanguageOption): Promise<MediaCategoryItem>;
47
+ /**
48
+ * Deletes this media category.
49
+ */
50
+ delete(): Promise<void>;
51
+ /**
52
+ * Permanently removes this media category.
53
+ * Call delete() first to deactivate it, then purge() to remove it entirely.
54
+ */
55
+ purge(options?: LanguageOption): Promise<void>;
56
+ /**
57
+ * Moves this media category under a new parent category.
58
+ */
59
+ move(newParentId: number, options?: LanguageOption): Promise<void>;
60
+ /**
61
+ * Creates a child media category under this category.
62
+ * Returns the created child as a mutable MediaCategoryItem.
63
+ */
64
+ addCategory(data: {
65
+ name: string;
66
+ }, options?: LanguageOption): Promise<MediaCategoryItem>;
67
+ /**
68
+ * Lists all media items in this category.
69
+ * Fetches all items in a single request (up to 10000).
70
+ */
71
+ list(options?: LanguageOption): Promise<MediaListItem[]>;
72
+ /**
73
+ * Builds the DataTables form body for the list endpoint.
74
+ * Uses a minimal column definition and requests all items.
75
+ */
76
+ private buildListFormBody;
77
+ }
78
+ //# sourceMappingURL=media-category-ref.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-category-ref.d.ts","sourceRoot":"","sources":["../../src/media-category-ref.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAapE,+DAA+D;AAC/D,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,IAAI,GAAG,IAAI,CAAC;CAC3B;AA4BD;;;;;GAKG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM;IAKtD;;OAEG;IACG,GAAG,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAS/D;;OAEG;IACG,aAAa,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,IAAI,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;IAatH;;;;OAIG;IACG,MAAM,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAwB1F;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAO7B;;;OAGG;IACG,KAAK,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAYpD;;OAEG;IACG,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IASxE;;;OAGG;IACG,WAAW,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA2B/F;;;OAGG;IACG,IAAI,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IA4B9D;;;OAGG;IACH,OAAO,CAAC,iBAAiB;CAyB1B"}