kiota-typescript icon indicating copy to clipboard operation
kiota-typescript copied to clipboard

Cannot write null to a nullable value

Open mbursill opened this issue 1 year ago • 5 comments

Our API depends on null's being allowed as part of the request:

const updateWidgetRequest: UpdateWidgetRequest = {
  name: 'Sproket',
  size: 5,
  inspectionDetails: null,
};

This is different than sending undefined for inspectionDetails. Our API treats undefined on patch as no change, but null as a means to clear the value.

While the swagger file defines the type as nullable, the generated code only allows InspectionDetails | undefined

We've tried to hack a value by doing:

inspectionDetails: <InspectionDetails>(<unknown>null)

This is awful and still doesn't work. This call to writeObjectValue strips it.

mbursill avatar May 15 '24 23:05 mbursill

Hi @mbursill Thanks for using kiota and for reaching out. QQ: are you enabling the backing store when you generate your client?

baywet avatar May 16 '24 12:05 baywet

Tested with both backing store and without. The generated model is:

export interface UpdateWidgetRequest extends BackedModel, Parsable {
    /**
     * Stores model information.
     */
    backingStoreEnabled?: boolean;
    /**
     * The inspectionDetails property
     */
    inspectionDetails?: InspectionDetails;
    /**
     * The mass property
     */
    mass?: number;
    /**
     * The name property
     */
    name?: string;
    /**
     * The size property
     */
    size?: number;
}

The fields are all optional, meaning they're union with undefined, but assigning null is not possible.

mbursill avatar May 16 '24 16:05 mbursill

Thanks for the additional information. Is your goal of passing null to have null in the JSON payload to reset a field of an object for example? The serialization writer already contains a method to write a null value but I don't think it was thought about end to end: the prototype of the methods would need to be updated, and we'd need all the implementations to test for the null value.

baywet avatar May 17 '24 16:05 baywet

Is your goal of passing null to have null in the JSON payload to reset a field of an object for example?

Yes, that's exactly what we're wanting it for. Undefined doesn't work for us in this case. Our API uses undefined to mean a change to the field was not made, and not to alter the value. To clear/reset the value we need null.

mbursill avatar May 17 '24 20:05 mbursill

Thanks for the additional context. Yes, this is probably a limitation of the design and code generation today we should work to fix. The first step is most likely to update all the interfaces (ParseNode, SerializationWriter, BackingStore,...) so parameters or return types also allow null as a value. Is this something you'd be interested in submitting a pull request for?

baywet avatar May 20 '24 18:05 baywet

any updates on this?

rners01 avatar Jun 14 '24 17:06 rners01

Hey @baywet, I want to contribute. How I can generate kiota.exe build after adding changes to packages?

rners01 avatar Jun 18 '24 14:06 rners01

@rners01 you can run it straight in process if you want with a single command

dotnet run --project ./src/kiota/kiota.csproj -- arguments you usually pass to kiota

or you can tweak the .vscode/launch.json if you are using vs code.

Make sure you have dotnet sdk 8 installed first

Thanks for the time and help!

baywet avatar Jun 19 '24 17:06 baywet

@baywet but I don't see no ./src/kiota/kiota.csproj in kiota-typescript repo

image

rners01 avatar Jun 21 '24 13:06 rners01

sorry, I meant in the main repo

baywet avatar Jun 21 '24 14:06 baywet

but then I don't understand, I have changes in kiota-typescript and seems like kiota is totally different project how can I generate the .exe with kiota-typescript changes?

rners01 avatar Jun 25 '24 10:06 rners01

the kiota typescript repository only contains the typescript libraries (abstractions, serialization, http, authentication,...) the generation happens in the main kiota repository.

baywet avatar Jun 25 '24 13:06 baywet

do you have any high-level instruction what changes should I apply to process null along with generation of .exe?

rners01 avatar Jun 25 '24 14:06 rners01

let's start with the TypeScript changes if you don't mind? Can you put a pull request together to make the following changes please? We'll then proceed to the generation changes as you won't be able to test them until the libraries here are updated.

baywet avatar Jun 25 '24 14:06 baywet

Hey @baywet, are there any changes needed for this to work?

Kindest13 avatar Aug 14 '24 11:08 Kindest13

besides updating the dependencies and refreshing the client? or am I misunderstanding your question?

baywet avatar Aug 14 '24 13:08 baywet

besides updating the dependencies and refreshing the client? or am I misunderstanding your question?

yes

Kindest13 avatar Aug 14 '24 15:08 Kindest13

turns out I found a missed update in my tests earlier. Once this is merged we should be good to go. https://github.com/microsoft/kiota/pull/5163

baywet avatar Aug 14 '24 19:08 baywet

Hey @baywet, after generating client from latest release build

there are a lot of errors on new null type, I guess we should've extended our methods with null type

image image

Kindest13 avatar Sep 02 '24 11:09 Kindest13

@Kindest13 you need to update the kiota packages (abstractions,...)

baywet avatar Sep 02 '24 13:09 baywet

@baywet Yes, you'r right. I have a question around id in ResponseRecord though, should we keep it as just string without additional null type as it's usually required?

export interface ResponseRecord extends Parsable {
    /**
     * The unique identifier.
     */
    id?: string | null;
}

Kindest13 avatar Sep 06 '24 10:09 Kindest13

@Kindest13 there's a long discussion around required/nullability here https://github.com/microsoft/kiota/issues/3911 TL;DR: today the way kiota generates code is not designed to handle required/non-nullable properties, this is because when we started out, most descriptions out there did not handle the information properly. And some contextualization is missing in the OAS standard itself to carry some distinctions.

So for now the goal with TypeScript is to align it with the other languages, and eventually make it stable, before we look at changing those things across languages.

baywet avatar Sep 06 '24 14:09 baywet