@hydranium/conformance 1.0.0-next.22 → 1.0.0-next.23
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/lib/lsp/index.d.ts.map +1 -1
- package/lib/lsp/index.js +13 -3
- package/lib/lsp/index.js.map +1 -1
- package/package.json +3 -3
- package/src/lsp/index.ts +13 -3
package/lib/lsp/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lsp/index.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAkBlF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,KAAK,eAAe,EAAiC,MAAM,aAAa,CAAC;AAElF,wGAAwG;AACxG,MAAM,WAAW,8BAA8B;IAC5C,QAAQ,CAAC,YAAY,EAAE;QACpB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;QACpC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAC;KACxC,CAAC;CACJ;AAED,gGAAgG;AAChG,MAAM,WAAW,4BAA4B;IAC1C,QAAQ,CAAC,KAAK,EAAE,SAAS,OAAO,EAAE,CAAC;CACrC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,wBAAwB;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CACxD;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lsp/index.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAkBlF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,KAAK,eAAe,EAAiC,MAAM,aAAa,CAAC;AAElF,wGAAwG;AACxG,MAAM,WAAW,8BAA8B;IAC5C,QAAQ,CAAC,YAAY,EAAE;QACpB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;QACpC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAC;KACxC,CAAC;CACJ;AAED,gGAAgG;AAChG,MAAM,WAAW,4BAA4B;IAC1C,QAAQ,CAAC,KAAK,EAAE,SAAS,OAAO,EAAE,CAAC;CACrC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,wBAAwB;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CACxD;AAkBD;;;;;;;GAOG;AACH,MAAM,WAAW,oBAAqB,SAAQ,OAAO;IAClD,wGAAwG;IACxG,UAAU,IAAI,OAAO,CAAC,8BAA8B,CAAC,CAAC;IACtD,oEAAoE;IACpE,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpF,iFAAiF;IACjF,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACjE,uGAAuG;IACvG,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,wBAAwB,EAAE,CAAC,CAAC;IAC/F,8DAA8D;IAC9D,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAAC;IAC9G,6CAA6C;IAC7C,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED,uCAAuC;AACvC,MAAM,WAAW,qBAAqB;IACnC;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC7E,+EAA+E;IAC/E,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC;IACnD,0DAA0D;IAC1D,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC/B;AAKD;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,gBAAgB,EAAE,CA2JjF"}
|
package/lib/lsp/index.js
CHANGED
|
@@ -22,10 +22,20 @@
|
|
|
22
22
|
*/
|
|
23
23
|
import assert from 'node:assert/strict';
|
|
24
24
|
import { resolveDeferred, resolveModel } from '../model.js';
|
|
25
|
-
/**
|
|
25
|
+
/**
|
|
26
|
+
* True when `diagnostic` carries a NON-EMPTY message in either LSP shape
|
|
27
|
+
* (plain string or markup).
|
|
28
|
+
*
|
|
29
|
+
* Emptiness is part of the claim, not a refinement of it: `message: ''` is a
|
|
30
|
+
* diagnostic a user cannot act on, and a type-only test admits it — which
|
|
31
|
+
* makes "every diagnostic carries a message" pass for a head that publishes
|
|
32
|
+
* none. LSP declares the field required without forbidding the empty string,
|
|
33
|
+
* so nothing upstream rules it out either.
|
|
34
|
+
*/
|
|
26
35
|
function hasTextMessage(diagnostic) {
|
|
27
36
|
const { message } = diagnostic;
|
|
28
|
-
|
|
37
|
+
const text = typeof message === 'string' ? message : message?.value;
|
|
38
|
+
return typeof text === 'string' && text.length > 0;
|
|
29
39
|
}
|
|
30
40
|
/** Document version sent on the `didChange` of the re-diagnose check (the open is v1). */
|
|
31
41
|
const CHANGED_VERSION = 2;
|
|
@@ -129,7 +139,7 @@ export function buildLspChecks(options) {
|
|
|
129
139
|
driver.openDocument(model.uri, model.text, model.languageId);
|
|
130
140
|
const published = await diagnostics;
|
|
131
141
|
assert.ok(published.length >= 1, 'didOpen(invalid) published no diagnostics');
|
|
132
|
-
assert.ok(published.every(hasTextMessage), 'a published diagnostic was missing a message');
|
|
142
|
+
assert.ok(published.every(hasTextMessage), 'a published diagnostic was missing a non-empty message');
|
|
133
143
|
}
|
|
134
144
|
finally {
|
|
135
145
|
driver.dispose();
|
package/lib/lsp/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lsp/index.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF;;;;;;;;;;;;;GAaG;AAEH,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAGxC,OAAO,EAAwB,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA0BlF
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lsp/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hydranium/conformance",
|
|
3
|
-
"version": "1.0.0-next.
|
|
3
|
+
"version": "1.0.0-next.23",
|
|
4
4
|
"description": "Protocol conformance kit (TCK) for hydranium adopters. Per-head slices (/data, /lsp, /glsp) of fixture-parameterized, protocol-only smoke checks an adopter runs against its own server.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"hydranium",
|
|
@@ -88,7 +88,7 @@
|
|
|
88
88
|
"watch": "tsc -b -w --preserveWatchOutput"
|
|
89
89
|
},
|
|
90
90
|
"devDependencies": {
|
|
91
|
-
"@hydranium/protocol": "1.0.0-next.
|
|
91
|
+
"@hydranium/protocol": "1.0.0-next.23",
|
|
92
92
|
"@jest/globals": "^29.7.0",
|
|
93
93
|
"@types/jest": "^29.5.12",
|
|
94
94
|
"jest": "^29.7.0",
|
|
@@ -98,7 +98,7 @@
|
|
|
98
98
|
"vitest": "^4.0.0"
|
|
99
99
|
},
|
|
100
100
|
"peerDependencies": {
|
|
101
|
-
"@hydranium/protocol": "1.0.0-next.
|
|
101
|
+
"@hydranium/protocol": "1.0.0-next.23",
|
|
102
102
|
"@jest/globals": "^29.0.0",
|
|
103
103
|
"vitest": "^4.0.0"
|
|
104
104
|
},
|
package/src/lsp/index.ts
CHANGED
|
@@ -51,10 +51,20 @@ export interface LspConformanceDiagnostic {
|
|
|
51
51
|
readonly message: string | { readonly value: string };
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
-
/**
|
|
54
|
+
/**
|
|
55
|
+
* True when `diagnostic` carries a NON-EMPTY message in either LSP shape
|
|
56
|
+
* (plain string or markup).
|
|
57
|
+
*
|
|
58
|
+
* Emptiness is part of the claim, not a refinement of it: `message: ''` is a
|
|
59
|
+
* diagnostic a user cannot act on, and a type-only test admits it — which
|
|
60
|
+
* makes "every diagnostic carries a message" pass for a head that publishes
|
|
61
|
+
* none. LSP declares the field required without forbidding the empty string,
|
|
62
|
+
* so nothing upstream rules it out either.
|
|
63
|
+
*/
|
|
55
64
|
function hasTextMessage(diagnostic: LspConformanceDiagnostic): boolean {
|
|
56
65
|
const { message } = diagnostic;
|
|
57
|
-
|
|
66
|
+
const text = typeof message === 'string' ? message : message?.value;
|
|
67
|
+
return typeof text === 'string' && text.length > 0;
|
|
58
68
|
}
|
|
59
69
|
|
|
60
70
|
/**
|
|
@@ -199,7 +209,7 @@ export function buildLspChecks(options: LspConformanceOptions): ConformanceCheck
|
|
|
199
209
|
driver.openDocument(model.uri, model.text, model.languageId);
|
|
200
210
|
const published = await diagnostics;
|
|
201
211
|
assert.ok(published.length >= 1, 'didOpen(invalid) published no diagnostics');
|
|
202
|
-
assert.ok(published.every(hasTextMessage), 'a published diagnostic was missing a message');
|
|
212
|
+
assert.ok(published.every(hasTextMessage), 'a published diagnostic was missing a non-empty message');
|
|
203
213
|
} finally {
|
|
204
214
|
driver.dispose();
|
|
205
215
|
}
|