@voiceflow/common 8.3.2 → 8.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,6 +3,7 @@ export declare const SLOT_REGEXP: RegExp;
3
3
  export declare const SLOT_ANNOTATION_SIMPLE_REGEX: RegExp;
4
4
  export declare const IS_VARIABLE_REGEXP: RegExp;
5
5
  export declare const READABLE_VARIABLE_REGEXP: RegExp;
6
+ export declare const VARIABLE_ONLY_REGEXP: RegExp;
6
7
  export declare const VALID_CHARACTER = "a-zA-Z";
7
8
  export declare const VALID_LATIN_CHARACTER = "a-zA-Z\u00C0-\u00FF\u0100-\u017F";
8
9
  export declare const VALID_SPOKEN_CHARACTER = "a-zA-Z\u00C0-\u00FF\u0100-\u017F\u0900-\u0965\u0970-\u097F\u3000-\u303F\u3040-\u309F\u30A0-\u30FF\uFF00-\uFF9F\u4E00-\u9FAF\u3400-\u4DBF";
@@ -1 +1 @@
1
- {"version":3,"file":"regexp.d.ts","sourceRoot":"","sources":["../../../src/constants/regexp.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,QAAO,CAAC;AAEjC,eAAO,MAAM,WAAW,QAA2C,CAAC;AAEpE,eAAO,MAAM,4BAA4B,QAAsB,CAAC;AAEhE,eAAO,MAAM,kBAAkB,QAAW,CAAC;AAE3C,eAAO,MAAM,wBAAwB,QAAkB,CAAC;AAExD,eAAO,MAAM,eAAe,WAAW,CAAC;AAGxC,eAAO,MAAM,qBAAqB,qCAA6C,CAAC;AAKhF,eAAO,MAAM,sBAAsB,6IAAqI,CAAC;AAEzK,eAAO,MAAM,sDAAsD,mJAAoC,CAAC;AAExG,eAAO,MAAM,uBAAuB,0JAAqE,CAAC;AAG1G,eAAO,MAAM,sBAAsB,8JAAmC,CAAC"}
1
+ {"version":3,"file":"regexp.d.ts","sourceRoot":"","sources":["../../../src/constants/regexp.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,QAAO,CAAC;AAEjC,eAAO,MAAM,WAAW,QAA2C,CAAC;AAEpE,eAAO,MAAM,4BAA4B,QAAsB,CAAC;AAEhE,eAAO,MAAM,kBAAkB,QAAW,CAAC;AAE3C,eAAO,MAAM,wBAAwB,QAA2C,CAAC;AAEjF,eAAO,MAAM,oBAAoB,QAAqD,CAAC;AAEvF,eAAO,MAAM,eAAe,WAAW,CAAC;AAGxC,eAAO,MAAM,qBAAqB,qCAA6C,CAAC;AAKhF,eAAO,MAAM,sBAAsB,6IAAqI,CAAC;AAEzK,eAAO,MAAM,sDAAsD,mJAAoC,CAAC;AAExG,eAAO,MAAM,uBAAuB,0JAAqE,CAAC;AAG1G,eAAO,MAAM,sBAAsB,8JAAmC,CAAC"}
@@ -1,11 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.VALID_SAMPLE_UTTERANCE = exports.VALID_SAMPLE_CHARACTERS = exports.VALID_SAMPLE_CHARACTERS_WITHOUT_CURLY_BRACES_OR_SPACES = exports.VALID_SPOKEN_CHARACTER = exports.VALID_LATIN_CHARACTER = exports.VALID_CHARACTER = exports.READABLE_VARIABLE_REGEXP = exports.IS_VARIABLE_REGEXP = exports.SLOT_ANNOTATION_SIMPLE_REGEX = exports.SLOT_REGEXP = exports.SPACE_REGEXP = void 0;
3
+ exports.VALID_SAMPLE_UTTERANCE = exports.VALID_SAMPLE_CHARACTERS = exports.VALID_SAMPLE_CHARACTERS_WITHOUT_CURLY_BRACES_OR_SPACES = exports.VALID_SPOKEN_CHARACTER = exports.VALID_LATIN_CHARACTER = exports.VALID_CHARACTER = exports.VARIABLE_ONLY_REGEXP = exports.READABLE_VARIABLE_REGEXP = exports.IS_VARIABLE_REGEXP = exports.SLOT_ANNOTATION_SIMPLE_REGEX = exports.SLOT_REGEXP = exports.SPACE_REGEXP = void 0;
4
4
  exports.SPACE_REGEXP = / /g;
5
5
  exports.SLOT_REGEXP = /{{\[([^ .[\]{}]*?)]\.([^ .[\]{}]*?)}}/g;
6
6
  exports.SLOT_ANNOTATION_SIMPLE_REGEX = /{([^ .[\]{}]+?)}/g;
7
7
  exports.IS_VARIABLE_REGEXP = /^{.*}$/;
8
- exports.READABLE_VARIABLE_REGEXP = /{(\w{1,64})}/g;
8
+ exports.READABLE_VARIABLE_REGEXP = /{(\w{1,64}((\[\d+])*(\.\w{1,64})*)*)}/g;
9
+ exports.VARIABLE_ONLY_REGEXP = new RegExp(`^${exports.READABLE_VARIABLE_REGEXP.source}$`);
9
10
  exports.VALID_CHARACTER = 'a-zA-Z';
10
11
  // Latin character Unicode points from https://tiny.amazon.com/1hix1tfzz/enwikiorgwikiList
11
12
  exports.VALID_LATIN_CHARACTER = `${exports.VALID_CHARACTER}\xC0-\xFF\u0100-\u017F`;
@@ -1,7 +1,12 @@
1
1
  export declare const variableReplacer: (match: string, inner: string, variables: Record<string, unknown>, modifier?: (variable: unknown) => unknown) => unknown;
2
- export declare const replaceVariables: (phrase: string | undefined | null, variables: Record<string, unknown>, modifier?: ((variable: unknown) => unknown) | undefined, { trim }?: {
2
+ export declare const splitVariableName: (inner: string) => {
3
+ id: string;
4
+ path: string;
5
+ };
6
+ export declare const replaceVariables: (phrase: string | undefined | null, variables: Record<string, unknown>, modifier?: ((variable: unknown) => unknown) | undefined, { trim, keepTypeIfOnlyVariable }?: {
3
7
  trim?: boolean;
4
- }) => string;
8
+ keepTypeIfOnlyVariable?: boolean;
9
+ }) => string | unknown;
5
10
  export declare const sanitizeVariables: (variables: Record<string, unknown>) => Record<string, unknown>;
6
11
  export declare const transformStringVariableToNumber: (str: string | number | null) => number | string | null;
7
12
  export declare const deepVariableSubstitution: <T>(bodyData: T, variableMap: Record<string, unknown>) => T;
@@ -1 +1 @@
1
- {"version":3,"file":"variables.d.ts","sourceRoot":"","sources":["../../../src/utils/variables.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,gBAAgB,UACpB,MAAM,SACN,MAAM,aACF,OAAO,MAAM,EAAE,OAAO,CAAC,aACvB,CAAC,QAAQ,EAAE,OAAO,KAAK,OAAO,KACxC,OAMF,CAAC;AAEF,eAAO,MAAM,gBAAgB,WACnB,MAAM,GAAG,SAAS,GAAG,IAAI,aACtB,OAAO,MAAM,EAAE,OAAO,CAAC,aACxB,CAAC,CAAC,QAAQ,EAAE,OAAO,KAAK,OAAO,CAAC,GAAG,SAAS,aACrC;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,KAClC,MAQF,CAAC;AAGF,eAAO,MAAM,iBAAiB,cAAe,OAAO,MAAM,EAAE,OAAO,CAAC,KAAG,OAAO,MAAM,EAAE,OAAO,CASrF,CAAC;AAET,eAAO,MAAM,+BAA+B,QAAS,MAAM,GAAG,MAAM,GAAG,IAAI,KAAG,MAAM,GAAG,MAAM,GAAG,IAY/F,CAAC;AAEF,eAAO,MAAM,wBAAwB,gBAAiB,CAAC,eAAe,OAAO,MAAM,EAAE,OAAO,CAAC,KAAG,CA2B/F,CAAC"}
1
+ {"version":3,"file":"variables.d.ts","sourceRoot":"","sources":["../../../src/utils/variables.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,gBAAgB,UACpB,MAAM,SACN,MAAM,aACF,OAAO,MAAM,EAAE,OAAO,CAAC,aACvB,CAAC,QAAQ,EAAE,OAAO,KAAK,OAAO,KACxC,OAmBF,CAAC;AAEF,eAAO,MAAM,iBAAiB,UAAW,MAAM;;;CAgC9C,CAAC;AAEF,eAAO,MAAM,gBAAgB,WACnB,MAAM,GAAG,SAAS,GAAG,IAAI,aACtB,OAAO,MAAM,EAAE,OAAO,CAAC,aACxB,CAAC,CAAC,QAAQ,EAAE,OAAO,KAAK,OAAO,CAAC,GAAG,SAAS,qCACL;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,sBAAsB,CAAC,EAAE,OAAO,CAAA;CAAE,KACpG,MAAM,GAAG,OAcX,CAAC;AAGF,eAAO,MAAM,iBAAiB,cAAe,OAAO,MAAM,EAAE,OAAO,CAAC,KAAG,OAAO,MAAM,EAAE,OAAO,CASrF,CAAC;AAET,eAAO,MAAM,+BAA+B,QAAS,MAAM,GAAG,MAAM,GAAG,IAAI,KAAG,MAAM,GAAG,MAAM,GAAG,IAY/F,CAAC;AAEF,eAAO,MAAM,wBAAwB,gBAAiB,CAAC,eAAe,OAAO,MAAM,EAAE,OAAO,CAAC,KAAG,CA2B/F,CAAC"}
@@ -1,18 +1,70 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.deepVariableSubstitution = exports.transformStringVariableToNumber = exports.sanitizeVariables = exports.replaceVariables = exports.variableReplacer = void 0;
6
+ exports.deepVariableSubstitution = exports.transformStringVariableToNumber = exports.sanitizeVariables = exports.replaceVariables = exports.splitVariableName = exports.variableReplacer = void 0;
4
7
  const constants_1 = require("../constants");
8
+ const get_js_1 = __importDefault(require("lodash/get.js"));
5
9
  const variableReplacer = (match, inner, variables, modifier) => {
6
- if (inner in variables) {
7
- return typeof modifier === 'function' ? modifier(variables[inner]) : variables[inner];
10
+ const { id, path } = (0, exports.splitVariableName)(inner);
11
+ if (!(id in variables)) {
12
+ return match;
13
+ }
14
+ if (!path) {
15
+ return typeof modifier === 'function' ? modifier(variables[id]) : variables[id];
16
+ }
17
+ try {
18
+ const variable = typeof variables[id] === 'string' ? JSON.parse(variables[id]) : variables[id];
19
+ return typeof modifier === 'function' ? modifier((0, get_js_1.default)(variable, path, 0)) : (0, get_js_1.default)(variable, path, 0);
20
+ }
21
+ catch (err) {
22
+ if (err?.message.includes('is not valid JSON')) {
23
+ return 0;
24
+ }
25
+ throw err;
8
26
  }
9
- return match;
10
27
  };
11
28
  exports.variableReplacer = variableReplacer;
12
- const replaceVariables = (phrase, variables, modifier = undefined, { trim = true } = {}) => {
29
+ const splitVariableName = (inner) => {
30
+ const firstDotIndex = inner.indexOf('.');
31
+ const firstSquareBracketIndex = inner.indexOf('[');
32
+ if (firstDotIndex === -1 && firstSquareBracketIndex === -1) {
33
+ return { id: inner, path: '' };
34
+ }
35
+ if (firstDotIndex !== -1 && firstSquareBracketIndex === -1) {
36
+ return {
37
+ id: inner.slice(0, firstDotIndex),
38
+ path: inner.slice(firstDotIndex + 1), // skip the dot
39
+ };
40
+ }
41
+ if (firstDotIndex === -1 && firstSquareBracketIndex !== -1) {
42
+ return {
43
+ id: inner.slice(0, firstSquareBracketIndex),
44
+ path: inner.slice(firstSquareBracketIndex),
45
+ };
46
+ }
47
+ if (firstDotIndex < firstSquareBracketIndex) {
48
+ return {
49
+ id: inner.slice(0, firstDotIndex),
50
+ path: inner.slice(firstDotIndex + 1), // skip the dot
51
+ };
52
+ }
53
+ return {
54
+ id: inner.slice(0, firstSquareBracketIndex),
55
+ path: inner.slice(firstSquareBracketIndex),
56
+ };
57
+ };
58
+ exports.splitVariableName = splitVariableName;
59
+ const replaceVariables = (phrase, variables, modifier = undefined, { trim = true, keepTypeIfOnlyVariable = false } = {}) => {
13
60
  if (!phrase || (trim && !phrase.trim())) {
14
61
  return '';
15
62
  }
63
+ if (keepTypeIfOnlyVariable && phrase.match(constants_1.VARIABLE_ONLY_REGEXP)) {
64
+ // remove the curly braces {} from phrase to get the inner
65
+ const inner = phrase.slice(1, -1);
66
+ return (0, exports.variableReplacer)(phrase, inner, variables, modifier);
67
+ }
16
68
  return phrase.replace(constants_1.READABLE_VARIABLE_REGEXP, (match, inner) => String((0, exports.variableReplacer)(match, inner, variables, modifier)));
17
69
  };
18
70
  exports.replaceVariables = replaceVariables;
@@ -3,6 +3,7 @@ export declare const SLOT_REGEXP: RegExp;
3
3
  export declare const SLOT_ANNOTATION_SIMPLE_REGEX: RegExp;
4
4
  export declare const IS_VARIABLE_REGEXP: RegExp;
5
5
  export declare const READABLE_VARIABLE_REGEXP: RegExp;
6
+ export declare const VARIABLE_ONLY_REGEXP: RegExp;
6
7
  export declare const VALID_CHARACTER = "a-zA-Z";
7
8
  export declare const VALID_LATIN_CHARACTER = "a-zA-Z\u00C0-\u00FF\u0100-\u017F";
8
9
  export declare const VALID_SPOKEN_CHARACTER = "a-zA-Z\u00C0-\u00FF\u0100-\u017F\u0900-\u0965\u0970-\u097F\u3000-\u303F\u3040-\u309F\u30A0-\u30FF\uFF00-\uFF9F\u4E00-\u9FAF\u3400-\u4DBF";
@@ -1 +1 @@
1
- {"version":3,"file":"regexp.d.ts","sourceRoot":"","sources":["../../../src/constants/regexp.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,QAAO,CAAC;AAEjC,eAAO,MAAM,WAAW,QAA2C,CAAC;AAEpE,eAAO,MAAM,4BAA4B,QAAsB,CAAC;AAEhE,eAAO,MAAM,kBAAkB,QAAW,CAAC;AAE3C,eAAO,MAAM,wBAAwB,QAAkB,CAAC;AAExD,eAAO,MAAM,eAAe,WAAW,CAAC;AAGxC,eAAO,MAAM,qBAAqB,qCAA6C,CAAC;AAKhF,eAAO,MAAM,sBAAsB,6IAAqI,CAAC;AAEzK,eAAO,MAAM,sDAAsD,mJAAoC,CAAC;AAExG,eAAO,MAAM,uBAAuB,0JAAqE,CAAC;AAG1G,eAAO,MAAM,sBAAsB,8JAAmC,CAAC"}
1
+ {"version":3,"file":"regexp.d.ts","sourceRoot":"","sources":["../../../src/constants/regexp.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,QAAO,CAAC;AAEjC,eAAO,MAAM,WAAW,QAA2C,CAAC;AAEpE,eAAO,MAAM,4BAA4B,QAAsB,CAAC;AAEhE,eAAO,MAAM,kBAAkB,QAAW,CAAC;AAE3C,eAAO,MAAM,wBAAwB,QAA2C,CAAC;AAEjF,eAAO,MAAM,oBAAoB,QAAqD,CAAC;AAEvF,eAAO,MAAM,eAAe,WAAW,CAAC;AAGxC,eAAO,MAAM,qBAAqB,qCAA6C,CAAC;AAKhF,eAAO,MAAM,sBAAsB,6IAAqI,CAAC;AAEzK,eAAO,MAAM,sDAAsD,mJAAoC,CAAC;AAExG,eAAO,MAAM,uBAAuB,0JAAqE,CAAC;AAG1G,eAAO,MAAM,sBAAsB,8JAAmC,CAAC"}
@@ -2,7 +2,8 @@ export const SPACE_REGEXP = / /g;
2
2
  export const SLOT_REGEXP = /{{\[([^ .[\]{}]*?)]\.([^ .[\]{}]*?)}}/g;
3
3
  export const SLOT_ANNOTATION_SIMPLE_REGEX = /{([^ .[\]{}]+?)}/g;
4
4
  export const IS_VARIABLE_REGEXP = /^{.*}$/;
5
- export const READABLE_VARIABLE_REGEXP = /{(\w{1,64})}/g;
5
+ export const READABLE_VARIABLE_REGEXP = /{(\w{1,64}((\[\d+])*(\.\w{1,64})*)*)}/g;
6
+ export const VARIABLE_ONLY_REGEXP = new RegExp(`^${READABLE_VARIABLE_REGEXP.source}$`);
6
7
  export const VALID_CHARACTER = 'a-zA-Z';
7
8
  // Latin character Unicode points from https://tiny.amazon.com/1hix1tfzz/enwikiorgwikiList
8
9
  export const VALID_LATIN_CHARACTER = `${VALID_CHARACTER}\xC0-\xFF\u0100-\u017F`;
@@ -1,7 +1,12 @@
1
1
  export declare const variableReplacer: (match: string, inner: string, variables: Record<string, unknown>, modifier?: (variable: unknown) => unknown) => unknown;
2
- export declare const replaceVariables: (phrase: string | undefined | null, variables: Record<string, unknown>, modifier?: ((variable: unknown) => unknown) | undefined, { trim }?: {
2
+ export declare const splitVariableName: (inner: string) => {
3
+ id: string;
4
+ path: string;
5
+ };
6
+ export declare const replaceVariables: (phrase: string | undefined | null, variables: Record<string, unknown>, modifier?: ((variable: unknown) => unknown) | undefined, { trim, keepTypeIfOnlyVariable }?: {
3
7
  trim?: boolean;
4
- }) => string;
8
+ keepTypeIfOnlyVariable?: boolean;
9
+ }) => string | unknown;
5
10
  export declare const sanitizeVariables: (variables: Record<string, unknown>) => Record<string, unknown>;
6
11
  export declare const transformStringVariableToNumber: (str: string | number | null) => number | string | null;
7
12
  export declare const deepVariableSubstitution: <T>(bodyData: T, variableMap: Record<string, unknown>) => T;
@@ -1 +1 @@
1
- {"version":3,"file":"variables.d.ts","sourceRoot":"","sources":["../../../src/utils/variables.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,gBAAgB,UACpB,MAAM,SACN,MAAM,aACF,OAAO,MAAM,EAAE,OAAO,CAAC,aACvB,CAAC,QAAQ,EAAE,OAAO,KAAK,OAAO,KACxC,OAMF,CAAC;AAEF,eAAO,MAAM,gBAAgB,WACnB,MAAM,GAAG,SAAS,GAAG,IAAI,aACtB,OAAO,MAAM,EAAE,OAAO,CAAC,aACxB,CAAC,CAAC,QAAQ,EAAE,OAAO,KAAK,OAAO,CAAC,GAAG,SAAS,aACrC;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,KAClC,MAQF,CAAC;AAGF,eAAO,MAAM,iBAAiB,cAAe,OAAO,MAAM,EAAE,OAAO,CAAC,KAAG,OAAO,MAAM,EAAE,OAAO,CASrF,CAAC;AAET,eAAO,MAAM,+BAA+B,QAAS,MAAM,GAAG,MAAM,GAAG,IAAI,KAAG,MAAM,GAAG,MAAM,GAAG,IAY/F,CAAC;AAEF,eAAO,MAAM,wBAAwB,gBAAiB,CAAC,eAAe,OAAO,MAAM,EAAE,OAAO,CAAC,KAAG,CA2B/F,CAAC"}
1
+ {"version":3,"file":"variables.d.ts","sourceRoot":"","sources":["../../../src/utils/variables.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,gBAAgB,UACpB,MAAM,SACN,MAAM,aACF,OAAO,MAAM,EAAE,OAAO,CAAC,aACvB,CAAC,QAAQ,EAAE,OAAO,KAAK,OAAO,KACxC,OAmBF,CAAC;AAEF,eAAO,MAAM,iBAAiB,UAAW,MAAM;;;CAgC9C,CAAC;AAEF,eAAO,MAAM,gBAAgB,WACnB,MAAM,GAAG,SAAS,GAAG,IAAI,aACtB,OAAO,MAAM,EAAE,OAAO,CAAC,aACxB,CAAC,CAAC,QAAQ,EAAE,OAAO,KAAK,OAAO,CAAC,GAAG,SAAS,qCACL;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,sBAAsB,CAAC,EAAE,OAAO,CAAA;CAAE,KACpG,MAAM,GAAG,OAcX,CAAC;AAGF,eAAO,MAAM,iBAAiB,cAAe,OAAO,MAAM,EAAE,OAAO,CAAC,KAAG,OAAO,MAAM,EAAE,OAAO,CASrF,CAAC;AAET,eAAO,MAAM,+BAA+B,QAAS,MAAM,GAAG,MAAM,GAAG,IAAI,KAAG,MAAM,GAAG,MAAM,GAAG,IAY/F,CAAC;AAEF,eAAO,MAAM,wBAAwB,gBAAiB,CAAC,eAAe,OAAO,MAAM,EAAE,OAAO,CAAC,KAAG,CA2B/F,CAAC"}
@@ -1,14 +1,62 @@
1
- import { READABLE_VARIABLE_REGEXP } from '../constants/index.js';
1
+ import { READABLE_VARIABLE_REGEXP, VARIABLE_ONLY_REGEXP } from '../constants/index.js';
2
+ import _get from 'lodash/get.js';
2
3
  export const variableReplacer = (match, inner, variables, modifier) => {
3
- if (inner in variables) {
4
- return typeof modifier === 'function' ? modifier(variables[inner]) : variables[inner];
4
+ const { id, path } = splitVariableName(inner);
5
+ if (!(id in variables)) {
6
+ return match;
7
+ }
8
+ if (!path) {
9
+ return typeof modifier === 'function' ? modifier(variables[id]) : variables[id];
10
+ }
11
+ try {
12
+ const variable = typeof variables[id] === 'string' ? JSON.parse(variables[id]) : variables[id];
13
+ return typeof modifier === 'function' ? modifier(_get(variable, path, 0)) : _get(variable, path, 0);
14
+ }
15
+ catch (err) {
16
+ if (err?.message.includes('is not valid JSON')) {
17
+ return 0;
18
+ }
19
+ throw err;
5
20
  }
6
- return match;
7
21
  };
8
- export const replaceVariables = (phrase, variables, modifier = undefined, { trim = true } = {}) => {
22
+ export const splitVariableName = (inner) => {
23
+ const firstDotIndex = inner.indexOf('.');
24
+ const firstSquareBracketIndex = inner.indexOf('[');
25
+ if (firstDotIndex === -1 && firstSquareBracketIndex === -1) {
26
+ return { id: inner, path: '' };
27
+ }
28
+ if (firstDotIndex !== -1 && firstSquareBracketIndex === -1) {
29
+ return {
30
+ id: inner.slice(0, firstDotIndex),
31
+ path: inner.slice(firstDotIndex + 1), // skip the dot
32
+ };
33
+ }
34
+ if (firstDotIndex === -1 && firstSquareBracketIndex !== -1) {
35
+ return {
36
+ id: inner.slice(0, firstSquareBracketIndex),
37
+ path: inner.slice(firstSquareBracketIndex),
38
+ };
39
+ }
40
+ if (firstDotIndex < firstSquareBracketIndex) {
41
+ return {
42
+ id: inner.slice(0, firstDotIndex),
43
+ path: inner.slice(firstDotIndex + 1), // skip the dot
44
+ };
45
+ }
46
+ return {
47
+ id: inner.slice(0, firstSquareBracketIndex),
48
+ path: inner.slice(firstSquareBracketIndex),
49
+ };
50
+ };
51
+ export const replaceVariables = (phrase, variables, modifier = undefined, { trim = true, keepTypeIfOnlyVariable = false } = {}) => {
9
52
  if (!phrase || (trim && !phrase.trim())) {
10
53
  return '';
11
54
  }
55
+ if (keepTypeIfOnlyVariable && phrase.match(VARIABLE_ONLY_REGEXP)) {
56
+ // remove the curly braces {} from phrase to get the inner
57
+ const inner = phrase.slice(1, -1);
58
+ return variableReplacer(phrase, inner, variables, modifier);
59
+ }
12
60
  return phrase.replace(READABLE_VARIABLE_REGEXP, (match, inner) => String(variableReplacer(match, inner, variables, modifier)));
13
61
  };
14
62
  // turn float variables to 4 decimal places
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voiceflow/common",
3
- "version": "8.3.2",
3
+ "version": "8.4.0",
4
4
  "description": "Junk drawer of utility functions",
5
5
  "keywords": [
6
6
  "voiceflow"
@@ -60,5 +60,5 @@
60
60
  "publishConfig": {
61
61
  "access": "public"
62
62
  },
63
- "gitHead": "eb8d92af87448d5f34d648d0e1e48992c42ec289"
63
+ "gitHead": "60ae823bb810ed7874dce0c23a011a00d2a6db62"
64
64
  }