Skip to content

Commit

Permalink
Merge pull request #1084 from microsoft/andrueastman/untypedNodes
Browse files Browse the repository at this point in the history
[TypeScript] Untyped Nodes
  • Loading branch information
andrueastman authored Mar 20, 2024
2 parents cd45905 + 47be78f commit 5ce4f29
Show file tree
Hide file tree
Showing 21 changed files with 583 additions and 20 deletions.
2 changes: 1 addition & 1 deletion packages/abstractions/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@microsoft/kiota-abstractions",
"version": "1.0.0-preview.47",
"version": "1.0.0-preview.48",
"description": "Core abstractions for kiota generated libraries in TypeScript and JavaScript",
"main": "dist/cjs/src/index.js",
"module": "dist/es/src/index.js",
Expand Down
7 changes: 7 additions & 0 deletions packages/abstractions/src/serialization/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,10 @@ export * from "./serializationWriterFactory";
export * from "./serializationWriterFactoryRegistry";
export * from "./serializationWriterProxyFactory";
export * from "./serializationFunctionTypes";
export * from "./untypedNode";
export * from "./untypedNumber";
export * from "./untypedArray";
export * from "./untypedNull";
export * from "./untypedObject";
export * from "./untypedString";
export * from "./untypedBoolean";
35 changes: 35 additions & 0 deletions packages/abstractions/src/serialization/untypedArray.ts
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[],
};
}
31 changes: 31 additions & 0 deletions packages/abstractions/src/serialization/untypedBoolean.ts
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,
};
}
61 changes: 61 additions & 0 deletions packages/abstractions/src/serialization/untypedNode.ts
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;
}
29 changes: 29 additions & 0 deletions packages/abstractions/src/serialization/untypedNull.ts
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,
};
}
31 changes: 31 additions & 0 deletions packages/abstractions/src/serialization/untypedNumber.ts
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,
};
}
38 changes: 38 additions & 0 deletions packages/abstractions/src/serialization/untypedObject.ts
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>,
};
}
31 changes: 31 additions & 0 deletions packages/abstractions/src/serialization/untypedString.ts
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,
};
}
4 changes: 2 additions & 2 deletions packages/authentication/azure/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@microsoft/kiota-authentication-azure",
"version": "1.0.0-preview.42",
"version": "1.0.0-preview.43",
"description": "Authentication provider for Kiota using Azure Identity",
"main": "dist/cjs/src/index.js",
"module": "dist/es/src/index.js",
Expand Down Expand Up @@ -30,7 +30,7 @@
"homepage": "https://github.com/microsoft/kiota-typescript#readme",
"dependencies": {
"@azure/core-auth": "^1.5.0",
"@microsoft/kiota-abstractions": "^1.0.0-preview.47",
"@microsoft/kiota-abstractions": "^1.0.0-preview.48",
"@opentelemetry/api": "^1.7.0",
"tslib": "^2.6.2"
},
Expand Down
4 changes: 2 additions & 2 deletions packages/authentication/spfx/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@microsoft/kiota-authentication-spfx",
"version": "1.0.0-preview.37",
"version": "1.0.0-preview.38",
"description": "Authentication provider for using Kiota in SPFx solutions",
"main": "dist/cjs/src/index.js",
"module": "dist/es/src/index.js",
Expand Down Expand Up @@ -39,7 +39,7 @@
},
"homepage": "https://github.com/microsoft/kiota-typescript#readme",
"dependencies": {
"@microsoft/kiota-abstractions": "^1.0.0-preview.47",
"@microsoft/kiota-abstractions": "^1.0.0-preview.48",
"@microsoft/sp-http": "^1.15.2",
"@opentelemetry/api": "^1.7.0",
"tslib": "^2.6.2"
Expand Down
4 changes: 2 additions & 2 deletions packages/http/fetch/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@microsoft/kiota-http-fetchlibrary",
"version": "1.0.0-preview.46",
"version": "1.0.0-preview.47",
"description": "Kiota request adapter implementation with fetch",
"keywords": [
"Kiota",
Expand Down Expand Up @@ -38,7 +38,7 @@
"test:cjs": "mocha 'dist/cjs/test/common/**/*.js' && mocha 'dist/cjs/test/node/**/*.js'"
},
"dependencies": {
"@microsoft/kiota-abstractions": "^1.0.0-preview.47",
"@microsoft/kiota-abstractions": "^1.0.0-preview.48",
"@opentelemetry/api": "^1.7.0",
"guid-typescript": "^1.0.9",
"tslib": "^2.6.2"
Expand Down
4 changes: 2 additions & 2 deletions packages/serialization/form/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@microsoft/kiota-serialization-form",
"version": "1.0.0-preview.36",
"version": "1.0.0-preview.37",
"description": "Implementation of Kiota Serialization interfaces for URI from encoded",
"main": "dist/cjs/src/index.js",
"browser": {
Expand Down Expand Up @@ -39,7 +39,7 @@
},
"homepage": "https://github.com/microsoft/kiota-typescript#readme",
"dependencies": {
"@microsoft/kiota-abstractions": "^1.0.0-preview.47",
"@microsoft/kiota-abstractions": "^1.0.0-preview.48",
"guid-typescript": "^1.0.9",
"tslib": "^2.6.2"
},
Expand Down
4 changes: 2 additions & 2 deletions packages/serialization/json/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@microsoft/kiota-serialization-json",
"version": "1.0.0-preview.47",
"version": "1.0.0-preview.48",
"description": "Implementation of Kiota Serialization interfaces for JSON",
"main": "dist/cjs/src/index.js",
"browser": {
Expand Down Expand Up @@ -39,7 +39,7 @@
},
"homepage": "https://github.com/microsoft/kiota-typescript#readme",
"dependencies": {
"@microsoft/kiota-abstractions": "^1.0.0-preview.47",
"@microsoft/kiota-abstractions": "^1.0.0-preview.48",
"guid-typescript": "^1.0.9",
"tslib": "^2.6.2"
},
Expand Down
Loading

0 comments on commit 5ce4f29

Please sign in to comment.