DSC icon indicating copy to clipboard operation
DSC copied to clipboard

Resource and Canonical Properties use of null

Open ThomasNieto opened this issue 1 month ago • 1 comments

Prerequisites

  • [x] Write a descriptive title.
  • [x] Make sure you are able to repro it on the latest version
  • [x] Search the existing issues.

Summary

There are built-in resources and canonical properties (_inDesiredState) that use null in addition to actual type of the property. Null should NOT be a valid type unless the property actually accepts null as a valid use case. By allowing null it can confuse users when we have auto-complete in BICEP and weakens the strongly validated schema.

JSON schema null and undefined properties are different.

https://json-schema.org/understanding-json-schema/reference/null

Excerpt:

It's important to remember that in JSON, null isn't equivalent to something being absent. See Required Properties for an example.

The mechanism to indicate a property is required or optional is by the use of the required property.

I understand that we're using nullable types so we can return only the properties that are actually defined instead of empty strings or false bools but it is not best practice.

Resources with Nullable Properties:

  1. Microsoft.DSC.Debug/Echo showSecrets: type: ["boolean", "null"]

  2. Microsoft.DSC.Transitional/PowerShellScript getScript: type: ["string", "null"] setScript: type: ["string", "null"] testScript: type: ["string", "null"] input: type: ["string", "boolean", "integer", "object", "array", "null"] output: type: ["array", "null"] _inDesiredState: type: ["boolean", "null"]

  3. Microsoft.DSC.Transitional/WindowsPowerShellScript getScript: type: ["string", "null"] setScript: type: ["string", "null"] testScript: type: ["string", "null"] input: type: ["string", "boolean", "integer", "object", "array", "null"] output: type: ["array", "null"] _inDesiredState: type: ["boolean", "null"]

  4. Microsoft.OpenSSH.SSHD/Windows shell: type: ["string", "null"] cmdOption: type: ["string", "null"] escapeArguments: type: ["boolean", "null"]

  5. Microsoft.Windows/RebootPending reasons: type: ["array", "null"] The entire object itself: type: ["object", "null"]

  6. Microsoft.Windows/Registry _metadata: anyOf: [{"$ref": "#/$defs/Metadata"}, {"type": "null"}] valueName: type: ["string", "null"] valueData: anyOf: [{"$ref": "#/$defs/RegistryValueData"}, {"type": "null"}] _exist: type: ["boolean", "null"]

ThomasNieto avatar Nov 05 '25 03:11 ThomasNieto

This is related to #538 - part of the canonicalization process is to remove these incorrect type definitions, which are auto-generated by schemars when a struct property is an Option type.

michaeltlombardi avatar Nov 05 '25 14:11 michaeltlombardi