@lionrapid/core 0.1.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 (302) hide show
  1. package/README.md +106 -0
  2. package/dist/base/event-emitter.d.ts +91 -0
  3. package/dist/base/event-emitter.d.ts.map +1 -0
  4. package/dist/base/event-emitter.js +330 -0
  5. package/dist/base/event-emitter.js.map +1 -0
  6. package/dist/base/index.d.ts +5 -0
  7. package/dist/base/index.d.ts.map +1 -0
  8. package/dist/base/index.js +5 -0
  9. package/dist/base/index.js.map +1 -0
  10. package/dist/browser/auto-init.d.ts +57 -0
  11. package/dist/browser/auto-init.d.ts.map +1 -0
  12. package/dist/browser/auto-init.js +304 -0
  13. package/dist/browser/auto-init.js.map +1 -0
  14. package/dist/browser/auto-translator.d.ts +98 -0
  15. package/dist/browser/auto-translator.d.ts.map +1 -0
  16. package/dist/browser/auto-translator.js +218 -0
  17. package/dist/browser/auto-translator.js.map +1 -0
  18. package/dist/browser/block-extractor.d.ts +26 -0
  19. package/dist/browser/block-extractor.d.ts.map +1 -0
  20. package/dist/browser/block-extractor.js +143 -0
  21. package/dist/browser/block-extractor.js.map +1 -0
  22. package/dist/browser/dom-observer.d.ts +42 -0
  23. package/dist/browser/dom-observer.d.ts.map +1 -0
  24. package/dist/browser/dom-observer.js +109 -0
  25. package/dist/browser/dom-observer.js.map +1 -0
  26. package/dist/browser/editor/editor-api.d.ts +67 -0
  27. package/dist/browser/editor/editor-api.d.ts.map +1 -0
  28. package/dist/browser/editor/editor-api.js +233 -0
  29. package/dist/browser/editor/editor-api.js.map +1 -0
  30. package/dist/browser/editor/editor-init.d.ts +11 -0
  31. package/dist/browser/editor/editor-init.d.ts.map +1 -0
  32. package/dist/browser/editor/editor-init.js +181 -0
  33. package/dist/browser/editor/editor-init.js.map +1 -0
  34. package/dist/browser/editor/editor-styles.d.ts +6 -0
  35. package/dist/browser/editor/editor-styles.d.ts.map +1 -0
  36. package/dist/browser/editor/editor-styles.js +419 -0
  37. package/dist/browser/editor/editor-styles.js.map +1 -0
  38. package/dist/browser/editor/inspector.d.ts +22 -0
  39. package/dist/browser/editor/inspector.d.ts.map +1 -0
  40. package/dist/browser/editor/inspector.js +125 -0
  41. package/dist/browser/editor/inspector.js.map +1 -0
  42. package/dist/browser/editor/key-resolver.d.ts +19 -0
  43. package/dist/browser/editor/key-resolver.d.ts.map +1 -0
  44. package/dist/browser/editor/key-resolver.js +49 -0
  45. package/dist/browser/editor/key-resolver.js.map +1 -0
  46. package/dist/browser/editor/live-preview.d.ts +10 -0
  47. package/dist/browser/editor/live-preview.d.ts.map +1 -0
  48. package/dist/browser/editor/live-preview.js +57 -0
  49. package/dist/browser/editor/live-preview.js.map +1 -0
  50. package/dist/browser/editor/sidebar.d.ts +50 -0
  51. package/dist/browser/editor/sidebar.d.ts.map +1 -0
  52. package/dist/browser/editor/sidebar.js +353 -0
  53. package/dist/browser/editor/sidebar.js.map +1 -0
  54. package/dist/browser/editor/toolbar.d.ts +29 -0
  55. package/dist/browser/editor/toolbar.d.ts.map +1 -0
  56. package/dist/browser/editor/toolbar.js +131 -0
  57. package/dist/browser/editor/toolbar.js.map +1 -0
  58. package/dist/browser/exclude-filter.d.ts +21 -0
  59. package/dist/browser/exclude-filter.d.ts.map +1 -0
  60. package/dist/browser/exclude-filter.js +51 -0
  61. package/dist/browser/exclude-filter.js.map +1 -0
  62. package/dist/browser/index.d.ts +32 -0
  63. package/dist/browser/index.d.ts.map +1 -0
  64. package/dist/browser/index.js +28 -0
  65. package/dist/browser/index.js.map +1 -0
  66. package/dist/browser/language-switcher.d.ts +70 -0
  67. package/dist/browser/language-switcher.d.ts.map +1 -0
  68. package/dist/browser/language-switcher.js +339 -0
  69. package/dist/browser/language-switcher.js.map +1 -0
  70. package/dist/browser/lionrapid.auto.dev.js +5757 -0
  71. package/dist/browser/lionrapid.auto.dev.js.map +7 -0
  72. package/dist/browser/lionrapid.auto.js +5757 -0
  73. package/dist/browser/lionrapid.auto.js.map +7 -0
  74. package/dist/browser/lionrapid.auto.min.js +80 -0
  75. package/dist/browser/lionrapid.auto.min.js.map +7 -0
  76. package/dist/browser/lionrapid.editor.js +1869 -0
  77. package/dist/browser/lionrapid.editor.js.map +7 -0
  78. package/dist/browser/lionrapid.editor.min.js +415 -0
  79. package/dist/browser/lionrapid.editor.min.js.map +7 -0
  80. package/dist/browser/lionrapid.esm.js +4786 -0
  81. package/dist/browser/lionrapid.esm.js.map +7 -0
  82. package/dist/browser/lionrapid.esm.min.js +3 -0
  83. package/dist/browser/lionrapid.esm.min.js.map +7 -0
  84. package/dist/browser/lionrapid.iife.dev.js +4809 -0
  85. package/dist/browser/lionrapid.iife.dev.js.map +7 -0
  86. package/dist/browser/lionrapid.iife.js +4809 -0
  87. package/dist/browser/lionrapid.iife.js.map +7 -0
  88. package/dist/browser/lionrapid.iife.min.js +3 -0
  89. package/dist/browser/lionrapid.iife.min.js.map +7 -0
  90. package/dist/browser/lionrapid.umd.js +4822 -0
  91. package/dist/browser/lionrapid.umd.js.map +7 -0
  92. package/dist/browser/lionrapid.umd.min.js +18 -0
  93. package/dist/browser/lionrapid.umd.min.js.map +7 -0
  94. package/dist/browser/markup-parser.d.ts +13 -0
  95. package/dist/browser/markup-parser.d.ts.map +1 -0
  96. package/dist/browser/markup-parser.js +56 -0
  97. package/dist/browser/markup-parser.js.map +1 -0
  98. package/dist/browser/md5.d.ts +16 -0
  99. package/dist/browser/md5.d.ts.map +1 -0
  100. package/dist/browser/md5.js +145 -0
  101. package/dist/browser/md5.js.map +1 -0
  102. package/dist/browser/storage/cache-storage-repository.d.ts +44 -0
  103. package/dist/browser/storage/cache-storage-repository.d.ts.map +1 -0
  104. package/dist/browser/storage/cache-storage-repository.js +186 -0
  105. package/dist/browser/storage/cache-storage-repository.js.map +1 -0
  106. package/dist/browser/storage/localstorage-repository.d.ts +51 -0
  107. package/dist/browser/storage/localstorage-repository.d.ts.map +1 -0
  108. package/dist/browser/storage/localstorage-repository.js +270 -0
  109. package/dist/browser/storage/localstorage-repository.js.map +1 -0
  110. package/dist/builder.d.ts +24 -0
  111. package/dist/builder.d.ts.map +1 -0
  112. package/dist/builder.js +169 -0
  113. package/dist/builder.js.map +1 -0
  114. package/dist/cache/CacheManager.d.ts +132 -0
  115. package/dist/cache/CacheManager.d.ts.map +1 -0
  116. package/dist/cache/CacheManager.js +277 -0
  117. package/dist/cache/CacheManager.js.map +1 -0
  118. package/dist/cache/index.d.ts +6 -0
  119. package/dist/cache/index.d.ts.map +1 -0
  120. package/dist/cache/index.js +5 -0
  121. package/dist/cache/index.js.map +1 -0
  122. package/dist/config/index.d.ts +6 -0
  123. package/dist/config/index.d.ts.map +1 -0
  124. package/dist/config/index.js +6 -0
  125. package/dist/config/index.js.map +1 -0
  126. package/dist/config/lionrapid.config.d.ts +12 -0
  127. package/dist/config/lionrapid.config.d.ts.map +1 -0
  128. package/dist/config/lionrapid.config.js +2 -0
  129. package/dist/config/lionrapid.config.js.map +1 -0
  130. package/dist/config/logger.config.d.ts +19 -0
  131. package/dist/config/logger.config.d.ts.map +1 -0
  132. package/dist/config/logger.config.js +9 -0
  133. package/dist/config/logger.config.js.map +1 -0
  134. package/dist/config/repository.config.d.ts +87 -0
  135. package/dist/config/repository.config.d.ts.map +1 -0
  136. package/dist/config/repository.config.js +5 -0
  137. package/dist/config/repository.config.js.map +1 -0
  138. package/dist/content/index.d.ts +20 -0
  139. package/dist/content/index.d.ts.map +1 -0
  140. package/dist/content/index.js +13 -0
  141. package/dist/content/index.js.map +1 -0
  142. package/dist/content/parser/IParser.d.ts +33 -0
  143. package/dist/content/parser/IParser.d.ts.map +1 -0
  144. package/dist/content/parser/IParser.js +6 -0
  145. package/dist/content/parser/IParser.js.map +1 -0
  146. package/dist/content/parser/MarkupParser.d.ts +67 -0
  147. package/dist/content/parser/MarkupParser.d.ts.map +1 -0
  148. package/dist/content/parser/MarkupParser.js +231 -0
  149. package/dist/content/parser/MarkupParser.js.map +1 -0
  150. package/dist/content/serializer/HTMLSerializer.d.ts +61 -0
  151. package/dist/content/serializer/HTMLSerializer.d.ts.map +1 -0
  152. package/dist/content/serializer/HTMLSerializer.js +100 -0
  153. package/dist/content/serializer/HTMLSerializer.js.map +1 -0
  154. package/dist/content/serializer/ISerializer.d.ts +33 -0
  155. package/dist/content/serializer/ISerializer.d.ts.map +1 -0
  156. package/dist/content/serializer/ISerializer.js +6 -0
  157. package/dist/content/serializer/ISerializer.js.map +1 -0
  158. package/dist/content/style-mapper/DefaultStyleMapper.d.ts +59 -0
  159. package/dist/content/style-mapper/DefaultStyleMapper.d.ts.map +1 -0
  160. package/dist/content/style-mapper/DefaultStyleMapper.js +128 -0
  161. package/dist/content/style-mapper/DefaultStyleMapper.js.map +1 -0
  162. package/dist/content/style-mapper/IStyleMapper.d.ts +50 -0
  163. package/dist/content/style-mapper/IStyleMapper.d.ts.map +1 -0
  164. package/dist/content/style-mapper/IStyleMapper.js +6 -0
  165. package/dist/content/style-mapper/IStyleMapper.js.map +1 -0
  166. package/dist/content/types.d.ts +39 -0
  167. package/dist/content/types.d.ts.map +1 -0
  168. package/dist/content/types.js +6 -0
  169. package/dist/content/types.js.map +1 -0
  170. package/dist/content/validator/ContentValidator.d.ts +57 -0
  171. package/dist/content/validator/ContentValidator.d.ts.map +1 -0
  172. package/dist/content/validator/ContentValidator.js +215 -0
  173. package/dist/content/validator/ContentValidator.js.map +1 -0
  174. package/dist/content/validator/IValidator.d.ts +82 -0
  175. package/dist/content/validator/IValidator.d.ts.map +1 -0
  176. package/dist/content/validator/IValidator.js +6 -0
  177. package/dist/content/validator/IValidator.js.map +1 -0
  178. package/dist/errors/translation-errors.d.ts +55 -0
  179. package/dist/errors/translation-errors.d.ts.map +1 -0
  180. package/dist/errors/translation-errors.js +85 -0
  181. package/dist/errors/translation-errors.js.map +1 -0
  182. package/dist/handlers/async-storage-handler.d.ts +77 -0
  183. package/dist/handlers/async-storage-handler.d.ts.map +1 -0
  184. package/dist/handlers/async-storage-handler.js +239 -0
  185. package/dist/handlers/async-storage-handler.js.map +1 -0
  186. package/dist/handlers/handler-chain.d.ts +79 -0
  187. package/dist/handlers/handler-chain.d.ts.map +1 -0
  188. package/dist/handlers/handler-chain.js +366 -0
  189. package/dist/handlers/handler-chain.js.map +1 -0
  190. package/dist/handlers/index.d.ts +7 -0
  191. package/dist/handlers/index.d.ts.map +1 -0
  192. package/dist/handlers/index.js +7 -0
  193. package/dist/handlers/index.js.map +1 -0
  194. package/dist/handlers/network-handler.d.ts +90 -0
  195. package/dist/handlers/network-handler.d.ts.map +1 -0
  196. package/dist/handlers/network-handler.js +283 -0
  197. package/dist/handlers/network-handler.js.map +1 -0
  198. package/dist/handlers/sync-storage-handler.d.ts +88 -0
  199. package/dist/handlers/sync-storage-handler.d.ts.map +1 -0
  200. package/dist/handlers/sync-storage-handler.js +270 -0
  201. package/dist/handlers/sync-storage-handler.js.map +1 -0
  202. package/dist/index.d.ts +37 -0
  203. package/dist/index.d.ts.map +1 -0
  204. package/dist/index.js +30 -0
  205. package/dist/index.js.map +1 -0
  206. package/dist/interfaces/emitter.interface.d.ts +33 -0
  207. package/dist/interfaces/emitter.interface.d.ts.map +1 -0
  208. package/dist/interfaces/emitter.interface.js +2 -0
  209. package/dist/interfaces/emitter.interface.js.map +1 -0
  210. package/dist/interfaces/handler.interface.d.ts +50 -0
  211. package/dist/interfaces/handler.interface.d.ts.map +1 -0
  212. package/dist/interfaces/handler.interface.js +5 -0
  213. package/dist/interfaces/handler.interface.js.map +1 -0
  214. package/dist/interfaces/index.d.ts +8 -0
  215. package/dist/interfaces/index.d.ts.map +1 -0
  216. package/dist/interfaces/index.js +8 -0
  217. package/dist/interfaces/index.js.map +1 -0
  218. package/dist/interfaces/plugin.interface.d.ts +49 -0
  219. package/dist/interfaces/plugin.interface.d.ts.map +1 -0
  220. package/dist/interfaces/plugin.interface.js +6 -0
  221. package/dist/interfaces/plugin.interface.js.map +1 -0
  222. package/dist/interfaces/repository.interface.d.ts +56 -0
  223. package/dist/interfaces/repository.interface.d.ts.map +1 -0
  224. package/dist/interfaces/repository.interface.js +2 -0
  225. package/dist/interfaces/repository.interface.js.map +1 -0
  226. package/dist/lionRapid.d.ts +225 -0
  227. package/dist/lionRapid.d.ts.map +1 -0
  228. package/dist/lionRapid.js +596 -0
  229. package/dist/lionRapid.js.map +1 -0
  230. package/dist/repositories/index.d.ts +3 -0
  231. package/dist/repositories/index.d.ts.map +1 -0
  232. package/dist/repositories/index.js +3 -0
  233. package/dist/repositories/index.js.map +1 -0
  234. package/dist/repositories/memory-repository.d.ts +30 -0
  235. package/dist/repositories/memory-repository.d.ts.map +1 -0
  236. package/dist/repositories/memory-repository.js +100 -0
  237. package/dist/repositories/memory-repository.js.map +1 -0
  238. package/dist/repositories/network-repository.d.ts +138 -0
  239. package/dist/repositories/network-repository.d.ts.map +1 -0
  240. package/dist/repositories/network-repository.js +516 -0
  241. package/dist/repositories/network-repository.js.map +1 -0
  242. package/dist/sync/missing-translation-queue.d.ts +64 -0
  243. package/dist/sync/missing-translation-queue.d.ts.map +1 -0
  244. package/dist/sync/missing-translation-queue.js +184 -0
  245. package/dist/sync/missing-translation-queue.js.map +1 -0
  246. package/dist/types/cache.types.d.ts +62 -0
  247. package/dist/types/cache.types.d.ts.map +1 -0
  248. package/dist/types/cache.types.js +6 -0
  249. package/dist/types/cache.types.js.map +1 -0
  250. package/dist/types/event-payloads.types.d.ts +46 -0
  251. package/dist/types/event-payloads.types.d.ts.map +1 -0
  252. package/dist/types/event-payloads.types.js +6 -0
  253. package/dist/types/event-payloads.types.js.map +1 -0
  254. package/dist/types/generated.types.d.ts +31 -0
  255. package/dist/types/generated.types.d.ts.map +1 -0
  256. package/dist/types/generated.types.js +6 -0
  257. package/dist/types/generated.types.js.map +1 -0
  258. package/dist/types/index.d.ts +7 -0
  259. package/dist/types/index.d.ts.map +1 -0
  260. package/dist/types/index.js +7 -0
  261. package/dist/types/index.js.map +1 -0
  262. package/dist/types/lionRapid.types.d.ts +169 -0
  263. package/dist/types/lionRapid.types.d.ts.map +1 -0
  264. package/dist/types/lionRapid.types.js +8 -0
  265. package/dist/types/lionRapid.types.js.map +1 -0
  266. package/dist/types/parameters.types.d.ts +36 -0
  267. package/dist/types/parameters.types.d.ts.map +1 -0
  268. package/dist/types/parameters.types.js +6 -0
  269. package/dist/types/parameters.types.js.map +1 -0
  270. package/dist/types/translation-data.types.d.ts +54 -0
  271. package/dist/types/translation-data.types.d.ts.map +1 -0
  272. package/dist/types/translation-data.types.js +6 -0
  273. package/dist/types/translation-data.types.js.map +1 -0
  274. package/dist/types/translation.types.d.ts +94 -0
  275. package/dist/types/translation.types.d.ts.map +1 -0
  276. package/dist/types/translation.types.js +5 -0
  277. package/dist/types/translation.types.js.map +1 -0
  278. package/dist/utils/context-utils.d.ts +23 -0
  279. package/dist/utils/context-utils.d.ts.map +1 -0
  280. package/dist/utils/context-utils.js +36 -0
  281. package/dist/utils/context-utils.js.map +1 -0
  282. package/dist/utils/index.d.ts +10 -0
  283. package/dist/utils/index.d.ts.map +1 -0
  284. package/dist/utils/index.js +19 -0
  285. package/dist/utils/index.js.map +1 -0
  286. package/dist/utils/logger.d.ts +229 -0
  287. package/dist/utils/logger.d.ts.map +1 -0
  288. package/dist/utils/logger.js +345 -0
  289. package/dist/utils/logger.js.map +1 -0
  290. package/dist/utils/namespace-utils.d.ts +30 -0
  291. package/dist/utils/namespace-utils.d.ts.map +1 -0
  292. package/dist/utils/namespace-utils.js +56 -0
  293. package/dist/utils/namespace-utils.js.map +1 -0
  294. package/dist/utils/translation-flow.d.ts +18 -0
  295. package/dist/utils/translation-flow.d.ts.map +1 -0
  296. package/dist/utils/translation-flow.js +74 -0
  297. package/dist/utils/translation-flow.js.map +1 -0
  298. package/dist/utils/translation-value-utils.d.ts +57 -0
  299. package/dist/utils/translation-value-utils.d.ts.map +1 -0
  300. package/dist/utils/translation-value-utils.js +194 -0
  301. package/dist/utils/translation-value-utils.js.map +1 -0
  302. package/package.json +76 -0
@@ -0,0 +1,304 @@
1
+ /**
2
+ * Auto-Init for Browser Bundle
3
+ * Reads script tag attributes and auto-configures LionRapid
4
+ *
5
+ * Usage:
6
+ * <script
7
+ * src="https://cdn.lionrapid.com/lionrapid.min.js"
8
+ * data-api-key="pk_live_xxx"
9
+ * data-default-locale="en"
10
+ * data-namespace="default"
11
+ * data-languages="en,es,fr,de"
12
+ * ></script>
13
+ */
14
+ import { LionRapidBuilder } from '../builder.js';
15
+ import { MemoryRepository } from '../repositories/memory-repository.js';
16
+ import { NetworkRepository } from '../repositories/network-repository.js';
17
+ import { AutoTranslator } from './auto-translator.js';
18
+ import { LanguageSwitcher } from './language-switcher.js';
19
+ import { LocalStorageRepository } from './storage/localstorage-repository.js';
20
+ import { CacheStorageRepository } from './storage/cache-storage-repository.js';
21
+ /**
22
+ * Parse script tag attributes
23
+ */
24
+ function parseConfig(script) {
25
+ const apiKey = script.dataset.apiKey || '';
26
+ const baseUrl = script.dataset.baseUrl || 'https://api.lionrapid.com';
27
+ const defaultLocale = script.dataset.defaultLocale || 'en';
28
+ const namespace = script.dataset.namespace || 'default';
29
+ const languages = (script.dataset.languages || defaultLocale)
30
+ .split(',')
31
+ .map((s) => s.trim())
32
+ .filter(Boolean);
33
+ const excludeSelectors = (script.dataset.exclude || '')
34
+ .split(',')
35
+ .map((s) => s.trim())
36
+ .filter(Boolean);
37
+ const autoDetect = script.dataset.autoDetect === 'true';
38
+ const mode = (script.dataset.mode === 'dynamic-only' ? 'dynamic-only' : 'full');
39
+ const switcherStyle = script.dataset.switcher && script.dataset.switcher !== 'false'
40
+ ? script.dataset.switcher
41
+ : undefined;
42
+ const switcherPosition = script.dataset.switcherPosition || undefined;
43
+ const switcherShowFlags = script.dataset.switcherShowFlags !== 'false';
44
+ const switcherShowNames = script.dataset.switcherShowNames === 'true';
45
+ const switcherCustomCss = script.dataset.switcherCustomCss || undefined;
46
+ return {
47
+ apiKey,
48
+ baseUrl,
49
+ defaultLocale,
50
+ namespace,
51
+ languages,
52
+ excludeSelectors,
53
+ autoDetect,
54
+ mode,
55
+ switcherStyle,
56
+ switcherPosition,
57
+ switcherShowFlags,
58
+ switcherShowNames,
59
+ switcherCustomCss,
60
+ };
61
+ }
62
+ /**
63
+ * Read lionrapid_locale cookie if it matches an available language
64
+ */
65
+ function readLocaleCookie(availableLanguages) {
66
+ if (typeof document === 'undefined')
67
+ return null;
68
+ const match = document.cookie.match(/lionrapid_locale=([a-z]{2})/);
69
+ if (!match)
70
+ return null;
71
+ return availableLanguages.includes(match[1]) ? match[1] : null;
72
+ }
73
+ /**
74
+ * Detect browser language
75
+ */
76
+ function detectBrowserLanguage(availableLanguages, defaultLocale) {
77
+ if (typeof navigator === 'undefined')
78
+ return defaultLocale;
79
+ const browserLang = navigator.language || navigator.userLanguage || '';
80
+ const primaryLang = browserLang.split('-')[0].toLowerCase();
81
+ if (availableLanguages.includes(primaryLang)) {
82
+ return primaryLang;
83
+ }
84
+ return defaultLocale;
85
+ }
86
+ /**
87
+ * Navigate to locale-prefixed URL (for dynamic-only mode)
88
+ */
89
+ function navigateToLocale(locale, defaultLocale) {
90
+ const path = window.location.pathname.replace(/^\/([a-z]{2})(\/|$)/, '/');
91
+ const prefix = locale === defaultLocale ? '' : '/' + locale;
92
+ window.location.href = prefix + (path || '/') + window.location.search;
93
+ }
94
+ /**
95
+ * Initialize LionRapid from script tag
96
+ */
97
+ async function autoInit() {
98
+ // Find the script tag
99
+ const scripts = document.querySelectorAll('script[data-api-key]');
100
+ const script = scripts[scripts.length - 1];
101
+ if (!script) {
102
+ console.warn('[LionRapid] No script tag with data-api-key found');
103
+ return;
104
+ }
105
+ const config = parseConfig(script);
106
+ window.__lionrapidConfig = config;
107
+ if (!config.apiKey) {
108
+ console.warn('[LionRapid] Missing data-api-key attribute');
109
+ return;
110
+ }
111
+ // Determine initial locale
112
+ let initialLocale = config.defaultLocale;
113
+ if (config.mode === 'dynamic-only') {
114
+ // In dynamic-only mode, server already set <html lang="xx">
115
+ // Normalize "en-US" → "en" (WordPress outputs full locale codes)
116
+ const htmlLang = document.documentElement.lang?.split('-')[0]?.toLowerCase();
117
+ initialLocale = htmlLang || config.defaultLocale;
118
+ }
119
+ else {
120
+ // Cookie > browser detection > default
121
+ const cookieLocale = readLocaleCookie(config.languages);
122
+ if (cookieLocale) {
123
+ initialLocale = cookieLocale;
124
+ }
125
+ else if (config.autoDetect) {
126
+ initialLocale = detectBrowserLanguage(config.languages, config.defaultLocale);
127
+ }
128
+ }
129
+ // Determine sync mode based on key type
130
+ const syncMode = config.apiKey.startsWith('pk_') ? 'report-only' : 'sync';
131
+ // Create language switcher immediately (no core dependency for rendering)
132
+ const languageSwitcher = new LanguageSwitcher();
133
+ languageSwitcher.setLanguages(config.languages);
134
+ languageSwitcher.setInitialLocale(initialLocale);
135
+ // Render switcher as soon as DOM is ready (don't wait for network)
136
+ const renderSwitcher = () => {
137
+ // In full mode, auto-create floating container from script tag config
138
+ // In dynamic-only mode, server (WP/edge) provides the container via HTML
139
+ if (config.mode !== 'dynamic-only') {
140
+ if (config.switcherStyle && !document.querySelector('[data-lionrapid-switcher]')) {
141
+ const container = document.createElement('div');
142
+ container.dataset.lionrapidSwitcher = config.switcherStyle;
143
+ if (config.switcherPosition) {
144
+ container.dataset.lionrapidSwitcherPosition = config.switcherPosition;
145
+ }
146
+ if (!config.switcherShowFlags) {
147
+ container.dataset.lionrapidSwitcherShowFlags = 'false';
148
+ }
149
+ if (!config.switcherShowNames) {
150
+ container.dataset.lionrapidSwitcherShowNames = 'false';
151
+ }
152
+ if (config.switcherCustomCss) {
153
+ container.dataset.lionrapidSwitcherCustomCss = config.switcherCustomCss;
154
+ }
155
+ document.body.appendChild(container);
156
+ }
157
+ }
158
+ // Always init: injects CSS, hydrates any [data-lionrapid-switcher] elements
159
+ languageSwitcher.initAll();
160
+ };
161
+ if (document.readyState === 'loading') {
162
+ document.addEventListener('DOMContentLoaded', renderSwitcher);
163
+ }
164
+ else {
165
+ renderSwitcher();
166
+ }
167
+ try {
168
+ // Build LionRapid with all cache layers
169
+ const core = await LionRapidBuilder.init({
170
+ defaultLocale: initialLocale,
171
+ namespace: config.namespace,
172
+ })
173
+ .use(new MemoryRepository({ enabled: true }))
174
+ .use(new LocalStorageRepository({ enabled: true }))
175
+ .use(new CacheStorageRepository({ enabled: true }))
176
+ .use(new NetworkRepository({
177
+ enabled: true,
178
+ options: {
179
+ baseUrl: config.baseUrl,
180
+ apiKey: config.apiKey,
181
+ syncMissing: {
182
+ enabled: syncMode === 'sync',
183
+ debounceMs: 500,
184
+ batchSize: 50,
185
+ },
186
+ preloadNamespaces: [
187
+ {
188
+ locale: initialLocale,
189
+ namespace: config.namespace,
190
+ eager: true,
191
+ },
192
+ ],
193
+ },
194
+ }))
195
+ .build();
196
+ // Create auto translator
197
+ const autoTranslator = new AutoTranslator({
198
+ excludeSelectors: config.excludeSelectors,
199
+ });
200
+ autoTranslator.setCore(core);
201
+ autoTranslator.init({
202
+ namespace: config.namespace,
203
+ locale: initialLocale,
204
+ sourceLocale: config.defaultLocale,
205
+ });
206
+ // Wire up core to switcher now that it's ready
207
+ languageSwitcher.setCore(core);
208
+ languageSwitcher.setOnLanguageChange(async (locale) => {
209
+ document.cookie = `lionrapid_locale=${locale}; path=/; max-age=31536000; SameSite=Lax`;
210
+ if (config.mode === 'dynamic-only') {
211
+ // Server does the translation — navigate to /{locale}/path
212
+ navigateToLocale(locale, config.defaultLocale);
213
+ return;
214
+ }
215
+ // Full mode: retranslate in-place
216
+ await core.changeLanguage(locale, {
217
+ preloadNamespaces: [config.namespace],
218
+ });
219
+ autoTranslator.updateLocale(locale);
220
+ autoTranslator.retranslate();
221
+ });
222
+ // === Reactive translation reload ===
223
+ const RETRY_DELAYS = [2000, 8000, 30000]; // backoff: 2s, 8s, 30s
224
+ const REVALIDATE_STALE_MS = 60_000; // 60s before background revalidation
225
+ let hasPendingTranslations = false;
226
+ let retryTimers = [];
227
+ let lastRevalidatedAt = Date.now();
228
+ const reloadTranslations = async () => {
229
+ await core.reloadNamespace(config.namespace);
230
+ autoTranslator.translatePage();
231
+ lastRevalidatedAt = Date.now();
232
+ };
233
+ const cancelRetries = () => {
234
+ retryTimers.forEach(t => clearTimeout(t));
235
+ retryTimers = [];
236
+ };
237
+ // After sync: schedule backoff retries
238
+ core.bus.on('sync:batch:complete', () => {
239
+ hasPendingTranslations = true;
240
+ cancelRetries();
241
+ RETRY_DELAYS.forEach(delay => {
242
+ retryTimers.push(setTimeout(() => reloadTranslations().catch(() => { }), delay));
243
+ });
244
+ });
245
+ // On tab focus: reload if pending, or background revalidate if stale (>60s)
246
+ // The revalidation is cheap — server returns 304 if nothing changed
247
+ document.addEventListener('visibilitychange', () => {
248
+ if (document.visibilityState !== 'visible')
249
+ return;
250
+ if (hasPendingTranslations) {
251
+ hasPendingTranslations = false;
252
+ cancelRetries();
253
+ reloadTranslations().catch(() => { });
254
+ }
255
+ else if (Date.now() - lastRevalidatedAt > REVALIDATE_STALE_MS) {
256
+ reloadTranslations().catch(() => { });
257
+ }
258
+ });
259
+ // Expose global API
260
+ const instance = {
261
+ t: (key, params, defaultValue) => core.t(key, params || {}, defaultValue),
262
+ tHtml: (key, params, defaultValue) => core.tHtml(key, params || {}, defaultValue),
263
+ changeLanguage: async (locale) => {
264
+ await core.changeLanguage(locale, {
265
+ preloadNamespaces: [config.namespace],
266
+ });
267
+ autoTranslator.updateLocale(locale);
268
+ autoTranslator.retranslate();
269
+ languageSwitcher.initAll();
270
+ },
271
+ getCurrentLocale: () => core.getCurrentLocale(),
272
+ on: (event, callback) => core.bus.on(event, callback),
273
+ retranslate: () => autoTranslator.retranslate(),
274
+ reloadTranslations,
275
+ autoTranslator,
276
+ languageSwitcher,
277
+ };
278
+ window.LionRapid = instance;
279
+ // Detect editor mode (non-proxy case — edge proxy already injects the script)
280
+ const editorParam = new URLSearchParams(window.location.search).get('__lr_editor');
281
+ if (editorParam && !document.querySelector('script[data-grant]')) {
282
+ const editorScript = document.createElement('script');
283
+ editorScript.src = config.editorCdnUrl
284
+ || 'https://cdn.lionrapid.com/lionrapid.editor.min.js';
285
+ editorScript.dataset.grant = editorParam;
286
+ editorScript.dataset.locale = core.getCurrentLocale();
287
+ editorScript.dataset.api = config.baseUrl;
288
+ editorScript.async = true;
289
+ document.body.appendChild(editorScript);
290
+ }
291
+ // Start auto-translation now that core is ready
292
+ if (config.mode !== 'dynamic-only') {
293
+ autoTranslator.translatePage();
294
+ }
295
+ autoTranslator.observe();
296
+ }
297
+ catch (error) {
298
+ console.error('[LionRapid] Initialization failed:', error);
299
+ }
300
+ }
301
+ // Auto-run on script load
302
+ autoInit();
303
+ export { autoInit, parseConfig };
304
+ //# sourceMappingURL=auto-init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-init.js","sourceRoot":"","sources":["../../src/browser/auto-init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Auto Translator
3
+ * Automatically translates block-level elements in DOM content.
4
+ * Uses ContentUnit model for key parity with WordPress TS, PHP, and edge proxy.
5
+ *
6
+ * Missing translations are reported via the event bus (translation:not-found),
7
+ * picked up by MissingTranslationQueue, and synced through NetworkRepository.
8
+ */
9
+ import type { LionRapidCore } from '../lionRapid.js';
10
+ import { ExcludePatterns } from './exclude-filter.js';
11
+ export interface AutoTranslatorConfig {
12
+ excludePatterns?: Partial<ExcludePatterns>;
13
+ excludeSelectors?: string[];
14
+ minTextLength?: number;
15
+ debounceMs?: number;
16
+ }
17
+ export declare class AutoTranslator {
18
+ private core;
19
+ private blockExtractor;
20
+ private domObserver;
21
+ private locale;
22
+ private sourceLocale;
23
+ private namespace;
24
+ private debounceMs;
25
+ private pendingElements;
26
+ private debounceTimer;
27
+ private translatedCount;
28
+ constructor(config?: AutoTranslatorConfig);
29
+ /**
30
+ * Set the core instance
31
+ */
32
+ setCore(core: LionRapidCore): void;
33
+ /**
34
+ * Initialize locale and namespace for cache key construction
35
+ */
36
+ init(config: {
37
+ namespace: string;
38
+ locale: string;
39
+ sourceLocale: string;
40
+ }): void;
41
+ /**
42
+ * Update locale (after language change)
43
+ */
44
+ updateLocale(locale: string): void;
45
+ /**
46
+ * Check if ready
47
+ */
48
+ isReady(): boolean;
49
+ /**
50
+ * Generate auto key for text (exposed for testing)
51
+ */
52
+ generateAutoKey(text: string): string;
53
+ /**
54
+ * Queue an element for translation (debounced)
55
+ */
56
+ queueElement(element: Element): void;
57
+ /**
58
+ * Translate an element immediately
59
+ */
60
+ translateElement(element: Element): number;
61
+ /**
62
+ * Translate the entire page
63
+ */
64
+ translatePage(): number;
65
+ /**
66
+ * Start observing DOM for dynamic content
67
+ */
68
+ observe(): void;
69
+ /**
70
+ * Stop observing DOM
71
+ */
72
+ stopObserving(): void;
73
+ /**
74
+ * Schedule debounced processing
75
+ */
76
+ private scheduleProcessing;
77
+ /**
78
+ * Process all pending elements
79
+ */
80
+ private processPendingElements;
81
+ /**
82
+ * Translate extracted blocks using ContentUnit model
83
+ */
84
+ private translateBlocks;
85
+ /**
86
+ * Get translated count
87
+ */
88
+ getTranslatedCount(): number;
89
+ /**
90
+ * Re-translate a single element (for editor live preview reset)
91
+ */
92
+ retranslateElement(element: Element): void;
93
+ /**
94
+ * Re-translate the page (after language change)
95
+ */
96
+ retranslate(): void;
97
+ }
98
+ //# sourceMappingURL=auto-translator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-translator.d.ts","sourceRoot":"","sources":["../../src/browser/auto-translator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGrD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAOtD,MAAM,WAAW,oBAAoB;IACnC,eAAe,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IAC3C,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,IAAI,CAA8B;IAC1C,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,eAAe,CAA2B;IAClD,OAAO,CAAC,aAAa,CAA8C;IACnE,OAAO,CAAC,eAAe,CAAK;gBAEhB,MAAM,GAAE,oBAAyB;IAS7C;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAIlC;;OAEG;IACH,IAAI,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAM/E;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIlC;;OAEG;IACH,OAAO,IAAI,OAAO;IAIlB;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAIrC;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAKpC;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM;IAS1C;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,OAAO,IAAI,IAAI;IAWf;;OAEG;IACH,aAAa,IAAI,IAAI;IAOrB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAU1B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAqB9B;;OAEG;IACH,OAAO,CAAC,eAAe;IA6CvB;;OAEG;IACH,kBAAkB,IAAI,MAAM;IAI5B;;OAEG;IACH,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAQ1C;;OAEG;IACH,WAAW,IAAI,IAAI;CAkBpB"}
@@ -0,0 +1,218 @@
1
+ /**
2
+ * Auto Translator
3
+ * Automatically translates block-level elements in DOM content.
4
+ * Uses ContentUnit model for key parity with WordPress TS, PHP, and edge proxy.
5
+ *
6
+ * Missing translations are reported via the event bus (translation:not-found),
7
+ * picked up by MissingTranslationQueue, and synced through NetworkRepository.
8
+ */
9
+ import { BlockExtractor } from './block-extractor.js';
10
+ import { DOMObserver } from './dom-observer.js';
11
+ import { HTMLSerializer } from '../content/serializer/HTMLSerializer.js';
12
+ import { generateAutoKey } from './md5.js';
13
+ const htmlSerializer = new HTMLSerializer();
14
+ export class AutoTranslator {
15
+ core = null;
16
+ blockExtractor;
17
+ domObserver = null;
18
+ locale = '';
19
+ sourceLocale = '';
20
+ namespace = '';
21
+ debounceMs;
22
+ pendingElements = new Set();
23
+ debounceTimer = null;
24
+ translatedCount = 0;
25
+ constructor(config = {}) {
26
+ this.blockExtractor = new BlockExtractor(config.excludePatterns, config.excludeSelectors, config.minTextLength);
27
+ this.debounceMs = config.debounceMs ?? 100;
28
+ }
29
+ /**
30
+ * Set the core instance
31
+ */
32
+ setCore(core) {
33
+ this.core = core;
34
+ }
35
+ /**
36
+ * Initialize locale and namespace for cache key construction
37
+ */
38
+ init(config) {
39
+ this.locale = config.locale;
40
+ this.sourceLocale = config.sourceLocale;
41
+ this.namespace = config.namespace;
42
+ }
43
+ /**
44
+ * Update locale (after language change)
45
+ */
46
+ updateLocale(locale) {
47
+ this.locale = locale;
48
+ }
49
+ /**
50
+ * Check if ready
51
+ */
52
+ isReady() {
53
+ return this.core !== null;
54
+ }
55
+ /**
56
+ * Generate auto key for text (exposed for testing)
57
+ */
58
+ generateAutoKey(text) {
59
+ return generateAutoKey(text);
60
+ }
61
+ /**
62
+ * Queue an element for translation (debounced)
63
+ */
64
+ queueElement(element) {
65
+ this.pendingElements.add(element);
66
+ this.scheduleProcessing();
67
+ }
68
+ /**
69
+ * Translate an element immediately
70
+ */
71
+ translateElement(element) {
72
+ if (!this.core) {
73
+ return 0;
74
+ }
75
+ const extracted = this.blockExtractor.extract(element);
76
+ return this.translateBlocks(extracted);
77
+ }
78
+ /**
79
+ * Translate the entire page
80
+ */
81
+ translatePage() {
82
+ return this.translateElement(document.body);
83
+ }
84
+ /**
85
+ * Start observing DOM for dynamic content
86
+ */
87
+ observe() {
88
+ if (this.domObserver) {
89
+ return;
90
+ }
91
+ this.domObserver = new DOMObserver({
92
+ onNewContent: (element) => this.queueElement(element),
93
+ });
94
+ this.domObserver.start();
95
+ }
96
+ /**
97
+ * Stop observing DOM
98
+ */
99
+ stopObserving() {
100
+ if (this.domObserver) {
101
+ this.domObserver.stop();
102
+ this.domObserver = null;
103
+ }
104
+ }
105
+ /**
106
+ * Schedule debounced processing
107
+ */
108
+ scheduleProcessing() {
109
+ if (this.debounceTimer) {
110
+ clearTimeout(this.debounceTimer);
111
+ }
112
+ this.debounceTimer = setTimeout(() => {
113
+ this.processPendingElements();
114
+ }, this.debounceMs);
115
+ }
116
+ /**
117
+ * Process all pending elements
118
+ */
119
+ processPendingElements() {
120
+ if (!this.core || this.pendingElements.size === 0) {
121
+ return;
122
+ }
123
+ let totalTranslated = 0;
124
+ for (const element of this.pendingElements) {
125
+ // Skip if element was removed from DOM
126
+ if (!document.body.contains(element)) {
127
+ continue;
128
+ }
129
+ const count = this.translateElement(element);
130
+ totalTranslated += count;
131
+ }
132
+ this.pendingElements.clear();
133
+ this.translatedCount += totalTranslated;
134
+ }
135
+ /**
136
+ * Translate extracted blocks using ContentUnit model
137
+ */
138
+ translateBlocks(extracted) {
139
+ if (!this.core)
140
+ return 0;
141
+ let count = 0;
142
+ for (const { element, unit, key } of extracted) {
143
+ // Construct full cache key: locale:namespace:key
144
+ const fullKey = `${this.locale}:${this.namespace}:${key}`;
145
+ // Look up translation from cache
146
+ const cached = this.core.cache.get(fullKey);
147
+ if (cached && cached.value !== unit.text && cached.value !== key) {
148
+ // Translation found — save original HTML before first translation
149
+ if (!element.hasAttribute('data-lr-original')) {
150
+ element.setAttribute('data-lr-original', element.innerHTML);
151
+ }
152
+ if (cached.styles && Object.keys(cached.styles).length > 0) {
153
+ const translatedUnit = { text: cached.value, styles: cached.styles };
154
+ element.innerHTML = htmlSerializer.serialize(translatedUnit);
155
+ }
156
+ else {
157
+ element.textContent = cached.value;
158
+ }
159
+ element.setAttribute('data-lr-block', key);
160
+ element.setAttribute('data-lionrapid-client', '1');
161
+ count++;
162
+ }
163
+ else {
164
+ // No translation — report missing via event bus
165
+ // MissingTranslationQueue picks this up and syncs through NetworkRepository
166
+ this.core.bus.emit('translation:not-found', {
167
+ payload: {
168
+ key,
169
+ fallbackValue: unit.text,
170
+ locale: this.sourceLocale,
171
+ namespace: this.namespace,
172
+ status: 404,
173
+ styles: unit.styles,
174
+ },
175
+ });
176
+ }
177
+ }
178
+ return count;
179
+ }
180
+ /**
181
+ * Get translated count
182
+ */
183
+ getTranslatedCount() {
184
+ return this.translatedCount;
185
+ }
186
+ /**
187
+ * Re-translate a single element (for editor live preview reset)
188
+ */
189
+ retranslateElement(element) {
190
+ const original = element.getAttribute('data-lr-original');
191
+ if (original !== null)
192
+ element.innerHTML = original;
193
+ element.removeAttribute('data-lionrapid-client');
194
+ element.removeAttribute('data-lr-block');
195
+ this.translateElement(element);
196
+ }
197
+ /**
198
+ * Re-translate the page (after language change)
199
+ */
200
+ retranslate() {
201
+ // Restore original HTML for all previously translated elements
202
+ const translated = document.querySelectorAll('[data-lionrapid-client]');
203
+ translated.forEach((el) => {
204
+ const original = el.getAttribute('data-lr-original');
205
+ if (original !== null) {
206
+ el.innerHTML = original;
207
+ }
208
+ el.removeAttribute('data-lionrapid-client');
209
+ el.removeAttribute('data-lr-block');
210
+ });
211
+ // Re-translate (blocks are now back to source text, so auto_keys will be correct)
212
+ this.translatedCount = 0;
213
+ if (this.locale !== this.sourceLocale) {
214
+ this.translatePage();
215
+ }
216
+ }
217
+ }
218
+ //# sourceMappingURL=auto-translator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-translator.js","sourceRoot":"","sources":["../../src/browser/auto-translator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Block Extractor
3
+ * Finds translatable block elements in DOM and parses them into ContentUnit.
4
+ * Mirrors WordPress TS BlockExtractor and edge proxy block-level approach.
5
+ */
6
+ import type { ContentUnit } from '../content/types.js';
7
+ import { ExcludePatterns } from './exclude-filter.js';
8
+ export interface ExtractedBlock {
9
+ element: Element;
10
+ unit: ContentUnit;
11
+ key: string;
12
+ }
13
+ export declare class BlockExtractor {
14
+ private excludeFilter;
15
+ private excludeSelectors;
16
+ constructor(excludePatterns?: Partial<ExcludePatterns>, excludeSelectors?: string[], minTextLength?: number);
17
+ /**
18
+ * Extract all translatable block elements from a root.
19
+ * @param includeTranslated - If true, include elements already marked as translated (for editor mode)
20
+ */
21
+ extract(root: Element | Document, includeTranslated?: boolean): ExtractedBlock[];
22
+ private isInsideSkipTag;
23
+ private hasSkipAttribute;
24
+ private matchesExcludeSelector;
25
+ }
26
+ //# sourceMappingURL=block-extractor.d.ts.map