@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.
- package/README.md +106 -0
- package/dist/base/event-emitter.d.ts +91 -0
- package/dist/base/event-emitter.d.ts.map +1 -0
- package/dist/base/event-emitter.js +330 -0
- package/dist/base/event-emitter.js.map +1 -0
- package/dist/base/index.d.ts +5 -0
- package/dist/base/index.d.ts.map +1 -0
- package/dist/base/index.js +5 -0
- package/dist/base/index.js.map +1 -0
- package/dist/browser/auto-init.d.ts +57 -0
- package/dist/browser/auto-init.d.ts.map +1 -0
- package/dist/browser/auto-init.js +304 -0
- package/dist/browser/auto-init.js.map +1 -0
- package/dist/browser/auto-translator.d.ts +98 -0
- package/dist/browser/auto-translator.d.ts.map +1 -0
- package/dist/browser/auto-translator.js +218 -0
- package/dist/browser/auto-translator.js.map +1 -0
- package/dist/browser/block-extractor.d.ts +26 -0
- package/dist/browser/block-extractor.d.ts.map +1 -0
- package/dist/browser/block-extractor.js +143 -0
- package/dist/browser/block-extractor.js.map +1 -0
- package/dist/browser/dom-observer.d.ts +42 -0
- package/dist/browser/dom-observer.d.ts.map +1 -0
- package/dist/browser/dom-observer.js +109 -0
- package/dist/browser/dom-observer.js.map +1 -0
- package/dist/browser/editor/editor-api.d.ts +67 -0
- package/dist/browser/editor/editor-api.d.ts.map +1 -0
- package/dist/browser/editor/editor-api.js +233 -0
- package/dist/browser/editor/editor-api.js.map +1 -0
- package/dist/browser/editor/editor-init.d.ts +11 -0
- package/dist/browser/editor/editor-init.d.ts.map +1 -0
- package/dist/browser/editor/editor-init.js +181 -0
- package/dist/browser/editor/editor-init.js.map +1 -0
- package/dist/browser/editor/editor-styles.d.ts +6 -0
- package/dist/browser/editor/editor-styles.d.ts.map +1 -0
- package/dist/browser/editor/editor-styles.js +419 -0
- package/dist/browser/editor/editor-styles.js.map +1 -0
- package/dist/browser/editor/inspector.d.ts +22 -0
- package/dist/browser/editor/inspector.d.ts.map +1 -0
- package/dist/browser/editor/inspector.js +125 -0
- package/dist/browser/editor/inspector.js.map +1 -0
- package/dist/browser/editor/key-resolver.d.ts +19 -0
- package/dist/browser/editor/key-resolver.d.ts.map +1 -0
- package/dist/browser/editor/key-resolver.js +49 -0
- package/dist/browser/editor/key-resolver.js.map +1 -0
- package/dist/browser/editor/live-preview.d.ts +10 -0
- package/dist/browser/editor/live-preview.d.ts.map +1 -0
- package/dist/browser/editor/live-preview.js +57 -0
- package/dist/browser/editor/live-preview.js.map +1 -0
- package/dist/browser/editor/sidebar.d.ts +50 -0
- package/dist/browser/editor/sidebar.d.ts.map +1 -0
- package/dist/browser/editor/sidebar.js +353 -0
- package/dist/browser/editor/sidebar.js.map +1 -0
- package/dist/browser/editor/toolbar.d.ts +29 -0
- package/dist/browser/editor/toolbar.d.ts.map +1 -0
- package/dist/browser/editor/toolbar.js +131 -0
- package/dist/browser/editor/toolbar.js.map +1 -0
- package/dist/browser/exclude-filter.d.ts +21 -0
- package/dist/browser/exclude-filter.d.ts.map +1 -0
- package/dist/browser/exclude-filter.js +51 -0
- package/dist/browser/exclude-filter.js.map +1 -0
- package/dist/browser/index.d.ts +32 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +28 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/language-switcher.d.ts +70 -0
- package/dist/browser/language-switcher.d.ts.map +1 -0
- package/dist/browser/language-switcher.js +339 -0
- package/dist/browser/language-switcher.js.map +1 -0
- package/dist/browser/lionrapid.auto.dev.js +5757 -0
- package/dist/browser/lionrapid.auto.dev.js.map +7 -0
- package/dist/browser/lionrapid.auto.js +5757 -0
- package/dist/browser/lionrapid.auto.js.map +7 -0
- package/dist/browser/lionrapid.auto.min.js +80 -0
- package/dist/browser/lionrapid.auto.min.js.map +7 -0
- package/dist/browser/lionrapid.editor.js +1869 -0
- package/dist/browser/lionrapid.editor.js.map +7 -0
- package/dist/browser/lionrapid.editor.min.js +415 -0
- package/dist/browser/lionrapid.editor.min.js.map +7 -0
- package/dist/browser/lionrapid.esm.js +4786 -0
- package/dist/browser/lionrapid.esm.js.map +7 -0
- package/dist/browser/lionrapid.esm.min.js +3 -0
- package/dist/browser/lionrapid.esm.min.js.map +7 -0
- package/dist/browser/lionrapid.iife.dev.js +4809 -0
- package/dist/browser/lionrapid.iife.dev.js.map +7 -0
- package/dist/browser/lionrapid.iife.js +4809 -0
- package/dist/browser/lionrapid.iife.js.map +7 -0
- package/dist/browser/lionrapid.iife.min.js +3 -0
- package/dist/browser/lionrapid.iife.min.js.map +7 -0
- package/dist/browser/lionrapid.umd.js +4822 -0
- package/dist/browser/lionrapid.umd.js.map +7 -0
- package/dist/browser/lionrapid.umd.min.js +18 -0
- package/dist/browser/lionrapid.umd.min.js.map +7 -0
- package/dist/browser/markup-parser.d.ts +13 -0
- package/dist/browser/markup-parser.d.ts.map +1 -0
- package/dist/browser/markup-parser.js +56 -0
- package/dist/browser/markup-parser.js.map +1 -0
- package/dist/browser/md5.d.ts +16 -0
- package/dist/browser/md5.d.ts.map +1 -0
- package/dist/browser/md5.js +145 -0
- package/dist/browser/md5.js.map +1 -0
- package/dist/browser/storage/cache-storage-repository.d.ts +44 -0
- package/dist/browser/storage/cache-storage-repository.d.ts.map +1 -0
- package/dist/browser/storage/cache-storage-repository.js +186 -0
- package/dist/browser/storage/cache-storage-repository.js.map +1 -0
- package/dist/browser/storage/localstorage-repository.d.ts +51 -0
- package/dist/browser/storage/localstorage-repository.d.ts.map +1 -0
- package/dist/browser/storage/localstorage-repository.js +270 -0
- package/dist/browser/storage/localstorage-repository.js.map +1 -0
- package/dist/builder.d.ts +24 -0
- package/dist/builder.d.ts.map +1 -0
- package/dist/builder.js +169 -0
- package/dist/builder.js.map +1 -0
- package/dist/cache/CacheManager.d.ts +132 -0
- package/dist/cache/CacheManager.d.ts.map +1 -0
- package/dist/cache/CacheManager.js +277 -0
- package/dist/cache/CacheManager.js.map +1 -0
- package/dist/cache/index.d.ts +6 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +5 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/config/index.d.ts +6 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +6 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/lionrapid.config.d.ts +12 -0
- package/dist/config/lionrapid.config.d.ts.map +1 -0
- package/dist/config/lionrapid.config.js +2 -0
- package/dist/config/lionrapid.config.js.map +1 -0
- package/dist/config/logger.config.d.ts +19 -0
- package/dist/config/logger.config.d.ts.map +1 -0
- package/dist/config/logger.config.js +9 -0
- package/dist/config/logger.config.js.map +1 -0
- package/dist/config/repository.config.d.ts +87 -0
- package/dist/config/repository.config.d.ts.map +1 -0
- package/dist/config/repository.config.js +5 -0
- package/dist/config/repository.config.js.map +1 -0
- package/dist/content/index.d.ts +20 -0
- package/dist/content/index.d.ts.map +1 -0
- package/dist/content/index.js +13 -0
- package/dist/content/index.js.map +1 -0
- package/dist/content/parser/IParser.d.ts +33 -0
- package/dist/content/parser/IParser.d.ts.map +1 -0
- package/dist/content/parser/IParser.js +6 -0
- package/dist/content/parser/IParser.js.map +1 -0
- package/dist/content/parser/MarkupParser.d.ts +67 -0
- package/dist/content/parser/MarkupParser.d.ts.map +1 -0
- package/dist/content/parser/MarkupParser.js +231 -0
- package/dist/content/parser/MarkupParser.js.map +1 -0
- package/dist/content/serializer/HTMLSerializer.d.ts +61 -0
- package/dist/content/serializer/HTMLSerializer.d.ts.map +1 -0
- package/dist/content/serializer/HTMLSerializer.js +100 -0
- package/dist/content/serializer/HTMLSerializer.js.map +1 -0
- package/dist/content/serializer/ISerializer.d.ts +33 -0
- package/dist/content/serializer/ISerializer.d.ts.map +1 -0
- package/dist/content/serializer/ISerializer.js +6 -0
- package/dist/content/serializer/ISerializer.js.map +1 -0
- package/dist/content/style-mapper/DefaultStyleMapper.d.ts +59 -0
- package/dist/content/style-mapper/DefaultStyleMapper.d.ts.map +1 -0
- package/dist/content/style-mapper/DefaultStyleMapper.js +128 -0
- package/dist/content/style-mapper/DefaultStyleMapper.js.map +1 -0
- package/dist/content/style-mapper/IStyleMapper.d.ts +50 -0
- package/dist/content/style-mapper/IStyleMapper.d.ts.map +1 -0
- package/dist/content/style-mapper/IStyleMapper.js +6 -0
- package/dist/content/style-mapper/IStyleMapper.js.map +1 -0
- package/dist/content/types.d.ts +39 -0
- package/dist/content/types.d.ts.map +1 -0
- package/dist/content/types.js +6 -0
- package/dist/content/types.js.map +1 -0
- package/dist/content/validator/ContentValidator.d.ts +57 -0
- package/dist/content/validator/ContentValidator.d.ts.map +1 -0
- package/dist/content/validator/ContentValidator.js +215 -0
- package/dist/content/validator/ContentValidator.js.map +1 -0
- package/dist/content/validator/IValidator.d.ts +82 -0
- package/dist/content/validator/IValidator.d.ts.map +1 -0
- package/dist/content/validator/IValidator.js +6 -0
- package/dist/content/validator/IValidator.js.map +1 -0
- package/dist/errors/translation-errors.d.ts +55 -0
- package/dist/errors/translation-errors.d.ts.map +1 -0
- package/dist/errors/translation-errors.js +85 -0
- package/dist/errors/translation-errors.js.map +1 -0
- package/dist/handlers/async-storage-handler.d.ts +77 -0
- package/dist/handlers/async-storage-handler.d.ts.map +1 -0
- package/dist/handlers/async-storage-handler.js +239 -0
- package/dist/handlers/async-storage-handler.js.map +1 -0
- package/dist/handlers/handler-chain.d.ts +79 -0
- package/dist/handlers/handler-chain.d.ts.map +1 -0
- package/dist/handlers/handler-chain.js +366 -0
- package/dist/handlers/handler-chain.js.map +1 -0
- package/dist/handlers/index.d.ts +7 -0
- package/dist/handlers/index.d.ts.map +1 -0
- package/dist/handlers/index.js +7 -0
- package/dist/handlers/index.js.map +1 -0
- package/dist/handlers/network-handler.d.ts +90 -0
- package/dist/handlers/network-handler.d.ts.map +1 -0
- package/dist/handlers/network-handler.js +283 -0
- package/dist/handlers/network-handler.js.map +1 -0
- package/dist/handlers/sync-storage-handler.d.ts +88 -0
- package/dist/handlers/sync-storage-handler.d.ts.map +1 -0
- package/dist/handlers/sync-storage-handler.js +270 -0
- package/dist/handlers/sync-storage-handler.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/emitter.interface.d.ts +33 -0
- package/dist/interfaces/emitter.interface.d.ts.map +1 -0
- package/dist/interfaces/emitter.interface.js +2 -0
- package/dist/interfaces/emitter.interface.js.map +1 -0
- package/dist/interfaces/handler.interface.d.ts +50 -0
- package/dist/interfaces/handler.interface.d.ts.map +1 -0
- package/dist/interfaces/handler.interface.js +5 -0
- package/dist/interfaces/handler.interface.js.map +1 -0
- package/dist/interfaces/index.d.ts +8 -0
- package/dist/interfaces/index.d.ts.map +1 -0
- package/dist/interfaces/index.js +8 -0
- package/dist/interfaces/index.js.map +1 -0
- package/dist/interfaces/plugin.interface.d.ts +49 -0
- package/dist/interfaces/plugin.interface.d.ts.map +1 -0
- package/dist/interfaces/plugin.interface.js +6 -0
- package/dist/interfaces/plugin.interface.js.map +1 -0
- package/dist/interfaces/repository.interface.d.ts +56 -0
- package/dist/interfaces/repository.interface.d.ts.map +1 -0
- package/dist/interfaces/repository.interface.js +2 -0
- package/dist/interfaces/repository.interface.js.map +1 -0
- package/dist/lionRapid.d.ts +225 -0
- package/dist/lionRapid.d.ts.map +1 -0
- package/dist/lionRapid.js +596 -0
- package/dist/lionRapid.js.map +1 -0
- package/dist/repositories/index.d.ts +3 -0
- package/dist/repositories/index.d.ts.map +1 -0
- package/dist/repositories/index.js +3 -0
- package/dist/repositories/index.js.map +1 -0
- package/dist/repositories/memory-repository.d.ts +30 -0
- package/dist/repositories/memory-repository.d.ts.map +1 -0
- package/dist/repositories/memory-repository.js +100 -0
- package/dist/repositories/memory-repository.js.map +1 -0
- package/dist/repositories/network-repository.d.ts +138 -0
- package/dist/repositories/network-repository.d.ts.map +1 -0
- package/dist/repositories/network-repository.js +516 -0
- package/dist/repositories/network-repository.js.map +1 -0
- package/dist/sync/missing-translation-queue.d.ts +64 -0
- package/dist/sync/missing-translation-queue.d.ts.map +1 -0
- package/dist/sync/missing-translation-queue.js +184 -0
- package/dist/sync/missing-translation-queue.js.map +1 -0
- package/dist/types/cache.types.d.ts +62 -0
- package/dist/types/cache.types.d.ts.map +1 -0
- package/dist/types/cache.types.js +6 -0
- package/dist/types/cache.types.js.map +1 -0
- package/dist/types/event-payloads.types.d.ts +46 -0
- package/dist/types/event-payloads.types.d.ts.map +1 -0
- package/dist/types/event-payloads.types.js +6 -0
- package/dist/types/event-payloads.types.js.map +1 -0
- package/dist/types/generated.types.d.ts +31 -0
- package/dist/types/generated.types.d.ts.map +1 -0
- package/dist/types/generated.types.js +6 -0
- package/dist/types/generated.types.js.map +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/lionRapid.types.d.ts +169 -0
- package/dist/types/lionRapid.types.d.ts.map +1 -0
- package/dist/types/lionRapid.types.js +8 -0
- package/dist/types/lionRapid.types.js.map +1 -0
- package/dist/types/parameters.types.d.ts +36 -0
- package/dist/types/parameters.types.d.ts.map +1 -0
- package/dist/types/parameters.types.js +6 -0
- package/dist/types/parameters.types.js.map +1 -0
- package/dist/types/translation-data.types.d.ts +54 -0
- package/dist/types/translation-data.types.d.ts.map +1 -0
- package/dist/types/translation-data.types.js +6 -0
- package/dist/types/translation-data.types.js.map +1 -0
- package/dist/types/translation.types.d.ts +94 -0
- package/dist/types/translation.types.d.ts.map +1 -0
- package/dist/types/translation.types.js +5 -0
- package/dist/types/translation.types.js.map +1 -0
- package/dist/utils/context-utils.d.ts +23 -0
- package/dist/utils/context-utils.d.ts.map +1 -0
- package/dist/utils/context-utils.js +36 -0
- package/dist/utils/context-utils.js.map +1 -0
- package/dist/utils/index.d.ts +10 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +19 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +229 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +345 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/namespace-utils.d.ts +30 -0
- package/dist/utils/namespace-utils.d.ts.map +1 -0
- package/dist/utils/namespace-utils.js +56 -0
- package/dist/utils/namespace-utils.js.map +1 -0
- package/dist/utils/translation-flow.d.ts +18 -0
- package/dist/utils/translation-flow.d.ts.map +1 -0
- package/dist/utils/translation-flow.js +74 -0
- package/dist/utils/translation-flow.js.map +1 -0
- package/dist/utils/translation-value-utils.d.ts +57 -0
- package/dist/utils/translation-value-utils.d.ts.map +1 -0
- package/dist/utils/translation-value-utils.js +194 -0
- package/dist/utils/translation-value-utils.js.map +1 -0
- 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"}
|