Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[TypeScript] Untyped Nodes #1084

Merged
merged 14 commits into from
Mar 20, 2024
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 {
andrueastman marked this conversation as resolved.
Show resolved Hide resolved
/**
* 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 {
baywet marked this conversation as resolved.
Show resolved Hide resolved
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
Loading