it-gorillaz / configify

NestJS Config on Steroids
MIT License
61 stars 4 forks source link

TypeError: value.matchAll is not a function #31

Closed sandeepsuvit closed 4 months ago

sandeepsuvit commented 4 months ago

When using numerical values in the application.yml file and restarting the application, getting the following error

database:
  uri: some_uri
  port: 27017

error log

[Nest] 26114  - 07/18/2024, 10:46:18 PM     LOG [NestFactory] Starting Nest application...
[Nest] 26114  - 07/18/2024, 10:46:18 PM   ERROR [ExceptionHandler] value.matchAll is not a function
TypeError: value.matchAll is not a function
    at Function.lastIndexOf (/Users/my-api/node_modules/@itgorillaz/configify/src/interpolation/variables.ts:98:38)
    at Function.interpolate (/Users/my-api/node_modules/@itgorillaz/configify/src/interpolation/variables.ts:59:47)
    at Function.expand (/Users/my-api/node_modules/@itgorillaz/configify/src/interpolation/variables.ts:43:49)
    at Function.forRootAsync (/Users/my-api/node_modules/@itgorillaz/configify/src/configify.module.ts:93:34)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
Waiting for the debugger to disconnect...

When i convert the number to a string like below, its working fine

database:
  uri: some_uri
  port: '27017'

What is the reason behind the error value.matchAll is not a function

Note: You need to restart the application to get the above error while using a numerical value

tommelo commented 4 months ago

@sandeepsuvit thanks for reporting the error!

I was able to reproduce and indeed the yaml parser is converting the value to a number so it fails when interpolating the variables.

The fix will be in the next release.

tommelo commented 4 months ago

@sandeepsuvit fixed on v1.2.3. Note that since we assign the configuration to process.env the values are converted to string, it is a good idea to use the parse option if your config attribute is not a string, e.g.:

@Configuration
export class DatabaseConfiguration {
  @Value('database.host')
  host: string;

  @Value('database.port', { parse: parseInt })
  port: number;
}