@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.
- package/LICENSE.md +106 -0
- package/README.md +169 -0
- package/dist/cjs/element-resolver.d.ts +115 -0
- package/dist/cjs/element-resolver.d.ts.map +1 -0
- package/dist/cjs/element-resolver.js +391 -0
- package/dist/cjs/element-resolver.js.map +1 -0
- package/dist/cjs/errors.d.ts +21 -0
- package/dist/cjs/errors.d.ts.map +1 -0
- package/dist/cjs/errors.js +21 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/handlebars.d.ts +123 -0
- package/dist/cjs/handlebars.d.ts.map +1 -0
- package/dist/cjs/handlebars.js +306 -0
- package/dist/cjs/handlebars.js.map +1 -0
- package/dist/cjs/http-client.d.ts +21 -0
- package/dist/cjs/http-client.d.ts.map +1 -0
- package/dist/cjs/http-client.js +126 -0
- package/dist/cjs/http-client.js.map +1 -0
- package/dist/cjs/index.d.ts +37 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +55 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/media-category-ref.d.ts +78 -0
- package/dist/cjs/media-category-ref.d.ts.map +1 -0
- package/dist/cjs/media-category-ref.js +184 -0
- package/dist/cjs/media-category-ref.js.map +1 -0
- package/dist/cjs/media-library.d.ts +30 -0
- package/dist/cjs/media-library.d.ts.map +1 -0
- package/dist/cjs/media-library.js +77 -0
- package/dist/cjs/media-library.js.map +1 -0
- package/dist/cjs/models/content-item.d.ts +80 -0
- package/dist/cjs/models/content-item.d.ts.map +1 -0
- package/dist/cjs/models/content-item.js +682 -0
- package/dist/cjs/models/content-item.js.map +1 -0
- package/dist/cjs/models/media-category-item.d.ts +29 -0
- package/dist/cjs/models/media-category-item.d.ts.map +1 -0
- package/dist/cjs/models/media-category-item.js +33 -0
- package/dist/cjs/models/media-category-item.js.map +1 -0
- package/dist/cjs/models/media-item.d.ts +74 -0
- package/dist/cjs/models/media-item.d.ts.map +1 -0
- package/dist/cjs/models/media-item.js +188 -0
- package/dist/cjs/models/media-item.js.map +1 -0
- package/dist/cjs/models/section-item.d.ts +58 -0
- package/dist/cjs/models/section-item.d.ts.map +1 -0
- package/dist/cjs/models/section-item.js +166 -0
- package/dist/cjs/models/section-item.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/resources/channel-resource.d.ts +112 -0
- package/dist/cjs/resources/channel-resource.d.ts.map +1 -0
- package/dist/cjs/resources/channel-resource.js +107 -0
- package/dist/cjs/resources/channel-resource.js.map +1 -0
- package/dist/cjs/resources/content-resource.d.ts +50 -0
- package/dist/cjs/resources/content-resource.d.ts.map +1 -0
- package/dist/cjs/resources/content-resource.js +286 -0
- package/dist/cjs/resources/content-resource.js.map +1 -0
- package/dist/cjs/resources/content-type-resource.d.ts +283 -0
- package/dist/cjs/resources/content-type-resource.d.ts.map +1 -0
- package/dist/cjs/resources/content-type-resource.js +970 -0
- package/dist/cjs/resources/content-type-resource.js.map +1 -0
- package/dist/cjs/resources/group-resource.d.ts +96 -0
- package/dist/cjs/resources/group-resource.d.ts.map +1 -0
- package/dist/cjs/resources/group-resource.js +213 -0
- package/dist/cjs/resources/group-resource.js.map +1 -0
- package/dist/cjs/resources/list-resource.d.ts +111 -0
- package/dist/cjs/resources/list-resource.d.ts.map +1 -0
- package/dist/cjs/resources/list-resource.js +179 -0
- package/dist/cjs/resources/list-resource.js.map +1 -0
- package/dist/cjs/resources/media-resource.d.ts +69 -0
- package/dist/cjs/resources/media-resource.d.ts.map +1 -0
- package/dist/cjs/resources/media-resource.js +210 -0
- package/dist/cjs/resources/media-resource.js.map +1 -0
- package/dist/cjs/resources/media-type-resource.d.ts +70 -0
- package/dist/cjs/resources/media-type-resource.d.ts.map +1 -0
- package/dist/cjs/resources/media-type-resource.js +195 -0
- package/dist/cjs/resources/media-type-resource.js.map +1 -0
- package/dist/cjs/resources/navigation-resource.d.ts +664 -0
- package/dist/cjs/resources/navigation-resource.d.ts.map +1 -0
- package/dist/cjs/resources/navigation-resource.js +2349 -0
- package/dist/cjs/resources/navigation-resource.js.map +1 -0
- package/dist/cjs/resources/page-layout-resource.d.ts +83 -0
- package/dist/cjs/resources/page-layout-resource.d.ts.map +1 -0
- package/dist/cjs/resources/page-layout-resource.js +214 -0
- package/dist/cjs/resources/page-layout-resource.js.map +1 -0
- package/dist/cjs/resources/user-resource.d.ts +126 -0
- package/dist/cjs/resources/user-resource.d.ts.map +1 -0
- package/dist/cjs/resources/user-resource.js +317 -0
- package/dist/cjs/resources/user-resource.js.map +1 -0
- package/dist/cjs/section-ref.d.ts +185 -0
- package/dist/cjs/section-ref.d.ts.map +1 -0
- package/dist/cjs/section-ref.js +813 -0
- package/dist/cjs/section-ref.js.map +1 -0
- package/dist/cjs/site-structure.d.ts +18 -0
- package/dist/cjs/site-structure.d.ts.map +1 -0
- package/dist/cjs/site-structure.js +57 -0
- package/dist/cjs/site-structure.js.map +1 -0
- package/dist/cjs/t4-client.d.ts +121 -0
- package/dist/cjs/t4-client.d.ts.map +1 -0
- package/dist/cjs/t4-client.js +190 -0
- package/dist/cjs/t4-client.js.map +1 -0
- package/dist/cjs/type-registry.d.ts +31 -0
- package/dist/cjs/type-registry.d.ts.map +1 -0
- package/dist/cjs/type-registry.js +76 -0
- package/dist/cjs/type-registry.js.map +1 -0
- package/dist/cjs/types.d.ts +211 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +3 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/cjs/utils.d.ts +147 -0
- package/dist/cjs/utils.d.ts.map +1 -0
- package/dist/cjs/utils.js +408 -0
- package/dist/cjs/utils.js.map +1 -0
- package/dist/esm/element-resolver.d.ts +115 -0
- package/dist/esm/element-resolver.d.ts.map +1 -0
- package/dist/esm/element-resolver.js +387 -0
- package/dist/esm/element-resolver.js.map +1 -0
- package/dist/esm/errors.d.ts +21 -0
- package/dist/esm/errors.d.ts.map +1 -0
- package/dist/esm/errors.js +17 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/handlebars.d.ts +123 -0
- package/dist/esm/handlebars.d.ts.map +1 -0
- package/dist/esm/handlebars.js +300 -0
- package/dist/esm/handlebars.js.map +1 -0
- package/dist/esm/http-client.d.ts +21 -0
- package/dist/esm/http-client.d.ts.map +1 -0
- package/dist/esm/http-client.js +122 -0
- package/dist/esm/http-client.js.map +1 -0
- package/dist/esm/index.d.ts +37 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +26 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/media-category-ref.d.ts +78 -0
- package/dist/esm/media-category-ref.d.ts.map +1 -0
- package/dist/esm/media-category-ref.js +180 -0
- package/dist/esm/media-category-ref.js.map +1 -0
- package/dist/esm/media-library.d.ts +30 -0
- package/dist/esm/media-library.d.ts.map +1 -0
- package/dist/esm/media-library.js +73 -0
- package/dist/esm/media-library.js.map +1 -0
- package/dist/esm/models/content-item.d.ts +80 -0
- package/dist/esm/models/content-item.d.ts.map +1 -0
- package/dist/esm/models/content-item.js +676 -0
- package/dist/esm/models/content-item.js.map +1 -0
- package/dist/esm/models/media-category-item.d.ts +29 -0
- package/dist/esm/models/media-category-item.d.ts.map +1 -0
- package/dist/esm/models/media-category-item.js +29 -0
- package/dist/esm/models/media-category-item.js.map +1 -0
- package/dist/esm/models/media-item.d.ts +74 -0
- package/dist/esm/models/media-item.d.ts.map +1 -0
- package/dist/esm/models/media-item.js +184 -0
- package/dist/esm/models/media-item.js.map +1 -0
- package/dist/esm/models/section-item.d.ts +58 -0
- package/dist/esm/models/section-item.d.ts.map +1 -0
- package/dist/esm/models/section-item.js +162 -0
- package/dist/esm/models/section-item.js.map +1 -0
- package/dist/esm/resources/channel-resource.d.ts +112 -0
- package/dist/esm/resources/channel-resource.d.ts.map +1 -0
- package/dist/esm/resources/channel-resource.js +102 -0
- package/dist/esm/resources/channel-resource.js.map +1 -0
- package/dist/esm/resources/content-resource.d.ts +50 -0
- package/dist/esm/resources/content-resource.d.ts.map +1 -0
- package/dist/esm/resources/content-resource.js +282 -0
- package/dist/esm/resources/content-resource.js.map +1 -0
- package/dist/esm/resources/content-type-resource.d.ts +283 -0
- package/dist/esm/resources/content-type-resource.d.ts.map +1 -0
- package/dist/esm/resources/content-type-resource.js +964 -0
- package/dist/esm/resources/content-type-resource.js.map +1 -0
- package/dist/esm/resources/group-resource.d.ts +96 -0
- package/dist/esm/resources/group-resource.d.ts.map +1 -0
- package/dist/esm/resources/group-resource.js +208 -0
- package/dist/esm/resources/group-resource.js.map +1 -0
- package/dist/esm/resources/list-resource.d.ts +111 -0
- package/dist/esm/resources/list-resource.d.ts.map +1 -0
- package/dist/esm/resources/list-resource.js +174 -0
- package/dist/esm/resources/list-resource.js.map +1 -0
- package/dist/esm/resources/media-resource.d.ts +69 -0
- package/dist/esm/resources/media-resource.d.ts.map +1 -0
- package/dist/esm/resources/media-resource.js +206 -0
- package/dist/esm/resources/media-resource.js.map +1 -0
- package/dist/esm/resources/media-type-resource.d.ts +70 -0
- package/dist/esm/resources/media-type-resource.d.ts.map +1 -0
- package/dist/esm/resources/media-type-resource.js +190 -0
- package/dist/esm/resources/media-type-resource.js.map +1 -0
- package/dist/esm/resources/navigation-resource.d.ts +664 -0
- package/dist/esm/resources/navigation-resource.d.ts.map +1 -0
- package/dist/esm/resources/navigation-resource.js +2344 -0
- package/dist/esm/resources/navigation-resource.js.map +1 -0
- package/dist/esm/resources/page-layout-resource.d.ts +83 -0
- package/dist/esm/resources/page-layout-resource.d.ts.map +1 -0
- package/dist/esm/resources/page-layout-resource.js +209 -0
- package/dist/esm/resources/page-layout-resource.js.map +1 -0
- package/dist/esm/resources/user-resource.d.ts +126 -0
- package/dist/esm/resources/user-resource.d.ts.map +1 -0
- package/dist/esm/resources/user-resource.js +312 -0
- package/dist/esm/resources/user-resource.js.map +1 -0
- package/dist/esm/section-ref.d.ts +185 -0
- package/dist/esm/section-ref.d.ts.map +1 -0
- package/dist/esm/section-ref.js +808 -0
- package/dist/esm/section-ref.js.map +1 -0
- package/dist/esm/site-structure.d.ts +18 -0
- package/dist/esm/site-structure.d.ts.map +1 -0
- package/dist/esm/site-structure.js +53 -0
- package/dist/esm/site-structure.js.map +1 -0
- package/dist/esm/t4-client.d.ts +121 -0
- package/dist/esm/t4-client.d.ts.map +1 -0
- package/dist/esm/t4-client.js +186 -0
- package/dist/esm/t4-client.js.map +1 -0
- package/dist/esm/type-registry.d.ts +31 -0
- package/dist/esm/type-registry.d.ts.map +1 -0
- package/dist/esm/type-registry.js +72 -0
- package/dist/esm/type-registry.js.map +1 -0
- package/dist/esm/types.d.ts +211 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +2 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/utils.d.ts +147 -0
- package/dist/esm/utils.d.ts.map +1 -0
- package/dist/esm/utils.js +355 -0
- package/dist/esm/utils.js.map +1 -0
- package/docs/channels.md +62 -0
- package/docs/content-types.md +313 -0
- package/docs/content.md +199 -0
- package/docs/error-handling.md +86 -0
- package/docs/getting-started.md +146 -0
- package/docs/groups-and-users.md +167 -0
- package/docs/handlebars.md +145 -0
- package/docs/lists.md +98 -0
- package/docs/media-types.md +111 -0
- package/docs/media.md +169 -0
- package/docs/navigation/a-to-z.md +62 -0
- package/docs/navigation/breadcrumbs.md +67 -0
- package/docs/navigation/css-selector.md +53 -0
- package/docs/navigation/generate-file.md +48 -0
- package/docs/navigation/keyword-search.md +134 -0
- package/docs/navigation/language-switcher.md +37 -0
- package/docs/navigation/link-menu.md +105 -0
- package/docs/navigation/pagination.md +80 -0
- package/docs/navigation/previous-next-fulltext.md +43 -0
- package/docs/navigation/publish-to-one-file.md +93 -0
- package/docs/navigation/related-content.md +79 -0
- package/docs/navigation/related-section-branch.md +31 -0
- package/docs/navigation/return-to-index.md +35 -0
- package/docs/navigation/section-details.md +51 -0
- package/docs/navigation/section-iterator.md +33 -0
- package/docs/navigation/section-meta-info.md +39 -0
- package/docs/navigation/site-map.md +58 -0
- package/docs/navigation/top-content.md +80 -0
- package/docs/navigation/top-stories.md +47 -0
- package/docs/navigation.md +134 -0
- package/docs/page-layouts.md +71 -0
- package/docs/sections.md +224 -0
- package/docs/typescript.md +124 -0
- package/package.json +64 -0
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.TtlValue = exports.TtlMap = exports.DEFAULT_CACHE_TTL = exports.AUTH_LEVEL_REVERSE = exports.AUTH_LEVEL_MAP = exports.STATUS_CODES = exports.STATUS_MAP = void 0;
|
|
37
|
+
exports.resolveLanguage = resolveLanguage;
|
|
38
|
+
exports.toTimestamp = toTimestamp;
|
|
39
|
+
exports.decodeHtmlEntities = decodeHtmlEntities;
|
|
40
|
+
exports.formatFileSize = formatFileSize;
|
|
41
|
+
exports.parseFileSize = parseFileSize;
|
|
42
|
+
exports.parseElementKey = parseElementKey;
|
|
43
|
+
exports.mapStatus = mapStatus;
|
|
44
|
+
exports.flattenGroups = flattenGroups;
|
|
45
|
+
exports.resolveFileToBlob = resolveFileToBlob;
|
|
46
|
+
exports.deriveFilename = deriveFilename;
|
|
47
|
+
exports.debugWarn = debugWarn;
|
|
48
|
+
exports.assertNotBrowser = assertNotBrowser;
|
|
49
|
+
exports.normaliseBaseUrl = normaliseBaseUrl;
|
|
50
|
+
exports.getCacheEpoch = getCacheEpoch;
|
|
51
|
+
exports.invalidateAllCaches = invalidateAllCaches;
|
|
52
|
+
/**
|
|
53
|
+
* Resolves the effective language for an API request.
|
|
54
|
+
*
|
|
55
|
+
* Resolution order:
|
|
56
|
+
* 1. Explicit per-call override
|
|
57
|
+
* 2. Client-level default language
|
|
58
|
+
* 3. Hardcoded fallback "en"
|
|
59
|
+
*/
|
|
60
|
+
function resolveLanguage(override, defaultLang) {
|
|
61
|
+
return override ?? defaultLang ?? 'en';
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Converts a DateInput (Date, timestamp in ms, or date string) to a
|
|
65
|
+
* millisecond timestamp suitable for the T4 API.
|
|
66
|
+
* Returns null if the input is null or undefined.
|
|
67
|
+
*/
|
|
68
|
+
function toTimestamp(value) {
|
|
69
|
+
if (value == null)
|
|
70
|
+
return null;
|
|
71
|
+
if (value instanceof Date)
|
|
72
|
+
return value.getTime();
|
|
73
|
+
if (typeof value === 'number')
|
|
74
|
+
return value;
|
|
75
|
+
if (typeof value === 'string') {
|
|
76
|
+
const ts = new Date(value).getTime();
|
|
77
|
+
return isNaN(ts) ? null : ts;
|
|
78
|
+
}
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
const HTML_ENTITIES = {
|
|
82
|
+
'&': '&',
|
|
83
|
+
'<': '<',
|
|
84
|
+
'>': '>',
|
|
85
|
+
'"': '"',
|
|
86
|
+
''': "'",
|
|
87
|
+
'/': '/',
|
|
88
|
+
''': "'",
|
|
89
|
+
'/': '/',
|
|
90
|
+
''': "'",
|
|
91
|
+
'»': '»',
|
|
92
|
+
};
|
|
93
|
+
const ENTITY_RE = /&#x[0-9a-fA-F]+;|&#\d+;|&\w+;/g;
|
|
94
|
+
/**
|
|
95
|
+
* Decodes HTML entities in a string.
|
|
96
|
+
* Handles named entities (&, », etc.) and numeric/hex entities (/, ').
|
|
97
|
+
*/
|
|
98
|
+
function decodeHtmlEntities(str) {
|
|
99
|
+
return str.replace(ENTITY_RE, (match) => {
|
|
100
|
+
if (HTML_ENTITIES[match])
|
|
101
|
+
return HTML_ENTITIES[match];
|
|
102
|
+
// Hex entity: &#xHH;
|
|
103
|
+
if (match.startsWith('&#x')) {
|
|
104
|
+
const code = parseInt(match.slice(3, -1), 16);
|
|
105
|
+
return isNaN(code) ? match : String.fromCharCode(code);
|
|
106
|
+
}
|
|
107
|
+
// Decimal entity: &#DD;
|
|
108
|
+
if (match.startsWith('&#')) {
|
|
109
|
+
const code = parseInt(match.slice(2, -1), 10);
|
|
110
|
+
return isNaN(code) ? match : String.fromCharCode(code);
|
|
111
|
+
}
|
|
112
|
+
return match;
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Formats a byte count into a human-readable string.
|
|
117
|
+
* Examples: "0 B", "512 B", "15.0 KB", "5.0 MB"
|
|
118
|
+
*/
|
|
119
|
+
function formatFileSize(bytes) {
|
|
120
|
+
if (bytes === 0)
|
|
121
|
+
return '0 B';
|
|
122
|
+
if (bytes < 1024)
|
|
123
|
+
return `${bytes} B`;
|
|
124
|
+
if (bytes < 1024 * 1024)
|
|
125
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
126
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Parses a human-readable file size string into bytes.
|
|
130
|
+
* Accepts: '2 KB', '5.0 MB', '512 B', '1024', etc.
|
|
131
|
+
* Returns 0 for invalid/unparseable input.
|
|
132
|
+
*/
|
|
133
|
+
function parseFileSize(input) {
|
|
134
|
+
if (input == null)
|
|
135
|
+
return 0;
|
|
136
|
+
if (typeof input === 'number')
|
|
137
|
+
return input;
|
|
138
|
+
const trimmed = input.trim().toLowerCase();
|
|
139
|
+
if (!trimmed)
|
|
140
|
+
return 0;
|
|
141
|
+
const match = trimmed.match(/^([\d.]+)\s*(b|kb|mb|gb)?$/i);
|
|
142
|
+
if (!match)
|
|
143
|
+
return 0;
|
|
144
|
+
const value = parseFloat(match[1]);
|
|
145
|
+
if (isNaN(value))
|
|
146
|
+
return 0;
|
|
147
|
+
const unit = (match[2] || 'b').toLowerCase();
|
|
148
|
+
switch (unit) {
|
|
149
|
+
case 'b': return Math.round(value);
|
|
150
|
+
case 'kb': return Math.round(value * 1024);
|
|
151
|
+
case 'mb': return Math.round(value * 1024 * 1024);
|
|
152
|
+
case 'gb': return Math.round(value * 1024 * 1024 * 1024);
|
|
153
|
+
default: return Math.round(value);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Parses a T4 element key like "Title#2:1" into its parts.
|
|
158
|
+
* Returns null if the key doesn't match the expected format.
|
|
159
|
+
*/
|
|
160
|
+
function parseElementKey(key) {
|
|
161
|
+
const match = key.match(/^(.+)#(\d+):(\d+)$/);
|
|
162
|
+
if (!match)
|
|
163
|
+
return null;
|
|
164
|
+
return { name: match[1], elementId: parseInt(match[2], 10), type: parseInt(match[3], 10) };
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Maps T4 status codes to friendly strings.
|
|
168
|
+
* Sections use 0–2; content and media also use 3 (draft).
|
|
169
|
+
*/
|
|
170
|
+
exports.STATUS_MAP = {
|
|
171
|
+
0: 'approved',
|
|
172
|
+
1: 'pending',
|
|
173
|
+
2: 'inactive',
|
|
174
|
+
3: 'draft',
|
|
175
|
+
};
|
|
176
|
+
/**
|
|
177
|
+
* Converts a numeric T4 status code to a friendly string.
|
|
178
|
+
*/
|
|
179
|
+
function mapStatus(code) {
|
|
180
|
+
return exports.STATUS_MAP[code] ?? `unknown (${code})`;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Maps friendly status strings to T4 numeric status codes.
|
|
184
|
+
* Sections use 0–2; content also uses 3 (draft).
|
|
185
|
+
*/
|
|
186
|
+
exports.STATUS_CODES = {
|
|
187
|
+
approved: 0,
|
|
188
|
+
pending: 1,
|
|
189
|
+
inactive: 2,
|
|
190
|
+
draft: 3,
|
|
191
|
+
};
|
|
192
|
+
/**
|
|
193
|
+
* Maps T4 auth level codes to friendly user level strings.
|
|
194
|
+
*/
|
|
195
|
+
exports.AUTH_LEVEL_MAP = {
|
|
196
|
+
0: 'admin',
|
|
197
|
+
40: 'power-user',
|
|
198
|
+
1: 'moderator',
|
|
199
|
+
2: 'contributor',
|
|
200
|
+
50: 'visitor',
|
|
201
|
+
};
|
|
202
|
+
/**
|
|
203
|
+
* Maps friendly user level strings to T4 auth level codes.
|
|
204
|
+
*/
|
|
205
|
+
exports.AUTH_LEVEL_REVERSE = {
|
|
206
|
+
'admin': 0,
|
|
207
|
+
'power-user': 40,
|
|
208
|
+
'moderator': 1,
|
|
209
|
+
'contributor': 2,
|
|
210
|
+
'visitor': 50,
|
|
211
|
+
};
|
|
212
|
+
/**
|
|
213
|
+
* Recursively flattens a hierarchical group tree into a flat Map of id → name.
|
|
214
|
+
*/
|
|
215
|
+
function flattenGroups(groups, map = new Map()) {
|
|
216
|
+
for (const g of groups) {
|
|
217
|
+
map.set(g.id, g.name);
|
|
218
|
+
if (Array.isArray(g.groupChildren) && g.groupChildren.length > 0) {
|
|
219
|
+
flattenGroups(g.groupChildren, map);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return map;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Resolves a file input (path, URL, Blob, or ReadableStream) to a Blob.
|
|
226
|
+
*/
|
|
227
|
+
async function resolveFileToBlob(file) {
|
|
228
|
+
if (file instanceof Blob)
|
|
229
|
+
return file;
|
|
230
|
+
if (typeof file === 'string') {
|
|
231
|
+
if (file.startsWith('https://') || file.startsWith('http://')) {
|
|
232
|
+
const response = await fetch(file);
|
|
233
|
+
if (!response.ok) {
|
|
234
|
+
throw new Error(`Failed to fetch file from ${file}: ${response.status} ${response.statusText}`);
|
|
235
|
+
}
|
|
236
|
+
return await response.blob();
|
|
237
|
+
}
|
|
238
|
+
const { readFile } = await Promise.resolve().then(() => __importStar(require('node:fs/promises')));
|
|
239
|
+
const buffer = await readFile(file);
|
|
240
|
+
return new Blob([buffer]);
|
|
241
|
+
}
|
|
242
|
+
// ReadableStream — collect into buffer
|
|
243
|
+
const chunks = [];
|
|
244
|
+
for await (const chunk of file) {
|
|
245
|
+
chunks.push(new Uint8Array(chunk));
|
|
246
|
+
}
|
|
247
|
+
return new Blob(chunks);
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Derives a filename from a file input (path, URL, Blob, ReadableStream, or { file, filename }).
|
|
251
|
+
*/
|
|
252
|
+
function deriveFilename(input) {
|
|
253
|
+
if (typeof input === 'string') {
|
|
254
|
+
if (input.startsWith('https://') || input.startsWith('http://')) {
|
|
255
|
+
try {
|
|
256
|
+
return new URL(input).pathname.split('/').pop() || 'file';
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
return 'file';
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
return input.replace(/\\/g, '/').split('/').pop() || 'file';
|
|
263
|
+
}
|
|
264
|
+
if (input instanceof Blob)
|
|
265
|
+
return 'file';
|
|
266
|
+
if (typeof input === 'object' && input !== null && 'file' in input) {
|
|
267
|
+
return input.filename
|
|
268
|
+
|| (typeof input.file === 'string' ? deriveFilename(input.file) : 'file');
|
|
269
|
+
}
|
|
270
|
+
// ReadableStream — no filename derivable
|
|
271
|
+
return 'file';
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Logs a warning message when T4_DEBUG=1 is set.
|
|
275
|
+
* Used for graceful degradation paths where errors are caught and fallback
|
|
276
|
+
* values are returned — the warning makes these visible during debugging.
|
|
277
|
+
*/
|
|
278
|
+
function debugWarn(message, error) {
|
|
279
|
+
if (typeof process !== 'undefined' && process.env?.T4_DEBUG === '1') {
|
|
280
|
+
const detail = error instanceof Error ? error.message : error ? String(error) : '';
|
|
281
|
+
console.warn(`[T4 SDK] ${message}${detail ? `: ${detail}` : ''}`);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Throws when running in a browser.
|
|
286
|
+
*
|
|
287
|
+
* The T4 API token is a full-privilege credential sent on every request. Bundling
|
|
288
|
+
* it into front-end code exposes it to anyone who opens devtools, so the SDK fails
|
|
289
|
+
* loudly at construction time — during development, when it's cheapest to fix —
|
|
290
|
+
* rather than silently shipping a leaked credential to production.
|
|
291
|
+
*
|
|
292
|
+
* There is no override. Detection deliberately requires both `window` and
|
|
293
|
+
* `window.document`, so genuine server-side runtimes without a DOM (Node, Deno,
|
|
294
|
+
* Bun, Cloudflare Workers) are unaffected.
|
|
295
|
+
*/
|
|
296
|
+
function assertNotBrowser() {
|
|
297
|
+
const isBrowser = typeof window !== 'undefined'
|
|
298
|
+
&& typeof window.document !== 'undefined';
|
|
299
|
+
if (!isBrowser)
|
|
300
|
+
return;
|
|
301
|
+
throw new Error('T4Client cannot be used in a browser. The apiToken is a full-privilege ' +
|
|
302
|
+
'credential and anything in front-end code is publicly readable, so this would ' +
|
|
303
|
+
'expose it to every visitor.\n\n' +
|
|
304
|
+
'Call the T4 API from a server you control (an API route, serverless function, ' +
|
|
305
|
+
'or backend service) and have the browser talk to that instead.');
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Validates and normalises a base URL.
|
|
309
|
+
*
|
|
310
|
+
* - Throws if the value isn't a parseable absolute URL or doesn't use http/https.
|
|
311
|
+
* - Warns when the scheme is `http:`, because every request sends the API token
|
|
312
|
+
* in an `Authorization` header and plain HTTP transmits it in cleartext.
|
|
313
|
+
* - Strips trailing slashes so `baseUrl + path` never produces a double slash.
|
|
314
|
+
*/
|
|
315
|
+
function normaliseBaseUrl(baseUrl) {
|
|
316
|
+
let parsed;
|
|
317
|
+
try {
|
|
318
|
+
parsed = new URL(baseUrl);
|
|
319
|
+
}
|
|
320
|
+
catch {
|
|
321
|
+
throw new Error(`T4Client baseUrl "${baseUrl}" is not a valid absolute URL. ` +
|
|
322
|
+
'Expected something like "https://mysite.edu/terminalfour/rs".');
|
|
323
|
+
}
|
|
324
|
+
if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') {
|
|
325
|
+
throw new Error(`T4Client baseUrl must use http or https, received "${parsed.protocol}".`);
|
|
326
|
+
}
|
|
327
|
+
if (parsed.protocol === 'http:') {
|
|
328
|
+
console.warn('[T4 SDK] baseUrl uses http:// — the API token will be sent in cleartext. ' +
|
|
329
|
+
'Use https:// unless you are testing against a local instance.');
|
|
330
|
+
}
|
|
331
|
+
return baseUrl.replace(/\/+$/, '');
|
|
332
|
+
}
|
|
333
|
+
/** Default cache TTL in milliseconds (5 minutes) */
|
|
334
|
+
exports.DEFAULT_CACHE_TTL = 5 * 60 * 1000;
|
|
335
|
+
/**
|
|
336
|
+
* Global cache epoch. Incremented by `invalidateAllCaches()` to force
|
|
337
|
+
* all TTL-based caches to treat their entries as expired. Every cache
|
|
338
|
+
* records the epoch at write time; on read, if the current epoch is
|
|
339
|
+
* higher, the entry is stale regardless of its TTL.
|
|
340
|
+
*/
|
|
341
|
+
let cacheEpoch = 0;
|
|
342
|
+
/** Returns the current cache epoch. */
|
|
343
|
+
function getCacheEpoch() {
|
|
344
|
+
return cacheEpoch;
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Bumps the global cache epoch, causing all TTL-based caches to miss
|
|
348
|
+
* on their next read. This is the mechanism behind `T4Client.clearCache()`.
|
|
349
|
+
*/
|
|
350
|
+
function invalidateAllCaches() {
|
|
351
|
+
cacheEpoch++;
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* A Map with time-to-live expiration on entries.
|
|
355
|
+
* Entries are lazily evicted on access — expired entries return undefined.
|
|
356
|
+
* Respects the global cache epoch: entries written before an epoch bump are stale.
|
|
357
|
+
*/
|
|
358
|
+
class TtlMap {
|
|
359
|
+
constructor(ttl = exports.DEFAULT_CACHE_TTL) {
|
|
360
|
+
this.entries = new Map();
|
|
361
|
+
this.ttl = ttl;
|
|
362
|
+
}
|
|
363
|
+
get(key) {
|
|
364
|
+
const entry = this.entries.get(key);
|
|
365
|
+
if (!entry)
|
|
366
|
+
return undefined;
|
|
367
|
+
if (entry.epoch < cacheEpoch || Date.now() > entry.expiresAt) {
|
|
368
|
+
this.entries.delete(key);
|
|
369
|
+
return undefined;
|
|
370
|
+
}
|
|
371
|
+
return entry.value;
|
|
372
|
+
}
|
|
373
|
+
set(key, value) {
|
|
374
|
+
this.entries.set(key, { value, expiresAt: Date.now() + this.ttl, epoch: cacheEpoch });
|
|
375
|
+
}
|
|
376
|
+
clear() {
|
|
377
|
+
this.entries.clear();
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
exports.TtlMap = TtlMap;
|
|
381
|
+
/**
|
|
382
|
+
* A single-value cache with TTL expiration.
|
|
383
|
+
* Stores a promise that resolves to the cached value.
|
|
384
|
+
* Respects the global cache epoch: entries written before an epoch bump are stale.
|
|
385
|
+
*/
|
|
386
|
+
class TtlValue {
|
|
387
|
+
constructor(ttl = exports.DEFAULT_CACHE_TTL) {
|
|
388
|
+
this.entry = null;
|
|
389
|
+
this.ttl = ttl;
|
|
390
|
+
}
|
|
391
|
+
get() {
|
|
392
|
+
if (!this.entry)
|
|
393
|
+
return undefined;
|
|
394
|
+
if (this.entry.epoch < cacheEpoch || Date.now() > this.entry.expiresAt) {
|
|
395
|
+
this.entry = null;
|
|
396
|
+
return undefined;
|
|
397
|
+
}
|
|
398
|
+
return this.entry.value;
|
|
399
|
+
}
|
|
400
|
+
set(value) {
|
|
401
|
+
this.entry = { value, expiresAt: Date.now() + this.ttl, epoch: cacheEpoch };
|
|
402
|
+
}
|
|
403
|
+
clear() {
|
|
404
|
+
this.entry = null;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
exports.TtlValue = TtlValue;
|
|
408
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { HttpClient } from './http-client.js';
|
|
2
|
+
import { TypeRegistry } from './type-registry.js';
|
|
3
|
+
/** A content type element from the template */
|
|
4
|
+
export interface TemplateElement {
|
|
5
|
+
id: number;
|
|
6
|
+
name: string;
|
|
7
|
+
alias: string;
|
|
8
|
+
type: number;
|
|
9
|
+
sequence: number;
|
|
10
|
+
listId: number;
|
|
11
|
+
maxSize?: number;
|
|
12
|
+
contentTypeElementConfiguration?: {
|
|
13
|
+
contentTypeId: number;
|
|
14
|
+
contentTypeDTO?: {
|
|
15
|
+
id: number;
|
|
16
|
+
contentTypeElements: TemplateElement[];
|
|
17
|
+
};
|
|
18
|
+
minRepeats: number;
|
|
19
|
+
maxRepeats: number;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/** List item from GET /list/{id}/{language} */
|
|
23
|
+
interface ListItem {
|
|
24
|
+
id: number;
|
|
25
|
+
name: string;
|
|
26
|
+
value: string;
|
|
27
|
+
listId: number;
|
|
28
|
+
sublist: number;
|
|
29
|
+
}
|
|
30
|
+
/** List response from GET /list/{id}/{language} */
|
|
31
|
+
interface ListResponse {
|
|
32
|
+
id: number;
|
|
33
|
+
items: ListItem[];
|
|
34
|
+
}
|
|
35
|
+
/** Keyword selector AND group */
|
|
36
|
+
interface KeywordAndGroup {
|
|
37
|
+
and: Array<string>;
|
|
38
|
+
}
|
|
39
|
+
/** Keyword selector input: array of OR items, where each item is a string or AND group */
|
|
40
|
+
export type KeywordSelectorInput = {
|
|
41
|
+
or: Array<string | KeywordAndGroup>;
|
|
42
|
+
};
|
|
43
|
+
/** Repeater item input from the developer */
|
|
44
|
+
export interface RepeaterInput {
|
|
45
|
+
name: string;
|
|
46
|
+
fields: Record<string, unknown>;
|
|
47
|
+
}
|
|
48
|
+
/** Section/Content Link input from the developer */
|
|
49
|
+
export interface SectionContentLinkInput {
|
|
50
|
+
sectionId: number;
|
|
51
|
+
contentId?: number;
|
|
52
|
+
linkText?: string;
|
|
53
|
+
}
|
|
54
|
+
/** Context needed for resolving certain element types (e.g. SS links) */
|
|
55
|
+
export interface ResolveContext {
|
|
56
|
+
fromSectionId: number;
|
|
57
|
+
fromContentId: number;
|
|
58
|
+
}
|
|
59
|
+
/** Input for inline media upload within a Media element */
|
|
60
|
+
export interface MediaElementUpload {
|
|
61
|
+
file: string | Blob | {
|
|
62
|
+
file: string | Blob;
|
|
63
|
+
filename?: string;
|
|
64
|
+
};
|
|
65
|
+
name: string;
|
|
66
|
+
category: number;
|
|
67
|
+
description?: string;
|
|
68
|
+
}
|
|
69
|
+
/** Function that creates a media item and returns its ID */
|
|
70
|
+
export type MediaCreateFn = (data: MediaElementUpload) => Promise<number>;
|
|
71
|
+
/**
|
|
72
|
+
* Resolves developer-friendly field values to T4 API element format.
|
|
73
|
+
* Handles list lookups, date conversion, repeater building, etc.
|
|
74
|
+
*/
|
|
75
|
+
export declare class ElementResolver {
|
|
76
|
+
private readonly httpClient;
|
|
77
|
+
private readonly typeRegistry;
|
|
78
|
+
private readonly mediaCreateFn;
|
|
79
|
+
private listCache;
|
|
80
|
+
constructor(httpClient: HttpClient, _defaultLanguage: string, typeRegistry: TypeRegistry, mediaCreateFn?: MediaCreateFn | null);
|
|
81
|
+
/**
|
|
82
|
+
* Resolves a single field value based on its element type.
|
|
83
|
+
* Uses the TypeRegistry to look up type names instead of hardcoded IDs.
|
|
84
|
+
*/
|
|
85
|
+
resolveValue(value: unknown, element: TemplateElement, language: string, allElements?: TemplateElement[], context?: ResolveContext): Promise<unknown>;
|
|
86
|
+
getList(listId: number, language: string): Promise<ListResponse>;
|
|
87
|
+
private resolveItemName;
|
|
88
|
+
private resolveDate;
|
|
89
|
+
/** Select Box, Radio Button — single list value: "listId:itemId" */
|
|
90
|
+
private resolveSingleList;
|
|
91
|
+
/** Checkbox, Multiple Select — "listId:id1,id2" */
|
|
92
|
+
private resolveCheckbox;
|
|
93
|
+
/** Multi-Select — "listId:id1;listId:id2" */
|
|
94
|
+
private resolveMultiSelect;
|
|
95
|
+
/** Cascading List — "listId1:itemId1, listId2:itemId2" */
|
|
96
|
+
private resolveCascadingList;
|
|
97
|
+
/** Group Select — comma-separated group IDs */
|
|
98
|
+
private resolveGroupSelect;
|
|
99
|
+
/** Keyword Selector — OR items comma-separated, AND groups with && */
|
|
100
|
+
private resolveKeywordSelector;
|
|
101
|
+
/** File/Image — upload file via POST /upload/ and return element value */
|
|
102
|
+
private resolveFileUpload;
|
|
103
|
+
/** Section/Content Link — create SS record and return T4 tag */
|
|
104
|
+
private resolveSectionContentLink;
|
|
105
|
+
/** Regex to match anchor tags that are SS link markers (have data-section-id attribute) */
|
|
106
|
+
private static readonly SSLINK_ANCHOR_REGEX;
|
|
107
|
+
/**
|
|
108
|
+
* Reverts friendly anchor elements in HTML back to T4 SS link tags.
|
|
109
|
+
* - Existing links (data-t4-sslink="39") → `<t4 type="sslink" sslink_id="39"/>`
|
|
110
|
+
* - New links (no data-t4-sslink or data-t4-sslink="new") → creates SS record via PUT /ssl, then inserts the tag
|
|
111
|
+
*/
|
|
112
|
+
private revertHtmlSsLinks;
|
|
113
|
+
}
|
|
114
|
+
export {};
|
|
115
|
+
//# sourceMappingURL=element-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"element-resolver.d.ts","sourceRoot":"","sources":["../../src/element-resolver.ts"],"names":[],"mappings":"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"}
|