Skip to content

Commit 0dc5de7

Browse files
committed
Type cleanup
1 parent e59aa40 commit 0dc5de7

File tree

6 files changed

+28
-21
lines changed

6 files changed

+28
-21
lines changed

src/jref/jref-util.d.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import { JrefCompatible, JrefNode } from "./jref-ast.d.ts";
22

33

4-
export type Reviver<A extends JrefNode | undefined> = (node: JrefCompatible<NonNullable<A>>, key?: string) => A;
4+
export type Reviver<A = JrefNode> = (node: JrefCompatible<NonNullable<A>>, key?: string) => A;
55

66
/**
77
* Parse a JRef string into a JRef AST. Includes a reviver option similar to
88
* {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse | JSON.parse}.
99
*/
10-
export const fromJref: <A extends JrefNode | undefined = JrefNode>(jref: string, uri: string, reviver?: Reviver<A>) => A;
10+
export const fromJref: <A = JrefNode>(jref: string, uri: string, reviver?: Reviver<A>) => A;
1111

1212
export type Replacer = (value: JrefNode, key?: string) => JrefNode | undefined;
1313

src/jref/jref-util.js

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import {
77
} from "../json/jsonast-util.js";
88

99
/**
10-
* @import { JsonObjectNode } from "../json/jsonast.js"
11-
* @import { JrefNode } from "./jref-ast.js"
10+
* @import { JsonNode, JsonObjectNode } from "../json/jsonast.d.ts"
11+
* @import { JrefNode } from "./jref-ast.d.ts"
1212
* @import * as API from "./jref-util.d.ts"
1313
*/
1414

@@ -35,11 +35,16 @@ export const fromJref = (jref, uri, reviver = defaultReviver) => {
3535
});
3636
};
3737

38-
/** @type <A extends JrefNode>(node: JsonObjectNode<A>) => string | undefined */
38+
/** @type <A>(node: JsonObjectNode<A>) => string | undefined */
3939
const isReference = (objectNode) => {
4040
for (const propertyNode of objectNode.children) {
4141
if (propertyNode.children[0].value === "$ref") {
42-
const valueNode = propertyNode.children[1];
42+
const unknownValueNode = propertyNode.children[1];
43+
if (!unknownValueNode || typeof unknownValueNode !== "object") {
44+
continue;
45+
}
46+
/** @type JsonNode */
47+
const valueNode = /** @type any */ (unknownValueNode);
4348
if (valueNode.type === "json" && valueNode.jsonType === "string") {
4449
return valueNode.value;
4550
}

src/jref/jref-util.test.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ import { fromJref, toJref } from "./jref-util.js";
33
import { resolveIri } from "@hyperjump/uri";
44

55
/**
6-
* @import { JrefNode } from "../jref/jref-ast.js"
6+
* @import { JrefNode } from "./jref-ast.d.ts"
7+
* @import { Reviver } from "./jref-util.d.ts"
78
*/
89

910

@@ -275,7 +276,8 @@ describe("JRef", () => {
275276

276277
describe("reviver", () => {
277278
test("convert properties that start with 'i' to integers", () => {
278-
const subject = fromJref(`{ "foo": 42, "iBar": "42", "baz": { "$ref": "./foo" } }`, testContext, (node, key) => {
279+
/** @type Reviver<JrefNode> */
280+
const reviver = (node, key) => {
279281
if (key?.startsWith("i") && node.type === "json" && node.jsonType === "string") {
280282
return {
281283
...node,
@@ -285,7 +287,8 @@ describe("JRef", () => {
285287
} else {
286288
return node;
287289
}
288-
});
290+
};
291+
const subject = fromJref(`{ "foo": 42, "iBar": "42", "baz": { "$ref": "./foo" } }`, testContext, reviver);
289292
expect(toJref(subject, testContext)).to.equal(`{"foo":42,"iBar":42,"baz":{"$ref":"foo"}}`);
290293
});
291294
});

src/json/jsonast-util.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {
1010
JsonStringNode
1111
} from "./jsonast.d.ts";
1212

13-
export type Reviver<A> = (node: JsonCompatible<NonNullable<A>>, key?: string) => A;
13+
export type Reviver<A = JsonNode> = (node: JsonCompatible<NonNullable<A>>, key?: string) => A;
1414

1515
/**
1616
* Parse a JSON string into a JSON AST. Includes a reviver option similar to

src/json/jsonast-util.js

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import { JsonLexer } from "./json-lexer.js";
77
* JsonArrayNode,
88
* JsonBooleanNode,
99
* JsonCompatible,
10-
* JsonNode,
1110
* JsonNullNode,
1211
* JsonNumberNode,
1312
* JsonObjectNode,
@@ -244,12 +243,7 @@ export const fromJs = (js) => {
244243
}
245244
};
246245

247-
/**
248-
* @template [A = JsonNode]
249-
* @typedef {(node: A, key?: string) => JsonCompatible<A> | undefined} Replacer
250-
*/
251-
252-
/** @type Replacer<any> */
246+
/** @type API.Replacer<any> */
253247
const defaultReplacer = (node) => node; // eslint-disable-line @typescript-eslint/no-unsafe-return
254248

255249
/** @type API.toJson */
@@ -258,7 +252,7 @@ export const toJson = (node, replacer = defaultReplacer, space = "") => {
258252
return replacedNode ? stringifyValue(replacedNode, replacer, space, 1) : "";
259253
};
260254

261-
/** @type <A>(node: JsonCompatible<A>, replacer: Replacer<A>, space: string, depth: number) => string */
255+
/** @type <A>(node: JsonCompatible<A>, replacer: API.Replacer<A>, space: string, depth: number) => string */
262256
const stringifyValue = (node, replacer, space, depth) => {
263257
switch (node.jsonType) {
264258
case "array":
@@ -270,7 +264,7 @@ const stringifyValue = (node, replacer, space, depth) => {
270264
}
271265
};
272266

273-
/** @type <A>(node: JsonArrayNode<A>, replacer: Replacer<A>, space: string, depth: number) => string */
267+
/** @type <A>(node: JsonArrayNode<A>, replacer: API.Replacer<A>, space: string, depth: number) => string */
274268
const stringifyArray = (node, replacer, space, depth) => {
275269
if (node.children.length === 0) {
276270
return "[]";
@@ -292,7 +286,7 @@ const stringifyArray = (node, replacer, space, depth) => {
292286
return result + padding + "]";
293287
};
294288

295-
/** @type <A>(node: JsonObjectNode<A>, replacer: Replacer<A>, space: string, depth: number) => string */
289+
/** @type <A>(node: JsonObjectNode<A>, replacer: API.Replacer<A>, space: string, depth: number) => string */
296290
const stringifyObject = (node, replacer, space, depth) => {
297291
if (node.children.length === 0) {
298292
return "{}";

src/json/jsonast.d.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,12 @@ export type JsonNode = JsonObjectNode
7878
| JsonBooleanNode
7979
| JsonNullNode;
8080

81-
export type JsonCompatible<A> = JsonObjectNode<A> | JsonArrayNode<A> | JsonStringNode | JsonNumberNode | JsonBooleanNode | JsonNullNode;
81+
export type JsonCompatible<A> = JsonObjectNode<A>
82+
| JsonArrayNode<A>
83+
| JsonStringNode
84+
| JsonNumberNode
85+
| JsonBooleanNode
86+
| JsonNullNode;
8287

8388
export type JsonType = "null" | "boolean" | "number" | "string" | "array" | "object";
8489

0 commit comments

Comments
 (0)