diff --git a/src/languageservice/parser/ast-converter.ts b/src/languageservice/parser/ast-converter.ts index 484dea5a8..3ab88a755 100644 --- a/src/languageservice/parser/ast-converter.ts +++ b/src/languageservice/parser/ast-converter.ts @@ -145,6 +145,19 @@ function convertScalar(node: Scalar, parent: ASTNode): ASTNode { result.isInteger = Number.isInteger(result.value); return result; } + case 'bigint': { + const numberValue = Number(node.value); + if (Number.isSafeInteger(numberValue)) { + const result = new NumberASTNodeImpl(parent, node, ...toOffsetLength(node.range)); + result.value = numberValue; + result.isInteger = true; + return result; + } + + const result = new StringASTNodeImpl(parent, node, ...toOffsetLength(node.range)); + result.value = node.value.toString(); + return result; + } default: { // fail safe converting, we need to return some node anyway const result = new StringASTNodeImpl(parent, node, ...toOffsetLength(node.range)); diff --git a/src/languageservice/parser/yamlParser07.ts b/src/languageservice/parser/yamlParser07.ts index 1f39a8220..bd52ec8f4 100644 --- a/src/languageservice/parser/yamlParser07.ts +++ b/src/languageservice/parser/yamlParser07.ts @@ -32,6 +32,7 @@ export function parse(text: string, parserOptions: ParserOptions = defaultOption customTags: getCustomTags(parserOptions.customTags), version: parserOptions.yamlVersion ?? defaultOptions.yamlVersion, keepSourceTokens: true, + intAsBigInt: true, }; const composer = new Composer(options); const lineCounter = new LineCounter(); diff --git a/test/schemaValidation.test.ts b/test/schemaValidation.test.ts index 34e23b5a6..0b40a105d 100644 --- a/test/schemaValidation.test.ts +++ b/test/schemaValidation.test.ts @@ -557,6 +557,34 @@ describe('Validation Tests', () => { }) .then(done, done); }); + + it('Big integer value should validate as type:integer', async () => { + schemaProvider.addSchema(SCHEMA_ID, { + type: 'object', + properties: { + bignum: { + type: 'integer', + }, + }, + }); + const content = 'bignum: 123456789012345671'; + const result = await parseSetup(content); + assert.equal(result.length, 0); + }); + + it('Big integer value should validate as type:number', async () => { + schemaProvider.addSchema(SCHEMA_ID, { + type: 'object', + properties: { + bignum: { + type: 'number', + }, + }, + }); + const content = 'bignum: 123456789012345671'; + const result = await parseSetup(content); + assert.equal(result.length, 0); + }); }); describe('Null tests', () => { diff --git a/test/yamlValidation.test.ts b/test/yamlValidation.test.ts index 2cb683d35..e553105ef 100644 --- a/test/yamlValidation.test.ts +++ b/test/yamlValidation.test.ts @@ -385,4 +385,19 @@ alpha: 1`; expect(result).to.be.empty; }); }); + + describe('Map key duplication Tests', () => { + it('should not report big integer key duplication error', async () => { + const yaml = '123456789012345671: 1\n123456789012345672: 2'; + const result = await parseSetup(yaml); + expect(result).to.be.empty; + }); + + it('should report duplication when bigint keys match across formats', async () => { + const yaml = '123456789012345671: 1\n0x1b69b4ba630f347: 2'; + const result = await parseSetup(yaml); + expect(result).not.to.be.empty; + expect(result[0].message).to.include('Map keys must be unique'); + }); + }); });