mirror of
https://github.com/directus/directus.git
synced 2026-04-25 03:00:53 -04:00
Change guessType to retain value types if they are known (#22349)
* Improve env variable casting for already typed variables configured through .[c]js files * Revert back to using dedicated toX functions and extended toBoolean to handle boolean type values * Some additions to test and removed some redundant code in toBoolean * Fix test case name * Add changeset * Change changeset
This commit is contained in:
5
.changeset/good-elephants-knock.md
Normal file
5
.changeset/good-elephants-knock.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@directus/env': patch
|
||||
---
|
||||
|
||||
Fixed behavior of config variable casting to retain types of known value types
|
||||
2
packages/env/src/lib/cast.test.ts
vendored
2
packages/env/src/lib/cast.test.ts
vendored
@@ -87,7 +87,7 @@ describe('Casting', () => {
|
||||
expect(cast('value')).toBe(123);
|
||||
});
|
||||
|
||||
test('Uses toBoolean for number types', () => {
|
||||
test('Uses toBoolean for boolean types', () => {
|
||||
vi.mocked(getCastFlag).mockReturnValue('boolean');
|
||||
|
||||
vi.mocked(toBoolean).mockReturnValue(false);
|
||||
|
||||
16
packages/env/src/utils/guess-type.test.ts
vendored
16
packages/env/src/utils/guess-type.test.ts
vendored
@@ -9,6 +9,10 @@ describe('boolean', () => {
|
||||
test('Returns boolean if value is literal "false"', () => {
|
||||
expect(guessType('true')).toBe('boolean');
|
||||
});
|
||||
|
||||
test('Returns boolean if value is of type boolean', () => {
|
||||
expect(guessType(true)).toBe('boolean');
|
||||
});
|
||||
});
|
||||
|
||||
describe('number', () => {
|
||||
@@ -27,12 +31,24 @@ describe('number', () => {
|
||||
test('Returns json for numbers bigger than the max safe integer', () => {
|
||||
expect(guessType('9007199254740992')).toBe('json');
|
||||
});
|
||||
|
||||
test('Returns json for numbers smaller than the min safe integer', () => {
|
||||
expect(guessType('-9007199254740992')).toBe('json');
|
||||
});
|
||||
|
||||
test('Returns number for values of type number', () => {
|
||||
expect(guessType(12345)).toBe('number');
|
||||
});
|
||||
});
|
||||
|
||||
describe('array', () => {
|
||||
test('Returns array for strings containing a comma', () => {
|
||||
expect(guessType('a,b,c')).toBe('array');
|
||||
});
|
||||
|
||||
test('Returns array for values that are actual arrays', () => {
|
||||
expect(guessType(['a', 'b', 'c'])).toBe('array');
|
||||
});
|
||||
});
|
||||
|
||||
describe('json', () => {
|
||||
|
||||
14
packages/env/src/utils/guess-type.ts
vendored
14
packages/env/src/utils/guess-type.ts
vendored
@@ -1,20 +1,22 @@
|
||||
import type { EnvType } from '../types/env-type.js';
|
||||
|
||||
export const guessType = (value: unknown): EnvType => {
|
||||
if (value === 'true' || value === 'false') {
|
||||
if (typeof value === 'boolean' || value === 'true' || value === 'false') {
|
||||
return 'boolean';
|
||||
}
|
||||
|
||||
if (
|
||||
String(value).startsWith('0') === false &&
|
||||
isNaN(Number(value)) === false &&
|
||||
String(value).length > 0 &&
|
||||
Number(value) <= Number.MAX_SAFE_INTEGER
|
||||
typeof value === 'number' ||
|
||||
(!String(value).startsWith('0') &&
|
||||
!isNaN(Number(value)) &&
|
||||
String(value).length > 0 &&
|
||||
Number(value) >= Number.MIN_SAFE_INTEGER &&
|
||||
Number(value) <= Number.MAX_SAFE_INTEGER)
|
||||
) {
|
||||
return 'number';
|
||||
}
|
||||
|
||||
if (String(value).includes(',')) {
|
||||
if (Array.isArray(value) || String(value).includes(',')) {
|
||||
return 'array';
|
||||
}
|
||||
|
||||
|
||||
@@ -11,6 +11,8 @@ test.each([
|
||||
[123, false],
|
||||
[{}, false],
|
||||
[['{}'], false],
|
||||
[true, true],
|
||||
[false, false],
|
||||
])('toBoolean(%s) -> %s', (value, expected) => {
|
||||
expect(toBoolean(value)).toBe(expected);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user