@lapidist/dtif-language-server 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +108 -0
- package/dist/code-actions.d.ts +11 -0
- package/dist/code-actions.d.ts.map +1 -0
- package/dist/code-actions.js +106 -0
- package/dist/code-actions.js.map +1 -0
- package/dist/core/documents/analysis-store.d.ts +27 -0
- package/dist/core/documents/analysis-store.d.ts.map +1 -0
- package/dist/core/documents/analysis-store.js +83 -0
- package/dist/core/documents/analysis-store.js.map +1 -0
- package/dist/core/documents/analyzer.d.ts +4 -0
- package/dist/core/documents/analyzer.d.ts.map +1 -0
- package/dist/core/documents/analyzer.js +147 -0
- package/dist/core/documents/analyzer.js.map +1 -0
- package/dist/core/documents/queries.d.ts +15 -0
- package/dist/core/documents/queries.d.ts.map +1 -0
- package/dist/core/documents/queries.js +52 -0
- package/dist/core/documents/queries.js.map +1 -0
- package/dist/core/documents/ranges.d.ts +9 -0
- package/dist/core/documents/ranges.d.ts.map +1 -0
- package/dist/core/documents/ranges.js +32 -0
- package/dist/core/documents/ranges.js.map +1 -0
- package/dist/core/documents/types.d.ts +23 -0
- package/dist/core/documents/types.d.ts.map +1 -0
- package/dist/core/documents/types.js +2 -0
- package/dist/core/documents/types.js.map +1 -0
- package/dist/core/json-tree.d.ts +3 -0
- package/dist/core/json-tree.d.ts.map +1 -0
- package/dist/core/json-tree.js +17 -0
- package/dist/core/json-tree.js.map +1 -0
- package/dist/core/utils/object.d.ts +2 -0
- package/dist/core/utils/object.d.ts.map +1 -0
- package/dist/core/utils/object.js +4 -0
- package/dist/core/utils/object.js.map +1 -0
- package/dist/diagnostics/constants.d.ts +2 -0
- package/dist/diagnostics/constants.d.ts.map +1 -0
- package/dist/diagnostics/constants.js +2 -0
- package/dist/diagnostics/constants.js.map +1 -0
- package/dist/diagnostics/document-validator.d.ts +12 -0
- package/dist/diagnostics/document-validator.d.ts.map +1 -0
- package/dist/diagnostics/document-validator.js +29 -0
- package/dist/diagnostics/document-validator.js.map +1 -0
- package/dist/diagnostics/index.d.ts +3 -0
- package/dist/diagnostics/index.d.ts.map +1 -0
- package/dist/diagnostics/index.js +2 -0
- package/dist/diagnostics/index.js.map +1 -0
- package/dist/diagnostics/messages.d.ts +4 -0
- package/dist/diagnostics/messages.d.ts.map +1 -0
- package/dist/diagnostics/messages.js +96 -0
- package/dist/diagnostics/messages.js.map +1 -0
- package/dist/diagnostics/parsing.d.ts +15 -0
- package/dist/diagnostics/parsing.d.ts.map +1 -0
- package/dist/diagnostics/parsing.js +47 -0
- package/dist/diagnostics/parsing.js.map +1 -0
- package/dist/diagnostics/schema-diagnostics.d.ts +10 -0
- package/dist/diagnostics/schema-diagnostics.d.ts.map +1 -0
- package/dist/diagnostics/schema-diagnostics.js +44 -0
- package/dist/diagnostics/schema-diagnostics.js.map +1 -0
- package/dist/diagnostics/types.d.ts +12 -0
- package/dist/diagnostics/types.d.ts.map +1 -0
- package/dist/diagnostics/types.js +2 -0
- package/dist/diagnostics/types.js.map +1 -0
- package/dist/features/completions/extension-items.d.ts +4 -0
- package/dist/features/completions/extension-items.d.ts.map +1 -0
- package/dist/features/completions/extension-items.js +31 -0
- package/dist/features/completions/extension-items.js.map +1 -0
- package/dist/features/completions/index.d.ts +10 -0
- package/dist/features/completions/index.d.ts.map +1 -0
- package/dist/features/completions/index.js +50 -0
- package/dist/features/completions/index.js.map +1 -0
- package/dist/features/completions/registry.d.ts +10 -0
- package/dist/features/completions/registry.d.ts.map +1 -0
- package/dist/features/completions/registry.js +26 -0
- package/dist/features/completions/registry.js.map +1 -0
- package/dist/features/completions/type-items.d.ts +4 -0
- package/dist/features/completions/type-items.d.ts.map +1 -0
- package/dist/features/completions/type-items.js +61 -0
- package/dist/features/completions/type-items.js.map +1 -0
- package/dist/features/completions/unit-items.d.ts +4 -0
- package/dist/features/completions/unit-items.d.ts.map +1 -0
- package/dist/features/completions/unit-items.js +97 -0
- package/dist/features/completions/unit-items.js.map +1 -0
- package/dist/features/definition.d.ts +4 -0
- package/dist/features/definition.d.ts.map +1 -0
- package/dist/features/definition.js +12 -0
- package/dist/features/definition.js.map +1 -0
- package/dist/features/hover/markdown.d.ts +11 -0
- package/dist/features/hover/markdown.d.ts.map +1 -0
- package/dist/features/hover/markdown.js +122 -0
- package/dist/features/hover/markdown.js.map +1 -0
- package/dist/features/hover.d.ts +4 -0
- package/dist/features/hover.d.ts.map +1 -0
- package/dist/features/hover.js +26 -0
- package/dist/features/hover.js.map +1 -0
- package/dist/features/rename.d.ts +4 -0
- package/dist/features/rename.d.ts.map +1 -0
- package/dist/features/rename.js +144 -0
- package/dist/features/rename.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/package-metadata.d.ts +8 -0
- package/dist/package-metadata.d.ts.map +1 -0
- package/dist/package-metadata.js +22 -0
- package/dist/package-metadata.js.map +1 -0
- package/dist/pointer-utils.d.ts +6 -0
- package/dist/pointer-utils.d.ts.map +1 -0
- package/dist/pointer-utils.js +55 -0
- package/dist/pointer-utils.js.map +1 -0
- package/dist/runtime/documents.d.ts +12 -0
- package/dist/runtime/documents.d.ts.map +1 -0
- package/dist/runtime/documents.js +7 -0
- package/dist/runtime/documents.js.map +1 -0
- package/dist/runtime/initialize.d.ts +11 -0
- package/dist/runtime/initialize.d.ts.map +1 -0
- package/dist/runtime/initialize.js +34 -0
- package/dist/runtime/initialize.js.map +1 -0
- package/dist/runtime/services/settings-controller.d.ts +20 -0
- package/dist/runtime/services/settings-controller.d.ts.map +1 -0
- package/dist/runtime/services/settings-controller.js +53 -0
- package/dist/runtime/services/settings-controller.js.map +1 -0
- package/dist/runtime/session.d.ts +38 -0
- package/dist/runtime/session.d.ts.map +1 -0
- package/dist/runtime/session.js +120 -0
- package/dist/runtime/session.js.map +1 -0
- package/dist/runtime/utils/errors.d.ts +2 -0
- package/dist/runtime/utils/errors.d.ts.map +1 -0
- package/dist/runtime/utils/errors.js +8 -0
- package/dist/runtime/utils/errors.js.map +1 -0
- package/dist/server.d.ts +20 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +76 -0
- package/dist/server.js.map +1 -0
- package/dist/settings.d.ts +10 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +26 -0
- package/dist/settings.js.map +1 -0
- package/dist/util/markdown.d.ts +2 -0
- package/dist/util/markdown.d.ts.map +1 -0
- package/dist/util/markdown.js +4 -0
- package/dist/util/markdown.js.map +1 -0
- package/package.json +43 -0
package/README.md
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# DTIF Language Server
|
|
2
|
+
|
|
3
|
+
`@lapidist/dtif-language-server` delivers Language Server Protocol (LSP) services for the Design Token Interchange Format (DTIF). It brings schema-backed diagnostics, pointer-aware navigation, and assisted authoring into any editor that can host a Node.js language server.
|
|
4
|
+
|
|
5
|
+
> **Runtime** · Node.js 22<br>
|
|
6
|
+
> **Transports** · stdio (default), custom message readers/writers
|
|
7
|
+
|
|
8
|
+
## Capabilities
|
|
9
|
+
|
|
10
|
+
### Diagnostics and validation
|
|
11
|
+
|
|
12
|
+
- Parses DTIF documents with tolerant JSONC support and precise error ranges.
|
|
13
|
+
- Validates against the canonical DTIF schema via `@lapidist/dtif-validator`.
|
|
14
|
+
- Publishes diagnostics on open and change events, clearing them automatically when documents close.
|
|
15
|
+
|
|
16
|
+
### Navigation and insights
|
|
17
|
+
|
|
18
|
+
- Resolves JSON pointers for `$ref` members and theming overrides.
|
|
19
|
+
- Provides jump-to-definition, hover documentation with inline token previews, and related location metadata.
|
|
20
|
+
- Keeps an incremental document index so navigation stays responsive in large workspaces.
|
|
21
|
+
|
|
22
|
+
### Refactors and quick fixes
|
|
23
|
+
|
|
24
|
+
- Supports rename refactors for pointer definitions, emitting workspace edits that update every reference currently loaded by the server.
|
|
25
|
+
- Offers quick fixes for common schema issues such as missing `$type` or `$ref` members, inserting scaffolded payloads that respect DTIF structure.
|
|
26
|
+
|
|
27
|
+
### Authoring assistance
|
|
28
|
+
|
|
29
|
+
- Supplies contextual completions for `$type` identifiers, measurement units, and `$extensions` namespaces sourced from the DTIF registry.
|
|
30
|
+
- Orders completion results by relevance to the active pointer scope.
|
|
31
|
+
|
|
32
|
+
## Installation
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
npm install --save-dev @lapidist/dtif-language-server
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
The package bundles TypeScript declarations and compiled JavaScript so editors can load it directly from `node_modules`.
|
|
39
|
+
|
|
40
|
+
## Minimal bootstrap
|
|
41
|
+
|
|
42
|
+
```ts
|
|
43
|
+
import { start } from '@lapidist/dtif-language-server';
|
|
44
|
+
|
|
45
|
+
start();
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
`start()` wires the language server to stdio, making it compatible with VS Code, Neovim, Sublime Text, and any editor that launches Node-based LSP servers as child processes. For socket- or stream-based transports, pass custom message reader and writer instances:
|
|
49
|
+
|
|
50
|
+
```ts
|
|
51
|
+
import net from 'node:net';
|
|
52
|
+
import { createConnection, start } from '@lapidist/dtif-language-server';
|
|
53
|
+
import { SocketMessageReader, SocketMessageWriter } from 'vscode-languageserver/node';
|
|
54
|
+
|
|
55
|
+
const socket = net.connect({ port: 7000 });
|
|
56
|
+
const connection = createConnection(
|
|
57
|
+
new SocketMessageReader(socket),
|
|
58
|
+
new SocketMessageWriter(socket)
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
start({ connection });
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Workspace settings
|
|
65
|
+
|
|
66
|
+
The language server reads optional workspace configuration under the `dtifLanguageServer` section.
|
|
67
|
+
|
|
68
|
+
| Setting | Type | Default | Description |
|
|
69
|
+
| ----------------- | --------------- | ------- | ------------------------------------------------------------------------------- |
|
|
70
|
+
| `validation.mode` | `'on' \| 'off'` | `'on'` | Enables or suppresses schema diagnostics while keeping navigation indexes warm. |
|
|
71
|
+
|
|
72
|
+
Settings can be supplied by clients that implement [`workspace/configuration`](https://microsoft.github.io/language-server-protocol/specifications/specification-current/#workspace_configuration) or via editor-specific configuration files.
|
|
73
|
+
|
|
74
|
+
### VS Code example
|
|
75
|
+
|
|
76
|
+
```jsonc
|
|
77
|
+
{
|
|
78
|
+
"dtifLanguageServer": {
|
|
79
|
+
"validation": {
|
|
80
|
+
"mode": "on"
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Version alignment
|
|
87
|
+
|
|
88
|
+
The language server depends on `@lapidist/dtif-parser`, `@lapidist/dtif-validator`, and `@lapidist/dtif-schema`. Package versions are locked so that a single release captures compatible behaviour across the stack. When upgrading one dependency, bump the workspace using a Changeset so downstream integrators receive an aligned bundle.
|
|
89
|
+
|
|
90
|
+
## Development
|
|
91
|
+
|
|
92
|
+
- `npm run build --workspace=@lapidist/dtif-language-server` – compile to `dist/`.
|
|
93
|
+
- `npm test --workspace=@lapidist/dtif-language-server` – run the Node.js test suite.
|
|
94
|
+
- `npm run lint` / `npm run lint:ts` – enforce repository lint rules.
|
|
95
|
+
|
|
96
|
+
Integration tests in `language-server/tests/` spin up the LSP over JSON-RPC streams to verify diagnostics, navigation, refactors, and configuration handling end to end.
|
|
97
|
+
|
|
98
|
+
## Troubleshooting
|
|
99
|
+
|
|
100
|
+
| Symptom | Suggested action |
|
|
101
|
+
| ----------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
|
|
102
|
+
| Diagnostics do not appear | Confirm `validation.mode` is set to `'on'` and the client calls `textDocument/didOpen` for DTIF files. |
|
|
103
|
+
| Rename edits miss some files | Only documents opened by the client are available to the server. Ensure the editor loads relevant files before triggering rename. |
|
|
104
|
+
| Diagnostics do not reappear after toggling validation | Ensure the client re-requests configuration after edits. Some editors only refetch settings on save or focus changes. |
|
|
105
|
+
|
|
106
|
+
## License
|
|
107
|
+
|
|
108
|
+
This package is distributed under the [MIT License](../LICENSE). See the repository root for contributing guidelines and governance.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type CodeAction, type CodeActionParams } from 'vscode-languageserver/node.js';
|
|
2
|
+
import { TextDocument } from 'vscode-languageserver-textdocument';
|
|
3
|
+
import { DocumentAnalysisStore } from './core/documents/analysis-store.js';
|
|
4
|
+
interface QuickFixContext {
|
|
5
|
+
readonly document: TextDocument;
|
|
6
|
+
readonly params: CodeActionParams;
|
|
7
|
+
readonly store: DocumentAnalysisStore;
|
|
8
|
+
}
|
|
9
|
+
export declare function buildQuickFixes(context: QuickFixContext): CodeAction[];
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=code-actions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-actions.d.ts","sourceRoot":"","sources":["../src/code-actions.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,gBAAgB,EAGtB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAElE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAO3E,UAAU,eAAe;IACvB,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,qBAAqB,CAAC;CACvC;AAaD,wBAAgB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,UAAU,EAAE,CAkDtE"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { CodeActionKind } from 'vscode-languageserver/node.js';
|
|
2
|
+
import { isRecord } from './core/utils/object.js';
|
|
3
|
+
const INDENT_UNIT = ' ';
|
|
4
|
+
const LEADING_WHITESPACE = /^\s*/u;
|
|
5
|
+
export function buildQuickFixes(context) {
|
|
6
|
+
const { document, params, store } = context;
|
|
7
|
+
const actions = [];
|
|
8
|
+
const uri = params.textDocument.uri;
|
|
9
|
+
for (const diagnostic of params.context.diagnostics) {
|
|
10
|
+
const data = toDiagnosticData(diagnostic.data);
|
|
11
|
+
if (!data?.pointer) {
|
|
12
|
+
continue;
|
|
13
|
+
}
|
|
14
|
+
if (data.keyword === 'required' && isRecord(data.params)) {
|
|
15
|
+
const missingProperty = data.params.missingProperty;
|
|
16
|
+
if (missingProperty === '$type') {
|
|
17
|
+
const action = buildInsertPropertyAction({
|
|
18
|
+
document,
|
|
19
|
+
uri,
|
|
20
|
+
pointer: data.pointer,
|
|
21
|
+
property: '$type',
|
|
22
|
+
value: '',
|
|
23
|
+
title: 'Add "$type" property',
|
|
24
|
+
diagnostic,
|
|
25
|
+
store
|
|
26
|
+
});
|
|
27
|
+
if (action) {
|
|
28
|
+
action.isPreferred = true;
|
|
29
|
+
actions.push(action);
|
|
30
|
+
}
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
if (missingProperty === '$ref') {
|
|
34
|
+
const action = buildInsertPropertyAction({
|
|
35
|
+
document,
|
|
36
|
+
uri,
|
|
37
|
+
pointer: data.pointer,
|
|
38
|
+
property: '$ref',
|
|
39
|
+
value: '',
|
|
40
|
+
title: 'Add "$ref" property',
|
|
41
|
+
diagnostic,
|
|
42
|
+
store
|
|
43
|
+
});
|
|
44
|
+
if (action) {
|
|
45
|
+
actions.push(action);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return actions;
|
|
51
|
+
}
|
|
52
|
+
function buildInsertPropertyAction(options) {
|
|
53
|
+
const node = options.store.getPointerNode(options.uri, options.pointer);
|
|
54
|
+
if (!node || node.type !== 'object') {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
const edit = buildInsertPropertyEdit(options.document, node, options.property, options.value);
|
|
58
|
+
if (!edit) {
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
const workspaceEdit = { changes: { [options.uri]: [edit] } };
|
|
62
|
+
return {
|
|
63
|
+
title: options.title,
|
|
64
|
+
kind: CodeActionKind.QuickFix,
|
|
65
|
+
diagnostics: [options.diagnostic],
|
|
66
|
+
edit: workspaceEdit
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function buildInsertPropertyEdit(document, node, property, value) {
|
|
70
|
+
const insertOffset = node.offset + 1;
|
|
71
|
+
const position = document.positionAt(insertOffset);
|
|
72
|
+
const indent = getIndentation(document, node.offset);
|
|
73
|
+
const propertyIndent = `${indent}${INDENT_UNIT}`;
|
|
74
|
+
const propertyText = `${propertyIndent}${JSON.stringify(property)}: ${JSON.stringify(value)}`;
|
|
75
|
+
const hasProperties = Array.isArray(node.children) && node.children.length > 0;
|
|
76
|
+
const newText = hasProperties ? `\n${propertyText},\n` : `\n${propertyText}\n${indent}`;
|
|
77
|
+
return {
|
|
78
|
+
range: { start: position, end: position },
|
|
79
|
+
newText
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
function getIndentation(document, offset) {
|
|
83
|
+
const position = document.positionAt(offset);
|
|
84
|
+
const lineStart = { line: position.line, character: 0 };
|
|
85
|
+
const lineEnd = { line: position.line, character: position.character };
|
|
86
|
+
const prefix = document.getText({ start: lineStart, end: lineEnd });
|
|
87
|
+
const match = LEADING_WHITESPACE.exec(prefix);
|
|
88
|
+
return match?.[0] ?? '';
|
|
89
|
+
}
|
|
90
|
+
function toDiagnosticData(value) {
|
|
91
|
+
if (!isRecord(value)) {
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
const pointerValue = value.pointer;
|
|
95
|
+
if (typeof pointerValue !== 'string') {
|
|
96
|
+
return undefined;
|
|
97
|
+
}
|
|
98
|
+
const keywordValue = typeof value.keyword === 'string' ? value.keyword : undefined;
|
|
99
|
+
const paramsValue = 'params' in value ? value.params : undefined;
|
|
100
|
+
return {
|
|
101
|
+
pointer: pointerValue,
|
|
102
|
+
keyword: keywordValue,
|
|
103
|
+
params: paramsValue
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=code-actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-actions.js","sourceRoot":"","sources":["../src/code-actions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Node as JsonNode } from 'jsonc-parser';
|
|
2
|
+
import type { Position } from 'vscode-languageserver/node.js';
|
|
3
|
+
import { TextDocument } from 'vscode-languageserver-textdocument';
|
|
4
|
+
import { type PointerKeyMatch, type PointerMatch } from './queries.js';
|
|
5
|
+
import type { DocumentAnalysis, DocumentReference, PointerMetadata } from './types.js';
|
|
6
|
+
export interface DocumentAnalysisUpdateResult {
|
|
7
|
+
readonly ok: boolean;
|
|
8
|
+
readonly error?: unknown;
|
|
9
|
+
}
|
|
10
|
+
export declare class DocumentAnalysisStore {
|
|
11
|
+
#private;
|
|
12
|
+
update(document: TextDocument): DocumentAnalysisUpdateResult;
|
|
13
|
+
remove(uri: string): void;
|
|
14
|
+
get(uri: string): DocumentAnalysis | undefined;
|
|
15
|
+
entries(): IterableIterator<[string, DocumentAnalysis]>;
|
|
16
|
+
findReference(uri: string, position: Position): DocumentReference | null;
|
|
17
|
+
findPointerKey(uri: string, position: Position): PointerKeyMatch | null;
|
|
18
|
+
matchPointer(uri: string, position: Position): PointerMatch | null;
|
|
19
|
+
getPointerMetadata(uri: string, pointer: string): PointerMetadata | undefined;
|
|
20
|
+
getPointerNode(uri: string, pointer: string): JsonNode | undefined;
|
|
21
|
+
getTypeValues(): readonly string[];
|
|
22
|
+
getExtensionKeys(): readonly string[];
|
|
23
|
+
getUnitValues(): readonly string[];
|
|
24
|
+
references(): IterableIterator<DocumentReference>;
|
|
25
|
+
private collectValues;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=analysis-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analysis-store.d.ts","sourceRoot":"","sources":["../../../src/core/documents/analysis-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAElE,OAAO,EAIL,KAAK,eAAe,EACpB,KAAK,YAAY,EAClB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEvF,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,qBAAa,qBAAqB;;IAGhC,MAAM,CAAC,QAAQ,EAAE,YAAY,GAAG,4BAA4B;IAe5D,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIzB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAI9C,OAAO,IAAI,gBAAgB,CAAC,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAIvD,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,iBAAiB,GAAG,IAAI;IAQxE,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,eAAe,GAAG,IAAI;IAQvE,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,YAAY,GAAG,IAAI;IAQlE,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAI7E,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAIlE,aAAa,IAAI,SAAS,MAAM,EAAE;IAIlC,gBAAgB,IAAI,SAAS,MAAM,EAAE;IAIrC,aAAa,IAAI,SAAS,MAAM,EAAE;IAIjC,UAAU,IAAI,gBAAgB,CAAC,iBAAiB,CAAC;IAQlD,OAAO,CAAC,aAAa;CAStB"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { analyzeTextDocument } from './analyzer.js';
|
|
2
|
+
import { findPointerKeyAtPosition, findReferenceAtPosition, matchPointerInAnalysis } from './queries.js';
|
|
3
|
+
export class DocumentAnalysisStore {
|
|
4
|
+
#analyses = new Map();
|
|
5
|
+
update(document) {
|
|
6
|
+
try {
|
|
7
|
+
const analysis = analyzeTextDocument(document);
|
|
8
|
+
if (analysis) {
|
|
9
|
+
this.#analyses.set(document.uri, analysis);
|
|
10
|
+
}
|
|
11
|
+
else {
|
|
12
|
+
this.#analyses.delete(document.uri);
|
|
13
|
+
}
|
|
14
|
+
return { ok: true };
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
this.#analyses.delete(document.uri);
|
|
18
|
+
return { ok: false, error };
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
remove(uri) {
|
|
22
|
+
this.#analyses.delete(uri);
|
|
23
|
+
}
|
|
24
|
+
get(uri) {
|
|
25
|
+
return this.#analyses.get(uri);
|
|
26
|
+
}
|
|
27
|
+
entries() {
|
|
28
|
+
return this.#analyses.entries();
|
|
29
|
+
}
|
|
30
|
+
findReference(uri, position) {
|
|
31
|
+
const analysis = this.#analyses.get(uri);
|
|
32
|
+
if (!analysis) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
return findReferenceAtPosition(analysis.references, position);
|
|
36
|
+
}
|
|
37
|
+
findPointerKey(uri, position) {
|
|
38
|
+
const analysis = this.#analyses.get(uri);
|
|
39
|
+
if (!analysis) {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
return findPointerKeyAtPosition(analysis.pointers, position);
|
|
43
|
+
}
|
|
44
|
+
matchPointer(uri, position) {
|
|
45
|
+
const analysis = this.#analyses.get(uri);
|
|
46
|
+
if (!analysis) {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
return matchPointerInAnalysis(analysis, position);
|
|
50
|
+
}
|
|
51
|
+
getPointerMetadata(uri, pointer) {
|
|
52
|
+
return this.#analyses.get(uri)?.pointers.get(pointer);
|
|
53
|
+
}
|
|
54
|
+
getPointerNode(uri, pointer) {
|
|
55
|
+
return this.getPointerMetadata(uri, pointer)?.node;
|
|
56
|
+
}
|
|
57
|
+
getTypeValues() {
|
|
58
|
+
return this.collectValues((analysis) => analysis.typeValues);
|
|
59
|
+
}
|
|
60
|
+
getExtensionKeys() {
|
|
61
|
+
return this.collectValues((analysis) => analysis.extensionKeys);
|
|
62
|
+
}
|
|
63
|
+
getUnitValues() {
|
|
64
|
+
return this.collectValues((analysis) => analysis.unitValues);
|
|
65
|
+
}
|
|
66
|
+
*references() {
|
|
67
|
+
for (const analysis of this.#analyses.values()) {
|
|
68
|
+
for (const reference of analysis.references) {
|
|
69
|
+
yield reference;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
collectValues(selector) {
|
|
74
|
+
const values = new Set();
|
|
75
|
+
for (const analysis of this.#analyses.values()) {
|
|
76
|
+
for (const value of selector(analysis)) {
|
|
77
|
+
values.add(value);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return Array.from(values).sort();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=analysis-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analysis-store.js","sourceRoot":"","sources":["../../../src/core/documents/analysis-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../../../src/core/documents/analyzer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAElE,OAAO,KAAK,EAAE,gBAAgB,EAAsC,MAAM,YAAY,CAAC;AAKvF,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,YAAY,GAAG,gBAAgB,GAAG,IAAI,CAwCnF"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { parseTree } from 'jsonc-parser';
|
|
2
|
+
import { escapeJsonPointerSegment, pointerToPath } from '../../pointer-utils.js';
|
|
3
|
+
import { rangeFromNode } from './ranges.js';
|
|
4
|
+
const POINTER_REFERENCE_KEYS = new Set(['$ref', 'token', 'ref']);
|
|
5
|
+
export function analyzeTextDocument(document) {
|
|
6
|
+
const text = document.getText();
|
|
7
|
+
const parseErrors = [];
|
|
8
|
+
const tree = parseTree(text, parseErrors, {
|
|
9
|
+
allowTrailingComma: false,
|
|
10
|
+
disallowComments: true
|
|
11
|
+
});
|
|
12
|
+
if (!tree || parseErrors.length > 0) {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
const pointers = new Map();
|
|
16
|
+
const typeValues = new Set();
|
|
17
|
+
const extensionKeys = new Set();
|
|
18
|
+
const unitValues = new Set();
|
|
19
|
+
collectPointerMetadata(tree, '#', document, pointers, undefined, undefined, typeValues, extensionKeys, unitValues);
|
|
20
|
+
const references = [];
|
|
21
|
+
collectReferences(tree, document, document.uri, references);
|
|
22
|
+
return {
|
|
23
|
+
pointers,
|
|
24
|
+
references,
|
|
25
|
+
tree,
|
|
26
|
+
typeValues,
|
|
27
|
+
extensionKeys,
|
|
28
|
+
unitValues
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function collectPointerMetadata(node, pointer, document, result, keyNode, parentPointer, typeValues, extensionKeys, unitValues) {
|
|
32
|
+
result.set(pointer, {
|
|
33
|
+
valueRange: rangeFromNode(node, document),
|
|
34
|
+
keyRange: keyNode ? rangeFromNode(keyNode, document) : undefined,
|
|
35
|
+
node
|
|
36
|
+
});
|
|
37
|
+
if (keyNode && typeof keyNode.value === 'string') {
|
|
38
|
+
if (keyNode.value === '$type' && typeof node.value === 'string') {
|
|
39
|
+
typeValues.add(node.value);
|
|
40
|
+
}
|
|
41
|
+
if (keyNode.value === 'unit' && typeof node.value === 'string') {
|
|
42
|
+
unitValues.add(node.value);
|
|
43
|
+
}
|
|
44
|
+
if (parentPointer) {
|
|
45
|
+
const parentPath = pointerToPath(parentPointer);
|
|
46
|
+
const parentKey = parentPath[parentPath.length - 1];
|
|
47
|
+
if (parentKey === '$extensions') {
|
|
48
|
+
extensionKeys.add(keyNode.value);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (!node.children || node.children.length === 0) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (node.type === 'object') {
|
|
56
|
+
for (const property of node.children) {
|
|
57
|
+
const nextKey = property.children?.[0];
|
|
58
|
+
const valueNode = property.children?.[1];
|
|
59
|
+
if (!nextKey || !valueNode || typeof nextKey.value !== 'string') {
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
const escaped = escapeJsonPointerSegment(nextKey.value);
|
|
63
|
+
const childPointer = pointer === '#' ? `#/${escaped}` : `${pointer}/${escaped}`;
|
|
64
|
+
collectPointerMetadata(valueNode, childPointer, document, result, nextKey, pointer, typeValues, extensionKeys, unitValues);
|
|
65
|
+
}
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
if (node.type === 'array') {
|
|
69
|
+
node.children.forEach((child, index) => {
|
|
70
|
+
const segment = index.toString();
|
|
71
|
+
const childPointer = pointer === '#' ? `#/${segment}` : `${pointer}/${segment}`;
|
|
72
|
+
collectPointerMetadata(child, childPointer, document, result, undefined, pointer, typeValues, extensionKeys, unitValues);
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function collectReferences(node, document, documentUri, references) {
|
|
77
|
+
if (!node.children || node.children.length === 0) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (node.type === 'object') {
|
|
81
|
+
for (const property of node.children) {
|
|
82
|
+
const keyNode = property.children?.[0];
|
|
83
|
+
const valueNode = property.children?.[1];
|
|
84
|
+
if (!keyNode || !valueNode || typeof keyNode.value !== 'string') {
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
if (valueNode.type === 'string' && POINTER_REFERENCE_KEYS.has(keyNode.value)) {
|
|
88
|
+
const pointerCandidate = valueNode.value;
|
|
89
|
+
if (typeof pointerCandidate !== 'string') {
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
const reference = resolvePointerTarget(pointerCandidate, documentUri);
|
|
93
|
+
if (reference) {
|
|
94
|
+
references.push({
|
|
95
|
+
documentUri,
|
|
96
|
+
range: rangeFromNode(valueNode, document),
|
|
97
|
+
targetUri: reference.uri,
|
|
98
|
+
targetPointer: reference.pointer,
|
|
99
|
+
rawValue: pointerCandidate
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
collectReferences(valueNode, document, documentUri, references);
|
|
104
|
+
}
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if (node.type === 'array') {
|
|
108
|
+
for (const child of node.children) {
|
|
109
|
+
collectReferences(child, document, documentUri, references);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
function resolvePointerTarget(value, baseUri) {
|
|
114
|
+
if (typeof value !== 'string') {
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
const normalized = normalizePointerCandidate(value);
|
|
118
|
+
if (normalized) {
|
|
119
|
+
return { uri: baseUri, pointer: normalized };
|
|
120
|
+
}
|
|
121
|
+
try {
|
|
122
|
+
const parsed = new URL(value, baseUri);
|
|
123
|
+
if (!parsed.hash) {
|
|
124
|
+
return undefined;
|
|
125
|
+
}
|
|
126
|
+
return { uri: parsed.toString(), pointer: normalizePointerCandidate(parsed.hash) ?? '#' };
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
return undefined;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
function normalizePointerCandidate(value) {
|
|
133
|
+
if (value === '#') {
|
|
134
|
+
return '#';
|
|
135
|
+
}
|
|
136
|
+
if (value.startsWith('#/')) {
|
|
137
|
+
return value;
|
|
138
|
+
}
|
|
139
|
+
if (value.startsWith('/')) {
|
|
140
|
+
return `#${value}`;
|
|
141
|
+
}
|
|
142
|
+
if (value.startsWith('#')) {
|
|
143
|
+
return value.length > 1 ? `#/${value.slice(1)}` : '#';
|
|
144
|
+
}
|
|
145
|
+
return undefined;
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../../src/core/documents/analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Position } from 'vscode-languageserver/node.js';
|
|
2
|
+
import type { DocumentAnalysis, DocumentReference, PointerMetadata } from './types.js';
|
|
3
|
+
export declare function findReferenceAtPosition(references: readonly DocumentReference[], position: Position): DocumentReference | null;
|
|
4
|
+
export interface PointerKeyMatch {
|
|
5
|
+
readonly pointer: string;
|
|
6
|
+
readonly metadata: PointerMetadata;
|
|
7
|
+
}
|
|
8
|
+
export declare function findPointerKeyAtPosition(pointers: ReadonlyMap<string, PointerMetadata>, position: Position): PointerKeyMatch | null;
|
|
9
|
+
export interface PointerMatch {
|
|
10
|
+
readonly pointer: string;
|
|
11
|
+
readonly inKey: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function matchPointerInAnalysis(analysis: DocumentAnalysis, position: Position): PointerMatch | null;
|
|
14
|
+
export declare function referenceIntersectsPosition(reference: DocumentReference, position: Position): boolean;
|
|
15
|
+
//# sourceMappingURL=queries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../../src/core/documents/queries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAE9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGvF,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,SAAS,iBAAiB,EAAE,EACxC,QAAQ,EAAE,QAAQ,GACjB,iBAAiB,GAAG,IAAI,CAO1B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;CACpC;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC,EAC9C,QAAQ,EAAE,QAAQ,GACjB,eAAe,GAAG,IAAI,CAOxB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,gBAAgB,EAC1B,QAAQ,EAAE,QAAQ,GACjB,YAAY,GAAG,IAAI,CAyBrB;AAED,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,iBAAiB,EAC5B,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAMT"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { pointerToPath } from '../../pointer-utils.js';
|
|
2
|
+
import { equalsPosition, rangeContainsInclusive } from './ranges.js';
|
|
3
|
+
export function findReferenceAtPosition(references, position) {
|
|
4
|
+
for (const reference of references) {
|
|
5
|
+
if (rangeContainsInclusive(reference.range, position)) {
|
|
6
|
+
return reference;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
export function findPointerKeyAtPosition(pointers, position) {
|
|
12
|
+
for (const [pointer, metadata] of pointers) {
|
|
13
|
+
if (metadata.keyRange && rangeContainsInclusive(metadata.keyRange, position)) {
|
|
14
|
+
return { pointer, metadata };
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
export function matchPointerInAnalysis(analysis, position) {
|
|
20
|
+
let bestMatch = null;
|
|
21
|
+
for (const [pointer, metadata] of analysis.pointers) {
|
|
22
|
+
if (metadata.keyRange && rangeContainsInclusive(metadata.keyRange, position)) {
|
|
23
|
+
const depth = pointerDepth(pointer);
|
|
24
|
+
if (!bestMatch || depth >= bestMatch.depth) {
|
|
25
|
+
bestMatch = { pointer, inKey: true, depth };
|
|
26
|
+
}
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
if (rangeContainsInclusive(metadata.valueRange, position)) {
|
|
30
|
+
const depth = pointerDepth(pointer);
|
|
31
|
+
if (!bestMatch || depth >= bestMatch.depth) {
|
|
32
|
+
bestMatch = { pointer, inKey: false, depth };
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (!bestMatch) {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
return { pointer: bestMatch.pointer, inKey: bestMatch.inKey };
|
|
40
|
+
}
|
|
41
|
+
export function referenceIntersectsPosition(reference, position) {
|
|
42
|
+
return (rangeContainsInclusive(reference.range, position) ||
|
|
43
|
+
equalsPosition(reference.range.end, position) ||
|
|
44
|
+
equalsPosition(reference.range.start, position));
|
|
45
|
+
}
|
|
46
|
+
function pointerDepth(pointer) {
|
|
47
|
+
if (pointer === '#') {
|
|
48
|
+
return 0;
|
|
49
|
+
}
|
|
50
|
+
return pointerToPath(pointer).length;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=queries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queries.js","sourceRoot":"","sources":["../../../src/core/documents/queries.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAErE,MAAM,UAAU,uBAAuB,CACrC,UAAwC,EACxC,QAAkB;IAElB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,sBAAsB,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;YACtD,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAOD,MAAM,UAAU,wBAAwB,CACtC,QAA8C,EAC9C,QAAkB;IAElB,KAAK,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,QAAQ,EAAE,CAAC;QAC3C,IAAI,QAAQ,CAAC,QAAQ,IAAI,sBAAsB,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC7E,OAAO,EAAE,OAAO,EAAE,QAAQ,EAA4B,CAAC;QACzD,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAOD,MAAM,UAAU,sBAAsB,CACpC,QAA0B,EAC1B,QAAkB;IAElB,IAAI,SAAS,GAA8D,IAAI,CAAC;IAEhF,KAAK,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACpD,IAAI,QAAQ,CAAC,QAAQ,IAAI,sBAAsB,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC7E,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;YACpC,IAAI,CAAC,SAAS,IAAI,KAAK,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;gBAC3C,SAAS,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YAC9C,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,sBAAsB,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC1D,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;YACpC,IAAI,CAAC,SAAS,IAAI,KAAK,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;gBAC3C,SAAS,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;YAC/C,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAyB,CAAC;AACvF,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,SAA4B,EAC5B,QAAkB;IAElB,OAAO,CACL,sBAAsB,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC;QACjD,cAAc,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC;QAC7C,cAAc,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,CAChD,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,OAAe;IACnC,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;QACpB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,OAAO,aAAa,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Node as JsonNode } from 'jsonc-parser';
|
|
2
|
+
import { TextDocument } from 'vscode-languageserver-textdocument';
|
|
3
|
+
import type { Position, Range } from 'vscode-languageserver/node.js';
|
|
4
|
+
export declare function rangeFromNode(node: JsonNode, document: TextDocument): Range;
|
|
5
|
+
export declare function rangeFromOffset(document: TextDocument, offset: number, length: number): Range;
|
|
6
|
+
export declare function rangeContainsInclusive(range: Range, position: Position): boolean;
|
|
7
|
+
export declare function isBefore(a: Position, b: Position): boolean;
|
|
8
|
+
export declare function equalsPosition(a: Position, b: Position): boolean;
|
|
9
|
+
//# sourceMappingURL=ranges.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ranges.d.ts","sourceRoot":"","sources":["../../../src/core/documents/ranges.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AAErE,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,GAAG,KAAK,CAI3E;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK,CAI7F;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAUhF;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CAU1D;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CAEhE"}
|