-
Notifications
You must be signed in to change notification settings - Fork 30
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #1084 from microsoft/andrueastman/untypedNodes
[TypeScript] Untyped Nodes
- Loading branch information
Showing
21 changed files
with
583 additions
and
20 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
import { isUntypedNode, UntypedNode } from "./untypedNode"; | ||
|
||
/** Defines an interface for defining an untyped array. */ | ||
export interface UntypedArray extends UntypedNode { | ||
/** | ||
* Gets the value of the UntypedNode as an array of UntypedNodes. | ||
*/ | ||
getValue(): UntypedNode[]; | ||
} | ||
|
||
/** | ||
* Type guard to assert that an UntypedNode instance is an UntypedArray. | ||
* @param node The UntypedNode to check. | ||
* @return boolean indicating if the node is an UntypedArray. | ||
*/ | ||
export function isUntypedArray(node: UntypedNode): node is UntypedArray { | ||
const proposedNode = node as UntypedArray; | ||
return ( | ||
proposedNode && | ||
proposedNode.value instanceof Array && | ||
proposedNode.value.every((item) => isUntypedNode(item)) | ||
); | ||
} | ||
|
||
/** | ||
* Factory to create an UntypedArray from an array of UntypedNodes. | ||
* @param value The value to create from. | ||
* @return The created UntypedArray. | ||
*/ | ||
export function createUntypedArray(value: UntypedNode[]): UntypedArray { | ||
return { | ||
value: value, | ||
getValue: () => value as UntypedNode[], | ||
}; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
import { UntypedNode } from "./untypedNode"; | ||
|
||
/** Defines an interface for defining an untyped boolean. */ | ||
export interface UntypedBoolean extends UntypedNode { | ||
/** | ||
* Gets the value of the UntypedNode as a boolean value. | ||
*/ | ||
getValue(): boolean; | ||
} | ||
|
||
/** | ||
* Type guard to assert that an UntypedNode instance is an UntypedBoolean. | ||
* @param node The UntypedNode to check. | ||
* @return boolean indicating if the node is an UntypedBoolean. | ||
*/ | ||
export function isUntypedBoolean(node: UntypedNode): node is UntypedBoolean { | ||
const proposedNode = node as UntypedBoolean; | ||
return proposedNode && typeof proposedNode.value === "boolean"; | ||
} | ||
|
||
/** | ||
* Factory to create an UntypedBoolean from a boolean. | ||
* @param value The boolean value to create from. | ||
* @return The created UntypedBoolean. | ||
*/ | ||
export function createUntypedBoolean(value: boolean): UntypedBoolean { | ||
return { | ||
value: value, | ||
getValue: () => value as boolean, | ||
}; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
/* eslint-disable @typescript-eslint/no-unused-vars */ | ||
import type { Parsable } from "./parsable"; | ||
import type { ParseNode } from "./parseNode"; | ||
import type { SerializationWriter } from "./serializationWriter"; | ||
|
||
/** Defines the base interface for defining an untyped node. */ | ||
export interface UntypedNode extends Parsable { | ||
/** | ||
* Gets the value of the UntypedNode. | ||
*/ | ||
getValue(): any; | ||
/** | ||
* The value represented by the UntypedNode. | ||
*/ | ||
value?: any; | ||
} | ||
|
||
/** | ||
* Factory to create an UntypedNode from a string during deserialization. | ||
*/ | ||
export function createUntypedNodeFromDiscriminatorValue( | ||
_parseNode: ParseNode | undefined, | ||
): (instance?: Parsable) => Record<string, (node: ParseNode) => void> { | ||
return deserializeIntoUntypedNode; | ||
} | ||
|
||
/** | ||
* Type guard to assert that an object instance is an UntypedNode. | ||
* @param node The object to check. | ||
* @return boolean indicating if the node is an UntypedNode. | ||
*/ | ||
export function isUntypedNode(node: any): node is UntypedNode { | ||
const potentialNode = node as UntypedNode; | ||
return potentialNode && potentialNode.getValue !== undefined; | ||
} | ||
|
||
/** | ||
* The deserialization implementation for UntypedNode. | ||
*/ | ||
export function deserializeIntoUntypedNode( | ||
untypedNode: Partial<UntypedNode> | undefined = {}, | ||
): Record<string, (node: ParseNode) => void> { | ||
return { | ||
value: (n) => { | ||
untypedNode.value = null; | ||
}, | ||
getValue: (n) => { | ||
untypedNode.getValue = () => untypedNode.value; | ||
}, | ||
}; | ||
} | ||
|
||
/** | ||
* The serialization implementation for UntypedNode. | ||
*/ | ||
export function serializeUntypedNode( | ||
_writer: SerializationWriter, | ||
_errorDetails: Partial<UntypedNode> | undefined = {}, | ||
): void { | ||
return; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
import { UntypedNode } from "./untypedNode"; | ||
|
||
/** Defines the interface for defining an untyped null value. */ | ||
export interface UntypedNull extends UntypedNode { | ||
/** | ||
* Gets the value of the UntypedNode as null. | ||
*/ | ||
getValue(): null; | ||
} | ||
|
||
/** | ||
* Type guard to assert that an object instance is an UntypedNull. | ||
* @param node The object to check. | ||
* @return boolean indicating if the node is an UntypedNull. | ||
*/ | ||
export function isUntypedNull(node: UntypedNode): node is UntypedNull { | ||
return node.value === null; | ||
} | ||
|
||
/** | ||
* Factory to create an UntypedNull from a boolean. | ||
* @return The created UntypedNull. | ||
*/ | ||
export function createUntypedNull(): UntypedNull { | ||
return { | ||
value: null, | ||
getValue: () => null, | ||
}; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
import { UntypedNode } from "./untypedNode"; | ||
|
||
/** Defines the interface for defining an untyped number value. */ | ||
export interface UntypedNumber extends UntypedNode { | ||
/** | ||
* Gets the value of the UntypedNode as a number. | ||
*/ | ||
getValue(): number; | ||
} | ||
|
||
/** | ||
* Type guard to assert that an object instance is an UntypedNumber. | ||
* @param node The object to check. | ||
* @return boolean indicating if the node is an UntypedNumber. | ||
*/ | ||
export function isUntypedNumber(node: UntypedNode): node is UntypedNumber { | ||
const proposedNode = node as UntypedNumber; | ||
return proposedNode && typeof proposedNode.value === "number"; | ||
} | ||
|
||
/** | ||
* Factory to create an UntypedNumber from a number. | ||
* @param value The number value to create from. | ||
* @return The created UntypedNumber. | ||
*/ | ||
export function createUntypedNumber(value: number): UntypedNumber { | ||
return { | ||
value: value, | ||
getValue: () => value as number, | ||
}; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
import { isUntypedNode, UntypedNode } from "./untypedNode"; | ||
|
||
/** Defines the interface for defining an untyped object value. */ | ||
export interface UntypedObject extends UntypedNode { | ||
/** | ||
* Gets the value of the UntypedNode as a Record<string, UntypedNode>. | ||
*/ | ||
getValue(): Record<string, UntypedNode>; | ||
} | ||
|
||
/** | ||
* Type guard to assert that an object instance is an UntypedObject. | ||
* @param node The object to check. | ||
* @return boolean indicating if the node is an UntypedObject. | ||
*/ | ||
export function isUntypedObject(node: UntypedNode): node is UntypedObject { | ||
const proposedNode = node as UntypedObject; | ||
return ( | ||
proposedNode && | ||
proposedNode.value instanceof Object && | ||
proposedNode.value instanceof Array === false && | ||
Object.values(proposedNode.value).every((item) => isUntypedNode(item)) | ||
); | ||
} | ||
|
||
/** | ||
* Factory to create an UntypedObject from a Record<string, UntypedNode>. | ||
* @param value The Record<string, UntypedNode> value to create from. | ||
* @return The created UntypedObject. | ||
*/ | ||
export function createUntypedObject( | ||
value: Record<string, UntypedNode>, | ||
): UntypedObject { | ||
return { | ||
value: value, | ||
getValue: () => value as Record<string, UntypedNode>, | ||
}; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
import { UntypedNode } from "./untypedNode"; | ||
|
||
/** Defines the interface for defining an untyped string value. */ | ||
export interface UntypedString extends UntypedNode { | ||
/** | ||
* Gets the value of the UntypedNode as a Record<string, UntypedNode>. | ||
*/ | ||
getValue(): string; | ||
} | ||
|
||
/** | ||
* Type guard to assert that an object instance is an UntypedString. | ||
* @param node The object to check. | ||
* @return boolean indicating if the node is an UntypedString. | ||
*/ | ||
export function isUntypedString(node: UntypedNode): node is UntypedString { | ||
const proposedNode = node as UntypedString; | ||
return proposedNode && typeof proposedNode.value === "string"; | ||
} | ||
|
||
/** | ||
* Factory to create an UntypedString from a string. | ||
* @param value The string value to create from. | ||
* @return The created UntypedString. | ||
*/ | ||
export function createUntypedString(value: string): UntypedString { | ||
return { | ||
value: value, | ||
getValue: () => value as string, | ||
}; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.