budibase/packages/string-templates/src/utilities.ts

89 lines
2.4 KiB
TypeScript
Raw Normal View History

const ALPHA_NUMERIC_REGEX = /^[A-Za-z0-9]+$/g
2024-02-21 19:42:15 +01:00
export const FIND_HBS_REGEX = /{{([^{].*?)}}/g
export const FIND_ANY_HBS_REGEX = /{?{{([^{].*?)}}}?/g
export const FIND_TRIPLE_HBS_REGEX = /{{{([^{].*?)}}}/g
const isJest = () => typeof jest !== "undefined"
2024-02-21 19:42:15 +01:00
export const isBackendService = () => {
// We consider the tests for string-templates to be frontend, so that they
// test the frontend JS functionality.
if (isJest()) {
return false
}
return typeof window === "undefined"
}
2024-02-21 19:42:15 +01:00
export const isJSAllowed = () => {
return process && !process.env.NO_JS
}
// originally this could be done with a single regex using look behinds
// but safari does not support this feature
// original regex: /(?<!{){{[^{}]+}}(?!})/g
2024-02-21 21:10:53 +01:00
export const findDoubleHbsInstances = (string: string): string[] => {
let copied = string
2024-02-21 19:57:05 +01:00
const doubleRegex = new RegExp(FIND_HBS_REGEX)
const regex = new RegExp(FIND_TRIPLE_HBS_REGEX)
const tripleMatches = copied.match(regex)
// remove triple braces
if (tripleMatches) {
2024-02-21 21:10:53 +01:00
tripleMatches.forEach((match: string) => {
copied = copied.replace(match, "")
})
}
const doubleMatches = copied.match(doubleRegex)
return doubleMatches ? doubleMatches : []
}
2024-02-21 21:10:53 +01:00
export const isAlphaNumeric = (char: string) => {
return char.match(ALPHA_NUMERIC_REGEX)
}
2024-02-21 21:10:53 +01:00
export const swapStrings = (
string: string,
start: number,
length: number,
swap: string
) => {
return string.slice(0, start) + swap + string.slice(start + length)
}
2024-02-21 19:42:15 +01:00
export const removeHandlebarsStatements = (
2024-02-21 21:10:53 +01:00
string: string,
replacement = "Invalid binding"
) => {
2024-02-21 19:57:05 +01:00
let regexp = new RegExp(FIND_HBS_REGEX)
let matches = string.match(regexp)
if (matches == null) {
return string
}
for (let match of matches) {
const idx = string.indexOf(match)
2024-02-21 19:57:05 +01:00
string = swapStrings(string, idx, match.length, replacement)
}
return string
}
2024-02-21 21:10:53 +01:00
export const btoa = (plainText: string) => {
return Buffer.from(plainText, "utf-8").toString("base64")
}
2024-02-21 21:10:53 +01:00
export const atob = (base64: string) => {
return Buffer.from(base64, "base64").toString("utf-8")
}
export const prefixStrings = (
baseString: string,
strings: string[],
prefix: string
) => {
// Escape any special characters in the strings to avoid regex errors
const escapedStrings = strings.map(str =>
str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")
)
const regexPattern = new RegExp(`\\b(${escapedStrings.join("|")})\\b`, "g")
return baseString.replace(regexPattern, `${prefix}$1`)
}