CircleCI-Public / circleci-config-sdk-ts

Generate CircleCI Configuration YAML from JavaScript or TypeScript. Use Dynamic Configuration and the Config SDK together for live generative config.
https://circleci-public.github.io/circleci-config-sdk-ts/
Apache License 2.0
82 stars 29 forks source link

Bug: Parameters default value mismatch it's type #170

Open Kylmakalle opened 1 year ago

Kylmakalle commented 1 year ago

Is there an existing issue for this?

Current behavior

CustomParameter generates an entry where default parameter is not quoted. That leads to type mismatch in result YAML, since some defaults like true, on, and off can be treated as booleans instead of strings.

new CircleCI.parameters.CustomParameter(
    'some_value',
    CircleCI.mapping.ParameterSubtype.STRING,
    "OFF"
)
parameters:
     some_value:
        type: string
        default: OFF
image

Config is not valid

% circleci config validate config.yml 

Error: Error in definition of command 'some-command'
Parameter error: default value of parameter 'some_value' is 'false' (type boolean): expected type string

Minimum reproduction code

https://gist.github.com/Kylmakalle/22f2c6eae2bd09758a70be2510284b33

Expected behavior

Any default provided value is "quoted" properly and aligns with parameter type.

CircleCI Config SDK version

0.12.0

Node.js version

19.0.0

In which operating systems have you tested?

KyleTryon commented 1 year ago

Good catch, YAML is going to make that one difficult for us. I think the main issue will be we are using a YAML parser and don't actually have a way of informing the parser to treat this value specifically as part of a string without writing some kind of custom validation library.

Was this a blocking issue or were you able to work around using a boolean or another string value?

Kylmakalle commented 1 year ago

I believe it's possible to tweak a YAML parser. See https://github.com/eemeli/yaml/issues/391

Talking about a workaround, we can add a prefix "_OFF" and cut it using different software