@adrk/mxls 1.0.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 (112) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +110 -0
  3. package/dist/completion/CompletionBuilder.d.ts +26 -0
  4. package/dist/completion/CompletionBuilder.d.ts.map +1 -0
  5. package/dist/completion/CompletionBuilder.js +113 -0
  6. package/dist/completion/CompletionBuilder.js.map +1 -0
  7. package/dist/completion/CompletionCache.d.ts +16 -0
  8. package/dist/completion/CompletionCache.d.ts.map +1 -0
  9. package/dist/completion/CompletionCache.js +25 -0
  10. package/dist/completion/CompletionCache.js.map +1 -0
  11. package/dist/completion/NamespaceResolver.d.ts +21 -0
  12. package/dist/completion/NamespaceResolver.d.ts.map +1 -0
  13. package/dist/completion/NamespaceResolver.js +58 -0
  14. package/dist/completion/NamespaceResolver.js.map +1 -0
  15. package/dist/completion/SchemaCompleter.d.ts +23 -0
  16. package/dist/completion/SchemaCompleter.d.ts.map +1 -0
  17. package/dist/completion/SchemaCompleter.js +164 -0
  18. package/dist/completion/SchemaCompleter.js.map +1 -0
  19. package/dist/completion/TextAnalyzer.d.ts +34 -0
  20. package/dist/completion/TextAnalyzer.d.ts.map +1 -0
  21. package/dist/completion/TextAnalyzer.js +122 -0
  22. package/dist/completion/TextAnalyzer.js.map +1 -0
  23. package/dist/features/EditorPlugin.d.ts +49 -0
  24. package/dist/features/EditorPlugin.d.ts.map +1 -0
  25. package/dist/features/EditorPlugin.js +128 -0
  26. package/dist/features/EditorPlugin.js.map +1 -0
  27. package/dist/formatter/XmlFormatter.d.ts +4 -0
  28. package/dist/formatter/XmlFormatter.d.ts.map +1 -0
  29. package/dist/formatter/XmlFormatter.js +13 -0
  30. package/dist/formatter/XmlFormatter.js.map +1 -0
  31. package/dist/hover/HoverBuilder.d.ts +8 -0
  32. package/dist/hover/HoverBuilder.d.ts.map +1 -0
  33. package/dist/hover/HoverBuilder.js +27 -0
  34. package/dist/hover/HoverBuilder.js.map +1 -0
  35. package/dist/hover/SchemaHover.d.ts +12 -0
  36. package/dist/hover/SchemaHover.d.ts.map +1 -0
  37. package/dist/hover/SchemaHover.js +71 -0
  38. package/dist/hover/SchemaHover.js.map +1 -0
  39. package/dist/index.d.ts +14 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +9 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/interfaces/IMonacoApi.d.ts +39 -0
  44. package/dist/interfaces/IMonacoApi.d.ts.map +1 -0
  45. package/dist/interfaces/IMonacoApi.js +2 -0
  46. package/dist/interfaces/IMonacoApi.js.map +1 -0
  47. package/dist/interfaces/ISchemaParser.d.ts +30 -0
  48. package/dist/interfaces/ISchemaParser.d.ts.map +1 -0
  49. package/dist/interfaces/ISchemaParser.js +2 -0
  50. package/dist/interfaces/ISchemaParser.js.map +1 -0
  51. package/dist/interfaces/ISchemaRegistry.d.ts +46 -0
  52. package/dist/interfaces/ISchemaRegistry.d.ts.map +1 -0
  53. package/dist/interfaces/ISchemaRegistry.js +2 -0
  54. package/dist/interfaces/ISchemaRegistry.js.map +1 -0
  55. package/dist/interfaces/ISchemaWorker.d.ts +25 -0
  56. package/dist/interfaces/ISchemaWorker.d.ts.map +1 -0
  57. package/dist/interfaces/ISchemaWorker.js +2 -0
  58. package/dist/interfaces/ISchemaWorker.js.map +1 -0
  59. package/dist/manager/SchemaRegistry.d.ts +24 -0
  60. package/dist/manager/SchemaRegistry.d.ts.map +1 -0
  61. package/dist/manager/SchemaRegistry.js +84 -0
  62. package/dist/manager/SchemaRegistry.js.map +1 -0
  63. package/dist/manager/SchemaWorker.d.ts +25 -0
  64. package/dist/manager/SchemaWorker.d.ts.map +1 -0
  65. package/dist/manager/SchemaWorker.js +70 -0
  66. package/dist/manager/SchemaWorker.js.map +1 -0
  67. package/dist/parser/SchemaIndex.d.ts +54 -0
  68. package/dist/parser/SchemaIndex.d.ts.map +1 -0
  69. package/dist/parser/SchemaIndex.js +149 -0
  70. package/dist/parser/SchemaIndex.js.map +1 -0
  71. package/dist/parser/SchemaParser.d.ts +23 -0
  72. package/dist/parser/SchemaParser.d.ts.map +1 -0
  73. package/dist/parser/SchemaParser.js +44 -0
  74. package/dist/parser/SchemaParser.js.map +1 -0
  75. package/dist/parser/SchemaQuery.d.ts +38 -0
  76. package/dist/parser/SchemaQuery.d.ts.map +1 -0
  77. package/dist/parser/SchemaQuery.js +364 -0
  78. package/dist/parser/SchemaQuery.js.map +1 -0
  79. package/dist/template/TemplateBuilder.d.ts +18 -0
  80. package/dist/template/TemplateBuilder.d.ts.map +1 -0
  81. package/dist/template/TemplateBuilder.js +52 -0
  82. package/dist/template/TemplateBuilder.js.map +1 -0
  83. package/dist/types.d.ts +81 -0
  84. package/dist/types.d.ts.map +1 -0
  85. package/dist/types.js +27 -0
  86. package/dist/types.js.map +1 -0
  87. package/dist/utils/Logger.d.ts +17 -0
  88. package/dist/utils/Logger.d.ts.map +1 -0
  89. package/dist/utils/Logger.js +41 -0
  90. package/dist/utils/Logger.js.map +1 -0
  91. package/dist/utils/XmlTextUtils.d.ts +20 -0
  92. package/dist/utils/XmlTextUtils.d.ts.map +1 -0
  93. package/dist/utils/XmlTextUtils.js +85 -0
  94. package/dist/utils/XmlTextUtils.js.map +1 -0
  95. package/dist/validation/DecorationMapper.d.ts +15 -0
  96. package/dist/validation/DecorationMapper.d.ts.map +1 -0
  97. package/dist/validation/DecorationMapper.js +59 -0
  98. package/dist/validation/DecorationMapper.js.map +1 -0
  99. package/dist/validation/SchemaDecorator.d.ts +26 -0
  100. package/dist/validation/SchemaDecorator.d.ts.map +1 -0
  101. package/dist/validation/SchemaDecorator.js +50 -0
  102. package/dist/validation/SchemaDecorator.js.map +1 -0
  103. package/dist/validation/SchemaValidator.d.ts +13 -0
  104. package/dist/validation/SchemaValidator.d.ts.map +1 -0
  105. package/dist/validation/SchemaValidator.js +387 -0
  106. package/dist/validation/SchemaValidator.js.map +1 -0
  107. package/dist/validation/validation.worker.d.ts +2 -0
  108. package/dist/validation/validation.worker.d.ts.map +1 -0
  109. package/dist/validation/validation.worker.js +57 -0
  110. package/dist/validation/validation.worker.js.map +1 -0
  111. package/package.json +49 -0
  112. package/style.css +17 -0
@@ -0,0 +1,34 @@
1
+ import { CompletionType } from '../types';
2
+ /** Pure cursor-context analyzer — zero Monaco imports. */
3
+ export declare class TextAnalyzer {
4
+ /**
5
+ * Returns the completion type appropriate for the given text and Monaco
6
+ * trigger information. `triggerKind` 1 = triggerCharacter; 0 = Invoke.
7
+ */
8
+ getCompletionType(text: string, triggerKind: number, triggerChar?: string): CompletionType;
9
+ /** Innermost unclosed element name (NS-stripped), or undefined. */
10
+ getParentTag(text: string): string | undefined;
11
+ /**
12
+ * All unclosed tags minus the innermost, with namespace prefix stripped.
13
+ * Represents the ancestor chain of the element being edited.
14
+ */
15
+ getAncestorChain(text: string): string[];
16
+ /** Full NS-prefixed unclosed-tag stack (as returned by XML text utils). */
17
+ getUnclosedTags(text: string): string[];
18
+ isInsideOpenTag(text: string): boolean;
19
+ /**
20
+ * Name of the element whose opening tag the cursor is currently inside.
21
+ * Unlike getParentTag (which returns the innermost *closed* element),
22
+ * this returns the element whose `<tagName` has not yet received its closing `>`.
23
+ * Returns undefined when the cursor is not inside an unclosed opening tag.
24
+ */
25
+ getCurrentOpenTagName(text: string): string | undefined;
26
+ /** Returns the attribute name whose value the cursor is currently inside. */
27
+ getAttrNameBeforeCursor(text: string): string | undefined;
28
+ /**
29
+ * Counts how many times `childTag` appears as a direct child of the current
30
+ * open `parentTag` scope (best-effort approximation based on text).
31
+ */
32
+ countChildOccurrences(text: string, parentTag: string, childTag: string): number;
33
+ }
34
+ //# sourceMappingURL=TextAnalyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextAnalyzer.d.ts","sourceRoot":"","sources":["../../src/completion/TextAnalyzer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAuDzC,0DAA0D;AAC1D,qBAAa,YAAY;IACrB;;;OAGG;IACH,iBAAiB,CACb,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,MAAM,GACrB,cAAc;IAoBjB,mEAAmE;IACnE,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAM9C;;;OAGG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IAKxC,2EAA2E;IAC3E,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IAIvC,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAKtC;;;;;OAKG;IACH,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IASvD,6EAA6E;IAC7E,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIzD;;;OAGG;IACH,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;CAQnF"}
@@ -0,0 +1,122 @@
1
+ import { CompletionType } from '../types';
2
+ import { getUnclosedTags, stripNsPrefix, extractCurrentAttributeName, } from '../utils/XmlTextUtils';
3
+ function scan(text) {
4
+ let inStr = null;
5
+ let lastOpen = -1;
6
+ let lastClose = -1;
7
+ for (let i = 0; i < text.length; i++) {
8
+ const ch = text[i];
9
+ if (inStr !== null) {
10
+ if (ch === inStr)
11
+ inStr = null;
12
+ }
13
+ else if (ch === '"' || ch === "'") {
14
+ inStr = ch;
15
+ }
16
+ else if (ch === '<') {
17
+ lastOpen = i;
18
+ }
19
+ else if (ch === '>') {
20
+ lastClose = i;
21
+ }
22
+ }
23
+ return { lastOpen, lastClose, inString: inStr !== null };
24
+ }
25
+ function deriveType(text) {
26
+ const { lastOpen, lastClose, inString } = scan(text);
27
+ if (inString)
28
+ return CompletionType.attributeValue;
29
+ const insideTag = lastOpen !== -1 && lastOpen > lastClose;
30
+ if (!insideTag)
31
+ return CompletionType.element;
32
+ const inside = text.slice(lastOpen + 1);
33
+ if (inside.startsWith('/'))
34
+ return CompletionType.closingElement;
35
+ const hasSpaceAfterName = /^(?:[a-zA-Z_][\w:.-]*)?\s/.test(inside);
36
+ if (!hasSpaceAfterName)
37
+ return CompletionType.incompleteElement;
38
+ return CompletionType.incompleteAttribute;
39
+ }
40
+ // ─── TextAnalyzer ─────────────────────────────────────────────────────────────
41
+ /** Pure cursor-context analyzer — zero Monaco imports. */
42
+ export class TextAnalyzer {
43
+ /**
44
+ * Returns the completion type appropriate for the given text and Monaco
45
+ * trigger information. `triggerKind` 1 = triggerCharacter; 0 = Invoke.
46
+ */
47
+ getCompletionType(text, triggerKind, triggerChar) {
48
+ if (triggerKind === 1 && triggerChar) {
49
+ switch (triggerChar) {
50
+ case '<':
51
+ return text.trimEnd().endsWith('</')
52
+ ? CompletionType.closingElement
53
+ : CompletionType.element;
54
+ case '/':
55
+ return CompletionType.closingElement;
56
+ case '=':
57
+ case '"':
58
+ case "'":
59
+ return CompletionType.attributeValue;
60
+ case ' ':
61
+ return CompletionType.incompleteAttribute;
62
+ }
63
+ }
64
+ return deriveType(text);
65
+ }
66
+ /** Innermost unclosed element name (NS-stripped), or undefined. */
67
+ getParentTag(text) {
68
+ const tags = this.getUnclosedTags(text);
69
+ const last = tags[tags.length - 1];
70
+ return last ? stripNsPrefix(last) : undefined;
71
+ }
72
+ /**
73
+ * All unclosed tags minus the innermost, with namespace prefix stripped.
74
+ * Represents the ancestor chain of the element being edited.
75
+ */
76
+ getAncestorChain(text) {
77
+ const tags = this.getUnclosedTags(text);
78
+ return tags.slice(0, -1).map(stripNsPrefix);
79
+ }
80
+ /** Full NS-prefixed unclosed-tag stack (as returned by XML text utils). */
81
+ getUnclosedTags(text) {
82
+ return getUnclosedTags(text);
83
+ }
84
+ isInsideOpenTag(text) {
85
+ const t = deriveType(text);
86
+ return t === CompletionType.incompleteAttribute || t === CompletionType.attributeValue;
87
+ }
88
+ /**
89
+ * Name of the element whose opening tag the cursor is currently inside.
90
+ * Unlike getParentTag (which returns the innermost *closed* element),
91
+ * this returns the element whose `<tagName` has not yet received its closing `>`.
92
+ * Returns undefined when the cursor is not inside an unclosed opening tag.
93
+ */
94
+ getCurrentOpenTagName(text) {
95
+ const { lastOpen, lastClose } = scan(text);
96
+ if (lastOpen === -1 || lastOpen <= lastClose)
97
+ return undefined;
98
+ const inside = text.slice(lastOpen + 1);
99
+ if (inside.startsWith('/'))
100
+ return undefined;
101
+ const match = /^([a-zA-Z_][\w:.-]*)/.exec(inside);
102
+ return match ? stripNsPrefix(match[1]) : undefined;
103
+ }
104
+ /** Returns the attribute name whose value the cursor is currently inside. */
105
+ getAttrNameBeforeCursor(text) {
106
+ return extractCurrentAttributeName(text) ?? undefined;
107
+ }
108
+ /**
109
+ * Counts how many times `childTag` appears as a direct child of the current
110
+ * open `parentTag` scope (best-effort approximation based on text).
111
+ */
112
+ countChildOccurrences(text, parentTag, childTag) {
113
+ const lastParentOpen = text.lastIndexOf(`<${parentTag}`);
114
+ if (lastParentOpen < 0)
115
+ return 0;
116
+ const scope = text.slice(lastParentOpen);
117
+ const escaped = childTag.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
118
+ const re = new RegExp(`<${escaped}[\\s>\/]`, 'g');
119
+ return (scope.match(re) ?? []).length;
120
+ }
121
+ }
122
+ //# sourceMappingURL=TextAnalyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextAnalyzer.js","sourceRoot":"","sources":["../../src/completion/TextAnalyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import type { editor } from 'monaco-editor';
2
+ import type { IMonacoApi } from '../interfaces/IMonacoApi';
3
+ import type { ISchemaRegistry } from '../interfaces/ISchemaRegistry';
4
+ export interface EditorPluginOptions {
5
+ /**
6
+ * Called when `generateTemplate` needs to know the desired nesting depth.
7
+ * Return a positive integer, or undefined/null to abort generation.
8
+ */
9
+ promptLevel?: () => number | null | undefined;
10
+ }
11
+ /**
12
+ * Top-level wiring class. Holds the editor reference; all other classes are
13
+ * editor-free. Activate once the Monaco editor and schema registry are ready.
14
+ */
15
+ export declare class EditorPlugin {
16
+ private readonly monacoApi;
17
+ private readonly codeEditor;
18
+ private readonly registry;
19
+ private readonly options;
20
+ private readonly completer;
21
+ private readonly decorator;
22
+ private readonly template;
23
+ private readonly formatter;
24
+ private readonly hover;
25
+ private completionDisposable;
26
+ private hoverDisposable;
27
+ private reformatDisposable;
28
+ private generateDisposable;
29
+ constructor(monacoApi: IMonacoApi, codeEditor: editor.IStandaloneCodeEditor, registry: ISchemaRegistry, options?: EditorPluginOptions);
30
+ /** Register the completion and hover providers and run the first validation pass. */
31
+ activate(): void;
32
+ /**
33
+ * Call after adding, updating, or removing schemas so completions and
34
+ * validation decorations are refreshed.
35
+ */
36
+ onSchemaChange(): void;
37
+ /**
38
+ * Generate an XML skeleton from the document's root tag and replace the
39
+ * current editor content. The nesting depth comes from `options.promptLevel`.
40
+ */
41
+ generateTemplate(withAttributes: boolean): void;
42
+ reformatXml(): Promise<void>;
43
+ addReformatAction(): void;
44
+ addGenerateAction(): void;
45
+ /** Unregister all providers and clear all validation decorations. */
46
+ dispose(): void;
47
+ private revalidate;
48
+ }
49
+ //# sourceMappingURL=EditorPlugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EditorPlugin.d.ts","sourceRoot":"","sources":["../../src/features/EditorPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AASpE,MAAM,WAAW,mBAAmB;IAChC;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;CAChD;AAED;;;GAGG;AACH,qBAAa,YAAY;IAYjB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAd5B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiB;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiB;IAC3C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwB;IACjD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAC/C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,oBAAoB,CAAmC;IAC/D,OAAO,CAAC,eAAe,CAAmC;IAC1D,OAAO,CAAC,kBAAkB,CAAmC;IAC7D,OAAO,CAAC,kBAAkB,CAAmC;gBAGxC,SAAS,EAAE,UAAU,EACrB,UAAU,EAAE,MAAM,CAAC,qBAAqB,EACxC,QAAQ,EAAE,eAAe,EACzB,OAAO,GAAE,mBAAwB;IAOtD,qFAAqF;IACrF,QAAQ,IAAI,IAAI;IAahB;;;OAGG;IACH,cAAc,IAAI,IAAI;IAKtB;;;OAGG;IACH,gBAAgB,CAAC,cAAc,EAAE,OAAO,GAAG,IAAI;IAczC,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBlC,iBAAiB,IAAI,IAAI;IAYzB,iBAAiB,IAAI,IAAI;IAYzB,qEAAqE;IACrE,OAAO,IAAI,IAAI;IAaf,OAAO,CAAC,UAAU;CAIrB"}
@@ -0,0 +1,128 @@
1
+ import { SchemaCompleter } from '../completion/SchemaCompleter';
2
+ import { SchemaDecorator } from '../validation/SchemaDecorator';
3
+ import { TemplateBuilder } from '../template/TemplateBuilder';
4
+ import { XmlFormatter } from '../formatter/XmlFormatter';
5
+ import { SchemaHover } from '../hover/SchemaHover';
6
+ import { getRootTag } from '../utils/XmlTextUtils';
7
+ import { logger } from '../utils/Logger';
8
+ /**
9
+ * Top-level wiring class. Holds the editor reference; all other classes are
10
+ * editor-free. Activate once the Monaco editor and schema registry are ready.
11
+ */
12
+ export class EditorPlugin {
13
+ monacoApi;
14
+ codeEditor;
15
+ registry;
16
+ options;
17
+ completer;
18
+ decorator;
19
+ template = new TemplateBuilder();
20
+ formatter = new XmlFormatter();
21
+ hover;
22
+ completionDisposable = null;
23
+ hoverDisposable = null;
24
+ reformatDisposable = null;
25
+ generateDisposable = null;
26
+ constructor(monacoApi, codeEditor, registry, options = {}) {
27
+ this.monacoApi = monacoApi;
28
+ this.codeEditor = codeEditor;
29
+ this.registry = registry;
30
+ this.options = options;
31
+ this.completer = new SchemaCompleter(registry, monacoApi);
32
+ this.decorator = new SchemaDecorator(monacoApi, codeEditor);
33
+ this.hover = new SchemaHover(registry);
34
+ }
35
+ /** Register the completion and hover providers and run the first validation pass. */
36
+ activate() {
37
+ this.completionDisposable = this.monacoApi.languages.registerCompletionItemProvider('xml', this.completer.provider());
38
+ this.hoverDisposable = this.monacoApi.languages.registerHoverProvider('xml', this.hover.provider());
39
+ logger.info('EditorPlugin activated');
40
+ this.revalidate();
41
+ }
42
+ /**
43
+ * Call after adding, updating, or removing schemas so completions and
44
+ * validation decorations are refreshed.
45
+ */
46
+ onSchemaChange() {
47
+ this.completer.invalidateCache();
48
+ this.revalidate();
49
+ }
50
+ /**
51
+ * Generate an XML skeleton from the document's root tag and replace the
52
+ * current editor content. The nesting depth comes from `options.promptLevel`.
53
+ */
54
+ generateTemplate(withAttributes) {
55
+ const model = this.codeEditor.getModel();
56
+ if (!model)
57
+ return;
58
+ const rootTag = getRootTag(model.getValue());
59
+ if (!rootTag)
60
+ return;
61
+ const level = this.options.promptLevel?.() ?? 3;
62
+ if (!level)
63
+ return;
64
+ const xml = this.template.buildFromRoot(rootTag, level, withAttributes, this.registry.getAllWorkers());
65
+ model.setValue(xml);
66
+ }
67
+ async reformatXml() {
68
+ const model = this.codeEditor.getModel();
69
+ if (!model)
70
+ return;
71
+ const original = model.getValue();
72
+ let formatted;
73
+ try {
74
+ formatted = await this.formatter.format(original);
75
+ }
76
+ catch (err) {
77
+ logger.warn(`reformatXml failed: ${err instanceof Error ? err.message : String(err)}`);
78
+ return;
79
+ }
80
+ if (formatted === original) {
81
+ logger.debug('reformatXml: no changes');
82
+ return;
83
+ }
84
+ logger.debug('reformatXml: applied');
85
+ const fullRange = model.getFullModelRange();
86
+ model.pushEditOperations([], [{ range: fullRange, text: formatted }], () => null);
87
+ }
88
+ addReformatAction() {
89
+ this.reformatDisposable?.dispose();
90
+ this.reformatDisposable = this.codeEditor.addAction({
91
+ id: 'mxls.reformat',
92
+ label: 'Reformat XML',
93
+ keybindings: [this.monacoApi.KeyMod.CtrlCmd | this.monacoApi.KeyMod.Shift | this.monacoApi.KeyCode.KeyF],
94
+ contextMenuGroupId: '1_modification',
95
+ contextMenuOrder: 1,
96
+ run: () => { void this.reformatXml(); },
97
+ });
98
+ }
99
+ addGenerateAction() {
100
+ this.generateDisposable?.dispose();
101
+ this.generateDisposable = this.codeEditor.addAction({
102
+ id: 'mxls.generate',
103
+ label: 'Generate XML Template',
104
+ keybindings: [this.monacoApi.KeyMod.CtrlCmd | this.monacoApi.KeyMod.Shift | this.monacoApi.KeyCode.KeyG],
105
+ contextMenuGroupId: '1_modification',
106
+ contextMenuOrder: 2,
107
+ run: () => { this.generateTemplate(true); },
108
+ });
109
+ }
110
+ /** Unregister all providers and clear all validation decorations. */
111
+ dispose() {
112
+ logger.info('EditorPlugin disposed');
113
+ this.decorator.dispose();
114
+ this.completionDisposable?.dispose();
115
+ this.completionDisposable = null;
116
+ this.hoverDisposable?.dispose();
117
+ this.hoverDisposable = null;
118
+ this.reformatDisposable?.dispose();
119
+ this.reformatDisposable = null;
120
+ this.generateDisposable?.dispose();
121
+ this.generateDisposable = null;
122
+ }
123
+ revalidate() {
124
+ const workers = this.registry.getAllWorkers();
125
+ this.decorator.revalidate(() => workers);
126
+ }
127
+ }
128
+ //# sourceMappingURL=EditorPlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EditorPlugin.js","sourceRoot":"","sources":["../../src/features/EditorPlugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare class XmlFormatter {
2
+ format(xml: string): Promise<string>;
3
+ }
4
+ //# sourceMappingURL=XmlFormatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"XmlFormatter.d.ts","sourceRoot":"","sources":["../../src/formatter/XmlFormatter.ts"],"names":[],"mappings":"AAGA,qBAAa,YAAY;IACf,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAQ7C"}
@@ -0,0 +1,13 @@
1
+ import { format } from 'prettier';
2
+ import xmlPlugin from '@prettier/plugin-xml';
3
+ export class XmlFormatter {
4
+ async format(xml) {
5
+ return format(xml, {
6
+ parser: 'xml',
7
+ plugins: [xmlPlugin],
8
+ printWidth: 120,
9
+ tabWidth: 2,
10
+ });
11
+ }
12
+ }
13
+ //# sourceMappingURL=XmlFormatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"XmlFormatter.js","sourceRoot":"","sources":["../../src/formatter/XmlFormatter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,SAAS,MAAM,sBAAsB,CAAA;AAE5C,MAAM,OAAO,YAAY;IACrB,KAAK,CAAC,MAAM,CAAC,GAAW;QACpB,OAAO,MAAM,CAAC,GAAG,EAAE;YACf,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,CAAC,SAAS,CAAC;YACpB,UAAU,EAAE,GAAG;YACf,QAAQ,EAAE,CAAC;SACd,CAAC,CAAA;IACN,CAAC;CACJ"}
@@ -0,0 +1,8 @@
1
+ import type { IMarkdownString } from 'monaco-editor';
2
+ import type { DocumentNode } from '../types';
3
+ /** Builds Monaco IMarkdownString hover content from schema DocumentNode data. */
4
+ export declare class HoverBuilder {
5
+ buildForElement(node: DocumentNode): IMarkdownString | undefined;
6
+ buildForAttribute(node: DocumentNode): IMarkdownString | undefined;
7
+ }
8
+ //# sourceMappingURL=HoverBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HoverBuilder.d.ts","sourceRoot":"","sources":["../../src/hover/HoverBuilder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAS5C,iFAAiF;AACjF,qBAAa,YAAY;IACrB,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,eAAe,GAAG,SAAS;IAOhE,iBAAiB,CAAC,IAAI,EAAE,YAAY,GAAG,eAAe,GAAG,SAAS;CAQrE"}
@@ -0,0 +1,27 @@
1
+ import TurndownService from 'turndown';
2
+ const td = new TurndownService();
3
+ function toMarkdown(raw) {
4
+ if (!raw)
5
+ return undefined;
6
+ return /<[a-z][\s\S]*>/i.test(raw) ? td.turndown(raw) : raw;
7
+ }
8
+ /** Builds Monaco IMarkdownString hover content from schema DocumentNode data. */
9
+ export class HoverBuilder {
10
+ buildForElement(node) {
11
+ const md = toMarkdown(node.documentation);
12
+ if (!md && !node.type)
13
+ return undefined;
14
+ const header = `**\`${node.name ?? ''}\`**${node.type ? ` *(${node.type})*` : ''}`;
15
+ return { value: md ? `${header}\n\n${md}` : header };
16
+ }
17
+ buildForAttribute(node) {
18
+ const md = toMarkdown(node.documentation);
19
+ const requiredMark = node.use === 'required' ? ' — **required**' : '';
20
+ const typeMark = node.type ? ` *(${node.type})*` : '';
21
+ if (!md && !node.type && !node.use)
22
+ return undefined;
23
+ const header = `**\`@${node.name ?? ''}\`**${typeMark}${requiredMark}`;
24
+ return { value: md ? `${header}\n\n${md}` : header };
25
+ }
26
+ }
27
+ //# sourceMappingURL=HoverBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HoverBuilder.js","sourceRoot":"","sources":["../../src/hover/HoverBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,UAAU,CAAA;AAItC,MAAM,EAAE,GAAG,IAAI,eAAe,EAAE,CAAA;AAEhC,SAAS,UAAU,CAAC,GAAuB;IACvC,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAA;IAC1B,OAAO,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;AAC/D,CAAC;AAED,iFAAiF;AACjF,MAAM,OAAO,YAAY;IACrB,eAAe,CAAC,IAAkB;QAC9B,MAAM,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;QACzC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO,SAAS,CAAA;QACvC,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,IAAI,IAAI,EAAE,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;QAClF,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAA;IACxD,CAAC;IAED,iBAAiB,CAAC,IAAkB;QAChC,MAAM,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;QACzC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,KAAK,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAA;QACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;QACrD,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG;YAAE,OAAO,SAAS,CAAA;QACpD,MAAM,MAAM,GAAG,QAAQ,IAAI,CAAC,IAAI,IAAI,EAAE,OAAO,QAAQ,GAAG,YAAY,EAAE,CAAA;QACtE,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAA;IACxD,CAAC;CACJ"}
@@ -0,0 +1,12 @@
1
+ import type { languages } from 'monaco-editor';
2
+ import type { ISchemaRegistry } from '../interfaces/ISchemaRegistry';
3
+ /** Monaco hover provider — resolves schema doc for the element or attribute under cursor. */
4
+ export declare class SchemaHover {
5
+ private readonly registry;
6
+ private readonly analyzer;
7
+ private readonly hoverBuilder;
8
+ constructor(registry: ISchemaRegistry);
9
+ provider(): languages.HoverProvider;
10
+ private provideHover;
11
+ }
12
+ //# sourceMappingURL=SchemaHover.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SchemaHover.d.ts","sourceRoot":"","sources":["../../src/hover/SchemaHover.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,SAAS,EAAU,MAAM,eAAe,CAAA;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAIpE,6FAA6F;AAC7F,qBAAa,WAAW;IAIR,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAHrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;gBAErB,QAAQ,EAAE,eAAe;IAEtD,QAAQ,IAAI,SAAS,CAAC,aAAa;IAMnC,OAAO,CAAC,YAAY;CA6DvB"}
@@ -0,0 +1,71 @@
1
+ import { TextAnalyzer } from '../completion/TextAnalyzer';
2
+ import { HoverBuilder } from './HoverBuilder';
3
+ /** Monaco hover provider — resolves schema doc for the element or attribute under cursor. */
4
+ export class SchemaHover {
5
+ registry;
6
+ analyzer = new TextAnalyzer();
7
+ hoverBuilder = new HoverBuilder();
8
+ constructor(registry) {
9
+ this.registry = registry;
10
+ }
11
+ provider() {
12
+ return {
13
+ provideHover: (model, position) => this.provideHover(model, position),
14
+ };
15
+ }
16
+ provideHover(model, position) {
17
+ const word = model.getWordAtPosition(position);
18
+ if (!word)
19
+ return null;
20
+ const wordRange = {
21
+ startLineNumber: position.lineNumber,
22
+ startColumn: word.startColumn,
23
+ endLineNumber: position.lineNumber,
24
+ endColumn: word.endColumn,
25
+ };
26
+ // Text from doc start up to the beginning of the hovered word
27
+ const textToWord = model.getValueInRange({
28
+ startLineNumber: 1, startColumn: 1,
29
+ endLineNumber: position.lineNumber, endColumn: word.startColumn,
30
+ });
31
+ // Text from doc start up to cursor (for inside-open-tag detection)
32
+ const textToCursor = model.getValueInRange({
33
+ startLineNumber: 1, startColumn: 1,
34
+ endLineNumber: position.lineNumber, endColumn: position.column,
35
+ });
36
+ const ancestors = this.analyzer.getAncestorChain(textToWord);
37
+ const parentAtWord = this.analyzer.getParentTag(textToWord);
38
+ // Element name hover: text before word ends with < or </
39
+ if (/[<\/]\s*$/.test(textToWord)) {
40
+ const tagName = word.word;
41
+ for (const worker of this.registry.getAllWorkers()) {
42
+ const candidates = parentAtWord
43
+ ? worker.getSubElements(parentAtWord, ancestors)
44
+ : worker.getRootElements();
45
+ const match = candidates.find(e => e.name === tagName);
46
+ if (match) {
47
+ const content = this.hoverBuilder.buildForElement(match);
48
+ if (content)
49
+ return { contents: [content], range: wordRange };
50
+ }
51
+ }
52
+ return null;
53
+ }
54
+ // Attribute name hover: cursor is inside an open tag
55
+ if (this.analyzer.isInsideOpenTag(textToCursor) && parentAtWord) {
56
+ const attrName = word.word;
57
+ for (const worker of this.registry.getAllWorkers()) {
58
+ const attrs = worker.getAttributesForElement(parentAtWord);
59
+ const match = attrs.find(a => a.name === attrName);
60
+ if (match) {
61
+ const content = this.hoverBuilder.buildForAttribute(match);
62
+ if (content)
63
+ return { contents: [content], range: wordRange };
64
+ }
65
+ }
66
+ return null;
67
+ }
68
+ return null;
69
+ }
70
+ }
71
+ //# sourceMappingURL=SchemaHover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SchemaHover.js","sourceRoot":"","sources":["../../src/hover/SchemaHover.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export { EditorPlugin } from './features/EditorPlugin';
2
+ export type { EditorPluginOptions } from './features/EditorPlugin';
3
+ export { SchemaRegistry } from './manager/SchemaRegistry';
4
+ export { SchemaWorker } from './manager/SchemaWorker';
5
+ export { TemplateBuilder } from './template/TemplateBuilder';
6
+ export type { IXsd, DocumentNode, ValidationError, ICompletion, INamespaceInfo, ContentModelType, } from './types';
7
+ export { CompletionType, Severity } from './types';
8
+ export type { IMonacoApi } from './interfaces/IMonacoApi';
9
+ export type { ISchemaRegistry } from './interfaces/ISchemaRegistry';
10
+ export type { ISchemaWorker } from './interfaces/ISchemaWorker';
11
+ export type { ISchemaParser } from './interfaces/ISchemaParser';
12
+ export { setLogLevel } from './utils/Logger';
13
+ export type { LogLevel } from './utils/Logger';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AACtD,YAAY,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAG5D,YAAY,EACR,IAAI,EACJ,YAAY,EACZ,eAAe,EACf,WAAW,EACX,cAAc,EACd,gBAAgB,GACnB,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAClD,YAAY,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACzD,YAAY,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AACnE,YAAY,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAC/D,YAAY,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAG/D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ // Public API
2
+ export { EditorPlugin } from './features/EditorPlugin';
3
+ export { SchemaRegistry } from './manager/SchemaRegistry';
4
+ export { SchemaWorker } from './manager/SchemaWorker';
5
+ export { TemplateBuilder } from './template/TemplateBuilder';
6
+ export { CompletionType, Severity } from './types';
7
+ // Logging
8
+ export { setLogLevel } from './utils/Logger';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,aAAa;AACb,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAEtD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAW5D,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAMlD,UAAU;AACV,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,39 @@
1
+ import type { MarkerSeverity, languages, IRange } from 'monaco-editor';
2
+ /**
3
+ * The Monaco API surface that mxls needs — injected at construction, never
4
+ * accessed via `window.monaco`. All runtime enum lookups (CompletionItemKind,
5
+ * KeyCode, …) go through this object so the library works in any host.
6
+ */
7
+ export interface IMonacoApi {
8
+ /** Constructs an IRange — used by DecorationMapper. */
9
+ Range: new (startLineNumber: number, startColumn: number, endLineNumber: number, endColumn: number) => IRange;
10
+ KeyCode: {
11
+ KeyF: number;
12
+ KeyG: number;
13
+ /** Escape key */
14
+ Escape: number;
15
+ [key: string]: number;
16
+ };
17
+ KeyMod: {
18
+ CtrlCmd: number;
19
+ Shift: number;
20
+ Alt: number;
21
+ WinCtrl: number;
22
+ };
23
+ languages: {
24
+ /** Enum values needed by CompletionBuilder. */
25
+ CompletionItemKind: typeof languages.CompletionItemKind;
26
+ CompletionItemInsertTextRule: typeof languages.CompletionItemInsertTextRule;
27
+ registerCompletionItemProvider(languageId: string, provider: languages.CompletionItemProvider): {
28
+ dispose(): void;
29
+ };
30
+ registerHoverProvider(languageId: string, provider: languages.HoverProvider): {
31
+ dispose(): void;
32
+ };
33
+ };
34
+ editor: {
35
+ /** Used by SchemaDecorator (fallback main-thread path). */
36
+ MarkerSeverity: typeof MarkerSeverity;
37
+ };
38
+ }
39
+ //# sourceMappingURL=IMonacoApi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IMonacoApi.d.ts","sourceRoot":"","sources":["../../src/interfaces/IMonacoApi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAEtE;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACvB,uDAAuD;IACvD,KAAK,EAAE,KACH,eAAe,EAAE,MAAM,EACvB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,KAChB,MAAM,CAAA;IAEX,OAAO,EAAE;QACL,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,CAAA;QACZ,iBAAiB;QACjB,MAAM,EAAE,MAAM,CAAA;QACd,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KACxB,CAAA;IAED,MAAM,EAAE;QACJ,OAAO,EAAE,MAAM,CAAA;QACf,KAAK,EAAE,MAAM,CAAA;QACb,GAAG,EAAE,MAAM,CAAA;QACX,OAAO,EAAE,MAAM,CAAA;KAClB,CAAA;IAED,SAAS,EAAE;QACP,+CAA+C;QAC/C,kBAAkB,EAAE,OAAO,SAAS,CAAC,kBAAkB,CAAA;QACvD,4BAA4B,EAAE,OAAO,SAAS,CAAC,4BAA4B,CAAA;QAE3E,8BAA8B,CAC1B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,SAAS,CAAC,sBAAsB,GAC3C;YAAE,OAAO,IAAI,IAAI,CAAA;SAAE,CAAA;QAEtB,qBAAqB,CACjB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,SAAS,CAAC,aAAa,GAClC;YAAE,OAAO,IAAI,IAAI,CAAA;SAAE,CAAA;KACzB,CAAA;IAED,MAAM,EAAE;QACJ,2DAA2D;QAC3D,cAAc,EAAE,OAAO,cAAc,CAAA;KACxC,CAAA;CACJ"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=IMonacoApi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IMonacoApi.js","sourceRoot":"","sources":["../../src/interfaces/IMonacoApi.ts"],"names":[],"mappings":""}