@journeyapps/evaluator
Advanced tools
@@ -15,2 +15,6 @@ import { TokenExpression } from './token-expressions/TokenExpression'; | ||
| static isInstanceOf(val: any): val is FormatString; | ||
| /** | ||
| * Compile a format string expression into tokens. | ||
| */ | ||
| static compile(format: string): TokenExpression[]; | ||
| toString(): string; | ||
@@ -36,1 +40,5 @@ /** | ||
| } | ||
| export declare const _compile: typeof FormatString.compile; | ||
| export declare function parseEnclosingBraces(format: string): { | ||
| length: number; | ||
| }; |
@@ -1,2 +0,1 @@ | ||
| import { TokenExpression } from './token-expressions/TokenExpression'; | ||
| import { FunctionTokenExpression } from './token-expressions/FunctionTokenExpression'; | ||
@@ -9,11 +8,2 @@ import { ShorthandTokenExpression } from './token-expressions/ShorthandTokenExpression'; | ||
| export declare function unescape(s: string): string; | ||
| export declare function parseEnclosingBraces(format: string): { | ||
| length: number; | ||
| }; | ||
| /** | ||
| * Compile a format string expression into tokens. | ||
| * @param {string} format string expression | ||
| * @return {TokenExpression[]} compiled tokens | ||
| */ | ||
| export declare function compile(format: string): TokenExpression[]; | ||
| export declare function getObjectType(parent: any, name: string): any; | ||
@@ -39,2 +29,2 @@ export declare function deepMerge(a: any, b: any): any; | ||
| export declare function formatValueAsync(value: any, type: TypeInterface, format: string): Promise<string>; | ||
| export { compile as _compile, deepMerge as _deepMerge }; | ||
| export { deepMerge as _deepMerge }; |
+125
-2
| "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.FormatString = void 0; | ||
| exports.parseEnclosingBraces = exports._compile = exports.FormatString = void 0; | ||
| const tools_1 = require("./tools"); | ||
| const FunctionTokenExpression_1 = require("./token-expressions/FunctionTokenExpression"); | ||
| const ConstantTokenExpression_1 = require("./token-expressions/ConstantTokenExpression"); | ||
| const ShorthandTokenExpression_1 = require("./token-expressions/ShorthandTokenExpression"); | ||
| const FormatShorthandTokenExpression_1 = require("./token-expressions/FormatShorthandTokenExpression"); | ||
| /** | ||
@@ -11,3 +15,3 @@ * Construct a new format string expression. | ||
| this.expression = expression || ''; | ||
| this.tokens = (0, tools_1.compile)(this.expression); | ||
| this.tokens = FormatString.compile(this.expression); | ||
| this.type = FormatString.TYPE; | ||
@@ -18,2 +22,78 @@ } | ||
| } | ||
| /** | ||
| * Compile a format string expression into tokens. | ||
| */ | ||
| static compile(format) { | ||
| let start = 0; | ||
| let tokens = []; | ||
| let len = format.length; | ||
| while (true) { | ||
| const i = format.indexOf('{', start); | ||
| if (i < 0 || i == len - 1) { | ||
| // end of string - everything is normal text | ||
| tokens.push(new ConstantTokenExpression_1.ConstantTokenExpression(unescape(format.substring(start)), start)); | ||
| break; | ||
| } | ||
| // normal text in the gaps between curly braces | ||
| tokens.push(new ConstantTokenExpression_1.ConstantTokenExpression(unescape(format.substring(start, i)), start)); | ||
| if (format[i + 1] == '{') { | ||
| // Double left brace - escape and continue | ||
| tokens.push(new ConstantTokenExpression_1.ConstantTokenExpression('{', start)); | ||
| start = i + 2; | ||
| continue; | ||
| } | ||
| const parsedBraces = parseEnclosingBraces(format.substring(i)); | ||
| if (!parsedBraces) { | ||
| // Brace pair faulty (no closing brace), return as a constant | ||
| tokens.push(new ConstantTokenExpression_1.ConstantTokenExpression(format.substring(i), start)); | ||
| break; | ||
| } | ||
| // Next start is at the end of the currently parsed brace pair | ||
| start = i + parsedBraces.length + 1; | ||
| // `spec` is everything between the curly braces "{" and "}". | ||
| const spec = format.substring(i + 1, i + parsedBraces.length); | ||
| // test for function token prefix | ||
| if (spec.trim().indexOf(FunctionTokenExpression_1.FunctionTokenExpression.PREFIX) === 0) { | ||
| // function token because the function name has "$:" as prefix (leading whitespace is ignored) | ||
| tokens.push(new FunctionTokenExpression_1.FunctionTokenExpression(spec, i)); | ||
| } | ||
| else { | ||
| // shorthand token | ||
| const colon = spec.indexOf(':'); | ||
| if (colon == -1) { | ||
| tokens.push(new ShorthandTokenExpression_1.ShorthandTokenExpression(spec, i)); | ||
| } | ||
| else { | ||
| tokens.push(new FormatShorthandTokenExpression_1.FormatShorthandTokenExpression(spec.substring(0, colon), spec.substring(colon + 1), i)); | ||
| } | ||
| } | ||
| } | ||
| // concatenate any neighbouring constant token expressions | ||
| let result = []; | ||
| let last = null; | ||
| for (var j = 0; j < tokens.length; j++) { | ||
| var token = tokens[j]; | ||
| if (token instanceof ConstantTokenExpression_1.ConstantTokenExpression) { | ||
| if (last == null) { | ||
| if (token.expression.length > 0) { | ||
| last = token; | ||
| } | ||
| } | ||
| else { | ||
| last = last.concat(token); | ||
| } | ||
| } | ||
| else { | ||
| if (last != null) { | ||
| result.push(last); | ||
| last = null; | ||
| } | ||
| result.push(token); | ||
| } | ||
| } | ||
| if (last != null) { | ||
| result.push(last); | ||
| } | ||
| return result; | ||
| } | ||
| toString() { | ||
@@ -187,2 +267,45 @@ return this.expression; | ||
| FormatString.TYPE = 'format-string'; | ||
| // Expose internal functions for tests | ||
| exports._compile = FormatString.compile; | ||
| function parseEnclosingBraces(format) { | ||
| const i = format.indexOf('{'); | ||
| if (i === -1) { | ||
| return null; | ||
| } | ||
| // We want to skip through these sections | ||
| // i.e. do not match { in a string, e.g. "{" | ||
| const SPECIAL_SECTIONS = ["'", '"']; | ||
| for (let k = i + 1; k < format.length; k++) { | ||
| const character = format[k]; | ||
| if (SPECIAL_SECTIONS.indexOf(character) !== -1) { | ||
| // This is the start of a string, jump to its end | ||
| const endChar = format.indexOf(character, k + 1); | ||
| if (endChar === -1) { | ||
| // Unless the end doesn't exist. Error out. | ||
| return null; | ||
| } | ||
| k = endChar; | ||
| continue; | ||
| } | ||
| if (character === '{') { | ||
| // Start of a pair of inner braces, | ||
| // recursively parse them | ||
| const inner = parseEnclosingBraces(format.substring(k)); | ||
| if (!inner) { | ||
| // Faulty inner, return null | ||
| return null; | ||
| } | ||
| k += inner.length; | ||
| continue; | ||
| } | ||
| if (character === '}') { | ||
| // Found closing part for current level of braces | ||
| // Return the length to the caller | ||
| return { length: k - i }; | ||
| } | ||
| } | ||
| // Came to end of loop without a match. Faulty, return null | ||
| return null; | ||
| } | ||
| exports.parseEnclosingBraces = parseEnclosingBraces; | ||
| //# sourceMappingURL=FormatString.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"FormatString.js","sourceRoot":"","sources":["../../src/FormatString.ts"],"names":[],"mappings":"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","sourcesContent":["import { TokenExpression } from './token-expressions/TokenExpression';\nimport { compile, extract, formatValue } from './tools';\nimport { AttributeValidationError } from '@journeyapps/core-xml';\nimport { TypeInterface } from './TypeInterface';\nimport { FormatStringScope } from './FormatStringScope';\nimport { FunctionTokenExpression } from './token-expressions/FunctionTokenExpression';\n\n/**\n * Construct a new format string expression.\n */\nexport class FormatString {\n static TYPE = 'format-string';\n type: string;\n expression: string;\n tokens: TokenExpression[];\n\n constructor(expression: string) {\n this.expression = expression || '';\n this.tokens = compile(this.expression);\n this.type = FormatString.TYPE;\n }\n\n static isInstanceOf(val: any): val is FormatString {\n return val?.type === FormatString.TYPE;\n }\n\n toString(): string {\n return this.expression;\n }\n\n /**\n * If the format string is constant (i.e. no values need to be evaluated).\n */\n isConstant(): boolean {\n // constants format strings will only contain a single constant token\n return this.tokens.length == 1 && this.tokens[0].isConstant();\n }\n\n // Example on an asset:\n // '{room} {room.name} {room.building.name}' => {'room' => {'building' => {}}}\n // This will recursively evaluate format strings where required.\n extractRelationshipStructure(type: TypeInterface, depth?: number, into?: any) {\n if (depth == null) {\n depth = 0;\n } else if (depth > 5) {\n return {};\n }\n\n var result = into || {};\n\n var tokens = this.tokens;\n\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i];\n if (token.isShorthand()) {\n var expression = token.expression;\n extract(type, expression, result, depth);\n }\n }\n return result;\n }\n\n validate(scopeType: TypeInterface): AttributeValidationError[] {\n var tokens = this.tokens;\n\n var results: AttributeValidationError[] = [];\n\n for (var i = 0; i < tokens.length; i++) {\n // validate all shorthand and function token expressions (ignore constant token expressions)\n var token = tokens[i];\n var expression = token.expression;\n if (token.isShorthand()) {\n var warnQuestionMark = false;\n if (expression.length > 0 && expression[0] == '?') {\n expression = expression.substring(1);\n warnQuestionMark = true;\n }\n\n var type = scopeType.getType(expression);\n if (type == null) {\n results.push({\n start: token.start + 1,\n end: token.start + 1 + token.expression.length,\n type: 'error',\n message: \"'\" + token.expression + \"' is not defined\"\n });\n } else if (warnQuestionMark) {\n results.push({\n start: token.start + 1,\n end: token.start + 2,\n type: 'warning',\n message: 'Usage of ? in expressions is deprecated.'\n });\n }\n }\n if (token.isFunction()) {\n // TODO: validate that function exists in view\n }\n }\n return results;\n }\n\n validateAndReturnRecordings(scopeType: TypeInterface) {\n var tokens = this.tokens;\n var recordings: {\n type: string;\n isPrimitiveType: boolean;\n name: string;\n }[][] = [];\n\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i];\n if (!token.isConstant()) {\n var expression = token.expression;\n // We are interested in the type and name of the final two variables in the expression\n var arrayOfVariables = scopeType.getVariableTypeAndNameWithParent(expression);\n if (arrayOfVariables[0] == null && scopeType.name != 'view') {\n // This can happen in, e.g., an object table where the attribute is on its own as a property\n arrayOfVariables[0] = {\n // Override to the scopeType\n type: scopeType.name,\n isPrimitiveType: scopeType.isPrimitiveType,\n name: 'n/a'\n };\n }\n recordings.push(arrayOfVariables);\n }\n }\n return recordings;\n }\n\n getConstantValue(): any {\n if (!this.isConstant()) {\n throw new Error('Not constant!');\n }\n return this.tokens[0].valueOf();\n }\n\n // This helps speed up dirty-checking.\n // With this, we can use \"by reference\" checking in watches.\n valueOf() {\n return this.expression;\n }\n\n evaluatePromise(scope: FormatStringScope): Promise<string> {\n const tokens = this.tokens;\n let promises = [];\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n if (token.isConstant()) {\n // Constant tokens are skipped here (nothing to evaluate).\n } else {\n const promise = token.tokenEvaluatePromise(scope);\n promises.push(promise);\n }\n }\n\n return Promise.all(promises).then(function (results) {\n let result = '';\n let promiseIndex = 0;\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n if (token.isConstant()) {\n result += token.valueOf();\n } else {\n result += results[promiseIndex];\n promiseIndex += 1;\n }\n }\n return result;\n });\n }\n\n /**\n * If not all values are loaded yet, null is returned.\n */\n evaluate(scope: FormatStringScope): string {\n const tokens = this.tokens;\n\n let result = '';\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n if (token.isConstant()) {\n result += token.valueOf();\n } else if (token.isFunction()) {\n // Not supported - return the original expression\n result += (token as FunctionTokenExpression).toConstant(true).valueOf();\n } else {\n let expression = token.expression;\n if (expression.length > 0 && expression[0] == '?') {\n expression = expression.substring(1);\n }\n const value = scope.getValue(expression);\n if (value === undefined) {\n // Still loading\n return null;\n } else {\n const type = scope.getExpressionType(expression);\n const text = formatValue(value, type, token.format);\n result += text;\n }\n }\n }\n return result;\n }\n}\n"]} | ||
| {"version":3,"file":"FormatString.js","sourceRoot":"","sources":["../../src/FormatString.ts"],"names":[],"mappings":"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","sourcesContent":["import { TokenExpression } from './token-expressions/TokenExpression';\nimport { extract, formatValue } from './tools';\nimport { AttributeValidationError } from '@journeyapps/core-xml';\nimport { TypeInterface } from './TypeInterface';\nimport { FormatStringScope } from './FormatStringScope';\nimport { FunctionTokenExpression } from './token-expressions/FunctionTokenExpression';\nimport { ConstantTokenExpression } from './token-expressions/ConstantTokenExpression';\nimport { ShorthandTokenExpression } from './token-expressions/ShorthandTokenExpression';\nimport { FormatShorthandTokenExpression } from './token-expressions/FormatShorthandTokenExpression';\n\n/**\n * Construct a new format string expression.\n */\nexport class FormatString {\n static TYPE = 'format-string';\n type: string;\n expression: string;\n tokens: TokenExpression[];\n\n constructor(expression: string) {\n this.expression = expression || '';\n this.tokens = FormatString.compile(this.expression);\n this.type = FormatString.TYPE;\n }\n\n static isInstanceOf(val: any): val is FormatString {\n return val?.type === FormatString.TYPE;\n }\n\n /**\n * Compile a format string expression into tokens.\n */\n static compile(format: string): TokenExpression[] {\n let start = 0;\n\n let tokens: TokenExpression[] = [];\n\n let len = format.length;\n while (true) {\n const i = format.indexOf('{', start);\n if (i < 0 || i == len - 1) {\n // end of string - everything is normal text\n tokens.push(new ConstantTokenExpression(unescape(format.substring(start)), start));\n break;\n }\n // normal text in the gaps between curly braces\n tokens.push(new ConstantTokenExpression(unescape(format.substring(start, i)), start));\n if (format[i + 1] == '{') {\n // Double left brace - escape and continue\n tokens.push(new ConstantTokenExpression('{', start));\n start = i + 2;\n continue;\n }\n\n const parsedBraces = parseEnclosingBraces(format.substring(i));\n if (!parsedBraces) {\n // Brace pair faulty (no closing brace), return as a constant\n tokens.push(new ConstantTokenExpression(format.substring(i), start));\n break;\n }\n\n // Next start is at the end of the currently parsed brace pair\n start = i + parsedBraces.length + 1;\n\n // `spec` is everything between the curly braces \"{\" and \"}\".\n const spec = format.substring(i + 1, i + parsedBraces.length);\n\n // test for function token prefix\n if (spec.trim().indexOf(FunctionTokenExpression.PREFIX) === 0) {\n // function token because the function name has \"$:\" as prefix (leading whitespace is ignored)\n tokens.push(new FunctionTokenExpression(spec, i));\n } else {\n // shorthand token\n const colon = spec.indexOf(':');\n if (colon == -1) {\n tokens.push(new ShorthandTokenExpression(spec, i));\n } else {\n tokens.push(new FormatShorthandTokenExpression(spec.substring(0, colon), spec.substring(colon + 1), i));\n }\n }\n }\n\n // concatenate any neighbouring constant token expressions\n let result: TokenExpression[] = [];\n let last: ConstantTokenExpression = null;\n for (var j = 0; j < tokens.length; j++) {\n var token = tokens[j];\n if (token instanceof ConstantTokenExpression) {\n if (last == null) {\n if (token.expression.length > 0) {\n last = token;\n }\n } else {\n last = last.concat(token);\n }\n } else {\n if (last != null) {\n result.push(last);\n last = null;\n }\n result.push(token);\n }\n }\n if (last != null) {\n result.push(last);\n }\n\n return result;\n }\n\n toString(): string {\n return this.expression;\n }\n\n /**\n * If the format string is constant (i.e. no values need to be evaluated).\n */\n isConstant(): boolean {\n // constants format strings will only contain a single constant token\n return this.tokens.length == 1 && this.tokens[0].isConstant();\n }\n\n // Example on an asset:\n // '{room} {room.name} {room.building.name}' => {'room' => {'building' => {}}}\n // This will recursively evaluate format strings where required.\n extractRelationshipStructure(type: TypeInterface, depth?: number, into?: any) {\n if (depth == null) {\n depth = 0;\n } else if (depth > 5) {\n return {};\n }\n\n var result = into || {};\n\n var tokens = this.tokens;\n\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i];\n if (token.isShorthand()) {\n var expression = token.expression;\n extract(type, expression, result, depth);\n }\n }\n return result;\n }\n\n validate(scopeType: TypeInterface): AttributeValidationError[] {\n var tokens = this.tokens;\n\n var results: AttributeValidationError[] = [];\n\n for (var i = 0; i < tokens.length; i++) {\n // validate all shorthand and function token expressions (ignore constant token expressions)\n var token = tokens[i];\n var expression = token.expression;\n if (token.isShorthand()) {\n var warnQuestionMark = false;\n if (expression.length > 0 && expression[0] == '?') {\n expression = expression.substring(1);\n warnQuestionMark = true;\n }\n\n var type = scopeType.getType(expression);\n if (type == null) {\n results.push({\n start: token.start + 1,\n end: token.start + 1 + token.expression.length,\n type: 'error',\n message: \"'\" + token.expression + \"' is not defined\"\n });\n } else if (warnQuestionMark) {\n results.push({\n start: token.start + 1,\n end: token.start + 2,\n type: 'warning',\n message: 'Usage of ? in expressions is deprecated.'\n });\n }\n }\n if (token.isFunction()) {\n // TODO: validate that function exists in view\n }\n }\n return results;\n }\n\n validateAndReturnRecordings(scopeType: TypeInterface) {\n var tokens = this.tokens;\n var recordings: {\n type: string;\n isPrimitiveType: boolean;\n name: string;\n }[][] = [];\n\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i];\n if (!token.isConstant()) {\n var expression = token.expression;\n // We are interested in the type and name of the final two variables in the expression\n var arrayOfVariables = scopeType.getVariableTypeAndNameWithParent(expression);\n if (arrayOfVariables[0] == null && scopeType.name != 'view') {\n // This can happen in, e.g., an object table where the attribute is on its own as a property\n arrayOfVariables[0] = {\n // Override to the scopeType\n type: scopeType.name,\n isPrimitiveType: scopeType.isPrimitiveType,\n name: 'n/a'\n };\n }\n recordings.push(arrayOfVariables);\n }\n }\n return recordings;\n }\n\n getConstantValue(): any {\n if (!this.isConstant()) {\n throw new Error('Not constant!');\n }\n return this.tokens[0].valueOf();\n }\n\n // This helps speed up dirty-checking.\n // With this, we can use \"by reference\" checking in watches.\n valueOf() {\n return this.expression;\n }\n\n evaluatePromise(scope: FormatStringScope): Promise<string> {\n const tokens = this.tokens;\n let promises = [];\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n if (token.isConstant()) {\n // Constant tokens are skipped here (nothing to evaluate).\n } else {\n const promise = token.tokenEvaluatePromise(scope);\n promises.push(promise);\n }\n }\n\n return Promise.all(promises).then(function (results) {\n let result = '';\n let promiseIndex = 0;\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n if (token.isConstant()) {\n result += token.valueOf();\n } else {\n result += results[promiseIndex];\n promiseIndex += 1;\n }\n }\n return result;\n });\n }\n\n /**\n * If not all values are loaded yet, null is returned.\n */\n evaluate(scope: FormatStringScope): string {\n const tokens = this.tokens;\n\n let result = '';\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n if (token.isConstant()) {\n result += token.valueOf();\n } else if (token.isFunction()) {\n // Not supported - return the original expression\n result += (token as FunctionTokenExpression).toConstant(true).valueOf();\n } else {\n let expression = token.expression;\n if (expression.length > 0 && expression[0] == '?') {\n expression = expression.substring(1);\n }\n const value = scope.getValue(expression);\n if (value === undefined) {\n // Still loading\n return null;\n } else {\n const type = scope.getExpressionType(expression);\n const text = formatValue(value, type, token.format);\n result += text;\n }\n }\n }\n return result;\n }\n}\n\n// Expose internal functions for tests\nexport const _compile = FormatString.compile;\n\nexport function parseEnclosingBraces(format: string) {\n const i = format.indexOf('{');\n if (i === -1) {\n return null;\n }\n // We want to skip through these sections\n // i.e. do not match { in a string, e.g. \"{\"\n const SPECIAL_SECTIONS = [\"'\", '\"'];\n\n for (let k = i + 1; k < format.length; k++) {\n const character = format[k];\n\n if (SPECIAL_SECTIONS.indexOf(character) !== -1) {\n // This is the start of a string, jump to its end\n const endChar = format.indexOf(character, k + 1);\n if (endChar === -1) {\n // Unless the end doesn't exist. Error out.\n return null;\n }\n k = endChar;\n continue;\n }\n\n if (character === '{') {\n // Start of a pair of inner braces,\n // recursively parse them\n const inner = parseEnclosingBraces(format.substring(k));\n if (!inner) {\n // Faulty inner, return null\n return null;\n }\n k += inner.length;\n continue;\n }\n\n if (character === '}') {\n // Found closing part for current level of braces\n // Return the length to the caller\n return { length: k - i };\n }\n }\n // Came to end of loop without a match. Faulty, return null\n return null;\n}\n"]} |
+1
-125
| "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports._deepMerge = exports._compile = exports.formatValueAsync = exports.formatValue = exports.actionableTokenExpression = exports.functionTokenExpression = exports.formatString = exports.extract = exports.deepMerge = exports.getObjectType = exports.compile = exports.parseEnclosingBraces = exports.unescape = void 0; | ||
| const ConstantTokenExpression_1 = require("./token-expressions/ConstantTokenExpression"); | ||
| exports._deepMerge = exports.formatValueAsync = exports.formatValue = exports.actionableTokenExpression = exports.functionTokenExpression = exports.formatString = exports.extract = exports.deepMerge = exports.getObjectType = exports.unescape = void 0; | ||
| const FunctionTokenExpression_1 = require("./token-expressions/FunctionTokenExpression"); | ||
@@ -27,125 +26,2 @@ const ShorthandTokenExpression_1 = require("./token-expressions/ShorthandTokenExpression"); | ||
| exports.unescape = unescape; | ||
| function parseEnclosingBraces(format) { | ||
| var i = format.indexOf('{'); | ||
| if (i == -1) { | ||
| return null; | ||
| } | ||
| // We want to skip through these sections | ||
| // i.e. do not match { in a string, e.g. "{" | ||
| var SPECIAL_SECTIONS = ["'", '"']; | ||
| for (var k = i + 1; k < format.length; k++) { | ||
| var character = format[k]; | ||
| if (SPECIAL_SECTIONS.indexOf(character) != -1) { | ||
| // This is the start of a string, jump to its end | ||
| var endChar = format.indexOf(character, k + 1); | ||
| if (endChar == -1) { | ||
| // Unless the end doesn't exist. Error out. | ||
| return null; | ||
| } | ||
| k = endChar; | ||
| continue; | ||
| } | ||
| if (character == '{') { | ||
| // Start of pair of inner braces, | ||
| // recursively parse them | ||
| var inner = parseEnclosingBraces(format.substring(k)); | ||
| if (!inner) { | ||
| // Faulty inner, return null | ||
| return null; | ||
| } | ||
| k += inner.length; | ||
| continue; | ||
| } | ||
| if (character == '}') { | ||
| // Found closing part for current level of braces | ||
| // Return the length to the caller | ||
| return { | ||
| length: k - i | ||
| }; | ||
| } | ||
| } | ||
| // Came to end of loop without a match. Faulty, return null | ||
| return null; | ||
| } | ||
| exports.parseEnclosingBraces = parseEnclosingBraces; | ||
| /** | ||
| * Compile a format string expression into tokens. | ||
| * @param {string} format string expression | ||
| * @return {TokenExpression[]} compiled tokens | ||
| */ | ||
| function compile(format) { | ||
| let start = 0; | ||
| let tokens = []; | ||
| let len = format.length; | ||
| while (true) { | ||
| const i = format.indexOf('{', start); | ||
| if (i < 0 || i == len - 1) { | ||
| // end of string - everything is normal text | ||
| tokens.push(new ConstantTokenExpression_1.ConstantTokenExpression(unescape(format.substring(start)), start)); | ||
| break; | ||
| } | ||
| // normal text in the gaps between curly braces | ||
| tokens.push(new ConstantTokenExpression_1.ConstantTokenExpression(unescape(format.substring(start, i)), start)); | ||
| if (format[i + 1] == '{') { | ||
| // Double left brace - escape and continue | ||
| tokens.push(new ConstantTokenExpression_1.ConstantTokenExpression('{', start)); | ||
| start = i + 2; | ||
| continue; | ||
| } | ||
| const parsedBraces = parseEnclosingBraces(format.substring(i)); | ||
| if (!parsedBraces) { | ||
| // Brace pair faulty (no closing brace), return as a constant | ||
| tokens.push(new ConstantTokenExpression_1.ConstantTokenExpression(format.substring(i), start)); | ||
| break; | ||
| } | ||
| // Next start is at the end of the currently parsed brace pair | ||
| start = i + parsedBraces.length + 1; | ||
| // `spec` is everything between the curly braces "{" and "}". | ||
| const spec = format.substring(i + 1, i + parsedBraces.length); | ||
| // test for function token prefix | ||
| if (spec.trim().indexOf(FunctionTokenExpression_1.FunctionTokenExpression.PREFIX) === 0) { | ||
| // function token because the function name has "$:" as prefix (leading whitespace is ignored) | ||
| tokens.push(new FunctionTokenExpression_1.FunctionTokenExpression(spec, i)); | ||
| } | ||
| else { | ||
| // shorthand token | ||
| const colon = spec.indexOf(':'); | ||
| if (colon == -1) { | ||
| tokens.push(new ShorthandTokenExpression_1.ShorthandTokenExpression(spec, i)); | ||
| } | ||
| else { | ||
| tokens.push(new FormatShorthandTokenExpression_1.FormatShorthandTokenExpression(spec.substring(0, colon), spec.substring(colon + 1), i)); | ||
| } | ||
| } | ||
| } | ||
| // concatenate any neighbouring constant token expressions | ||
| let result = []; | ||
| let last = null; | ||
| for (var j = 0; j < tokens.length; j++) { | ||
| var token = tokens[j]; | ||
| if (token instanceof ConstantTokenExpression_1.ConstantTokenExpression) { | ||
| if (last == null) { | ||
| if (token.expression.length > 0) { | ||
| last = token; | ||
| } | ||
| } | ||
| else { | ||
| last = last.concat(token); | ||
| } | ||
| } | ||
| else { | ||
| if (last != null) { | ||
| result.push(last); | ||
| last = null; | ||
| } | ||
| result.push(token); | ||
| } | ||
| } | ||
| if (last != null) { | ||
| result.push(last); | ||
| } | ||
| return result; | ||
| } | ||
| exports.compile = compile; | ||
| exports._compile = compile; | ||
| function getObjectType(parent, name) { | ||
@@ -152,0 +28,0 @@ var variable = parent.getAttribute(name); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/tools.ts"],"names":[],"mappings":"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","sourcesContent":["// Unescape double closing braces to a single brace\nimport { TokenExpression } from './token-expressions/TokenExpression';\nimport { ConstantTokenExpression } from './token-expressions/ConstantTokenExpression';\nimport { FunctionTokenExpression } from './token-expressions/FunctionTokenExpression';\nimport { ShorthandTokenExpression } from './token-expressions/ShorthandTokenExpression';\nimport { FormatShorthandTokenExpression } from './token-expressions/FormatShorthandTokenExpression';\nimport { FormatString } from './FormatString';\nimport { TypeInterface } from './TypeInterface';\nimport { LegacyFunctionTokenExpression } from './token-expressions/LegacyFunctionTokenExpression';\n\nexport function unescape(s: string) {\n var start = 0;\n var result = '';\n var len = s.length;\n while (true) {\n var i = s.indexOf('}', start);\n if (i == -1 || i == len - 1) {\n result += s.substring(start);\n break;\n }\n result += s.substring(start, i + 1);\n // We assume that the character at i+1 is another right brace, but we don't do any checking.\n start = i + 2;\n }\n return result;\n}\n\nexport function parseEnclosingBraces(format: string) {\n var i = format.indexOf('{');\n if (i == -1) {\n return null;\n }\n\n // We want to skip through these sections\n // i.e. do not match { in a string, e.g. \"{\"\n var SPECIAL_SECTIONS = [\"'\", '\"'];\n\n for (var k = i + 1; k < format.length; k++) {\n var character = format[k];\n if (SPECIAL_SECTIONS.indexOf(character) != -1) {\n // This is the start of a string, jump to its end\n var endChar = format.indexOf(character, k + 1);\n if (endChar == -1) {\n // Unless the end doesn't exist. Error out.\n return null;\n }\n k = endChar;\n continue;\n }\n if (character == '{') {\n // Start of pair of inner braces,\n // recursively parse them\n var inner = parseEnclosingBraces(format.substring(k));\n if (!inner) {\n // Faulty inner, return null\n return null;\n }\n k += inner.length;\n continue;\n }\n if (character == '}') {\n // Found closing part for current level of braces\n // Return the length to the caller\n return {\n length: k - i\n };\n }\n }\n // Came to end of loop without a match. Faulty, return null\n return null;\n}\n\n/**\n * Compile a format string expression into tokens.\n * @param {string} format string expression\n * @return {TokenExpression[]} compiled tokens\n */\nexport function compile(format: string) {\n let start = 0;\n\n let tokens: TokenExpression[] = [];\n\n let len = format.length;\n while (true) {\n const i = format.indexOf('{', start);\n if (i < 0 || i == len - 1) {\n // end of string - everything is normal text\n tokens.push(new ConstantTokenExpression(unescape(format.substring(start)), start));\n break;\n }\n // normal text in the gaps between curly braces\n tokens.push(new ConstantTokenExpression(unescape(format.substring(start, i)), start));\n if (format[i + 1] == '{') {\n // Double left brace - escape and continue\n tokens.push(new ConstantTokenExpression('{', start));\n start = i + 2;\n continue;\n }\n\n const parsedBraces = parseEnclosingBraces(format.substring(i));\n if (!parsedBraces) {\n // Brace pair faulty (no closing brace), return as a constant\n tokens.push(new ConstantTokenExpression(format.substring(i), start));\n break;\n }\n\n // Next start is at the end of the currently parsed brace pair\n start = i + parsedBraces.length + 1;\n\n // `spec` is everything between the curly braces \"{\" and \"}\".\n const spec = format.substring(i + 1, i + parsedBraces.length);\n\n // test for function token prefix\n if (spec.trim().indexOf(FunctionTokenExpression.PREFIX) === 0) {\n // function token because the function name has \"$:\" as prefix (leading whitespace is ignored)\n tokens.push(new FunctionTokenExpression(spec, i));\n } else {\n // shorthand token\n const colon = spec.indexOf(':');\n if (colon == -1) {\n tokens.push(new ShorthandTokenExpression(spec, i));\n } else {\n tokens.push(new FormatShorthandTokenExpression(spec.substring(0, colon), spec.substring(colon + 1), i));\n }\n }\n }\n\n // concatenate any neighbouring constant token expressions\n let result: TokenExpression[] = [];\n let last: ConstantTokenExpression = null;\n for (var j = 0; j < tokens.length; j++) {\n var token = tokens[j];\n if (token instanceof ConstantTokenExpression) {\n if (last == null) {\n if (token.expression.length > 0) {\n last = token;\n }\n } else {\n last = last.concat(token);\n }\n } else {\n if (last != null) {\n result.push(last);\n last = null;\n }\n result.push(token);\n }\n }\n if (last != null) {\n result.push(last);\n }\n\n return result;\n}\n\nexport function getObjectType(parent: any, name: string) {\n var variable = parent.getAttribute(name);\n\n if (variable != null) {\n var type = variable.type;\n if (type.isObject) {\n return type;\n }\n }\n return null;\n}\n\n// Merge hashes of hashes (no non-hash values)\n// Sample:\n// deepMerge({a: {}}, {b: {}}) => {a: {}, b: {}}\n// deepMerge({a: {b: {c: {}}}, d: {}}, {a: {e: {}}}) => {a: {b: {c: {}}, e: {}}, d: {}}\nexport function deepMerge(a: any, b: any) {\n if (typeof a != 'object' || typeof b != 'object') {\n throw new Error('Parameters must be objects only');\n }\n Object.keys(b).forEach(function (key) {\n if (!(key in a)) {\n // There are no actual \"values\" here, except for more nested hashes.\n // The presence of keys is the important part.\n a[key] = {};\n }\n deepMerge(a[key], b[key]);\n });\n return a;\n}\n\nexport function extract(type: any, expression: string, into: any, depth: number) {\n var dot = expression.indexOf('.');\n if (dot < 0) {\n var objectType = getObjectType(type, expression);\n if (objectType == null) {\n // Not an object - don't continue\n } else {\n var b: any = {};\n b[expression] = objectType.displayFormat.extractRelationshipStructure(objectType, depth + 1);\n deepMerge(into, b);\n }\n } else {\n var head = expression.substring(0, dot); // The first part of the expression\n var tail = expression.substring(dot + 1); // The rest of the expression\n\n var child = getObjectType(type, head);\n\n if (child == null) {\n // nothing\n } else {\n if (!(head in into)) {\n into[head] = {};\n }\n extract(child, tail, into[head], depth + 1);\n }\n }\n}\n\n/**\n * Create format string.\n */\nexport function formatString(expression: string): FormatString | null {\n if (expression == null) {\n return null;\n } else {\n return new FormatString(expression);\n }\n}\n\n/**\n # Construct a function token expression from a raw expression string.\n * @param {string} expression\n * @param {boolean} [allowLegacy=true] if legacy function token expressions are allowed (defaults to true)\n * @return {FunctionTokenExpression|LegacyFunctionTokenExpression|null}\n */\nexport function functionTokenExpression(expression: string, allowLegacy?: boolean) {\n if (typeof allowLegacy === 'undefined' || allowLegacy == null) {\n allowLegacy = true; // default value\n }\n if (expression == null) {\n return null;\n }\n if (expression.trim().indexOf(FunctionTokenExpression.PREFIX) === 0) {\n return new FunctionTokenExpression(expression);\n }\n if (allowLegacy) {\n // assume legacy function token expression (if allowed) at this point\n return new LegacyFunctionTokenExpression(expression);\n }\n return null;\n}\n\n/**\n * Create a token expression that can be evaluated.\n */\nexport function actionableTokenExpression(\n expression: string\n): FunctionTokenExpression | ShorthandTokenExpression | FormatShorthandTokenExpression {\n if (expression == null) {\n return null;\n }\n if (expression.trim().indexOf(FunctionTokenExpression.PREFIX) === 0) {\n return new FunctionTokenExpression(expression);\n }\n var colon = expression.indexOf(':');\n if (colon == -1) {\n return new ShorthandTokenExpression(expression);\n }\n return new FormatShorthandTokenExpression(expression.substring(0, colon), expression.substring(colon + 1));\n}\n\n// Format an expression with a specific format.\n// Return a promise resolving with the formatted value.\nexport function formatValue(value: any, type: TypeInterface, format: string): string {\n if (value == null) {\n return '';\n } else if (type != null) {\n return type.format(value, format);\n } else {\n // This should generally not happen. However, we still try to handle it gracefully.\n // This is useful for tests where we don't want to define the type for every variable.\n return value.toString();\n }\n}\n\nexport async function formatValueAsync(value: any, type: TypeInterface, format: string): Promise<string> {\n if (value != null && typeof value._display == 'function') {\n // Object - recursive promise-based formatting.\n return value._display() as Promise<string>;\n } else {\n return formatValue(value, type, format);\n }\n}\n\n// Expose internal functions for tests\nexport { compile as _compile, deepMerge as _deepMerge };\n"]} | ||
| {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/tools.ts"],"names":[],"mappings":";;;AAGA,yFAAsF;AACtF,2FAAwF;AACxF,uGAAoG;AACpG,iDAA8C;AAE9C,qGAAkG;AAElG,SAAgB,QAAQ,CAAC,CAAS;IAChC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC;IACnB,OAAO,IAAI,EAAE;QACX,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,EAAE;YAC3B,MAAM,IAAI,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC7B,MAAM;SACP;QACD,MAAM,IAAI,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACpC,4FAA4F;QAC5F,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;KACf;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAfD,4BAeC;AAED,SAAgB,aAAa,CAAC,MAAW,EAAE,IAAY;IACrD,IAAI,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAEzC,IAAI,QAAQ,IAAI,IAAI,EAAE;QACpB,IAAI,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;QACzB,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,OAAO,IAAI,CAAC;SACb;KACF;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAVD,sCAUC;AAED,8CAA8C;AAC9C,UAAU;AACV,kDAAkD;AAClD,yFAAyF;AACzF,SAAgB,SAAS,CAAC,CAAM,EAAE,CAAM;IACtC,IAAI,OAAO,CAAC,IAAI,QAAQ,IAAI,OAAO,CAAC,IAAI,QAAQ,EAAE;QAChD,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;KACpD;IACD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,GAAG;QAClC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE;YACf,oEAAoE;YACpE,8CAA8C;YAC9C,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;SACb;QACD,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,CAAC;AACX,CAAC;AAbD,8BAaC;AA2GqB,+BAAU;AAzGhC,SAAgB,OAAO,CAAC,IAAS,EAAE,UAAkB,EAAE,IAAS,EAAE,KAAa;IAC7E,IAAI,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,GAAG,GAAG,CAAC,EAAE;QACX,IAAI,UAAU,GAAG,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACjD,IAAI,UAAU,IAAI,IAAI,EAAE;YACtB,iCAAiC;SAClC;aAAM;YACL,IAAI,CAAC,GAAQ,EAAE,CAAC;YAChB,CAAC,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC,aAAa,CAAC,4BAA4B,CAAC,UAAU,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YAC7F,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;SACpB;KACF;SAAM;QACL,IAAI,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,mCAAmC;QAC5E,IAAI,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,6BAA6B;QAEvE,IAAI,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAEtC,IAAI,KAAK,IAAI,IAAI,EAAE;YACjB,UAAU;SACX;aAAM;YACL,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE;gBACnB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;aACjB;YACD,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;SAC7C;KACF;AACH,CAAC;AA1BD,0BA0BC;AAED;;GAEG;AACH,SAAgB,YAAY,CAAC,UAAkB;IAC7C,IAAI,UAAU,IAAI,IAAI,EAAE;QACtB,OAAO,IAAI,CAAC;KACb;SAAM;QACL,OAAO,IAAI,2BAAY,CAAC,UAAU,CAAC,CAAC;KACrC;AACH,CAAC;AAND,oCAMC;AAED;;;;;GAKG;AACH,SAAgB,uBAAuB,CAAC,UAAkB,EAAE,WAAqB;IAC/E,IAAI,OAAO,WAAW,KAAK,WAAW,IAAI,WAAW,IAAI,IAAI,EAAE;QAC7D,WAAW,GAAG,IAAI,CAAC,CAAC,gBAAgB;KACrC;IACD,IAAI,UAAU,IAAI,IAAI,EAAE;QACtB,OAAO,IAAI,CAAC;KACb;IACD,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,iDAAuB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;QACnE,OAAO,IAAI,iDAAuB,CAAC,UAAU,CAAC,CAAC;KAChD;IACD,IAAI,WAAW,EAAE;QACf,qEAAqE;QACrE,OAAO,IAAI,6DAA6B,CAAC,UAAU,CAAC,CAAC;KACtD;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAfD,0DAeC;AAED;;GAEG;AACH,SAAgB,yBAAyB,CACvC,UAAkB;IAElB,IAAI,UAAU,IAAI,IAAI,EAAE;QACtB,OAAO,IAAI,CAAC;KACb;IACD,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,iDAAuB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;QACnE,OAAO,IAAI,iDAAuB,CAAC,UAAU,CAAC,CAAC;KAChD;IACD,IAAI,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,KAAK,IAAI,CAAC,CAAC,EAAE;QACf,OAAO,IAAI,mDAAwB,CAAC,UAAU,CAAC,CAAC;KACjD;IACD,OAAO,IAAI,+DAA8B,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,UAAU,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;AAC7G,CAAC;AAdD,8DAcC;AAED,+CAA+C;AAC/C,uDAAuD;AACvD,SAAgB,WAAW,CAAC,KAAU,EAAE,IAAmB,EAAE,MAAc;IACzE,IAAI,KAAK,IAAI,IAAI,EAAE;QACjB,OAAO,EAAE,CAAC;KACX;SAAM,IAAI,IAAI,IAAI,IAAI,EAAE;QACvB,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;KACnC;SAAM;QACL,mFAAmF;QACnF,sFAAsF;QACtF,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;KACzB;AACH,CAAC;AAVD,kCAUC;AAEM,KAAK,UAAU,gBAAgB,CAAC,KAAU,EAAE,IAAmB,EAAE,MAAc;IACpF,IAAI,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,CAAC,QAAQ,IAAI,UAAU,EAAE;QACxD,+CAA+C;QAC/C,OAAO,KAAK,CAAC,QAAQ,EAAqB,CAAC;KAC5C;SAAM;QACL,OAAO,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;KACzC;AACH,CAAC;AAPD,4CAOC","sourcesContent":["// Unescape double closing braces to a single brace\nimport { TokenExpression } from './token-expressions/TokenExpression';\nimport { ConstantTokenExpression } from './token-expressions/ConstantTokenExpression';\nimport { FunctionTokenExpression } from './token-expressions/FunctionTokenExpression';\nimport { ShorthandTokenExpression } from './token-expressions/ShorthandTokenExpression';\nimport { FormatShorthandTokenExpression } from './token-expressions/FormatShorthandTokenExpression';\nimport { FormatString } from './FormatString';\nimport { TypeInterface } from './TypeInterface';\nimport { LegacyFunctionTokenExpression } from './token-expressions/LegacyFunctionTokenExpression';\n\nexport function unescape(s: string) {\n var start = 0;\n var result = '';\n var len = s.length;\n while (true) {\n var i = s.indexOf('}', start);\n if (i == -1 || i == len - 1) {\n result += s.substring(start);\n break;\n }\n result += s.substring(start, i + 1);\n // We assume that the character at i+1 is another right brace, but we don't do any checking.\n start = i + 2;\n }\n return result;\n}\n\nexport function getObjectType(parent: any, name: string) {\n var variable = parent.getAttribute(name);\n\n if (variable != null) {\n var type = variable.type;\n if (type.isObject) {\n return type;\n }\n }\n return null;\n}\n\n// Merge hashes of hashes (no non-hash values)\n// Sample:\n// deepMerge({a: {}}, {b: {}}) => {a: {}, b: {}}\n// deepMerge({a: {b: {c: {}}}, d: {}}, {a: {e: {}}}) => {a: {b: {c: {}}, e: {}}, d: {}}\nexport function deepMerge(a: any, b: any) {\n if (typeof a != 'object' || typeof b != 'object') {\n throw new Error('Parameters must be objects only');\n }\n Object.keys(b).forEach(function (key) {\n if (!(key in a)) {\n // There are no actual \"values\" here, except for more nested hashes.\n // The presence of keys is the important part.\n a[key] = {};\n }\n deepMerge(a[key], b[key]);\n });\n return a;\n}\n\nexport function extract(type: any, expression: string, into: any, depth: number) {\n var dot = expression.indexOf('.');\n if (dot < 0) {\n var objectType = getObjectType(type, expression);\n if (objectType == null) {\n // Not an object - don't continue\n } else {\n var b: any = {};\n b[expression] = objectType.displayFormat.extractRelationshipStructure(objectType, depth + 1);\n deepMerge(into, b);\n }\n } else {\n var head = expression.substring(0, dot); // The first part of the expression\n var tail = expression.substring(dot + 1); // The rest of the expression\n\n var child = getObjectType(type, head);\n\n if (child == null) {\n // nothing\n } else {\n if (!(head in into)) {\n into[head] = {};\n }\n extract(child, tail, into[head], depth + 1);\n }\n }\n}\n\n/**\n * Create format string.\n */\nexport function formatString(expression: string): FormatString | null {\n if (expression == null) {\n return null;\n } else {\n return new FormatString(expression);\n }\n}\n\n/**\n # Construct a function token expression from a raw expression string.\n * @param {string} expression\n * @param {boolean} [allowLegacy=true] if legacy function token expressions are allowed (defaults to true)\n * @return {FunctionTokenExpression|LegacyFunctionTokenExpression|null}\n */\nexport function functionTokenExpression(expression: string, allowLegacy?: boolean) {\n if (typeof allowLegacy === 'undefined' || allowLegacy == null) {\n allowLegacy = true; // default value\n }\n if (expression == null) {\n return null;\n }\n if (expression.trim().indexOf(FunctionTokenExpression.PREFIX) === 0) {\n return new FunctionTokenExpression(expression);\n }\n if (allowLegacy) {\n // assume legacy function token expression (if allowed) at this point\n return new LegacyFunctionTokenExpression(expression);\n }\n return null;\n}\n\n/**\n * Create a token expression that can be evaluated.\n */\nexport function actionableTokenExpression(\n expression: string\n): FunctionTokenExpression | ShorthandTokenExpression | FormatShorthandTokenExpression {\n if (expression == null) {\n return null;\n }\n if (expression.trim().indexOf(FunctionTokenExpression.PREFIX) === 0) {\n return new FunctionTokenExpression(expression);\n }\n var colon = expression.indexOf(':');\n if (colon == -1) {\n return new ShorthandTokenExpression(expression);\n }\n return new FormatShorthandTokenExpression(expression.substring(0, colon), expression.substring(colon + 1));\n}\n\n// Format an expression with a specific format.\n// Return a promise resolving with the formatted value.\nexport function formatValue(value: any, type: TypeInterface, format: string): string {\n if (value == null) {\n return '';\n } else if (type != null) {\n return type.format(value, format);\n } else {\n // This should generally not happen. However, we still try to handle it gracefully.\n // This is useful for tests where we don't want to define the type for every variable.\n return value.toString();\n }\n}\n\nexport async function formatValueAsync(value: any, type: TypeInterface, format: string): Promise<string> {\n if (value != null && typeof value._display == 'function') {\n // Object - recursive promise-based formatting.\n return value._display() as Promise<string>;\n } else {\n return formatValue(value, type, format);\n }\n}\n\n// Expose internal functions for tests\nexport { deepMerge as _deepMerge };\n"]} |
+2
-2
| { | ||
| "name": "@journeyapps/evaluator", | ||
| "version": "0.0.0-dev-20230621144252", | ||
| "version": "0.0.0-dev-20230713095442", | ||
| "description": "Journey Evaluator library", | ||
@@ -8,3 +8,3 @@ "main": "./dist/src/index.js", | ||
| "dependencies": { | ||
| "@journeyapps/core-xml": "0.0.0-dev-20230621144252" | ||
| "@journeyapps/core-xml": "5.0.2" | ||
| }, | ||
@@ -11,0 +11,0 @@ "files": [ |
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
126683
0.69%1
-80%1186
-0.34%+ Added
- Removed
Updated