glost-core 0.5.0

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 (62) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/LICENSE +21 -0
  3. package/README.md +199 -0
  4. package/dist/__benchmarks__/document-creation.bench.d.ts +7 -0
  5. package/dist/__benchmarks__/document-creation.bench.d.ts.map +1 -0
  6. package/dist/__benchmarks__/document-creation.bench.js +71 -0
  7. package/dist/__benchmarks__/document-creation.bench.js.map +1 -0
  8. package/dist/__benchmarks__/traversal.bench.d.ts +7 -0
  9. package/dist/__benchmarks__/traversal.bench.d.ts.map +1 -0
  10. package/dist/__benchmarks__/traversal.bench.js +124 -0
  11. package/dist/__benchmarks__/traversal.bench.js.map +1 -0
  12. package/dist/cli/migrate.d.ts +8 -0
  13. package/dist/cli/migrate.d.ts.map +1 -0
  14. package/dist/cli/migrate.js +229 -0
  15. package/dist/cli/migrate.js.map +1 -0
  16. package/dist/errors.d.ts +168 -0
  17. package/dist/errors.d.ts.map +1 -0
  18. package/dist/errors.js +300 -0
  19. package/dist/errors.js.map +1 -0
  20. package/dist/guards.d.ts +103 -0
  21. package/dist/guards.d.ts.map +1 -0
  22. package/dist/guards.js +264 -0
  23. package/dist/guards.js.map +1 -0
  24. package/dist/index.d.ts +9 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +25 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/nodes.d.ts +227 -0
  29. package/dist/nodes.d.ts.map +1 -0
  30. package/dist/nodes.js +243 -0
  31. package/dist/nodes.js.map +1 -0
  32. package/dist/types.d.ts +442 -0
  33. package/dist/types.d.ts.map +1 -0
  34. package/dist/types.js +51 -0
  35. package/dist/types.js.map +1 -0
  36. package/dist/utils.d.ts +247 -0
  37. package/dist/utils.d.ts.map +1 -0
  38. package/dist/utils.js +564 -0
  39. package/dist/utils.js.map +1 -0
  40. package/dist/validators.d.ts +1876 -0
  41. package/dist/validators.d.ts.map +1 -0
  42. package/dist/validators.js +302 -0
  43. package/dist/validators.js.map +1 -0
  44. package/package.json +73 -0
  45. package/src/__benchmarks__/document-creation.bench.ts +92 -0
  46. package/src/__benchmarks__/traversal.bench.ts +152 -0
  47. package/src/__tests__/README.md +20 -0
  48. package/src/__tests__/example.test.ts +43 -0
  49. package/src/__tests__/example.ts +186 -0
  50. package/src/__tests__/helpers.test.ts +178 -0
  51. package/src/__tests__/mock-data.ts +624 -0
  52. package/src/__tests__/performance.test.ts +317 -0
  53. package/src/__tests__/traversal.test.ts +170 -0
  54. package/src/cli/migrate.ts +294 -0
  55. package/src/errors.ts +394 -0
  56. package/src/guards.ts +341 -0
  57. package/src/index.ts +69 -0
  58. package/src/nodes.ts +409 -0
  59. package/src/types.ts +633 -0
  60. package/src/utils.ts +730 -0
  61. package/src/validators.ts +336 -0
  62. package/tsconfig.json +9 -0
package/dist/utils.js ADDED
@@ -0,0 +1,564 @@
1
+ import { is as isNode } from "unist-util-is";
2
+ import { visit, SKIP } from "unist-util-visit";
3
+ // ============================================================================
4
+ // BCP-47 Language Tag Utilities
5
+ // ============================================================================
6
+ /**
7
+ * Parse a BCP-47 language tag into its components
8
+ * Format: language[-script][-region][-variant]
9
+ */
10
+ export function parseLanguageTag(tag) {
11
+ const parts = tag.split("-");
12
+ const result = {
13
+ language: parts[0] || "",
14
+ script: undefined,
15
+ region: undefined,
16
+ variant: undefined,
17
+ fullTag: tag,
18
+ };
19
+ if (parts.length >= 2) {
20
+ // Check if second part is a script (4 letters) or region (2-3 letters)
21
+ if (parts[1] && parts[1].length === 4 && /^[A-Za-z]{4}$/.test(parts[1])) {
22
+ result.script = parts[1];
23
+ if (parts.length >= 3 && parts[2]) {
24
+ result.region = parts[2];
25
+ if (parts.length >= 4) {
26
+ result.variant = parts.slice(3).join("-");
27
+ }
28
+ }
29
+ }
30
+ else {
31
+ // Second part is likely a region
32
+ if (parts[1]) {
33
+ result.region = parts[1];
34
+ if (parts.length >= 3) {
35
+ result.variant = parts.slice(2).join("-");
36
+ }
37
+ }
38
+ }
39
+ }
40
+ return result;
41
+ }
42
+ /**
43
+ * Get the base language from a BCP-47 tag
44
+ * Examples: "en-US" -> "en", "zh-CN" -> "zh"
45
+ */
46
+ export function getBaseLanguage(tag) {
47
+ const parts = tag.split("-");
48
+ return parts[0] || tag;
49
+ }
50
+ /**
51
+ * Check if two language tags are compatible (same base language)
52
+ * Examples: "en-US" and "en-GB" are compatible
53
+ */
54
+ export function areLanguagesCompatible(tag1, tag2) {
55
+ return getBaseLanguage(tag1) === getBaseLanguage(tag2);
56
+ }
57
+ /**
58
+ * Find the best matching language tag from available options
59
+ * Prioritizes exact matches, then region matches, then base language matches
60
+ */
61
+ export function findBestLanguageMatch(target, available) {
62
+ if (available.includes(target)) {
63
+ return target;
64
+ }
65
+ const targetParts = parseLanguageTag(target);
66
+ // Try to find region-specific matches
67
+ for (const option of available) {
68
+ const optionParts = parseLanguageTag(option);
69
+ if (optionParts.language === targetParts.language &&
70
+ optionParts.region === targetParts.region) {
71
+ return option;
72
+ }
73
+ }
74
+ // Try to find base language matches
75
+ for (const option of available) {
76
+ const optionParts = parseLanguageTag(option);
77
+ if (optionParts.language === targetParts.language) {
78
+ return option;
79
+ }
80
+ }
81
+ return null;
82
+ }
83
+ /**
84
+ * Get a fallback language tag when the exact one isn't available
85
+ * Examples: "en-US" -> "en", "zh-CN" -> "zh"
86
+ */
87
+ export function getLanguageFallback(tag) {
88
+ const parts = parseLanguageTag(tag);
89
+ return parts.language;
90
+ }
91
+ /**
92
+ * Normalize a language tag to standard format
93
+ * Converts to lowercase and ensures proper formatting
94
+ */
95
+ export function normalizeLanguageTag(tag) {
96
+ const parts = tag.split("-");
97
+ const language = parts[0]?.toLowerCase() || "";
98
+ if (parts.length === 1) {
99
+ return language;
100
+ }
101
+ // Handle script (4 letters, title case)
102
+ if (parts[1] && parts[1].length === 4) {
103
+ const script = parts[1]
104
+ .toLowerCase()
105
+ .replace(/\b\w/g, (l) => l.toUpperCase());
106
+ if (parts.length === 2) {
107
+ return `${language}-${script}`;
108
+ }
109
+ // Handle region (2-3 letters, uppercase)
110
+ const region = parts[2]?.toUpperCase() || "";
111
+ if (parts.length === 3) {
112
+ return `${language}-${script}-${region}`;
113
+ }
114
+ // Handle variants (lowercase)
115
+ const variants = parts.slice(3).join("-").toLowerCase();
116
+ return `${language}-${script}-${region}-${variants}`;
117
+ }
118
+ else {
119
+ // No script, just language-region
120
+ const region = parts[1]?.toUpperCase() || "";
121
+ if (parts.length === 2) {
122
+ return `${language}-${region}`;
123
+ }
124
+ // Handle variants
125
+ const variants = parts.slice(2).join("-").toLowerCase();
126
+ return `${language}-${region}-${variants}`;
127
+ }
128
+ }
129
+ /**
130
+ * Check if a language tag is valid BCP-47 format
131
+ */
132
+ export function isValidLanguageTag(tag) {
133
+ // Basic BCP-47 validation
134
+ const bcp47Pattern = /^[a-z]{2,3}(-[A-Za-z]{4})?(-[A-Za-z]{2,3})?(-[A-Za-z0-9]+)*$/;
135
+ return bcp47Pattern.test(tag);
136
+ }
137
+ // ============================================================================
138
+ // Enhanced Tree Traversal Utilities (using unist-util-visit)
139
+ // ============================================================================
140
+ /**
141
+ * Get all word nodes from an GLOST tree
142
+ */
143
+ export function getAllWords(node) {
144
+ const words = [];
145
+ visit(node, "WordNode", (wordNode) => {
146
+ if (isGLOSTWord(wordNode)) {
147
+ words.push(wordNode);
148
+ }
149
+ });
150
+ return words;
151
+ }
152
+ /**
153
+ * Get the first word from a document
154
+ *
155
+ * Convenience helper for accessing the first word in document order.
156
+ * Returns undefined if no words are found.
157
+ *
158
+ * @param document - GLOST document root
159
+ * @returns First word node or undefined
160
+ *
161
+ * @example
162
+ * ```typescript
163
+ * const doc = createSimpleDocument([word1, word2], "en");
164
+ * const firstWord = getFirstWord(doc);
165
+ * if (firstWord) {
166
+ * console.log(getWordText(firstWord));
167
+ * }
168
+ * ```
169
+ */
170
+ export function getFirstWord(document) {
171
+ let firstWord;
172
+ visit(document, "WordNode", (wordNode) => {
173
+ if (isGLOSTWord(wordNode) && !firstWord) {
174
+ firstWord = wordNode;
175
+ return SKIP; // Stop traversal after finding first word
176
+ }
177
+ });
178
+ return firstWord;
179
+ }
180
+ /**
181
+ * Get word at specific path in document
182
+ *
183
+ * Navigate document hierarchy using paragraph, sentence, and word indices.
184
+ * Returns undefined if path is invalid or doesn't exist.
185
+ *
186
+ * @param document - GLOST document root
187
+ * @param path - Path specifying paragraph, sentence, and word indices (0-based)
188
+ * @returns Word node at path or undefined
189
+ *
190
+ * @example
191
+ * ```typescript
192
+ * // Get the first word of the second sentence in the first paragraph
193
+ * const word = getWordAtPath(doc, {
194
+ * paragraph: 0,
195
+ * sentence: 1,
196
+ * word: 0
197
+ * });
198
+ * ```
199
+ */
200
+ export function getWordAtPath(document, path) {
201
+ const { paragraph: pIdx, sentence: sIdx, word: wIdx } = path;
202
+ // Navigate to paragraph
203
+ const para = document.children[pIdx];
204
+ if (!para || para.type !== "ParagraphNode") {
205
+ return undefined;
206
+ }
207
+ // Navigate to sentence
208
+ const sent = para.children[sIdx];
209
+ if (!sent || sent.type !== "SentenceNode") {
210
+ return undefined;
211
+ }
212
+ // Navigate to word
213
+ const word = sent.children[wIdx];
214
+ if (!word || word.type !== "WordNode") {
215
+ return undefined;
216
+ }
217
+ return word;
218
+ }
219
+ /**
220
+ * Get all sentence nodes from an GLOST tree
221
+ */
222
+ export function getAllSentences(node) {
223
+ const sentences = [];
224
+ visit(node, "SentenceNode", (sentenceNode) => {
225
+ if (isGLOSTSentence(sentenceNode)) {
226
+ sentences.push(sentenceNode);
227
+ }
228
+ });
229
+ return sentences;
230
+ }
231
+ /**
232
+ * Get all paragraph nodes from an GLOST tree
233
+ */
234
+ export function getAllParagraphs(node) {
235
+ const paragraphs = [];
236
+ visit(node, "ParagraphNode", (paragraphNode) => {
237
+ if (isGLOSTParagraph(paragraphNode)) {
238
+ paragraphs.push(paragraphNode);
239
+ }
240
+ });
241
+ return paragraphs;
242
+ }
243
+ /**
244
+ * Get all clause nodes from an GLOST tree
245
+ */
246
+ export function getAllClauses(node) {
247
+ const clauses = [];
248
+ visit(node, "ClauseNode", (clauseNode) => {
249
+ if (isGLOSTClause(clauseNode)) {
250
+ clauses.push(clauseNode);
251
+ }
252
+ });
253
+ return clauses;
254
+ }
255
+ /**
256
+ * Get all phrase nodes from an GLOST tree
257
+ */
258
+ export function getAllPhrases(node) {
259
+ const phrases = [];
260
+ visit(node, "PhraseNode", (phraseNode) => {
261
+ if (isGLOSTPhrase(phraseNode)) {
262
+ phrases.push(phraseNode);
263
+ }
264
+ });
265
+ return phrases;
266
+ }
267
+ /**
268
+ * Get all syllable nodes from an GLOST tree
269
+ */
270
+ export function getAllSyllables(node) {
271
+ const syllables = [];
272
+ visit(node, "SyllableNode", (syllableNode) => {
273
+ if (isGLOSTSyllable(syllableNode)) {
274
+ syllables.push(syllableNode);
275
+ }
276
+ });
277
+ return syllables;
278
+ }
279
+ /**
280
+ * Get all character nodes from an GLOST tree
281
+ */
282
+ export function getAllCharacters(node) {
283
+ const characters = [];
284
+ visit(node, "CharacterNode", (characterNode) => {
285
+ if (isGLOSTCharacter(characterNode)) {
286
+ characters.push(characterNode);
287
+ }
288
+ });
289
+ return characters;
290
+ }
291
+ /**
292
+ * Find nodes by type with better typing
293
+ */
294
+ export function findNodesByType(node, type) {
295
+ const results = [];
296
+ visit(node, type, (foundNode) => {
297
+ results.push(foundNode);
298
+ });
299
+ return results;
300
+ }
301
+ // ============================================================================
302
+ // New Utilities for Transcription Components
303
+ // ============================================================================
304
+ /**
305
+ * Get all words from a document with proper typing
306
+ */
307
+ export function getWordsFromDocument(doc) {
308
+ return getAllWords(doc);
309
+ }
310
+ /**
311
+ * Get the first sentence from a document
312
+ */
313
+ export function getFirstSentence(doc) {
314
+ const paragraphs = getAllParagraphs(doc);
315
+ if (paragraphs.length === 0)
316
+ return null;
317
+ const firstParagraph = paragraphs[0];
318
+ if (!firstParagraph)
319
+ return null;
320
+ const sentences = getAllSentences(firstParagraph);
321
+ if (sentences.length === 0)
322
+ return null;
323
+ const firstSentence = sentences[0];
324
+ return firstSentence || null;
325
+ }
326
+ /**
327
+ * Get words from a specific sentence
328
+ */
329
+ export function getWordsFromSentence(sentence) {
330
+ return getAllWords(sentence);
331
+ }
332
+ /**
333
+ * Get words from a specific paragraph
334
+ */
335
+ export function getWordsFromParagraph(paragraph) {
336
+ const words = [];
337
+ visit(paragraph, "WordNode", (wordNode) => {
338
+ if (isGLOSTWord(wordNode)) {
339
+ words.push(wordNode);
340
+ }
341
+ });
342
+ return words;
343
+ }
344
+ /**
345
+ * Find word nodes with specific language
346
+ */
347
+ export function findWordsByLanguage(node, lang) {
348
+ const words = getAllWords(node);
349
+ return words.filter((word) => word.lang === lang);
350
+ }
351
+ /**
352
+ * Find word nodes with specific transcription system
353
+ */
354
+ export function findWordsByTranscriptionSystem(node, system) {
355
+ const words = getAllWords(node);
356
+ return words.filter((word) => word.transcription && word.transcription[system]);
357
+ }
358
+ // ============================================================================
359
+ // Enhanced Type Guards (using unist-util-is)
360
+ // ============================================================================
361
+ /**
362
+ * Enhanced type guards for the new GLOST types
363
+ */
364
+ export function isGLOSTWord(node) {
365
+ return (isNode(node, "WordNode") && "transcription" in node && "metadata" in node);
366
+ }
367
+ export function isGLOSTSentence(node) {
368
+ return (isNode(node, "SentenceNode") &&
369
+ "lang" in node &&
370
+ "script" in node &&
371
+ "originalText" in node);
372
+ }
373
+ export function isGLOSTParagraph(node) {
374
+ return isNode(node, "ParagraphNode");
375
+ }
376
+ export function isGLOSTRoot(node) {
377
+ return isNode(node, "Root") && "lang" in node && "script" in node;
378
+ }
379
+ /**
380
+ * Type guard for GLOSTClause nodes
381
+ */
382
+ export function isGLOSTClause(node) {
383
+ return isNode(node, "ClauseNode") && "clauseType" in node;
384
+ }
385
+ /**
386
+ * Type guard for GLOSTPhrase nodes
387
+ */
388
+ export function isGLOSTPhrase(node) {
389
+ return isNode(node, "PhraseNode") && "phraseType" in node;
390
+ }
391
+ /**
392
+ * Type guard for GLOSTSyllable nodes
393
+ */
394
+ export function isGLOSTSyllable(node) {
395
+ return isNode(node, "SyllableNode") && "structure" in node;
396
+ }
397
+ /**
398
+ * Type guard for GLOSTCharacter nodes
399
+ */
400
+ export function isGLOSTCharacter(node) {
401
+ return isNode(node, "CharacterNode") && "value" in node;
402
+ }
403
+ // ============================================================================
404
+ // Utility Functions for Transcription Components
405
+ // ============================================================================
406
+ /**
407
+ * Extract text value from a word node
408
+ */
409
+ export function getWordText(word) {
410
+ const textNode = word.children.find((child) => child.type === "TextNode");
411
+ return textNode?.value ?? "";
412
+ }
413
+ /**
414
+ * Get transcription for a specific system
415
+ */
416
+ export function getWordTranscription(word, system) {
417
+ return word.transcription?.[system]?.text ?? null;
418
+ }
419
+ /**
420
+ * Check if a word has transcription for a specific system
421
+ */
422
+ export function hasWordTranscription(word, system) {
423
+ return !!word.transcription && system in word.transcription && !!word.transcription[system]?.text;
424
+ }
425
+ /**
426
+ * Get word translation for a specific language
427
+ * @param word - The word node
428
+ * @param language - Target language code (default: "en-US")
429
+ * @returns Translation string or empty string if not found
430
+ */
431
+ export function getWordTranslation(word, language = "en-US") {
432
+ // Check extras.translations first (preferred format)
433
+ if (word.extras?.translations?.[language]) {
434
+ return word.extras.translations[language];
435
+ }
436
+ // Also check short language code (e.g., "en" for "en-US")
437
+ const shortLang = language.split("-")[0];
438
+ if (shortLang && word.extras?.translations?.[shortLang]) {
439
+ return word.extras.translations[shortLang];
440
+ }
441
+ return "";
442
+ }
443
+ /**
444
+ * Get word meaning/definition
445
+ * @deprecated Use getWordTranslation for multi-language support.
446
+ * This function is kept for backward compatibility.
447
+ */
448
+ export function getWordMeaning(word) {
449
+ // Priority: extras.translations (preferred) > metadata.meaning (deprecated) > shortDefinition (deprecated)
450
+ const translation = getWordTranslation(word, "en-US");
451
+ if (translation)
452
+ return translation;
453
+ return (word.metadata?.meaning ?? word.shortDefinition ?? word.fullDefinition ?? "");
454
+ }
455
+ /**
456
+ * Get word part of speech
457
+ */
458
+ export function getWordPartOfSpeech(word) {
459
+ return word.metadata?.partOfSpeech ?? "";
460
+ }
461
+ /**
462
+ * Get word difficulty
463
+ */
464
+ export function getWordDifficulty(word) {
465
+ return word.difficulty ?? word.extras?.metadata?.difficulty ?? "";
466
+ }
467
+ /**
468
+ * Get sentence translation
469
+ */
470
+ export function getSentenceTranslation(sentence, language = "en") {
471
+ if (sentence.extras?.translations?.[language]) {
472
+ return sentence.extras.translations[language];
473
+ }
474
+ // Fallback: build from word meanings
475
+ const words = getWordsFromSentence(sentence);
476
+ const wordMeanings = words
477
+ .map((word) => getWordMeaning(word))
478
+ .filter(Boolean)
479
+ .join(" ");
480
+ return wordMeanings || null;
481
+ }
482
+ /**
483
+ * Convert a paragraph-like structure to GLOST format for word count calculation
484
+ * This is a minimal adapter that only converts what's needed for word counting
485
+ *
486
+ * @param paragraph - Paragraph structure with sentences containing text and optional translations
487
+ * @returns GLOST paragraph node
488
+ *
489
+ * @example
490
+ * ```ts
491
+ * const paragraph = {
492
+ * sentences: [
493
+ * { sentence: "Hello", translation: "สวัสดี" },
494
+ * { sentence: "World", translation: "โลก" }
495
+ * ]
496
+ * };
497
+ * const mtstParagraph = adaptParagraphLikeToGLOST(paragraph);
498
+ * const wordCount = getGLOSTWordCount(mtstParagraph);
499
+ * ```
500
+ */
501
+ export function adaptParagraphLikeToGLOST(paragraph) {
502
+ return {
503
+ type: "ParagraphNode",
504
+ children: paragraph.sentences.map((sentence) => ({
505
+ type: "SentenceNode",
506
+ lang: "unknown",
507
+ script: "unknown",
508
+ originalText: sentence.sentence,
509
+ children: [],
510
+ extras: {
511
+ translations: sentence.translation
512
+ ? { en: sentence.translation }
513
+ : undefined,
514
+ },
515
+ })),
516
+ };
517
+ }
518
+ /**
519
+ * Calculate word count from GLOST content
520
+ * Counts words from sentence translations or original text
521
+ *
522
+ * @param content - GLOST paragraph, sentence, or root node
523
+ * @param language - Optional language code for translation preference (default: 'en')
524
+ * @returns Word count as a number, or undefined if content is empty
525
+ *
526
+ * @example
527
+ * ```ts
528
+ * const wordCount = getGLOSTWordCount(paragraph, 'en');
529
+ * // Returns: 245
530
+ * ```
531
+ */
532
+ export function getGLOSTWordCount(content, language = "en") {
533
+ if (isGLOSTParagraph(content)) {
534
+ const sentences = getAllSentences(content);
535
+ if (sentences.length === 0) {
536
+ return undefined;
537
+ }
538
+ return sentences.reduce((count, sentence) => {
539
+ const translation = getSentenceTranslation(sentence, language);
540
+ const text = translation || sentence.originalText || "";
541
+ return count + text.split(/\s+/).filter((word) => word.length > 0).length;
542
+ }, 0);
543
+ }
544
+ if (isGLOSTSentence(content)) {
545
+ const translation = getSentenceTranslation(content, language);
546
+ const text = translation || content.originalText || "";
547
+ if (!text) {
548
+ return undefined;
549
+ }
550
+ return text.split(/\s+/).filter((word) => word.length > 0).length;
551
+ }
552
+ if (isGLOSTRoot(content)) {
553
+ const paragraphs = getAllParagraphs(content);
554
+ if (paragraphs.length === 0) {
555
+ return undefined;
556
+ }
557
+ return paragraphs.reduce((count, paragraph) => {
558
+ const paragraphCount = getGLOSTWordCount(paragraph, language);
559
+ return count + (paragraphCount ?? 0);
560
+ }, 0);
561
+ }
562
+ return undefined;
563
+ }
564
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}