ochre-sdk 1.0.13 → 1.0.14

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 (51) hide show
  1. package/dist/constants.d.mts +17 -0
  2. package/dist/constants.mjs +85 -0
  3. package/dist/fetchers/gallery.d.mts +38 -0
  4. package/dist/fetchers/gallery.mjs +91 -0
  5. package/dist/fetchers/item-links.d.mts +32 -0
  6. package/dist/fetchers/item-links.mjs +120 -0
  7. package/dist/fetchers/item.d.mts +74 -0
  8. package/dist/fetchers/item.mjs +146 -0
  9. package/dist/fetchers/set/items.d.mts +48 -0
  10. package/dist/fetchers/set/items.mjs +268 -0
  11. package/dist/fetchers/set/property-values.d.mts +46 -0
  12. package/dist/fetchers/set/property-values.mjs +514 -0
  13. package/dist/fetchers/website.d.mts +25 -0
  14. package/dist/fetchers/website.mjs +38 -0
  15. package/dist/getters.d.mts +193 -0
  16. package/dist/getters.mjs +341 -0
  17. package/dist/helpers.d.mts +18 -0
  18. package/dist/helpers.mjs +33 -0
  19. package/dist/index.d.mts +12 -1971
  20. package/dist/index.mjs +9 -7236
  21. package/dist/parsers/helpers.d.mts +27 -0
  22. package/dist/parsers/helpers.mjs +53 -0
  23. package/dist/parsers/index.d.mts +65 -0
  24. package/dist/parsers/index.mjs +1338 -0
  25. package/dist/parsers/mdx.d.mts +4 -0
  26. package/dist/parsers/mdx.mjs +9 -0
  27. package/dist/parsers/multilingual.d.mts +189 -0
  28. package/dist/parsers/multilingual.mjs +410 -0
  29. package/dist/parsers/string.d.mts +29 -0
  30. package/dist/parsers/string.mjs +477 -0
  31. package/dist/parsers/website/index.d.mts +20 -0
  32. package/dist/parsers/website/index.mjs +1245 -0
  33. package/dist/parsers/website/reader.d.mts +29 -0
  34. package/dist/parsers/website/reader.mjs +75 -0
  35. package/dist/query.d.mts +13 -0
  36. package/dist/query.mjs +827 -0
  37. package/dist/schemas.d.mts +84 -0
  38. package/dist/schemas.mjs +232 -0
  39. package/dist/types/index.d.mts +840 -0
  40. package/dist/types/index.mjs +1 -0
  41. package/dist/types/website.d.mts +501 -0
  42. package/dist/types/website.mjs +1 -0
  43. package/dist/utils.d.mts +34 -0
  44. package/dist/utils.mjs +172 -0
  45. package/dist/xml/metadata.d.mts +5 -0
  46. package/dist/xml/metadata.mjs +30 -0
  47. package/dist/xml/schemas.d.mts +13 -0
  48. package/dist/xml/schemas.mjs +849 -0
  49. package/dist/xml/types.d.mts +901 -0
  50. package/dist/xml/types.mjs +1 -0
  51. package/package.json +19 -17
@@ -0,0 +1,4 @@
1
+ //#region src/parsers/mdx.d.ts
2
+ declare function serializeMDXText(value: string): string;
3
+ //#endregion
4
+ export { serializeMDXText };
@@ -0,0 +1,9 @@
1
+ //#region src/parsers/mdx.ts
2
+ const MDX_LITERAL_EXPRESSION_REGEX = /[!#*<>[\]_`{|}~]/;
3
+ const MDX_LITERAL_BLOCK_REGEX = /(?:^|\n)[\t ]*(?:import|export|[+>-]|\d+[).])(?:[\t ]|$)/;
4
+ function serializeMDXText(value) {
5
+ if (value === "" || !MDX_LITERAL_EXPRESSION_REGEX.test(value) && !MDX_LITERAL_BLOCK_REGEX.test(value)) return value;
6
+ return `{${JSON.stringify(value)}}`;
7
+ }
8
+ //#endregion
9
+ export { serializeMDXText };
@@ -0,0 +1,189 @@
1
+ //#region src/parsers/multilingual.d.ts
2
+ /**
3
+ * One text entry for a language. When OCHRE exposes multiple entries for the
4
+ * same language, the first one is primary.
5
+ */
6
+ type MultilingualStringEntry = {
7
+ text: string;
8
+ richText: string;
9
+ isPrimary: boolean;
10
+ };
11
+ type MultilingualStringText = {
12
+ text: string;
13
+ richText: string;
14
+ };
15
+ type MultilingualStringInput = string | {
16
+ text: string;
17
+ richText?: string;
18
+ };
19
+ type MultilingualStringJSON<T extends ReadonlyArray<string> = ReadonlyArray<string>> = {
20
+ content: Partial<Record<T[number], Array<MultilingualStringEntry>>>;
21
+ aliases: Array<string>;
22
+ };
23
+ type MultilingualStringObject<T extends ReadonlyArray<string> = ReadonlyArray<string>> = Partial<Record<T[number], MultilingualStringInput>>;
24
+ type MultilingualStringEntries<T extends ReadonlyArray<string> = ReadonlyArray<string>> = Partial<Record<T[number], ReadonlyArray<MultilingualStringInput>>>;
25
+ /**
26
+ * Options for creating and working with multilingual strings
27
+ */
28
+ type MultilingualOptions = {
29
+ /** Default language to use for fallbacks */defaultLanguage?: string; /** Available languages for this string */
30
+ availableLanguages?: ReadonlyArray<string>; /** Alias values carried by OCHRE as zxx content */
31
+ aliases?: ReadonlyArray<string>;
32
+ };
33
+ type MultilingualContent<T extends ReadonlyArray<string>> = Partial<Record<T[number], ReadonlyArray<MultilingualStringEntry>>>;
34
+ declare const MULTILINGUAL_STRING_INTERNAL_INIT: unique symbol;
35
+ type MultilingualStringInternalInit<T extends ReadonlyArray<string>> = {
36
+ readonly [MULTILINGUAL_STRING_INTERNAL_INIT]: true;
37
+ content: MultilingualContent<T>;
38
+ options: Required<MultilingualOptions>;
39
+ availableLanguages: ReadonlyArray<T[number]>;
40
+ };
41
+ /**
42
+ * Multilingual string
43
+ */
44
+ declare class MultilingualString<T extends ReadonlyArray<string> = ReadonlyArray<string>> {
45
+ private readonly _content;
46
+ private readonly _options;
47
+ private readonly _availableLanguages;
48
+ private readonly _aliases;
49
+ /**
50
+ * Create a new multilingual string from an object of language codes to text.
51
+ */
52
+ /** @internal */
53
+ constructor(init: MultilingualStringInternalInit<T>);
54
+ constructor(content: MultilingualStringObject<T>, languages: T, options?: MultilingualOptions);
55
+ constructor(content?: Partial<Record<string, MultilingualStringInput>>, languages?: undefined, options?: MultilingualOptions);
56
+ private static fromNormalized;
57
+ /**
58
+ * Create a new multilingual string from an object of language codes to text
59
+ */
60
+ static fromObject<U extends ReadonlyArray<string>>(content: MultilingualStringObject<U>, languages: U, options?: MultilingualOptions): MultilingualString<U>;
61
+ static fromObject(content: Partial<Record<string, MultilingualStringInput>>, languages?: undefined, options?: MultilingualOptions): MultilingualString<ReadonlyArray<string>>;
62
+ /**
63
+ * Create a new multilingual string from language entries.
64
+ */
65
+ static fromEntries<U extends ReadonlyArray<string>>(content: MultilingualStringEntries<U>, languages: U, options?: MultilingualOptions): MultilingualString<U>;
66
+ static fromEntries(content: Partial<Record<string, ReadonlyArray<MultilingualStringInput>>>, languages?: undefined, options?: MultilingualOptions): MultilingualString<ReadonlyArray<string>>;
67
+ /**
68
+ * Create a new multilingual string for a single language
69
+ */
70
+ static create<U extends ReadonlyArray<string>>(language: U[number], text: MultilingualStringInput, languages: U, options?: MultilingualOptions): MultilingualString<U>;
71
+ static create(language: string, text: MultilingualStringInput, languages?: undefined, options?: MultilingualOptions): MultilingualString<ReadonlyArray<string>>;
72
+ /**
73
+ * Create an empty multilingual string
74
+ */
75
+ static empty<U extends ReadonlyArray<string>>(languages: U, options?: MultilingualOptions): MultilingualString<U>;
76
+ static empty(languages?: undefined, options?: MultilingualOptions): MultilingualString<ReadonlyArray<string>>;
77
+ /**
78
+ * Recreate a multilingual string from its JSON representation.
79
+ */
80
+ static fromJSON<U extends ReadonlyArray<string>>(json: MultilingualStringJSON<U>, languages: U, options?: Omit<MultilingualOptions, "aliases">): MultilingualString<U>;
81
+ static fromJSON(json: MultilingualStringJSON, languages?: undefined, options?: Omit<MultilingualOptions, "aliases">): MultilingualString<ReadonlyArray<string>>;
82
+ private getPrimaryEntry;
83
+ /**
84
+ * Get text in a specific language with automatic fallback
85
+ */
86
+ getText(language?: T[number]): string;
87
+ /**
88
+ * Get rich text in a specific language with automatic fallback
89
+ */
90
+ getRichText(language?: T[number]): string;
91
+ /**
92
+ * Get primary text in a specific language without fallback
93
+ */
94
+ getExactText(language: T[number]): string | null;
95
+ /**
96
+ * Get primary rich text in a specific language without fallback
97
+ */
98
+ getExactRichText(language: T[number]): string | null;
99
+ /**
100
+ * Get all text entries in a specific language without fallback
101
+ */
102
+ getExactTexts(language: T[number]): Array<string>;
103
+ /**
104
+ * Get all rich text entries in a specific language without fallback
105
+ */
106
+ getExactRichTexts(language: T[number]): Array<string>;
107
+ /**
108
+ * Get all text entries in a specific language with fallback
109
+ */
110
+ getTexts(language?: T[number]): Array<string>;
111
+ /**
112
+ * Get all rich text entries in a specific language with fallback
113
+ */
114
+ getRichTexts(language?: T[number]): Array<string>;
115
+ /**
116
+ * Get all entries in a specific language without fallback
117
+ */
118
+ getExactEntries(language: T[number]): Array<MultilingualStringEntry>;
119
+ /**
120
+ * Get all entries in a specific language with fallback
121
+ */
122
+ getEntries(language?: T[number]): Array<MultilingualStringEntry>;
123
+ /**
124
+ * Get aliases carried by OCHRE as zxx content
125
+ */
126
+ getAliases(): Array<string>;
127
+ /**
128
+ * Check if text exists for a specific language
129
+ */
130
+ hasLanguage(language: T[number]): boolean;
131
+ /**
132
+ * Check if aliases exist
133
+ */
134
+ hasAliases(): boolean;
135
+ /**
136
+ * Get all available languages
137
+ */
138
+ getAvailableLanguages(): ReadonlyArray<T[number]>;
139
+ /**
140
+ * Get all supported languages (the full language array passed to constructor)
141
+ */
142
+ getSupportedLanguages(): T;
143
+ /**
144
+ * Check if the multilingual string is empty (no content in any language)
145
+ */
146
+ isEmpty(): boolean;
147
+ /**
148
+ * Check if the multilingual string has any content
149
+ */
150
+ hasContent(): boolean;
151
+ /**
152
+ * Get the default language
153
+ */
154
+ getDefaultLanguage(): T[number];
155
+ /**
156
+ * Add or update the primary text for a language (returns new instance)
157
+ */
158
+ withText(language: T[number], text: MultilingualStringInput): MultilingualString<T>;
159
+ /**
160
+ * Add another text entry for a language (returns new instance)
161
+ */
162
+ withEntry(language: T[number], text: MultilingualStringInput): MultilingualString<T>;
163
+ /**
164
+ * Replace aliases (returns new instance)
165
+ */
166
+ withAliases(aliases: ReadonlyArray<string>): MultilingualString<T>;
167
+ /**
168
+ * Remove text for a language (returns new instance)
169
+ */
170
+ withoutLanguage(language: T[number]): MultilingualString<T>;
171
+ /**
172
+ * Transform all language versions (returns new instance)
173
+ */
174
+ map(fn: (text: string, language: T[number]) => string): MultilingualString<T>;
175
+ /**
176
+ * Filter languages based on predicate (returns new instance)
177
+ */
178
+ filter(predicate: (text: string, language: T[number]) => boolean): MultilingualString<T>;
179
+ /**
180
+ * Get the string representation (uses default language)
181
+ */
182
+ toString(): string;
183
+ /**
184
+ * Get JSON representation
185
+ */
186
+ toJSON(): MultilingualStringJSON<T>;
187
+ }
188
+ //#endregion
189
+ export { MultilingualOptions, MultilingualString, MultilingualStringEntries, MultilingualStringEntry, MultilingualStringInput, MultilingualStringJSON, MultilingualStringObject, MultilingualStringText };
@@ -0,0 +1,410 @@
1
+ import { DEFAULT_LANGUAGES } from "../constants.mjs";
2
+ import { serializeMDXText } from "./mdx.mjs";
3
+ //#region src/parsers/multilingual.ts
4
+ const MULTILINGUAL_STRING_INTERNAL_INIT = Symbol("MultilingualString.internalInit");
5
+ function normalizeInputText(text) {
6
+ return typeof text === "string" ? {
7
+ text,
8
+ richText: serializeMDXText(text)
9
+ } : {
10
+ text: text.text,
11
+ richText: text.richText ?? serializeMDXText(text.text)
12
+ };
13
+ }
14
+ function normalizeAliases(aliases) {
15
+ const normalizedAliases = [];
16
+ for (const alias of aliases ?? []) if (alias !== "") normalizedAliases.push(alias);
17
+ return normalizedAliases;
18
+ }
19
+ function entriesFromTexts(texts) {
20
+ const entries = [];
21
+ for (const text of texts) entries.push({
22
+ ...normalizeInputText(text),
23
+ isPrimary: entries.length === 0
24
+ });
25
+ return entries;
26
+ }
27
+ function cloneContent(content) {
28
+ const clonedContent = {};
29
+ const entriesByLanguage = Object.entries(content);
30
+ for (const [language, entries] of entriesByLanguage) {
31
+ const clonedEntries = [];
32
+ for (const entry of entries ?? []) clonedEntries.push({
33
+ text: entry.text,
34
+ richText: entry.richText,
35
+ isPrimary: entry.isPrimary
36
+ });
37
+ clonedContent[language] = normalizePrimary(clonedEntries);
38
+ }
39
+ return clonedContent;
40
+ }
41
+ function normalizePrimary(entries) {
42
+ const normalizedEntries = [];
43
+ for (const entry of entries) normalizedEntries.push({
44
+ text: entry.text,
45
+ richText: entry.richText,
46
+ isPrimary: normalizedEntries.length === 0
47
+ });
48
+ return normalizedEntries;
49
+ }
50
+ function getLanguagesWithEntries(content, languages) {
51
+ const availableLanguages = [];
52
+ for (const language of languages) if ((content[language]?.length ?? 0) > 0) availableLanguages.push(language);
53
+ return availableLanguages;
54
+ }
55
+ function getImplicitLanguages(content, options) {
56
+ const languages = [];
57
+ for (const language of options.availableLanguages ?? []) if (!languages.includes(language)) languages.push(language);
58
+ for (const language of Object.keys(content)) if (!languages.includes(language)) languages.push(language);
59
+ return languages.length > 0 ? languages : [...DEFAULT_LANGUAGES];
60
+ }
61
+ function isInternalInit(value) {
62
+ return typeof value === "object" && value != null && MULTILINGUAL_STRING_INTERNAL_INIT in value;
63
+ }
64
+ /**
65
+ * Multilingual string
66
+ */
67
+ var MultilingualString = class MultilingualString {
68
+ _content;
69
+ _options;
70
+ _availableLanguages;
71
+ _aliases;
72
+ constructor(content = {}, languages, options = {}) {
73
+ if (isInternalInit(content)) {
74
+ this._content = Object.freeze(cloneContent(content.content));
75
+ this._options = Object.freeze({ ...content.options });
76
+ this._availableLanguages = Object.freeze([...content.availableLanguages]);
77
+ this._aliases = Object.freeze([...content.options.aliases]);
78
+ return;
79
+ }
80
+ const parsed = languages === void 0 ? MultilingualString.fromObject(content, void 0, options) : MultilingualString.fromObject(content, languages, options);
81
+ this._content = parsed._content;
82
+ this._options = parsed._options;
83
+ this._availableLanguages = parsed._availableLanguages;
84
+ this._aliases = parsed._aliases;
85
+ }
86
+ static fromNormalized(content, options, availableLanguages) {
87
+ return new MultilingualString({
88
+ [MULTILINGUAL_STRING_INTERNAL_INIT]: true,
89
+ content,
90
+ options,
91
+ availableLanguages
92
+ });
93
+ }
94
+ static fromObject(content, languages, options = {}) {
95
+ const entries = {};
96
+ for (const [language, text] of Object.entries(content)) if (text != null) entries[language] = [text];
97
+ if (languages === void 0) return MultilingualString.fromEntries(entries, void 0, options);
98
+ return MultilingualString.fromEntries(entries, languages, options);
99
+ }
100
+ static fromEntries(content, languages, options = {}) {
101
+ if (languages === void 0) {
102
+ const actualLanguages = getImplicitLanguages(content, options);
103
+ const normalizedContent = {};
104
+ for (const language of actualLanguages) normalizedContent[language] = entriesFromTexts(content[language] ?? []);
105
+ const availableLanguages = getLanguagesWithEntries(normalizedContent, actualLanguages);
106
+ const defaultOptions = {
107
+ defaultLanguage: options.defaultLanguage ?? availableLanguages[0] ?? actualLanguages[0],
108
+ availableLanguages: actualLanguages,
109
+ aliases: normalizeAliases(options.aliases)
110
+ };
111
+ return MultilingualString.fromNormalized(normalizedContent, defaultOptions, availableLanguages);
112
+ }
113
+ const normalizedContent = {};
114
+ for (const language of languages) {
115
+ const typedLanguage = language;
116
+ normalizedContent[typedLanguage] = entriesFromTexts(content[typedLanguage] ?? []);
117
+ }
118
+ const availableLanguages = getLanguagesWithEntries(normalizedContent, languages);
119
+ const defaultOptions = {
120
+ defaultLanguage: options.defaultLanguage ?? availableLanguages[0] ?? languages[0],
121
+ availableLanguages: languages,
122
+ aliases: normalizeAliases(options.aliases)
123
+ };
124
+ return MultilingualString.fromNormalized(normalizedContent, defaultOptions, availableLanguages);
125
+ }
126
+ static create(language, text, languages, options = {}) {
127
+ if (languages === void 0) return MultilingualString.fromObject({ [language]: text }, void 0, {
128
+ ...options,
129
+ defaultLanguage: language
130
+ });
131
+ return MultilingualString.fromObject({ [language]: text }, languages, {
132
+ ...options,
133
+ defaultLanguage: language
134
+ });
135
+ }
136
+ static empty(languages, options = {}) {
137
+ if (languages === void 0) return MultilingualString.fromObject({}, void 0, options);
138
+ return MultilingualString.fromObject({}, languages, options);
139
+ }
140
+ static fromJSON(json, languages, options = {}) {
141
+ const content = json.content;
142
+ const mergedOptions = {
143
+ ...options,
144
+ aliases: json.aliases
145
+ };
146
+ if (languages === void 0) return MultilingualString.fromEntries(content, void 0, mergedOptions);
147
+ return MultilingualString.fromEntries(content, languages, mergedOptions);
148
+ }
149
+ getPrimaryEntry(language) {
150
+ const entries = this._content[language] ?? [];
151
+ for (const entry of entries) if (entry.isPrimary) return entry;
152
+ return entries[0] ?? null;
153
+ }
154
+ /**
155
+ * Get text in a specific language with automatic fallback
156
+ */
157
+ getText(language) {
158
+ if (language == null) {
159
+ const defaultEntry = this.getPrimaryEntry(this._options.defaultLanguage);
160
+ if (defaultEntry != null) return defaultEntry.text;
161
+ }
162
+ if (language != null) {
163
+ const requestedEntry = this.getPrimaryEntry(language);
164
+ if (requestedEntry != null) return requestedEntry.text;
165
+ }
166
+ const defaultEntry = this.getPrimaryEntry(this._options.defaultLanguage);
167
+ if (defaultEntry != null) return defaultEntry.text;
168
+ for (const availableLanguage of this._availableLanguages) {
169
+ const entry = this.getPrimaryEntry(availableLanguage);
170
+ if (entry != null) return entry.text;
171
+ }
172
+ return "";
173
+ }
174
+ /**
175
+ * Get rich text in a specific language with automatic fallback
176
+ */
177
+ getRichText(language) {
178
+ if (language == null) {
179
+ const defaultEntry = this.getPrimaryEntry(this._options.defaultLanguage);
180
+ if (defaultEntry != null) return defaultEntry.richText;
181
+ }
182
+ if (language != null) {
183
+ const requestedEntry = this.getPrimaryEntry(language);
184
+ if (requestedEntry != null) return requestedEntry.richText;
185
+ }
186
+ const defaultEntry = this.getPrimaryEntry(this._options.defaultLanguage);
187
+ if (defaultEntry != null) return defaultEntry.richText;
188
+ for (const availableLanguage of this._availableLanguages) {
189
+ const entry = this.getPrimaryEntry(availableLanguage);
190
+ if (entry != null) return entry.richText;
191
+ }
192
+ return "";
193
+ }
194
+ /**
195
+ * Get primary text in a specific language without fallback
196
+ */
197
+ getExactText(language) {
198
+ return this.getPrimaryEntry(language)?.text ?? null;
199
+ }
200
+ /**
201
+ * Get primary rich text in a specific language without fallback
202
+ */
203
+ getExactRichText(language) {
204
+ return this.getPrimaryEntry(language)?.richText ?? null;
205
+ }
206
+ /**
207
+ * Get all text entries in a specific language without fallback
208
+ */
209
+ getExactTexts(language) {
210
+ const texts = [];
211
+ for (const entry of this._content[language] ?? []) texts.push(entry.text);
212
+ return texts;
213
+ }
214
+ /**
215
+ * Get all rich text entries in a specific language without fallback
216
+ */
217
+ getExactRichTexts(language) {
218
+ const texts = [];
219
+ for (const entry of this._content[language] ?? []) texts.push(entry.richText);
220
+ return texts;
221
+ }
222
+ /**
223
+ * Get all text entries in a specific language with fallback
224
+ */
225
+ getTexts(language) {
226
+ if (language != null && (this._content[language]?.length ?? 0) > 0) return this.getExactTexts(language);
227
+ const defaultLanguage = this._options.defaultLanguage;
228
+ if ((this._content[defaultLanguage]?.length ?? 0) > 0) return this.getExactTexts(defaultLanguage);
229
+ const firstLanguage = this._availableLanguages[0];
230
+ return firstLanguage == null ? [] : this.getExactTexts(firstLanguage);
231
+ }
232
+ /**
233
+ * Get all rich text entries in a specific language with fallback
234
+ */
235
+ getRichTexts(language) {
236
+ if (language != null && (this._content[language]?.length ?? 0) > 0) return this.getExactRichTexts(language);
237
+ const defaultLanguage = this._options.defaultLanguage;
238
+ if ((this._content[defaultLanguage]?.length ?? 0) > 0) return this.getExactRichTexts(defaultLanguage);
239
+ const firstLanguage = this._availableLanguages[0];
240
+ return firstLanguage == null ? [] : this.getExactRichTexts(firstLanguage);
241
+ }
242
+ /**
243
+ * Get all entries in a specific language without fallback
244
+ */
245
+ getExactEntries(language) {
246
+ const entries = [];
247
+ for (const entry of this._content[language] ?? []) entries.push({
248
+ text: entry.text,
249
+ richText: entry.richText,
250
+ isPrimary: entry.isPrimary
251
+ });
252
+ return entries;
253
+ }
254
+ /**
255
+ * Get all entries in a specific language with fallback
256
+ */
257
+ getEntries(language) {
258
+ if (language != null && (this._content[language]?.length ?? 0) > 0) return this.getExactEntries(language);
259
+ const defaultLanguage = this._options.defaultLanguage;
260
+ if ((this._content[defaultLanguage]?.length ?? 0) > 0) return this.getExactEntries(defaultLanguage);
261
+ const firstLanguage = this._availableLanguages[0];
262
+ return firstLanguage == null ? [] : this.getExactEntries(firstLanguage);
263
+ }
264
+ /**
265
+ * Get aliases carried by OCHRE as zxx content
266
+ */
267
+ getAliases() {
268
+ return [...this._aliases];
269
+ }
270
+ /**
271
+ * Check if text exists for a specific language
272
+ */
273
+ hasLanguage(language) {
274
+ return (this._content[language]?.length ?? 0) > 0;
275
+ }
276
+ /**
277
+ * Check if aliases exist
278
+ */
279
+ hasAliases() {
280
+ return this._aliases.length > 0;
281
+ }
282
+ /**
283
+ * Get all available languages
284
+ */
285
+ getAvailableLanguages() {
286
+ return this._availableLanguages;
287
+ }
288
+ /**
289
+ * Get all supported languages (the full language array passed to constructor)
290
+ */
291
+ getSupportedLanguages() {
292
+ return this._options.availableLanguages;
293
+ }
294
+ /**
295
+ * Check if the multilingual string is empty (no content in any language)
296
+ */
297
+ isEmpty() {
298
+ return this._availableLanguages.length === 0;
299
+ }
300
+ /**
301
+ * Check if the multilingual string has any content
302
+ */
303
+ hasContent() {
304
+ const contentEntries = Object.values(this._content);
305
+ for (const entries of contentEntries) for (const entry of entries ?? []) if (entry.text.trim().length > 0 || entry.richText.trim().length > 0) return true;
306
+ return false;
307
+ }
308
+ /**
309
+ * Get the default language
310
+ */
311
+ getDefaultLanguage() {
312
+ return this._options.defaultLanguage;
313
+ }
314
+ /**
315
+ * Add or update the primary text for a language (returns new instance)
316
+ */
317
+ withText(language, text) {
318
+ const newContent = cloneContent(this._content);
319
+ newContent[language] = entriesFromTexts([text]);
320
+ const newAvailableLanguages = getLanguagesWithEntries(newContent, this._options.availableLanguages);
321
+ return MultilingualString.fromNormalized(newContent, this._options, newAvailableLanguages);
322
+ }
323
+ /**
324
+ * Add another text entry for a language (returns new instance)
325
+ */
326
+ withEntry(language, text) {
327
+ const newContent = cloneContent(this._content);
328
+ newContent[language] = normalizePrimary([...newContent[language] ?? [], {
329
+ ...normalizeInputText(text),
330
+ isPrimary: false
331
+ }]);
332
+ const newAvailableLanguages = getLanguagesWithEntries(newContent, this._options.availableLanguages);
333
+ return MultilingualString.fromNormalized(newContent, this._options, newAvailableLanguages);
334
+ }
335
+ /**
336
+ * Replace aliases (returns new instance)
337
+ */
338
+ withAliases(aliases) {
339
+ return MultilingualString.fromNormalized(this._content, {
340
+ ...this._options,
341
+ aliases: normalizeAliases(aliases)
342
+ }, this._availableLanguages);
343
+ }
344
+ /**
345
+ * Remove text for a language (returns new instance)
346
+ */
347
+ withoutLanguage(language) {
348
+ const newContent = {};
349
+ const currentContent = cloneContent(this._content);
350
+ for (const supportedLanguage of this._options.availableLanguages) if (supportedLanguage !== language) newContent[supportedLanguage] = normalizePrimary(currentContent[supportedLanguage] ?? []);
351
+ const newAvailableLanguages = getLanguagesWithEntries(newContent, this._options.availableLanguages);
352
+ const newDefaultLanguage = this._options.defaultLanguage === language ? newAvailableLanguages[0] ?? this._options.availableLanguages[0] : this._options.defaultLanguage;
353
+ return MultilingualString.fromNormalized(newContent, {
354
+ ...this._options,
355
+ defaultLanguage: newDefaultLanguage
356
+ }, newAvailableLanguages);
357
+ }
358
+ /**
359
+ * Transform all language versions (returns new instance)
360
+ */
361
+ map(fn) {
362
+ const newContent = {};
363
+ for (const language of this._availableLanguages) {
364
+ const mappedEntries = [];
365
+ for (const entry of this._content[language] ?? []) mappedEntries.push({
366
+ text: fn(entry.text, language),
367
+ richText: fn(entry.richText, language),
368
+ isPrimary: entry.isPrimary
369
+ });
370
+ newContent[language] = normalizePrimary(mappedEntries);
371
+ }
372
+ return MultilingualString.fromNormalized(newContent, this._options, this._availableLanguages);
373
+ }
374
+ /**
375
+ * Filter languages based on predicate (returns new instance)
376
+ */
377
+ filter(predicate) {
378
+ const newContent = {};
379
+ for (const language of this._availableLanguages) {
380
+ const entries = [];
381
+ for (const entry of this._content[language] ?? []) if (predicate(entry.text, language)) entries.push(entry);
382
+ newContent[language] = normalizePrimary(entries);
383
+ }
384
+ const newAvailableLanguages = getLanguagesWithEntries(newContent, this._options.availableLanguages);
385
+ const newDefaultLanguage = (newContent[this._options.defaultLanguage]?.length ?? 0) > 0 ? this._options.defaultLanguage : newAvailableLanguages[0] ?? this._options.availableLanguages[0];
386
+ return MultilingualString.fromNormalized(newContent, {
387
+ ...this._options,
388
+ defaultLanguage: newDefaultLanguage
389
+ }, newAvailableLanguages);
390
+ }
391
+ /**
392
+ * Get the string representation (uses default language)
393
+ */
394
+ toString() {
395
+ return this.getText();
396
+ }
397
+ /**
398
+ * Get JSON representation
399
+ */
400
+ toJSON() {
401
+ const content = {};
402
+ for (const language of this._availableLanguages) content[language] = this.getExactEntries(language);
403
+ return {
404
+ content,
405
+ aliases: this.getAliases()
406
+ };
407
+ }
408
+ };
409
+ //#endregion
410
+ export { MultilingualString };
@@ -0,0 +1,29 @@
1
+ import { MultilingualString, MultilingualStringText } from "./multilingual.mjs";
2
+ import { XMLContent, XMLString } from "../xml/types.mjs";
3
+
4
+ //#region src/parsers/string.d.ts
5
+ declare function transformPermanentIdentificationUrl(url: string): string;
6
+ declare function parseXMLString(string: XMLString): MultilingualStringText;
7
+ /**
8
+ * Parses rich text content into a formatted string with links and annotations
9
+ *
10
+ * @param item - XML-based rich text item to parse
11
+ * @param options - Options for parsing
12
+ * @param options.languages - Languages of the content
13
+ * @returns Plain and rich formatted strings
14
+ *
15
+ * @internal
16
+ */
17
+ declare function parseXMLContent<V extends ReadonlyArray<string>>(item: XMLContent, options: {
18
+ languages: V;
19
+ }): MultilingualString<V>;
20
+ /**
21
+ * Extracts alias strings from XMLContent where lang="zxx"
22
+ * @param content - The XMLContent to extract aliases from
23
+ * @returns Array of alias strings, or null if none found
24
+ *
25
+ * @internal
26
+ */
27
+ declare function extractAliases(content: XMLContent | undefined): Array<string> | null;
28
+ //#endregion
29
+ export { extractAliases, parseXMLContent, parseXMLString, transformPermanentIdentificationUrl };