Skip to content

Commit 12b1950

Browse files
committed
Fix bug with pointer URI encoding
1 parent bd2a252 commit 12b1950

File tree

2 files changed

+33
-33
lines changed

2 files changed

+33
-33
lines changed

src/json-util.js

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -13,48 +13,48 @@ import { JsonLexer } from "./json-lexer.js";
1313
* } from "./jsonast.d.ts"
1414
*/
1515

16-
/** @type (json: string, location?: string) => JsonNode */
17-
export const fromJson = (json, location = "") => {
16+
/** @type (json: string, uri?: string) => JsonNode */
17+
export const fromJson = (json, uri = "") => {
1818
const lexer = new JsonLexer(json);
1919

2020
const token = lexer.nextToken();
21-
const jsonValue = parseValue(token, lexer, undefined, `${location}#`);
21+
const jsonValue = parseValue(token, lexer, undefined, uri, "");
2222

2323
lexer.done();
2424

2525
return jsonValue;
2626
};
2727

28-
/** @type (token: JsonToken, lexer: JsonLexer, key: string | undefined, location: string) => JsonNode */
29-
const parseValue = (token, lexer, _key, location) => {
28+
/** @type (token: JsonToken, lexer: JsonLexer, key: string | undefined, uri: string, pointer: string) => JsonNode */
29+
const parseValue = (token, lexer, _key, uri, pointer) => {
3030
switch (token.type) {
3131
case "null":
3232
case "boolean":
3333
case "number":
3434
case "string":
35-
return parseScalar(token, location);
35+
return parseScalar(token, uri, pointer);
3636
case "[":
37-
return parseArray(token, lexer, location);
37+
return parseArray(token, lexer, uri, pointer);
3838
case "{":
39-
return parseObject(token, lexer, location);
39+
return parseObject(token, lexer, uri, pointer);
4040
default:
4141
throw lexer.syntaxError("Expected a JSON value", token);
4242
}
4343
};
4444

45-
/** @type (token: JsonToken<"null" | "boolean" | "number" | "string">, location: string) => JsonNode */
46-
const parseScalar = (token, location) => {
45+
/** @type (token: JsonToken<"null" | "boolean" | "number" | "string">, uri: string, pointer: string) => JsonNode */
46+
const parseScalar = (token, uri, pointer) => {
4747
return {
4848
type: "json",
4949
jsonType: token.type,
5050
value: JSON.parse(token.value), // eslint-disable-line @typescript-eslint/no-unsafe-assignment
51-
location: location,
51+
location: `${uri}#${encodeURI(pointer)}`,
5252
position: tokenPosition(token)
5353
};
5454
};
5555

56-
/** @type (token: JsonToken, lexer: JsonLexer, key: string, location: string) => JsonPropertyNode */
57-
const parseProperty = (token, lexer, _key, location) => {
56+
/** @type (token: JsonToken, lexer: JsonLexer, key: string, uri: string, pointer: string) => JsonPropertyNode */
57+
const parseProperty = (token, lexer, _key, uri, pointer) => {
5858
if (token.type !== "string") {
5959
throw lexer.syntaxError("Expected a propertry", token);
6060
}
@@ -71,7 +71,7 @@ const parseProperty = (token, lexer, _key, location) => {
7171
throw lexer.syntaxError("Expected :", token);
7272
}
7373

74-
const valueNode = parseValue(lexer.nextToken(), lexer, keyNode.value, JsonPointer.append(keyNode.value, location));
74+
const valueNode = parseValue(lexer.nextToken(), lexer, keyNode.value, uri, JsonPointer.append(keyNode.value, pointer));
7575

7676
return {
7777
type: "json-property",
@@ -90,11 +90,11 @@ const parseProperty = (token, lexer, _key, location) => {
9090

9191
/**
9292
* @type <P extends ParentNode<C>, C extends JsonNode | JsonPropertyNode>(
93-
* parseChild: (token: JsonToken, lexer: JsonLexer, key: string, location: string) => C,
93+
* parseChild: (token: JsonToken, lexer: JsonLexer, key: string, uri: string, pointer: string) => C,
9494
* endToken: string
95-
* ) => (lexer: JsonLexer, node: P, location: string) => P
95+
* ) => (lexer: JsonLexer, node: P, uri: string, pointer: string) => P
9696
*/
97-
const parseCommaSeparated = (parseChild, endToken) => (lexer, node, location) => {
97+
const parseCommaSeparated = (parseChild, endToken) => (lexer, node, uri, pointer) => {
9898
for (let index = 0; true; index++) {
9999
let token = lexer.nextToken();
100100

@@ -111,44 +111,44 @@ const parseCommaSeparated = (parseChild, endToken) => (lexer, node, location) =>
111111
}
112112
}
113113

114-
const childNode = parseChild(token, lexer, `${index}`, location);
114+
const childNode = parseChild(token, lexer, `${index}`, uri, pointer);
115115
if (childNode) {
116116
node.children.push(childNode);
117117
}
118118
}
119119
};
120120

121-
/** @type (openToken: JsonToken, lexer: JsonLexer, location: string) => JsonArrayNode */
122-
const parseArray = (openToken, lexer, location) => {
121+
/** @type (openToken: JsonToken, lexer: JsonLexer, uri: string, pointer: string) => JsonArrayNode */
122+
const parseArray = (openToken, lexer, uri, pointer) => {
123123
return parseItems(lexer, {
124124
type: "json",
125125
jsonType: "array",
126126
children: [],
127-
location: location,
127+
location: `${uri}#${encodeURI(pointer)}`,
128128
position: tokenPosition(openToken)
129-
}, location);
129+
}, uri, pointer);
130130
};
131131

132-
/** @type (token: JsonToken, lexer: JsonLexer, key: string, location: string) => JsonNode */
133-
const parseItem = (token, lexer, key, location) => {
134-
return parseValue(token, lexer, key, JsonPointer.append(key, location));
132+
/** @type (token: JsonToken, lexer: JsonLexer, key: string, uri: string, pointer: string) => JsonNode */
133+
const parseItem = (token, lexer, key, uri, pointer) => {
134+
return parseValue(token, lexer, key, uri, JsonPointer.append(key, pointer));
135135
};
136136

137-
/** @type (lexer: JsonLexer, node: { type: "json" } & JsonArrayNode, location: string) => JsonArrayNode */
137+
/** @type (lexer: JsonLexer, node: { type: "json" } & JsonArrayNode, uri: string, pointer: string) => JsonArrayNode */
138138
const parseItems = parseCommaSeparated(parseItem, "]");
139139

140-
/** @type (openToken: JsonToken, lexer: JsonLexer, location: string) => JsonObjectNode */
141-
const parseObject = (openToken, lexer, location) => {
140+
/** @type (openToken: JsonToken, lexer: JsonLexer, uri: string, pointer: string) => JsonObjectNode */
141+
const parseObject = (openToken, lexer, uri, pointer) => {
142142
return parseProperties(lexer, {
143143
type: "json",
144144
jsonType: "object",
145145
children: [],
146-
location: location,
146+
location: `${uri}#${encodeURI(pointer)}`,
147147
position: tokenPosition(openToken)
148-
}, location);
148+
}, uri, pointer);
149149
};
150150

151-
/** @type (lexer: JsonLexer, node: { type: "json" } & JsonObjectNode, location: string) => JsonObjectNode */
151+
/** @type (lexer: JsonLexer, node: { type: "json" } & JsonObjectNode, uri: string, pointer: string) => JsonObjectNode */
152152
const parseProperties = parseCommaSeparated(parseProperty, "}");
153153

154154
/** @type (startToken: JsonToken, endToken?: JsonToken) => Position */

src/test-coverage-evaluation-plugin.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ export class TestCoverageEvaluationPlugin {
7474
}
7575

7676
const tree = this.#schemaCache[schemaPath];
77-
const pointer = parseIri(schemaLocation).fragment ?? "";
77+
const pointer = decodeURI(parseIri(schemaLocation).fragment ?? "");
7878
const node = getNodeFromPointer(tree, pointer);
7979

8080
const declRange = node.type === "json-property"
@@ -108,7 +108,7 @@ export class TestCoverageEvaluationPlugin {
108108
continue;
109109
}
110110

111-
const pointer = parseIri(keywordLocation).fragment ?? "";
111+
const pointer = decodeURI(parseIri(keywordLocation).fragment ?? "");
112112
const node = getNodeFromPointer(tree, pointer);
113113
const range = positionToRange(node.position);
114114

0 commit comments

Comments
 (0)