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.44",
andrueastman marked this conversation as resolved.
Show resolved Hide resolved
"version": "1.0.0-preview.45",
"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";
19 changes: 19 additions & 0 deletions packages/abstractions/src/serialization/untypedArray.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { isUntypedNode, UntypedNode } from "./untypedNode";

export class UntypedArray extends UntypedNode {
baywet marked this conversation as resolved.
Show resolved Hide resolved
constructor(value: UntypedNode[]) {
super(value);
}
getValue(): UntypedNode[] {
return this.value as UntypedNode[];
}
}

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))
);
}
14 changes: 14 additions & 0 deletions packages/abstractions/src/serialization/untypedBoolean.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { UntypedNode } from "./untypedNode";

export class UntypedBoolean extends UntypedNode {
constructor(value: boolean) {
super(value);
}
getValue(): boolean {
return this.value as boolean;
}
}

export function isUntypedBoolean(node: UntypedNode): node is UntypedBoolean {
baywet marked this conversation as resolved.
Show resolved Hide resolved
return typeof (node as UntypedBoolean)?.value === "boolean";
}
45 changes: 45 additions & 0 deletions packages/abstractions/src/serialization/untypedNode.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/* eslint-disable @typescript-eslint/no-unused-vars */
import type { Parsable } from "./parsable";
import type { ParseNode } from "./parseNode";
import type { SerializationWriter } from "./serializationWriter";

export class UntypedNode implements Parsable {
constructor(value?: any) {
this.value = value;
}
getValue(): any {
return this.value;
}
value?: any;
}

export function createUntypedNodeFromDiscriminatorValue(
_parseNode: ParseNode | undefined,
): (instance?: Parsable) => Record<string, (node: ParseNode) => void> {
return deserializeIntoUntypedNode;
}

export function isUntypedNode(node: any): node is UntypedNode {
const potentialNode = node as UntypedNode;
return potentialNode && potentialNode.getValue !== undefined;
}

export function deserializeIntoUntypedNode(
untypedNode: Partial<UntypedNode> | undefined = {},
): Record<string, (node: ParseNode) => void> {
return {
value: (n) => {
untypedNode.value = null;
},
getValue: (n) => {
untypedNode.getValue = () => untypedNode.value;
},
};
}

export function serializeUntypedNode(
_writer: SerializationWriter,
_errorDetails: Partial<UntypedNode> | undefined = {},
): void {
return;
}
14 changes: 14 additions & 0 deletions packages/abstractions/src/serialization/untypedNull.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { UntypedNode } from "./untypedNode";

export class UntypedNull extends UntypedNode {
constructor() {
super(null);
}
getValue(): null {
return null;
}
}

export function isUntypedNull(node: UntypedNode): node is UntypedNull {
return (node as UntypedNull)?.value === null;
}
14 changes: 14 additions & 0 deletions packages/abstractions/src/serialization/untypedNumber.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { UntypedNode } from "./untypedNode";

export class UntypedNumber extends UntypedNode {
constructor(value: number) {
super(value);
}
getValue(): number {
return this.value as number;
}
}

export function isUntypedNumber(node: UntypedNode): node is UntypedNumber {
return typeof (node as UntypedNumber)?.value === "number";
}
19 changes: 19 additions & 0 deletions packages/abstractions/src/serialization/untypedObject.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { isUntypedNode, UntypedNode } from "./untypedNode";

export class UntypedObject extends UntypedNode {
constructor(value: Record<string, UntypedNode>) {
super(value);
}
getValue(): Record<string, UntypedNode> {
return this.value as Record<string, UntypedNode>;
}
}

export function isUntypedObject(node: UntypedNode): node is UntypedObject {
const value = (node as UntypedObject)?.value;
return (
value instanceof Object &&
value instanceof Array === false &&
Object.values(value).every((item) => isUntypedNode(item))
);
}
14 changes: 14 additions & 0 deletions packages/abstractions/src/serialization/untypedString.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { UntypedNode } from "./untypedNode";

export class UntypedString extends UntypedNode {
constructor(value: string) {
super(value);
}
getValue(): string {
return this.value as string;
}
}

export function isUntypedString(node: UntypedNode): node is UntypedString {
return typeof (node as UntypedString)?.value === "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.39",
"version": "1.0.0-preview.40",
"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.44",
"@microsoft/kiota-abstractions": "^1.0.0-preview.45",
"@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.34",
"version": "1.0.0-preview.35",
"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.44",
"@microsoft/kiota-abstractions": "^1.0.0-preview.45",
"@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.43",
"version": "1.0.0-preview.44",
"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.44",
"@microsoft/kiota-abstractions": "^1.0.0-preview.45",
"@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.33",
"version": "1.0.0-preview.34",
"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.44",
"@microsoft/kiota-abstractions": "^1.0.0-preview.45",
"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.44",
"version": "1.0.0-preview.45",
"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.44",
"@microsoft/kiota-abstractions": "^1.0.0-preview.45",
"guid-typescript": "^1.0.9",
"tslib": "^2.6.2"
},
Expand Down
42 changes: 42 additions & 0 deletions packages/serialization/json/src/jsonParseNode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,15 @@ import {
TimeOnly,
isBackingStoreEnabled,
toFirstCharacterUpper,
isUntypedNode,
UntypedNode,
UntypedArray,
UntypedBoolean,
UntypedNumber,
UntypedObject,
UntypedString,
createUntypedNodeFromDiscriminatorValue,
UntypedNull,
} from "@microsoft/kiota-abstractions";

export class JsonParseNode implements ParseNode {
Expand Down Expand Up @@ -72,6 +81,39 @@ export class JsonParseNode implements ParseNode {
parsableFactory: ParsableFactory<T>,
): T => {
const temp: T = {} as T;
if (isUntypedNode(parsableFactory(this)(temp))) {
const valueType = typeof this._jsonNode;
let value: T = temp;
if (valueType === "boolean") {
value = new UntypedBoolean(this._jsonNode as boolean) as any as T;
} else if (valueType === "string") {
value = new UntypedString(this._jsonNode as string) as any as T;
} else if (valueType === "number") {
value = new UntypedNumber(this._jsonNode as number) as any as T;
} else if (Array.isArray(this._jsonNode)) {
const nodes: UntypedNode[] = [];
// eslint-disable-next-line @typescript-eslint/no-unused-vars
(this._jsonNode as any[]).forEach((x) => {
nodes.push(
new JsonParseNode(x).getObjectValue(
baywet marked this conversation as resolved.
Show resolved Hide resolved
createUntypedNodeFromDiscriminatorValue,
),
);
});
value = new UntypedArray(nodes) as any as T;
} else if (this._jsonNode && valueType === "object") {
const properties: Record<string, UntypedNode> = {};
Object.entries(this._jsonNode as any).forEach(([k, v]) => {
properties[k] = new JsonParseNode(v).getObjectValue(
andrueastman marked this conversation as resolved.
Show resolved Hide resolved
createUntypedNodeFromDiscriminatorValue,
);
});
value = new UntypedObject(properties) as any as T;
} else if (!this._jsonNode) {
value = new UntypedNull() as any as T;
}
return value;
}
const enableBackingStore = isBackingStoreEnabled(parsableFactory(this)(temp));
const value: T = enableBackingStore ? new Proxy(temp, createBackedModelProxyHandler<T>()) : temp;
if (this.onBeforeAssignFieldValues) {
Expand Down
Loading
Loading