Azure / PSDocs.Azure

Generate documentation from Azure infrastructure as code (IaC) artifacts.
https://azure.github.io/PSDocs.Azure/
MIT License
60 stars 21 forks source link

When trying to create document for an ARM template with user defined typed outputs and resource deployed, error `Invoke-PSDocument: Object reference not set to an instance of an object.` is triggered #355

Open GABRIELNGBTUC opened 5 months ago

GABRIELNGBTUC commented 5 months ago

Description of the issue

We have some bicep/ARM templates that use outputs with a user defined type as the output type.

When trying to create documentation on the compiled ARM file using PSDocs, the command fails with the error Invoke-PSDocument: Object reference not set to an instance of an object..

This only happens if the template both:

If I either replace the user defined type with object or remove all the resources/modules from the template, PSDocs successfully run

To reproduce

Have a bicep file with the following content:

type test = {
  str: string
}

param text test

resource res 'Microsoft.Compute/virtualMachines@2024-03-01'= {
  name: 'myVM'
  location: ''
}

// si custom type + resource => instance of object
output out test = {str: 'test'}

Compile that file with the bicep cli and run the following command

Invoke-PSDocument -Module PSDocs.Azure -InputObject .\main.json -OutputPath $pwd -InstanceName .\main.md -Culture en-GB

The command will fail.

If you either replace the output line with output out object = {str: 'test'} or command the res resource, no error is triggered

Expected behaviour

The command succeed in creating the documentation.

Error output

Module in use and version:

Captured output from $PSVersionTable:

VERBOSE: [Invoke-PSDocument]::BEGIN
VERBOSE: [New-PSDocumentOption] BEGIN::
VERBOSE: Attempting to read: D:\Users\GNGANDUB\OneDrive - TUC RAIL\Documents\test\test-json\psdoc
VERBOSE: [New-PSDocumentOption] END::
VERBOSE: [PSDocs][D] -- Scanning for source files in module: PSDocs.Azure
Invoke-PSDocument: Object reference not set to an instance of an object.
VERBOSE: [Invoke-PSDocument]::END

Additional context

WillemRB commented 1 month ago

The issue is that there is no type property in the output when using user defined types.

You will see something like this in the JSON output when a bicep build is done:

"out": {
    "$ref": "#/definitions/test",
    ...
}

I've tested it by changing $ref to type and then it will work again. If this is fixed there should also be support for rendering the definitions from the module in the output.