From 2ceaca347d3c1dbc507e93dafee89b93f683ab14 Mon Sep 17 00:00:00 2001 From: aedenmurray Date: Wed, 16 Apr 2025 12:31:56 -0600 Subject: [PATCH 1/5] report problem if extendedRegExp catches an error --- src/parser/jsonParser.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/parser/jsonParser.ts b/src/parser/jsonParser.ts index 46fef323..995f894c 100644 --- a/src/parser/jsonParser.ts +++ b/src/parser/jsonParser.ts @@ -695,6 +695,13 @@ function validate(n: ASTNode | undefined, schema: JSONSchema, validationResult: if (isString(schema.pattern)) { const regex = extendedRegExp(schema.pattern); + if(regex === undefined) { + validationResult.problems.push({ + location: { offset: node.offset, length: node.length }, + message: l10n.t('Invalid schema pattern "{0}".', schema.pattern) + }); + } + if (!(regex?.test(node.value))) { validationResult.problems.push({ location: { offset: node.offset, length: node.length }, From c5999ebaf7becbb69f3426fff715385b20344739 Mon Sep 17 00:00:00 2001 From: aedenmurray Date: Wed, 16 Apr 2025 12:34:49 -0600 Subject: [PATCH 2/5] only report invalid regex if needed --- src/parser/jsonParser.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/parser/jsonParser.ts b/src/parser/jsonParser.ts index 995f894c..e4327ee0 100644 --- a/src/parser/jsonParser.ts +++ b/src/parser/jsonParser.ts @@ -700,6 +700,8 @@ function validate(n: ASTNode | undefined, schema: JSONSchema, validationResult: location: { offset: node.offset, length: node.length }, message: l10n.t('Invalid schema pattern "{0}".', schema.pattern) }); + + return; } if (!(regex?.test(node.value))) { From bdde883ed438ddc0e9e04bb3a822a9562425c609 Mon Sep 17 00:00:00 2001 From: aedenmurray Date: Wed, 16 Apr 2025 12:41:50 -0600 Subject: [PATCH 3/5] add test for invalid patterns --- src/test/parser.test.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/test/parser.test.ts b/src/test/parser.test.ts index e6cf4e09..81c02230 100644 --- a/src/test/parser.test.ts +++ b/src/test/parser.test.ts @@ -609,6 +609,18 @@ suite('JSON Parser', () => { assert.strictEqual(semanticErrors!.length, 0); + semanticErrors = validate2(jsonDoc, textDoc, { + type: 'object', + properties: { + "one": { + type: 'string', + pattern: 'invalid pattern', + } + } + }); + + assert.strictEqual(semanticErrors!.length, 1); + semanticErrors = validate2(jsonDoc, textDoc, { type: 'object', properties: { From f12df421318b0f715176bba529158f6f02c02e68 Mon Sep 17 00:00:00 2001 From: aedenmurray Date: Wed, 16 Apr 2025 12:46:18 -0600 Subject: [PATCH 4/5] no optional chaining --- src/parser/jsonParser.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/parser/jsonParser.ts b/src/parser/jsonParser.ts index e4327ee0..0332c2e8 100644 --- a/src/parser/jsonParser.ts +++ b/src/parser/jsonParser.ts @@ -704,7 +704,7 @@ function validate(n: ASTNode | undefined, schema: JSONSchema, validationResult: return; } - if (!(regex?.test(node.value))) { + if (!(regex.test(node.value))) { validationResult.problems.push({ location: { offset: node.offset, length: node.length }, message: schema.patternErrorMessage || schema.errorMessage || l10n.t('String does not match the pattern of "{0}".', schema.pattern) From 702f46c57e1e8ff9740b74af9fed03978f8cda60 Mon Sep 17 00:00:00 2001 From: aedenmurray Date: Fri, 25 Apr 2025 20:17:44 -0700 Subject: [PATCH 5/5] ignore invalid regex --- src/parser/jsonParser.ts | 11 +---------- src/test/parser.test.ts | 4 ++-- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/src/parser/jsonParser.ts b/src/parser/jsonParser.ts index ca2a32c7..8c3906a5 100644 --- a/src/parser/jsonParser.ts +++ b/src/parser/jsonParser.ts @@ -695,16 +695,7 @@ function validate(n: ASTNode | undefined, schema: JSONSchema, validationResult: if (isString(schema.pattern)) { const regex = extendedRegExp(schema.pattern); - if(regex === undefined) { - validationResult.problems.push({ - location: { offset: node.offset, length: node.length }, - message: l10n.t('Invalid schema pattern "{0}".', schema.pattern) - }); - - return; - } - - if (!(regex.test(node.value))) { + if (regex && !(regex.test(node.value))) { validationResult.problems.push({ location: { offset: node.offset, length: node.length }, message: schema.patternErrorMessage || schema.errorMessage || l10n.t('String does not match the pattern of "{0}".', schema.pattern) diff --git a/src/test/parser.test.ts b/src/test/parser.test.ts index 81c02230..ca1a92fb 100644 --- a/src/test/parser.test.ts +++ b/src/test/parser.test.ts @@ -614,12 +614,12 @@ suite('JSON Parser', () => { properties: { "one": { type: 'string', - pattern: 'invalid pattern', + pattern: '*+ (invalid pattern)', } } }); - assert.strictEqual(semanticErrors!.length, 1); + assert.strictEqual(semanticErrors!.length, 0); semanticErrors = validate2(jsonDoc, textDoc, { type: 'object',