mirror of
https://github.com/voson-wang/toon.git
synced 2026-01-29 15:24:10 +08:00
fix: reject negative numbers with leading zeros
This commit is contained in:
@@ -38,6 +38,6 @@
|
|||||||
"test": "vitest"
|
"test": "vitest"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@toon-format/spec": "^3.0.0"
|
"@toon-format/spec": "^3.0.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,12 +14,11 @@ export function isNumericLiteral(token: string): boolean {
|
|||||||
if (!token)
|
if (!token)
|
||||||
return false
|
return false
|
||||||
|
|
||||||
// Must not have leading zeros (except for `"0"` itself or decimals like `"0.5"`)
|
// Enforce JSON-like grammar with no forbidden leading zeros
|
||||||
if (token.length > 1 && token[0] === '0' && token[1] !== '.') {
|
const numericPattern = /^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:e[+-]?\d+)?$/i
|
||||||
|
if (!numericPattern.test(token))
|
||||||
return false
|
return false
|
||||||
}
|
|
||||||
|
|
||||||
// Check if it's a valid number
|
|
||||||
const numericValue = Number(token)
|
const numericValue = Number(token)
|
||||||
return !Number.isNaN(numericValue) && Number.isFinite(numericValue)
|
return !Number.isNaN(numericValue) && Number.isFinite(numericValue)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
import { DEFAULT_DELIMITER, LIST_ITEM_MARKER } from '../constants'
|
import { DEFAULT_DELIMITER, LIST_ITEM_MARKER } from '../constants'
|
||||||
import { isBooleanOrNullLiteral } from './literal-utils'
|
import { isBooleanOrNullLiteral } from './literal-utils'
|
||||||
|
|
||||||
|
const NUMERIC_LIKE_PATTERN = /^-?\d+(?:\.\d+)?(?:e[+-]?\d+)?$/i
|
||||||
|
const LEADING_ZERO_PATTERN = /^0\d+$/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if a key can be used without quotes.
|
* Checks if a key can be used without quotes.
|
||||||
*
|
*
|
||||||
@@ -93,5 +96,5 @@ export function isSafeUnquoted(value: string, delimiter: string = DEFAULT_DELIMI
|
|||||||
* Match numbers like `42`, `-3.14`, `1e-6`, `05`, etc.
|
* Match numbers like `42`, `-3.14`, `1e-6`, `05`, etc.
|
||||||
*/
|
*/
|
||||||
function isNumericLike(value: string): boolean {
|
function isNumericLike(value: string): boolean {
|
||||||
return /^-?\d+(?:\.\d+)?(?:e[+-]?\d+)?$/i.test(value) || /^0\d+$/.test(value)
|
return NUMERIC_LIKE_PATTERN.test(value) || LEADING_ZERO_PATTERN.test(value)
|
||||||
}
|
}
|
||||||
|
|||||||
10
pnpm-lock.yaml
generated
10
pnpm-lock.yaml
generated
@@ -132,8 +132,8 @@ importers:
|
|||||||
packages/toon:
|
packages/toon:
|
||||||
devDependencies:
|
devDependencies:
|
||||||
'@toon-format/spec':
|
'@toon-format/spec':
|
||||||
specifier: ^3.0.0
|
specifier: ^3.0.1
|
||||||
version: 3.0.0
|
version: 3.0.1
|
||||||
|
|
||||||
packages:
|
packages:
|
||||||
|
|
||||||
@@ -1171,8 +1171,8 @@ packages:
|
|||||||
peerDependencies:
|
peerDependencies:
|
||||||
eslint: '>=9.0.0'
|
eslint: '>=9.0.0'
|
||||||
|
|
||||||
'@toon-format/spec@3.0.0':
|
'@toon-format/spec@3.0.1':
|
||||||
resolution: {integrity: sha512-Xm22jj7TpirgQRlQOAjLMKxRLJfz0Q/BkOdV6d27mHnJ1VQxzDV54Rl03zsFtY3D8wk7t04CV/PS/KjVs2Ys7Q==}
|
resolution: {integrity: sha512-f9YADLDxH/j06biiTBKEMx0i8dqgo7cfVQe7lCP5NS59M7Ys0pKIXuAzQx4VDW3NgiHaKjWRlbK+C/yuUqS5dA==}
|
||||||
|
|
||||||
'@tybys/wasm-util@0.10.1':
|
'@tybys/wasm-util@0.10.1':
|
||||||
resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==}
|
resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==}
|
||||||
@@ -4449,7 +4449,7 @@ snapshots:
|
|||||||
estraverse: 5.3.0
|
estraverse: 5.3.0
|
||||||
picomatch: 4.0.3
|
picomatch: 4.0.3
|
||||||
|
|
||||||
'@toon-format/spec@3.0.0': {}
|
'@toon-format/spec@3.0.1': {}
|
||||||
|
|
||||||
'@tybys/wasm-util@0.10.1':
|
'@tybys/wasm-util@0.10.1':
|
||||||
dependencies:
|
dependencies:
|
||||||
|
|||||||
Reference in New Issue
Block a user