diff --git a/src/utils/transformations.js b/src/utils/transformations.js index 6778ebe..423cb7f 100644 --- a/src/utils/transformations.js +++ b/src/utils/transformations.js @@ -1,9 +1,14 @@ -const toSnake = str => str - .replace(/[^a-zA-Z]/g, '_') - .replace(/([A-Z])/g, '_$1') - .toLowerCase() +const toSnake = (str) => str + // replace any sequence of non-alphanumeric characters with a single underscore + .replace(/[^0-9A-Za-z]+/g, '_') + // insert underscore between a lower-case letter/digit and an upper-case letter (but not between consecutive uppers) + .replace(/([a-z0-9])([A-Z])/g, '$1_$2') + // collapse multiple underscores .replace(/_+/g, '_') - .replace(/^_|_$/g, ''); + // trim leading/trailing underscores + .replace(/^_+|_+$/g, '') + // finally, lowercase the result + .toLowerCase(); export const safeToSnake = (str) => { const res = toSnake(str);