From 2fe25f5f748909c261cd4b1619006b7bbe5cadce Mon Sep 17 00:00:00 2001 From: Simon Hofer Date: Mon, 2 Feb 2026 10:26:31 +0100 Subject: [PATCH 1/4] feat: allow ternary operator in filter expressions --- .../static/queriesWithQueryLanguage.ts.txt | 53 +++++++++++++++---- 1 file changed, 44 insertions(+), 9 deletions(-) diff --git a/src/generator/01-base/static/queriesWithQueryLanguage.ts.txt b/src/generator/01-base/static/queriesWithQueryLanguage.ts.txt index 4fa26cb..de605dd 100644 --- a/src/generator/01-base/static/queriesWithQueryLanguage.ts.txt +++ b/src/generator/01-base/static/queriesWithQueryLanguage.ts.txt @@ -64,9 +64,23 @@ export type LengthOperator = 'LENGTH'; export type ArrayOperator = 'IN'; +export type CaseOperator = 'CASE'; + +export type CaseNode = { + [K in CaseOperator]: CaseExpression; +}; + +export type CaseExpression = { + IF: SingleFilterExpr; + THEN: PropType; + ELSE: PropType | CaseNode; +}; + export type NullOperator = 'NULL'; -export type Operator = ComparisonOperator | ArrayOperator | NullOperator; +export type Operator = ComparisonOperator | ArrayOperator | CaseOperator | NullOperator; + +export type BinaryOperator = Exclude; export type ModifierFunction = 'LOWER' | 'TRIM'; @@ -109,10 +123,10 @@ export type SingleFilterExpr = { [P in keyof T]?: T[P] extends Array | undefined ? U extends Record ? SingleFilterExpr | { NOT?: SingleFilterExpr } - : MapOperators + : MapOperators | CaseNode : T[P] extends Record | undefined ? SingleFilterExpr | { NOT?: SingleFilterExpr } - : MapOperators; + : MapOperators | CaseNode; }; export type QueryFilter = SingleFilterExpr & { @@ -178,7 +192,7 @@ const comparisonOperatorList: ComparisonOperator[] = [ 'LIKE' ]; -const comparisonOperatorMap: Record = { +const comparisonOperatorMap: Record = { EQ: '=', NE: '!=', LT: '<', @@ -250,13 +264,15 @@ const flattenWhere = ( `${setModifiers.reduce( (acc, [first]) => `${first.toLowerCase()}(${acc})`, nestedPaths.some((path) => path === prop) ? nestedPaths.join('.') : [...nestedPaths, prop].join('.') - )} ${comparisonOperatorMap[operator as Operator]} ${ - typeof value === 'string' ? JSON.stringify(value) : value + )} ${comparisonOperatorMap[operator as BinaryOperator]} ${ + typeof value === 'string' + ? setModifiers.reduce((acc, [first]) => `${first}(${acc})`, JSON.stringify(value)) + : value }` ); } else if ((operator as Operator) === 'NULL') { entries.push( - `${!value ? 'not ' : ''}${nestedPaths.some((path) => path === prop) ? nestedPaths.join('.') : [...nestedPaths, prop].join('.')} ${comparisonOperatorMap[operator as Operator]}` + `${!value ? 'not ' : ''}${nestedPaths.some((path) => path === prop) ? nestedPaths.join('.') : [...nestedPaths, prop].join('.')} ${comparisonOperatorMap[operator as BinaryOperator]}` ); } else if ((operator as Operator) === 'IN') { if(value.length === 0) { @@ -266,11 +282,13 @@ const flattenWhere = ( `${setModifiers.reduce( (acc, [first]) => `${first.toLowerCase()}(${acc})`, nestedPaths.some((path) => path === prop) ? nestedPaths.join('.') : [...nestedPaths, prop].join('.') - )} ${comparisonOperatorMap[operator as Operator]} [${value.map((v: string | number) => - typeof v === 'string' ? JSON.stringify(v) : v + )} ${comparisonOperatorMap[operator as BinaryOperator]} [${value.map((v: string | number) => + typeof v === 'string' ? setModifiers.reduce((acc, [first]) => `${first}(${acc})`, JSON.stringify(v)) : v )}]` ); } + } else if ((operator as Operator) === 'CASE') { + entries.push(evaluateCaseExpression(value as CaseExpression, setModifiers, nestedPaths)); } else if ((operator as LengthOperator) === 'LENGTH') { const lengthProp = `length(${setModifiers.reduce( (acc, [first]) => `${first.toLowerCase()}(${acc})`, @@ -295,6 +313,23 @@ const flattenWhere = ( return entries; }; +const evaluateCaseExpression = ( + exp: CaseExpression, + setModifiers: [string, any][], + nestedPaths: string[] +): string => + `(${flattenWhere(exp.IF, nestedPaths)} ? ${ + typeof exp.THEN === 'string' + ? setModifiers.reduce((acc, [first]) => `${first}(${acc})`, JSON.stringify(exp.THEN)) + : exp.THEN + } : ${ + typeof exp.ELSE === 'string' + ? setModifiers.reduce((acc, [first]) => `${first}(${acc})`, JSON.stringify(exp.ELSE)) + : typeof exp.ELSE === 'number' || typeof exp.ELSE === 'boolean' + ? exp.ELSE + : evaluateCaseExpression((exp.ELSE as CaseNode).CASE, setModifiers, nestedPaths) + })`; + const assembleOrderBy = (orderBy: OrderBy[] = []): Record => { if(!orderBy.length) { return {} From 80fcbd50ee0181808c112ae4a84f3a33c57177e1 Mon Sep 17 00:00:00 2001 From: Simon Hofer Date: Tue, 3 Mar 2026 08:50:10 +0100 Subject: [PATCH 2/4] feat: allow ternary operator in filter expressions --- src/generator/01-base/static/queriesWithQueryLanguage.ts.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/generator/01-base/static/queriesWithQueryLanguage.ts.txt b/src/generator/01-base/static/queriesWithQueryLanguage.ts.txt index de605dd..04148e9 100644 --- a/src/generator/01-base/static/queriesWithQueryLanguage.ts.txt +++ b/src/generator/01-base/static/queriesWithQueryLanguage.ts.txt @@ -72,7 +72,7 @@ export type CaseNode = { export type CaseExpression = { IF: SingleFilterExpr; - THEN: PropType; + THEN: PropType | CaseNode; ELSE: PropType | CaseNode; }; From bb6c675b57ddcaeb3111b192b7ead4334e4a41ce Mon Sep 17 00:00:00 2001 From: Simon Hofer Date: Fri, 27 Mar 2026 09:16:04 +0100 Subject: [PATCH 3/4] feat: allow ternary operator in filter expressions --- .../static/queriesWithQueryLanguage.ts.txt | 61 ++++++++++++------- 1 file changed, 38 insertions(+), 23 deletions(-) diff --git a/src/generator/01-base/static/queriesWithQueryLanguage.ts.txt b/src/generator/01-base/static/queriesWithQueryLanguage.ts.txt index 04148e9..eeaee53 100644 --- a/src/generator/01-base/static/queriesWithQueryLanguage.ts.txt +++ b/src/generator/01-base/static/queriesWithQueryLanguage.ts.txt @@ -66,14 +66,16 @@ export type ArrayOperator = 'IN'; export type CaseOperator = 'CASE'; -export type CaseNode = { - [K in CaseOperator]: CaseExpression; +export type CaseNode = { + [K in CaseOperator]: CaseExpression; }; -export type CaseExpression = { - IF: SingleFilterExpr; - THEN: PropType | CaseNode; - ELSE: PropType | CaseNode; +type InCaseNode = Case extends CaseNode ? CaseNode : never; + +export type CaseExpression = { + IF: SingleFilterExpr; + THEN: PropType | CaseNode; + ELSE: PropType | CaseNode; }; export type NullOperator = 'NULL'; @@ -102,31 +104,31 @@ export type LengthExprWithModifier = { [K in NullOperator]?: never } & { [K in ModifierFunction]?: boolean }; -export type FilterExpr = - { [K in ComparisonOperator]?: T } & - { [K in ArrayOperator]?: T[] } & +export type FilterExpr = + { [K in ComparisonOperator]?: T | Case } & + { [K in ArrayOperator]?: T[] | InCaseNode } & { [K in keyof LengthExpr]?: never }; -export type FilterExprWithoutNull = - RequireAtLeastOne> & +export type FilterExprWithoutNull = + RequireAtLeastOne> & { [K in NullOperator]?: never } & { [K in ModifierFunction]?: boolean }; -export type FilterExprWithNull = - FilterExpr & +export type FilterExprWithNull = + FilterExpr & { [K in NullOperator]?: boolean} & { [K in ModifierFunction]?: never }; -export type MapOperators = LengthExprWithModifier | FilterExprWithoutNull | FilterExprWithNull; +export type MapOperators = LengthExprWithModifier | FilterExprWithoutNull | FilterExprWithNull; export type SingleFilterExpr = { [P in keyof T]?: T[P] extends Array | undefined ? U extends Record ? SingleFilterExpr | { NOT?: SingleFilterExpr } - : MapOperators | CaseNode + : MapOperators> : T[P] extends Record | undefined ? SingleFilterExpr | { NOT?: SingleFilterExpr } - : MapOperators | CaseNode; + : MapOperators>; }; export type QueryFilter = SingleFilterExpr & { @@ -256,6 +258,8 @@ const flattenWhere = ( entries.push( `not ${flattedNot.length > 1 ? '(' : ''}${flattedNot.join(' and ')}${flattedNot.length > 1 ? ')' : ''}` ); + } else if (prop === 'CASE') { + entries.push(evaluateCaseExpression(propValue as CaseExpression, setModifiers, nestedPaths)); } else if (propValue) { for (const [operator, value] of Object.entries(propValue)) { if (value === undefined) continue; @@ -265,9 +269,11 @@ const flattenWhere = ( (acc, [first]) => `${first.toLowerCase()}(${acc})`, nestedPaths.some((path) => path === prop) ? nestedPaths.join('.') : [...nestedPaths, prop].join('.') )} ${comparisonOperatorMap[operator as BinaryOperator]} ${ - typeof value === 'string' - ? setModifiers.reduce((acc, [first]) => `${first}(${acc})`, JSON.stringify(value)) - : value + typeof value === 'object' + ? flattenWhere(value, nestedPaths) + : typeof value === 'string' + ? setModifiers.reduce((acc, [first]) => `${first}(${acc})`, JSON.stringify(value)) + : value }` ); } else if ((operator as Operator) === 'NULL') { @@ -275,7 +281,14 @@ const flattenWhere = ( `${!value ? 'not ' : ''}${nestedPaths.some((path) => path === prop) ? nestedPaths.join('.') : [...nestedPaths, prop].join('.')} ${comparisonOperatorMap[operator as BinaryOperator]}` ); } else if ((operator as Operator) === 'IN') { - if(value.length === 0) { + if (typeof value === 'object' && !Array.isArray(value) && value.CASE) { + entries.push( + `${setModifiers.reduce( + (acc, [first]) => `${first}(${acc})`, + nestedPaths.some((path) => path === prop) ? nestedPaths.join('.') : [...nestedPaths, prop].join('.') + )} ${comparisonOperatorMap[operator as BinaryOperator]} ${evaluateCaseExpression(value.CASE as CaseExpression, setModifiers, nestedPaths)}` + ); + } else if(value.length === 0) { entries.push('1 = 0') } else { entries.push( @@ -319,11 +332,13 @@ const evaluateCaseExpression = ( nestedPaths: string[] ): string => `(${flattenWhere(exp.IF, nestedPaths)} ? ${ - typeof exp.THEN === 'string' + typeof exp.THEN === 'string' || Array.isArray(exp.THEN) ? setModifiers.reduce((acc, [first]) => `${first}(${acc})`, JSON.stringify(exp.THEN)) - : exp.THEN + : typeof exp.THEN === 'number' || typeof exp.THEN === 'boolean' + ? exp.THEN + : evaluateCaseExpression((exp.THEN as CaseNode).CASE, setModifiers, nestedPaths) } : ${ - typeof exp.ELSE === 'string' + typeof exp.ELSE === 'string' || Array.isArray(exp.ELSE) ? setModifiers.reduce((acc, [first]) => `${first}(${acc})`, JSON.stringify(exp.ELSE)) : typeof exp.ELSE === 'number' || typeof exp.ELSE === 'boolean' ? exp.ELSE From 2fc29ae467b725603fcfcd280be8a35e766a9b35 Mon Sep 17 00:00:00 2001 From: Simon Hofer Date: Mon, 30 Mar 2026 16:13:46 +0200 Subject: [PATCH 4/4] feat: allow ternary operator in filter expressions Rebase on master Run "npm audit fix" against vulnerable dependencies --- package-lock.json | 145 +++++++++++++++++++++++----------------------- 1 file changed, 73 insertions(+), 72 deletions(-) diff --git a/package-lock.json b/package-lock.json index 912b6e4..a20ef97 100644 --- a/package-lock.json +++ b/package-lock.json @@ -688,9 +688,9 @@ } }, "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1586,9 +1586,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1978,9 +1978,9 @@ "dev": true }, "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", "dev": true, "license": "MIT", "dependencies": { @@ -2917,9 +2917,9 @@ } }, "node_modules/eslint/node_modules/brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3088,9 +3088,9 @@ } }, "node_modules/fast-xml-parser": { - "version": "5.5.6", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.5.6.tgz", - "integrity": "sha512-3+fdZyBRVg29n4rXP0joHthhcHdPUHaIC16cuyyd1iLsuaO6Vea36MPrxgAzbZna8lhvZeRL8Bc9GP56/J9xEw==", + "version": "5.5.9", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.5.9.tgz", + "integrity": "sha512-jldvxr1MC6rtiZKgrFnDSvT8xuH+eJqxqOBThUVjYrxssYTo1avZLGql5l0a0BAERR01CadYzZ83kVEkbyDg+g==", "dev": true, "funding": [ { @@ -3101,8 +3101,8 @@ "license": "MIT", "dependencies": { "fast-xml-builder": "^1.1.4", - "path-expression-matcher": "^1.1.3", - "strnum": "^2.1.2" + "path-expression-matcher": "^1.2.0", + "strnum": "^2.2.2" }, "bin": { "fxparser": "src/cli/cli.js" @@ -3369,13 +3369,14 @@ "dev": true }, "node_modules/handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", + "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.5", - "neo-async": "^2.6.0", + "neo-async": "^2.6.2", "source-map": "^0.6.1", "wordwrap": "^1.0.0" }, @@ -4319,9 +4320,9 @@ } }, "node_modules/path-expression-matcher": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.1.3.tgz", - "integrity": "sha512-qdVgY8KXmVdJZRSS1JdEPOKPdTiEK/pi0RkcT2sw1RhXxohdujUlJFPuS1TSkevZ9vzd3ZlL7ULl1MHGTApKzQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.2.0.tgz", + "integrity": "sha512-DwmPWeFn+tq7TiyJ2CxezCAirXjFxvaiD03npak3cRjlP9+OjTmSy1EpIrEbh+l6JgUundniloMLDQ/6VTdhLQ==", "dev": true, "funding": [ { @@ -4364,9 +4365,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "license": "MIT", "engines": { "node": ">=12" @@ -4763,9 +4764,9 @@ } }, "node_modules/serialize-javascript": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.0.4.tgz", - "integrity": "sha512-DuGdB+Po43Q5Jxwpzt1lhyFSYKryqoNjQSA9M92tyw0lyHIOur+XCalOUe0KTJpyqzT8+fQ5A0Jf7vCx/NKmIg==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.0.5.tgz", + "integrity": "sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw==", "license": "BSD-3-Clause", "engines": { "node": ">=20.0.0" @@ -4984,9 +4985,9 @@ } }, "node_modules/strnum": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.0.tgz", - "integrity": "sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.2.tgz", + "integrity": "sha512-DnR90I+jtXNSTXWdwrEy9FakW7UX+qUZg28gj5fk2vxxl7uS/3bpI4fjFYVmdK9etptYBPNkpahuQnEwhwECqA==", "dev": true, "funding": [ { @@ -5510,9 +5511,9 @@ "dev": true }, "node_modules/yaml": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", - "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", + "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", "dev": true, "license": "ISC", "bin": { @@ -5887,9 +5888,9 @@ "dev": true }, "brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, "requires": { "balanced-match": "^4.0.2" @@ -6402,9 +6403,9 @@ "dev": true }, "brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, "requires": { "balanced-match": "^4.0.2" @@ -6659,9 +6660,9 @@ "dev": true }, "brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -7326,9 +7327,9 @@ "dev": true }, "brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, "requires": { "balanced-match": "^4.0.2" @@ -7457,14 +7458,14 @@ } }, "fast-xml-parser": { - "version": "5.5.6", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.5.6.tgz", - "integrity": "sha512-3+fdZyBRVg29n4rXP0joHthhcHdPUHaIC16cuyyd1iLsuaO6Vea36MPrxgAzbZna8lhvZeRL8Bc9GP56/J9xEw==", + "version": "5.5.9", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.5.9.tgz", + "integrity": "sha512-jldvxr1MC6rtiZKgrFnDSvT8xuH+eJqxqOBThUVjYrxssYTo1avZLGql5l0a0BAERR01CadYzZ83kVEkbyDg+g==", "dev": true, "requires": { "fast-xml-builder": "^1.1.4", - "path-expression-matcher": "^1.1.3", - "strnum": "^2.1.2" + "path-expression-matcher": "^1.2.0", + "strnum": "^2.2.2" } }, "fdir": { @@ -7663,13 +7664,13 @@ "dev": true }, "handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", + "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", "dev": true, "requires": { "minimist": "^1.2.5", - "neo-async": "^2.6.0", + "neo-async": "^2.6.2", "source-map": "^0.6.1", "uglify-js": "^3.1.4", "wordwrap": "^1.0.0" @@ -8372,9 +8373,9 @@ "dev": true }, "path-expression-matcher": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.1.3.tgz", - "integrity": "sha512-qdVgY8KXmVdJZRSS1JdEPOKPdTiEK/pi0RkcT2sw1RhXxohdujUlJFPuS1TSkevZ9vzd3ZlL7ULl1MHGTApKzQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.2.0.tgz", + "integrity": "sha512-DwmPWeFn+tq7TiyJ2CxezCAirXjFxvaiD03npak3cRjlP9+OjTmSy1EpIrEbh+l6JgUundniloMLDQ/6VTdhLQ==", "dev": true }, "path-key": { @@ -8401,9 +8402,9 @@ "dev": true }, "picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==" + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==" }, "pify": { "version": "2.3.0", @@ -8684,9 +8685,9 @@ } }, "serialize-javascript": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.0.4.tgz", - "integrity": "sha512-DuGdB+Po43Q5Jxwpzt1lhyFSYKryqoNjQSA9M92tyw0lyHIOur+XCalOUe0KTJpyqzT8+fQ5A0Jf7vCx/NKmIg==" + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.0.5.tgz", + "integrity": "sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw==" }, "shebang-command": { "version": "2.0.0", @@ -8856,9 +8857,9 @@ } }, "strnum": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.0.tgz", - "integrity": "sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.2.tgz", + "integrity": "sha512-DnR90I+jtXNSTXWdwrEy9FakW7UX+qUZg28gj5fk2vxxl7uS/3bpI4fjFYVmdK9etptYBPNkpahuQnEwhwECqA==", "dev": true }, "supports-color": { @@ -9146,9 +9147,9 @@ "dev": true }, "yaml": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", - "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", + "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", "dev": true }, "yargs": {