@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 @@
1
+ {"version":3,"file":"block-extractor.d.ts","sourceRoot":"","sources":["../../src/browser/block-extractor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAiB,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAyBrE,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,WAAW,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,gBAAgB,CAAW;gBAGjC,eAAe,GAAE,OAAO,CAAC,eAAe,CAAM,EAC9C,gBAAgB,GAAE,MAAM,EAAO,EAC/B,aAAa,SAAI;IAMnB;;;OAGG;IACH,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,EAAE,iBAAiB,UAAQ,GAAG,cAAc,EAAE;IAkF9E,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,sBAAsB;CAY/B"}
@@ -0,0 +1,143 @@
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 { ExcludeFilter } from './exclude-filter.js';
7
+ import { parseBlockElement } from './markup-parser.js';
8
+ import { generateAutoKey } from './md5.js';
9
+ const BLOCK_SELECTOR = 'p,h1,h2,h3,h4,h5,h6,li,td,th,label,button,figcaption,dt,dd,summary,caption';
10
+ // Tags to skip (same as PHP/edge)
11
+ const SKIP_TAGS = new Set([
12
+ 'SCRIPT',
13
+ 'STYLE',
14
+ 'CODE',
15
+ 'PRE',
16
+ 'TEXTAREA',
17
+ 'NOSCRIPT',
18
+ 'SVG',
19
+ ]);
20
+ // Attributes that mark elements to skip
21
+ const SKIP_ATTRIBUTES = [
22
+ 'data-lionrapid-translated', // Server already translated
23
+ 'data-lionrapid-client', // Client already translated
24
+ 'data-no-translate', // Explicitly marked to skip
25
+ ];
26
+ export class BlockExtractor {
27
+ excludeFilter;
28
+ excludeSelectors;
29
+ constructor(excludePatterns = {}, excludeSelectors = [], minTextLength = 2) {
30
+ this.excludeFilter = new ExcludeFilter(excludePatterns, minTextLength);
31
+ this.excludeSelectors = excludeSelectors;
32
+ }
33
+ /**
34
+ * Extract all translatable block elements from a root.
35
+ * @param includeTranslated - If true, include elements already marked as translated (for editor mode)
36
+ */
37
+ extract(root, includeTranslated = false) {
38
+ const results = [];
39
+ const descendants = root.querySelectorAll(BLOCK_SELECTOR);
40
+ // Include the root itself if it matches the block selector
41
+ const elements = [];
42
+ if (root instanceof Element && root.matches(BLOCK_SELECTOR)) {
43
+ elements.push(root);
44
+ }
45
+ for (let i = 0; i < descendants.length; i++) {
46
+ elements.push(descendants[i]);
47
+ }
48
+ for (let i = 0; i < elements.length; i++) {
49
+ const el = elements[i];
50
+ // Skip if inside a SKIP_TAG ancestor
51
+ if (this.isInsideSkipTag(el)) {
52
+ continue;
53
+ }
54
+ // Skip if has skip attributes (unless editor mode includes translated)
55
+ if (!includeTranslated && this.hasSkipAttribute(el)) {
56
+ continue;
57
+ }
58
+ // Skip if matches exclude selectors
59
+ if (this.matchesExcludeSelector(el)) {
60
+ continue;
61
+ }
62
+ // Skip if has translate="no"
63
+ if (el.getAttribute('translate') === 'no') {
64
+ continue;
65
+ }
66
+ // Skip nested block elements (let the inner blocks be extracted)
67
+ if (el.querySelector(BLOCK_SELECTOR)) {
68
+ continue;
69
+ }
70
+ // For already-translated elements, use original HTML for key + unit
71
+ const lrBlock = el.getAttribute('data-lr-block');
72
+ const lrOriginal = el.getAttribute('data-lr-original');
73
+ let unit;
74
+ if (lrOriginal) {
75
+ // Parse original (source) HTML → correct ContentUnit for key generation
76
+ const temp = document.createElement(el.tagName);
77
+ temp.innerHTML = lrOriginal;
78
+ unit = parseBlockElement(temp);
79
+ }
80
+ else {
81
+ unit = parseBlockElement(el);
82
+ }
83
+ // Strip indexed tags for exclude filter
84
+ const strippedText = unit.text.replace(/<\/?[0-9]+\/?>/g, '');
85
+ // Apply exclude filter
86
+ if (this.excludeFilter.shouldExclude(strippedText)) {
87
+ continue;
88
+ }
89
+ // Key priority: data-lr-block (translated) → data-i18n (named) → auto-generate
90
+ let key;
91
+ if (lrBlock) {
92
+ key = lrBlock;
93
+ }
94
+ else {
95
+ const dataI18n = el.getAttribute('data-i18n');
96
+ if (dataI18n) {
97
+ key = dataI18n.includes(':') ? dataI18n : `common:${dataI18n}`;
98
+ }
99
+ else {
100
+ key = generateAutoKey(unit.text);
101
+ }
102
+ }
103
+ results.push({ element: el, unit, key });
104
+ }
105
+ return results;
106
+ }
107
+ isInsideSkipTag(element) {
108
+ let current = element.parentElement;
109
+ while (current) {
110
+ if (SKIP_TAGS.has(current.tagName)) {
111
+ return true;
112
+ }
113
+ current = current.parentElement;
114
+ }
115
+ return false;
116
+ }
117
+ hasSkipAttribute(element) {
118
+ let current = element;
119
+ while (current) {
120
+ for (const attr of SKIP_ATTRIBUTES) {
121
+ if (current.hasAttribute(attr)) {
122
+ return true;
123
+ }
124
+ }
125
+ current = current.parentElement;
126
+ }
127
+ return false;
128
+ }
129
+ matchesExcludeSelector(element) {
130
+ for (const selector of this.excludeSelectors) {
131
+ try {
132
+ if (element.matches(selector) || element.closest(selector)) {
133
+ return true;
134
+ }
135
+ }
136
+ catch {
137
+ // Invalid selector, skip
138
+ }
139
+ }
140
+ return false;
141
+ }
142
+ }
143
+ //# sourceMappingURL=block-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block-extractor.js","sourceRoot":"","sources":["../../src/browser/block-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * DOM Observer
3
+ * Watches for dynamically added content using MutationObserver
4
+ * Triggers translation of new content (AJAX, SPA navigation, etc.)
5
+ */
6
+ export interface DOMObserverCallbacks {
7
+ onNewContent?: (element: Element) => void;
8
+ onNewSwitchers?: () => void;
9
+ }
10
+ export declare class DOMObserver {
11
+ private observer;
12
+ private callbacks;
13
+ private debounceTimer;
14
+ private pendingElements;
15
+ private debounceMs;
16
+ constructor(callbacks: DOMObserverCallbacks, debounceMs?: number);
17
+ /**
18
+ * Start observing DOM changes
19
+ */
20
+ start(): void;
21
+ /**
22
+ * Stop observing
23
+ */
24
+ stop(): void;
25
+ /**
26
+ * Handle DOM mutations
27
+ */
28
+ private handleMutations;
29
+ /**
30
+ * Schedule debounced processing of pending elements
31
+ */
32
+ private scheduleFlush;
33
+ /**
34
+ * Process all pending elements
35
+ */
36
+ private flushPendingElements;
37
+ /**
38
+ * Check if element or children are language switchers
39
+ */
40
+ private hasLanguageSwitcher;
41
+ }
42
+ //# sourceMappingURL=dom-observer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom-observer.d.ts","sourceRoot":"","sources":["../../src/browser/dom-observer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,oBAAoB;IACnC,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1C,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;CAC7B;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAiC;IACjD,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,aAAa,CAA8C;IACnE,OAAO,CAAC,eAAe,CAA2B;IAClD,OAAO,CAAC,UAAU,CAAS;gBAEf,SAAS,EAAE,oBAAoB,EAAE,UAAU,SAAK;IAK5D;;OAEG;IACH,KAAK,IAAI,IAAI;IAeb;;OAEG;IACH,IAAI,IAAI,IAAI;IAYZ;;OAEG;IACH,OAAO,CAAC,eAAe;IAgCvB;;OAEG;IACH,OAAO,CAAC,aAAa;IAUrB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAgB5B;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAM5B"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * DOM Observer
3
+ * Watches for dynamically added content using MutationObserver
4
+ * Triggers translation of new content (AJAX, SPA navigation, etc.)
5
+ */
6
+ export class DOMObserver {
7
+ observer = null;
8
+ callbacks;
9
+ debounceTimer = null;
10
+ pendingElements = new Set();
11
+ debounceMs;
12
+ constructor(callbacks, debounceMs = 50) {
13
+ this.callbacks = callbacks;
14
+ this.debounceMs = debounceMs;
15
+ }
16
+ /**
17
+ * Start observing DOM changes
18
+ */
19
+ start() {
20
+ if (this.observer) {
21
+ return;
22
+ }
23
+ this.observer = new MutationObserver((mutations) => {
24
+ this.handleMutations(mutations);
25
+ });
26
+ this.observer.observe(document.body, {
27
+ childList: true,
28
+ subtree: true,
29
+ });
30
+ }
31
+ /**
32
+ * Stop observing
33
+ */
34
+ stop() {
35
+ if (this.observer) {
36
+ this.observer.disconnect();
37
+ this.observer = null;
38
+ }
39
+ if (this.debounceTimer) {
40
+ clearTimeout(this.debounceTimer);
41
+ this.debounceTimer = null;
42
+ }
43
+ this.pendingElements.clear();
44
+ }
45
+ /**
46
+ * Handle DOM mutations
47
+ */
48
+ handleMutations(mutations) {
49
+ let hasNewSwitchers = false;
50
+ for (const mutation of mutations) {
51
+ for (const node of Array.from(mutation.addedNodes)) {
52
+ if (node.nodeType !== Node.ELEMENT_NODE)
53
+ continue;
54
+ const element = node;
55
+ // Check for language switchers
56
+ if (this.hasLanguageSwitcher(element)) {
57
+ hasNewSwitchers = true;
58
+ }
59
+ // Queue for auto-translation
60
+ if (this.callbacks.onNewContent) {
61
+ this.pendingElements.add(element);
62
+ }
63
+ }
64
+ }
65
+ // Trigger switcher callback immediately
66
+ if (hasNewSwitchers && this.callbacks.onNewSwitchers) {
67
+ this.callbacks.onNewSwitchers();
68
+ }
69
+ // Debounce content translation
70
+ if (this.pendingElements.size > 0) {
71
+ this.scheduleFlush();
72
+ }
73
+ }
74
+ /**
75
+ * Schedule debounced processing of pending elements
76
+ */
77
+ scheduleFlush() {
78
+ if (this.debounceTimer) {
79
+ clearTimeout(this.debounceTimer);
80
+ }
81
+ this.debounceTimer = setTimeout(() => {
82
+ this.flushPendingElements();
83
+ }, this.debounceMs);
84
+ }
85
+ /**
86
+ * Process all pending elements
87
+ */
88
+ flushPendingElements() {
89
+ if (!this.callbacks.onNewContent || this.pendingElements.size === 0) {
90
+ return;
91
+ }
92
+ for (const element of this.pendingElements) {
93
+ // Skip if element was removed from DOM
94
+ if (!document.body.contains(element)) {
95
+ continue;
96
+ }
97
+ this.callbacks.onNewContent(element);
98
+ }
99
+ this.pendingElements.clear();
100
+ }
101
+ /**
102
+ * Check if element or children are language switchers
103
+ */
104
+ hasLanguageSwitcher(element) {
105
+ return (element.hasAttribute('data-lionrapid-switcher') ||
106
+ element.querySelector('[data-lionrapid-switcher]') !== null);
107
+ }
108
+ }
109
+ //# sourceMappingURL=dom-observer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom-observer.js","sourceRoot":"","sources":["../../src/browser/dom-observer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Editor API — Batch save queue + session auth
3
+ * Queues translation edits and flushes them in a single batch API call.
4
+ * Uses editor session JWTs (es_ prefixed) for authentication with auto-renewal.
5
+ */
6
+ export interface QueuedTranslation {
7
+ key: string;
8
+ locale: string;
9
+ namespace: string;
10
+ text: string;
11
+ styles: Record<string, string[]>;
12
+ }
13
+ export interface TargetStatus {
14
+ text: string;
15
+ rowState: string;
16
+ isConfirmed: boolean;
17
+ isReady: boolean;
18
+ isLocked: boolean;
19
+ }
20
+ export type StatusCallback = (status: 'unsaved' | 'saving' | 'saved' | 'error', message?: string) => void;
21
+ export declare class EditorAPI {
22
+ private queue;
23
+ private apiBase;
24
+ private sessionToken;
25
+ private projectId;
26
+ private flushInterval;
27
+ private renewalInterval;
28
+ private onStatus;
29
+ private onFlushed;
30
+ private onSessionExpired;
31
+ constructor(apiBase: string, sessionToken: string, projectId: string);
32
+ setStatusCallback(cb: StatusCallback): void;
33
+ setFlushedCallback(cb: (keys: string[]) => void): void;
34
+ setSessionExpiredCallback(cb: () => void): void;
35
+ /**
36
+ * Start auto-flush (30s interval + visibilitychange) and session renewal (60s check)
37
+ */
38
+ startAutoFlush(): void;
39
+ /**
40
+ * Stop auto-flush and flush remaining items
41
+ */
42
+ stopAndFlush(): Promise<void>;
43
+ /**
44
+ * Queue a translation for saving
45
+ */
46
+ queueSave(item: QueuedTranslation): void;
47
+ /**
48
+ * Flush all queued translations to the server
49
+ */
50
+ flush(): Promise<void>;
51
+ private statusAbort;
52
+ /**
53
+ * Fetch translation status for a batch of keys (includes unconfirmed rows).
54
+ * Cancels any in-flight status request. Caps at 200 keys per request.
55
+ */
56
+ fetchStatus(keys: string[], locale: string, namespace: string): Promise<Record<string, TargetStatus | null>>;
57
+ get pendingCount(): number;
58
+ /**
59
+ * Check if session is within 2min of expiry, and renew if so.
60
+ */
61
+ private maybeRenewSession;
62
+ private renewSession;
63
+ private getSessionExp;
64
+ private handleSessionExpired;
65
+ private handleVisibility;
66
+ }
67
+ //# sourceMappingURL=editor-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor-api.d.ts","sourceRoot":"","sources":["../../../src/browser/editor/editor-api.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;AAE1G,qBAAa,SAAS;IACpB,OAAO,CAAC,KAAK,CAA2B;IACxC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAA+C;IACpE,OAAO,CAAC,eAAe,CAA+C;IACtE,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,SAAS,CAAsC;IACvD,OAAO,CAAC,gBAAgB,CAA6B;gBAEzC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;IAMpE,iBAAiB,CAAC,EAAE,EAAE,cAAc,GAAG,IAAI;IAI3C,kBAAkB,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,GAAG,IAAI;IAItD,yBAAyB,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IAI/C;;OAEG;IACH,cAAc,IAAI,IAAI;IAQtB;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAanC;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI;IAkBxC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAqD5B,OAAO,CAAC,WAAW,CAAgC;IAEnD;;;OAGG;IACG,WAAW,CACf,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC,CAAC;IAgC/C,IAAI,YAAY,IAAI,MAAM,CAEzB;IAMD;;OAEG;YACW,iBAAiB;YAUjB,YAAY;IAoC1B,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,gBAAgB,CAItB;CACH"}
@@ -0,0 +1,233 @@
1
+ /**
2
+ * Editor API — Batch save queue + session auth
3
+ * Queues translation edits and flushes them in a single batch API call.
4
+ * Uses editor session JWTs (es_ prefixed) for authentication with auto-renewal.
5
+ */
6
+ export class EditorAPI {
7
+ queue = [];
8
+ apiBase;
9
+ sessionToken;
10
+ projectId;
11
+ flushInterval = null;
12
+ renewalInterval = null;
13
+ onStatus = () => { };
14
+ onFlushed = () => { };
15
+ onSessionExpired = null;
16
+ constructor(apiBase, sessionToken, projectId) {
17
+ this.apiBase = apiBase.replace(/\/$/, '');
18
+ this.sessionToken = sessionToken;
19
+ this.projectId = projectId;
20
+ }
21
+ setStatusCallback(cb) {
22
+ this.onStatus = cb;
23
+ }
24
+ setFlushedCallback(cb) {
25
+ this.onFlushed = cb;
26
+ }
27
+ setSessionExpiredCallback(cb) {
28
+ this.onSessionExpired = cb;
29
+ }
30
+ /**
31
+ * Start auto-flush (30s interval + visibilitychange) and session renewal (60s check)
32
+ */
33
+ startAutoFlush() {
34
+ this.flushInterval = setInterval(() => this.flush(), 30_000);
35
+ document.addEventListener('visibilitychange', this.handleVisibility);
36
+ // Check session renewal every 60s
37
+ this.renewalInterval = setInterval(() => this.maybeRenewSession(), 60_000);
38
+ }
39
+ /**
40
+ * Stop auto-flush and flush remaining items
41
+ */
42
+ async stopAndFlush() {
43
+ if (this.flushInterval) {
44
+ clearInterval(this.flushInterval);
45
+ this.flushInterval = null;
46
+ }
47
+ if (this.renewalInterval) {
48
+ clearInterval(this.renewalInterval);
49
+ this.renewalInterval = null;
50
+ }
51
+ document.removeEventListener('visibilitychange', this.handleVisibility);
52
+ await this.flush();
53
+ }
54
+ /**
55
+ * Queue a translation for saving
56
+ */
57
+ queueSave(item) {
58
+ // Replace existing entry for same key+locale
59
+ const idx = this.queue.findIndex((q) => q.key === item.key && q.locale === item.locale && q.namespace === item.namespace);
60
+ if (idx >= 0) {
61
+ this.queue[idx] = item;
62
+ }
63
+ else {
64
+ this.queue.push(item);
65
+ }
66
+ this.onStatus('unsaved', `${this.queue.length} unsaved`);
67
+ // Auto-flush if queue is large
68
+ if (this.queue.length > 50) {
69
+ this.flush();
70
+ }
71
+ }
72
+ /**
73
+ * Flush all queued translations to the server
74
+ */
75
+ async flush() {
76
+ if (this.queue.length === 0)
77
+ return;
78
+ const items = [...this.queue];
79
+ this.onStatus('saving');
80
+ try {
81
+ const response = await fetch(`${this.apiBase}/api/integrations/targets/batch`, {
82
+ method: 'PUT',
83
+ headers: {
84
+ 'Content-Type': 'application/json',
85
+ 'Authorization': `Bearer ${this.sessionToken}`,
86
+ },
87
+ body: JSON.stringify({
88
+ translations: items.map((t) => ({
89
+ key: `${t.locale}:${t.namespace}:${t.key}`,
90
+ value: { text: t.text, styles: t.styles },
91
+ })),
92
+ }),
93
+ });
94
+ if (response.status === 401) {
95
+ this.handleSessionExpired();
96
+ return;
97
+ }
98
+ if (!response.ok) {
99
+ throw new Error(`HTTP ${response.status}`);
100
+ }
101
+ // Remove flushed items from queue (new items may have been added during fetch)
102
+ const flushedKeys = items.map((i) => i.key);
103
+ for (const item of items) {
104
+ const idx = this.queue.indexOf(item);
105
+ if (idx >= 0)
106
+ this.queue.splice(idx, 1);
107
+ }
108
+ // Notify sidebar to re-fetch status for flushed keys
109
+ this.onFlushed(flushedKeys);
110
+ if (this.queue.length === 0) {
111
+ this.onStatus('saved', 'All changes saved');
112
+ }
113
+ else {
114
+ this.onStatus('unsaved', `${this.queue.length} unsaved`);
115
+ }
116
+ }
117
+ catch (err) {
118
+ this.onStatus('error', `Save failed: ${err.message}`);
119
+ }
120
+ }
121
+ statusAbort = null;
122
+ /**
123
+ * Fetch translation status for a batch of keys (includes unconfirmed rows).
124
+ * Cancels any in-flight status request. Caps at 200 keys per request.
125
+ */
126
+ async fetchStatus(keys, locale, namespace) {
127
+ if (keys.length === 0)
128
+ return {};
129
+ // Cancel previous in-flight request
130
+ if (this.statusAbort)
131
+ this.statusAbort.abort();
132
+ this.statusAbort = new AbortController();
133
+ // Cap keys to avoid exceeding URL length limits
134
+ const batch = keys.slice(0, 200);
135
+ const params = new URLSearchParams({ locale, namespace, keys: batch.join(',') });
136
+ try {
137
+ const response = await fetch(`${this.apiBase}/api/integrations/targets/status?${params}`, {
138
+ headers: { 'Authorization': `Bearer ${this.sessionToken}` },
139
+ signal: this.statusAbort.signal,
140
+ });
141
+ if (response.status === 401) {
142
+ this.handleSessionExpired();
143
+ return {};
144
+ }
145
+ if (!response.ok)
146
+ return {};
147
+ const data = await response.json();
148
+ return data.translations;
149
+ }
150
+ catch (err) {
151
+ if (err.name === 'AbortError')
152
+ return {};
153
+ return {};
154
+ }
155
+ }
156
+ get pendingCount() {
157
+ return this.queue.length;
158
+ }
159
+ // ============================================
160
+ // Session renewal
161
+ // ============================================
162
+ /**
163
+ * Check if session is within 2min of expiry, and renew if so.
164
+ */
165
+ async maybeRenewSession() {
166
+ const exp = this.getSessionExp();
167
+ if (!exp)
168
+ return;
169
+ const timeLeft = exp * 1000 - Date.now();
170
+ if (timeLeft > 120_000)
171
+ return; // More than 2 min left, skip
172
+ await this.renewSession();
173
+ }
174
+ async renewSession() {
175
+ try {
176
+ const response = await fetch(`${this.apiBase}/api/editor/renew`, {
177
+ method: 'POST',
178
+ headers: {
179
+ 'Authorization': `Bearer ${this.sessionToken}`,
180
+ },
181
+ });
182
+ if (response.status === 401) {
183
+ this.handleSessionExpired();
184
+ return;
185
+ }
186
+ if (!response.ok)
187
+ return;
188
+ const data = await response.json();
189
+ this.sessionToken = data.session_token;
190
+ // Update sessionStorage
191
+ try {
192
+ const raw = this.sessionToken.startsWith('es_') ? this.sessionToken.slice(3) : this.sessionToken;
193
+ const parts = raw.split('.');
194
+ if (parts.length === 3) {
195
+ const payload = JSON.parse(atob(parts[1]));
196
+ sessionStorage.setItem('__lr_editor_session', JSON.stringify({
197
+ token: this.sessionToken,
198
+ exp: payload.exp || 0,
199
+ }));
200
+ }
201
+ }
202
+ catch { /* non-critical */ }
203
+ }
204
+ catch {
205
+ // Network error — will retry on next interval
206
+ }
207
+ }
208
+ getSessionExp() {
209
+ try {
210
+ const raw = this.sessionToken.startsWith('es_') ? this.sessionToken.slice(3) : this.sessionToken;
211
+ const parts = raw.split('.');
212
+ if (parts.length !== 3)
213
+ return null;
214
+ const payload = JSON.parse(atob(parts[1]));
215
+ return payload.exp || null;
216
+ }
217
+ catch {
218
+ return null;
219
+ }
220
+ }
221
+ handleSessionExpired() {
222
+ this.onStatus('error', 'Session expired. Please reopen the editor from the dashboard.');
223
+ if (this.onSessionExpired) {
224
+ this.onSessionExpired();
225
+ }
226
+ }
227
+ handleVisibility = () => {
228
+ if (document.visibilityState === 'hidden') {
229
+ this.flush();
230
+ }
231
+ };
232
+ }
233
+ //# sourceMappingURL=editor-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor-api.js","sourceRoot":"","sources":["../../../src/browser/editor/editor-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Visual Translation Editor — Entry Point
3
+ * Self-executing IIFE bundle loaded by edge proxy or auto-init when ?__lr_editor is detected.
4
+ *
5
+ * Reads script tag attributes, polls for window.LionRapid, creates Shadow DOM,
6
+ * and instantiates Inspector, Sidebar, and Toolbar.
7
+ *
8
+ * Auth flow: grant token → exchange for scoped session JWT → use JWT for API calls.
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=editor-init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor-init.d.ts","sourceRoot":"","sources":["../../../src/browser/editor/editor-init.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}