@voiceflow/utils-designer 1.23.1 → 1.24.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 @@ import type { Entity, Markup, MarkupSpan, Variable } from '@voiceflow/dtos';
3
3
  import type { MultiAdapter } from 'bidirectional-adapter';
4
4
  export type MarkupItem = Markup[number];
5
5
  export declare const ENTITY_OR_VARIABLE_TEXT_REGEXP: RegExp;
6
+ export declare const EXPRESSION_VARIABLE_TEXT_REGEXP: RegExp;
6
7
  export interface MarkupSpanText extends Omit<MarkupSpan, 'text'> {
7
8
  text: [string];
8
9
  attributes: {
@@ -52,6 +53,7 @@ export declare const replaceMarkupEntity: (markup: Markup, { oldEntityID, newEnt
52
53
  }) => Markup;
53
54
  export declare const fillMarkupWithVariablesValues: (promptText: string, variables: Record<string, string>) => string;
54
55
  export declare const markupToString: MultiAdapter<Markup, string, [MarkupToStringFromOptions], [MarkupToStringToOptions]>;
56
+ export declare const markupToExpression: MultiAdapter<Markup, string, [MarkupToStringFromOptions], [MarkupToStringToOptions]>;
55
57
  export declare const markupToSlate: MultiAdapter<Markup, BaseText.SlateTextValue, [{
56
58
  iteration?: number | undefined;
57
59
  entitiesMapByID: Partial<Record<string, Entity>>;
@@ -1 +1 @@
1
- {"version":3,"file":"markup.util.d.ts","sourceRoot":"","sources":["../../src/markup.util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAK1D,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AAExC,eAAO,MAAM,8BAA8B,QAAa,CAAC;AAEzD,MAAM,WAAW,cAAe,SAAQ,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC;IAC9D,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC;IACf,UAAU,EAAE;QACV,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,cAAe,SAAQ,UAAU;IAChD,UAAU,EAAE;QACV,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;CACH;AAED,eAAO,MAAM,yBAAyB,eAAgB,MAAM,CAAC,MAAM,CAAC;gBAA+B,MAAM;CAExG,CAAC;AAEF,eAAO,MAAM,uBAAuB,eAAgB,MAAM,CAAC,MAAM,CAAC;cAA6B,MAAM;CAEpG,CAAC;AAEF,eAAO,MAAM,aAAa,2BAA4C,CAAC;AAEvE,eAAO,MAAM,YAAY,UAAW,UAAU,wBAC2B,CAAC;AAE1E,eAAO,MAAM,gBAAgB,UAAW,UAAU,4BAIf,CAAC;AAEpC,eAAO,MAAM,gBAAgB,UAAW,UAAU,4BACa,CAAC;AAEhE,eAAO,MAAM,cAAc,UAAW,UAAU;cAAwB,MAAM;CACD,CAAC;AAE9E,eAAO,MAAM,cAAc,UAAW,UAAU,oBAA+C,CAAC;AAEhG,eAAO,MAAM,gBAAgB,UAAW,UAAU;gBAA0B,MAAM;CACH,CAAC;AAEhF,eAAO,MAAM,aAAa,sBAAqB,OAI5C,CAAC;AAEJ,eAAO,MAAM,oBAAoB,sBAAqB,OAYrD,CAAC;AAEF,UAAU,yBAAyB;IACjC,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACjD,gBAAgB,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IACpD,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,UAAU,uBAAuB;IAC/B,iBAAiB,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,kBAAkB,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;CACvD;AAiBD,eAAO,MAAM,kBAAkB,8BAAwE,CAAC;AAiBxG,eAAO,MAAM,oBAAoB,8BAA0E,CAAC;AAE5G,eAAO,MAAM,mBAAmB;iBAEe,MAAM;iBAAe,MAAM;YAWzE,CAAC;AAEF,eAAO,MAAM,6BAA6B,eAAgB,MAAM,aAAa,OAAO,MAAM,EAAE,MAAM,CAAC,WAOlG,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,yBAAyB,CAAC,EAAE,CAAC,uBAAuB,CAAC,CA8E7G,CAAC;AAOJ,eAAO,MAAM,aAAa;;qBAMH,QAAQ,OAAO,MAAM,EAAE,MAAM,CAAC,CAAC;sBAC9B,QAAQ,OAAO,MAAM,EAAE,QAAQ,CAAC,CAAC;OA2HxD,CAAC"}
1
+ {"version":3,"file":"markup.util.d.ts","sourceRoot":"","sources":["../../src/markup.util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAK1D,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AAExC,eAAO,MAAM,8BAA8B,QAAa,CAAC;AACzD,eAAO,MAAM,+BAA+B,QAAyB,CAAC;AAEtE,MAAM,WAAW,cAAe,SAAQ,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC;IAC9D,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC;IACf,UAAU,EAAE;QACV,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,cAAe,SAAQ,UAAU;IAChD,UAAU,EAAE;QACV,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;CACH;AAED,eAAO,MAAM,yBAAyB,eAAgB,MAAM,CAAC,MAAM,CAAC;gBAA+B,MAAM;CAExG,CAAC;AAEF,eAAO,MAAM,uBAAuB,eAAgB,MAAM,CAAC,MAAM,CAAC;cAA6B,MAAM;CAEpG,CAAC;AAEF,eAAO,MAAM,aAAa,2BAA4C,CAAC;AAEvE,eAAO,MAAM,YAAY,UAAW,UAAU,wBAC2B,CAAC;AAE1E,eAAO,MAAM,gBAAgB,UAAW,UAAU,4BAIf,CAAC;AAEpC,eAAO,MAAM,gBAAgB,UAAW,UAAU,4BACa,CAAC;AAEhE,eAAO,MAAM,cAAc,UAAW,UAAU;cAAwB,MAAM;CACD,CAAC;AAE9E,eAAO,MAAM,cAAc,UAAW,UAAU,oBAA+C,CAAC;AAEhG,eAAO,MAAM,gBAAgB,UAAW,UAAU;gBAA0B,MAAM;CACH,CAAC;AAEhF,eAAO,MAAM,aAAa,sBAAqB,OAI5C,CAAC;AAEJ,eAAO,MAAM,oBAAoB,sBAAqB,OAYrD,CAAC;AAEF,UAAU,yBAAyB;IACjC,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACjD,gBAAgB,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IACpD,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,UAAU,uBAAuB;IAC/B,iBAAiB,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,kBAAkB,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;CACvD;AAiBD,eAAO,MAAM,kBAAkB,8BAAwE,CAAC;AAiBxG,eAAO,MAAM,oBAAoB,8BAA0E,CAAC;AAE5G,eAAO,MAAM,mBAAmB;iBAEe,MAAM;iBAAe,MAAM;YAWzE,CAAC;AAEF,eAAO,MAAM,6BAA6B,eAAgB,MAAM,aAAa,OAAO,MAAM,EAAE,MAAM,CAAC,WAOlG,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,yBAAyB,CAAC,EAAE,CAAC,uBAAuB,CAAC,CA+E7G,CAAC;AAEJ,eAAO,MAAM,kBAAkB,EAAE,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,yBAAyB,CAAC,EAAE,CAAC,uBAAuB,CAAC,CA+EjH,CAAC;AAOJ,eAAO,MAAM,aAAa;;qBAMH,QAAQ,OAAO,MAAM,EAAE,MAAM,CAAC,CAAC;sBAC9B,QAAQ,OAAO,MAAM,EAAE,QAAQ,CAAC,CAAC;OA2HxD,CAAC"}
@@ -1,12 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.markupToSlate = exports.markupToString = exports.fillMarkupWithVariablesValues = exports.replaceMarkupEntity = exports.getMarkupVariableIDs = exports.getMarkupEntityIDs = exports.isMarkupWithEntities = exports.isMarkupEmpty = exports.isMarkupVariable = exports.isMarkupString = exports.isMarkupEntity = exports.isMarkupSpanLink = exports.isMarkupSpanText = exports.isMarkupSpan = exports.markupFactory = exports.isMarkupEntityReference = exports.isMarkupVariableReference = exports.ENTITY_OR_VARIABLE_TEXT_REGEXP = void 0;
3
+ exports.markupToSlate = exports.markupToExpression = exports.markupToString = exports.fillMarkupWithVariablesValues = exports.replaceMarkupEntity = exports.getMarkupVariableIDs = exports.getMarkupEntityIDs = exports.isMarkupWithEntities = exports.isMarkupEmpty = exports.isMarkupVariable = exports.isMarkupString = exports.isMarkupEntity = exports.isMarkupSpanLink = exports.isMarkupSpanText = exports.isMarkupSpan = exports.markupFactory = exports.isMarkupEntityReference = exports.isMarkupVariableReference = exports.EXPRESSION_VARIABLE_TEXT_REGEXP = exports.ENTITY_OR_VARIABLE_TEXT_REGEXP = void 0;
4
4
  const base_types_1 = require("@voiceflow/base-types");
5
5
  const common_1 = require("@voiceflow/common");
6
6
  const bidirectional_adapter_1 = require("bidirectional-adapter");
7
7
  const slate_1 = require("slate");
8
8
  const ts_pattern_1 = require("ts-pattern");
9
9
  exports.ENTITY_OR_VARIABLE_TEXT_REGEXP = /{(\w*)}/g;
10
+ exports.EXPRESSION_VARIABLE_TEXT_REGEXP = /{{\[(\w*)]\.(\w*)}}/g;
10
11
  const isMarkupVariableReference = (markupItem) => {
11
12
  return markupItem.variableID !== undefined;
12
13
  };
@@ -106,9 +107,12 @@ exports.markupToString = (0, bidirectional_adapter_1.createMultiAdapter)((markup
106
107
  .when(exports.isMarkupEntity, ({ entityID }) => !entitiesMapByID[entityID] && ignoreMissingEntities
107
108
  ? ''
108
109
  : `{${entitiesMapByID[entityID]?.name ?? entityID}}`)
109
- .when(exports.isMarkupVariable, ({ variableID }) => !variablesMapByID[variableID] && ignoreMissingVariables
110
- ? ''
111
- : `{${variablesMapByID[variableID]?.name ?? variableID}}`)
110
+ .when(exports.isMarkupVariable, ({ variableID }) => {
111
+ if (!variablesMapByID[variableID] && ignoreMissingVariables) {
112
+ return '';
113
+ }
114
+ return `{${variablesMapByID[variableID]?.name ?? variableID}}`;
115
+ })
112
116
  .exhaustive(), ''), (text, { entitiesMapByName, variablesMapByName }) => {
113
117
  const matches = [...text.matchAll(exports.ENTITY_OR_VARIABLE_TEXT_REGEXP)];
114
118
  if (!matches.length)
@@ -150,6 +154,63 @@ exports.markupToString = (0, bidirectional_adapter_1.createMultiAdapter)((markup
150
154
  }
151
155
  return [span];
152
156
  });
157
+ exports.markupToExpression = (0, bidirectional_adapter_1.createMultiAdapter)((markup, { entitiesMapByID, variablesMapByID, ignoreMissingEntities, ignoreMissingVariables } = {
158
+ entitiesMapByID: {},
159
+ variablesMapByID: {},
160
+ }) => markup.reduce((acc, item) => acc +
161
+ (0, ts_pattern_1.match)(item)
162
+ .when(exports.isMarkupSpan, ({ text }) => exports.markupToExpression.fromDB(text, { entitiesMapByID, variablesMapByID }))
163
+ .when(exports.isMarkupString, (item) => item)
164
+ .when(exports.isMarkupEntity, ({ entityID }) => !entitiesMapByID[entityID] && ignoreMissingEntities
165
+ ? ''
166
+ : `{${entitiesMapByID[entityID]?.name ?? entityID}}`)
167
+ .when(exports.isMarkupVariable, ({ variableID }) => {
168
+ if (!variablesMapByID[variableID] && ignoreMissingVariables) {
169
+ return '';
170
+ }
171
+ return `{{[${variablesMapByID[variableID]?.name ?? variableID}].${variableID}}}`;
172
+ })
173
+ .exhaustive(), ''), (text, { entitiesMapByName, variablesMapByName }) => {
174
+ const matches = [...text.matchAll(exports.EXPRESSION_VARIABLE_TEXT_REGEXP)];
175
+ if (!matches.length)
176
+ return [{ text: [text] }];
177
+ const span = {
178
+ text: [],
179
+ };
180
+ let prevMatch = null;
181
+ for (const match of matches) {
182
+ const entity = entitiesMapByName[match[1]];
183
+ const variable = variablesMapByName[match[1]];
184
+ let substring;
185
+ if (!prevMatch) {
186
+ substring = text.substring(0, match.index);
187
+ }
188
+ else {
189
+ substring = text.substring(prevMatch.index + prevMatch[0].length, match.index);
190
+ }
191
+ if (substring) {
192
+ span.text.push(substring);
193
+ }
194
+ if (entity) {
195
+ span.text.push({ entityID: entity.id });
196
+ }
197
+ else if (variable) {
198
+ span.text.push({ variableID: variable.id });
199
+ }
200
+ else {
201
+ span.text.push(match[0]);
202
+ }
203
+ prevMatch = match;
204
+ }
205
+ if (!prevMatch) {
206
+ return [span];
207
+ }
208
+ const substring = text.substring(prevMatch.index + prevMatch[0].length, text.length);
209
+ if (substring) {
210
+ span.text.push(substring);
211
+ }
212
+ return [span];
213
+ });
153
214
  const isEmptyState = (nodes) => nodes.every((element) => slate_1.Text.isText(element) ? !element.text.trim() : element.type !== 'variable' && isEmptyState(element.children));
154
215
  exports.markupToSlate = (0, bidirectional_adapter_1.createMultiAdapter)((markup, { iteration = 0, entitiesMapByID, variablesMapByID }) => {
155
216
  if (!markup?.length)
@@ -3,6 +3,7 @@ import type { Entity, Markup, MarkupSpan, Variable } from '@voiceflow/dtos';
3
3
  import type { MultiAdapter } from 'bidirectional-adapter';
4
4
  export type MarkupItem = Markup[number];
5
5
  export declare const ENTITY_OR_VARIABLE_TEXT_REGEXP: RegExp;
6
+ export declare const EXPRESSION_VARIABLE_TEXT_REGEXP: RegExp;
6
7
  export interface MarkupSpanText extends Omit<MarkupSpan, 'text'> {
7
8
  text: [string];
8
9
  attributes: {
@@ -52,6 +53,7 @@ export declare const replaceMarkupEntity: (markup: Markup, { oldEntityID, newEnt
52
53
  }) => Markup;
53
54
  export declare const fillMarkupWithVariablesValues: (promptText: string, variables: Record<string, string>) => string;
54
55
  export declare const markupToString: MultiAdapter<Markup, string, [MarkupToStringFromOptions], [MarkupToStringToOptions]>;
56
+ export declare const markupToExpression: MultiAdapter<Markup, string, [MarkupToStringFromOptions], [MarkupToStringToOptions]>;
55
57
  export declare const markupToSlate: MultiAdapter<Markup, BaseText.SlateTextValue, [{
56
58
  iteration?: number | undefined;
57
59
  entitiesMapByID: Partial<Record<string, Entity>>;
@@ -1 +1 @@
1
- {"version":3,"file":"markup.util.d.ts","sourceRoot":"","sources":["../../src/markup.util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAK1D,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AAExC,eAAO,MAAM,8BAA8B,QAAa,CAAC;AAEzD,MAAM,WAAW,cAAe,SAAQ,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC;IAC9D,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC;IACf,UAAU,EAAE;QACV,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,cAAe,SAAQ,UAAU;IAChD,UAAU,EAAE;QACV,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;CACH;AAED,eAAO,MAAM,yBAAyB,eAAgB,MAAM,CAAC,MAAM,CAAC;gBAA+B,MAAM;CAExG,CAAC;AAEF,eAAO,MAAM,uBAAuB,eAAgB,MAAM,CAAC,MAAM,CAAC;cAA6B,MAAM;CAEpG,CAAC;AAEF,eAAO,MAAM,aAAa,2BAA4C,CAAC;AAEvE,eAAO,MAAM,YAAY,UAAW,UAAU,wBAC2B,CAAC;AAE1E,eAAO,MAAM,gBAAgB,UAAW,UAAU,4BAIf,CAAC;AAEpC,eAAO,MAAM,gBAAgB,UAAW,UAAU,4BACa,CAAC;AAEhE,eAAO,MAAM,cAAc,UAAW,UAAU;cAAwB,MAAM;CACD,CAAC;AAE9E,eAAO,MAAM,cAAc,UAAW,UAAU,oBAA+C,CAAC;AAEhG,eAAO,MAAM,gBAAgB,UAAW,UAAU;gBAA0B,MAAM;CACH,CAAC;AAEhF,eAAO,MAAM,aAAa,sBAAqB,OAI5C,CAAC;AAEJ,eAAO,MAAM,oBAAoB,sBAAqB,OAYrD,CAAC;AAEF,UAAU,yBAAyB;IACjC,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACjD,gBAAgB,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IACpD,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,UAAU,uBAAuB;IAC/B,iBAAiB,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,kBAAkB,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;CACvD;AAiBD,eAAO,MAAM,kBAAkB,8BAAwE,CAAC;AAiBxG,eAAO,MAAM,oBAAoB,8BAA0E,CAAC;AAE5G,eAAO,MAAM,mBAAmB;iBAEe,MAAM;iBAAe,MAAM;YAWzE,CAAC;AAEF,eAAO,MAAM,6BAA6B,eAAgB,MAAM,aAAa,OAAO,MAAM,EAAE,MAAM,CAAC,WAOlG,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,yBAAyB,CAAC,EAAE,CAAC,uBAAuB,CAAC,CA8E7G,CAAC;AAOJ,eAAO,MAAM,aAAa;;qBAMH,QAAQ,OAAO,MAAM,EAAE,MAAM,CAAC,CAAC;sBAC9B,QAAQ,OAAO,MAAM,EAAE,QAAQ,CAAC,CAAC;OA2HxD,CAAC"}
1
+ {"version":3,"file":"markup.util.d.ts","sourceRoot":"","sources":["../../src/markup.util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAK1D,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AAExC,eAAO,MAAM,8BAA8B,QAAa,CAAC;AACzD,eAAO,MAAM,+BAA+B,QAAyB,CAAC;AAEtE,MAAM,WAAW,cAAe,SAAQ,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC;IAC9D,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC;IACf,UAAU,EAAE;QACV,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,cAAe,SAAQ,UAAU;IAChD,UAAU,EAAE;QACV,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;CACH;AAED,eAAO,MAAM,yBAAyB,eAAgB,MAAM,CAAC,MAAM,CAAC;gBAA+B,MAAM;CAExG,CAAC;AAEF,eAAO,MAAM,uBAAuB,eAAgB,MAAM,CAAC,MAAM,CAAC;cAA6B,MAAM;CAEpG,CAAC;AAEF,eAAO,MAAM,aAAa,2BAA4C,CAAC;AAEvE,eAAO,MAAM,YAAY,UAAW,UAAU,wBAC2B,CAAC;AAE1E,eAAO,MAAM,gBAAgB,UAAW,UAAU,4BAIf,CAAC;AAEpC,eAAO,MAAM,gBAAgB,UAAW,UAAU,4BACa,CAAC;AAEhE,eAAO,MAAM,cAAc,UAAW,UAAU;cAAwB,MAAM;CACD,CAAC;AAE9E,eAAO,MAAM,cAAc,UAAW,UAAU,oBAA+C,CAAC;AAEhG,eAAO,MAAM,gBAAgB,UAAW,UAAU;gBAA0B,MAAM;CACH,CAAC;AAEhF,eAAO,MAAM,aAAa,sBAAqB,OAI5C,CAAC;AAEJ,eAAO,MAAM,oBAAoB,sBAAqB,OAYrD,CAAC;AAEF,UAAU,yBAAyB;IACjC,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACjD,gBAAgB,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IACpD,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,UAAU,uBAAuB;IAC/B,iBAAiB,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,kBAAkB,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;CACvD;AAiBD,eAAO,MAAM,kBAAkB,8BAAwE,CAAC;AAiBxG,eAAO,MAAM,oBAAoB,8BAA0E,CAAC;AAE5G,eAAO,MAAM,mBAAmB;iBAEe,MAAM;iBAAe,MAAM;YAWzE,CAAC;AAEF,eAAO,MAAM,6BAA6B,eAAgB,MAAM,aAAa,OAAO,MAAM,EAAE,MAAM,CAAC,WAOlG,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,yBAAyB,CAAC,EAAE,CAAC,uBAAuB,CAAC,CA+E7G,CAAC;AAEJ,eAAO,MAAM,kBAAkB,EAAE,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,yBAAyB,CAAC,EAAE,CAAC,uBAAuB,CAAC,CA+EjH,CAAC;AAOJ,eAAO,MAAM,aAAa;;qBAMH,QAAQ,OAAO,MAAM,EAAE,MAAM,CAAC,CAAC;sBAC9B,QAAQ,OAAO,MAAM,EAAE,QAAQ,CAAC,CAAC;OA2HxD,CAAC"}
@@ -4,6 +4,7 @@ import { createMultiAdapter } from 'bidirectional-adapter';
4
4
  import { Text } from 'slate';
5
5
  import { match } from 'ts-pattern';
6
6
  export const ENTITY_OR_VARIABLE_TEXT_REGEXP = /{(\w*)}/g;
7
+ export const EXPRESSION_VARIABLE_TEXT_REGEXP = /{{\[(\w*)]\.(\w*)}}/g;
7
8
  export const isMarkupVariableReference = (markupItem) => {
8
9
  return markupItem.variableID !== undefined;
9
10
  };
@@ -88,9 +89,12 @@ export const markupToString = createMultiAdapter((markup, { entitiesMapByID, var
88
89
  .when(isMarkupEntity, ({ entityID }) => !entitiesMapByID[entityID] && ignoreMissingEntities
89
90
  ? ''
90
91
  : `{${entitiesMapByID[entityID]?.name ?? entityID}}`)
91
- .when(isMarkupVariable, ({ variableID }) => !variablesMapByID[variableID] && ignoreMissingVariables
92
- ? ''
93
- : `{${variablesMapByID[variableID]?.name ?? variableID}}`)
92
+ .when(isMarkupVariable, ({ variableID }) => {
93
+ if (!variablesMapByID[variableID] && ignoreMissingVariables) {
94
+ return '';
95
+ }
96
+ return `{${variablesMapByID[variableID]?.name ?? variableID}}`;
97
+ })
94
98
  .exhaustive(), ''), (text, { entitiesMapByName, variablesMapByName }) => {
95
99
  const matches = [...text.matchAll(ENTITY_OR_VARIABLE_TEXT_REGEXP)];
96
100
  if (!matches.length)
@@ -132,6 +136,63 @@ export const markupToString = createMultiAdapter((markup, { entitiesMapByID, var
132
136
  }
133
137
  return [span];
134
138
  });
139
+ export const markupToExpression = createMultiAdapter((markup, { entitiesMapByID, variablesMapByID, ignoreMissingEntities, ignoreMissingVariables } = {
140
+ entitiesMapByID: {},
141
+ variablesMapByID: {},
142
+ }) => markup.reduce((acc, item) => acc +
143
+ match(item)
144
+ .when(isMarkupSpan, ({ text }) => markupToExpression.fromDB(text, { entitiesMapByID, variablesMapByID }))
145
+ .when(isMarkupString, (item) => item)
146
+ .when(isMarkupEntity, ({ entityID }) => !entitiesMapByID[entityID] && ignoreMissingEntities
147
+ ? ''
148
+ : `{${entitiesMapByID[entityID]?.name ?? entityID}}`)
149
+ .when(isMarkupVariable, ({ variableID }) => {
150
+ if (!variablesMapByID[variableID] && ignoreMissingVariables) {
151
+ return '';
152
+ }
153
+ return `{{[${variablesMapByID[variableID]?.name ?? variableID}].${variableID}}}`;
154
+ })
155
+ .exhaustive(), ''), (text, { entitiesMapByName, variablesMapByName }) => {
156
+ const matches = [...text.matchAll(EXPRESSION_VARIABLE_TEXT_REGEXP)];
157
+ if (!matches.length)
158
+ return [{ text: [text] }];
159
+ const span = {
160
+ text: [],
161
+ };
162
+ let prevMatch = null;
163
+ for (const match of matches) {
164
+ const entity = entitiesMapByName[match[1]];
165
+ const variable = variablesMapByName[match[1]];
166
+ let substring;
167
+ if (!prevMatch) {
168
+ substring = text.substring(0, match.index);
169
+ }
170
+ else {
171
+ substring = text.substring(prevMatch.index + prevMatch[0].length, match.index);
172
+ }
173
+ if (substring) {
174
+ span.text.push(substring);
175
+ }
176
+ if (entity) {
177
+ span.text.push({ entityID: entity.id });
178
+ }
179
+ else if (variable) {
180
+ span.text.push({ variableID: variable.id });
181
+ }
182
+ else {
183
+ span.text.push(match[0]);
184
+ }
185
+ prevMatch = match;
186
+ }
187
+ if (!prevMatch) {
188
+ return [span];
189
+ }
190
+ const substring = text.substring(prevMatch.index + prevMatch[0].length, text.length);
191
+ if (substring) {
192
+ span.text.push(substring);
193
+ }
194
+ return [span];
195
+ });
135
196
  const isEmptyState = (nodes) => nodes.every((element) => Text.isText(element) ? !element.text.trim() : element.type !== 'variable' && isEmptyState(element.children));
136
197
  export const markupToSlate = createMultiAdapter((markup, { iteration = 0, entitiesMapByID, variablesMapByID }) => {
137
198
  if (!markup?.length)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voiceflow/utils-designer",
3
- "version": "1.23.1",
3
+ "version": "1.24.0",
4
4
  "exports": {
5
5
  ".": {
6
6
  "types": "./build/cjs/main.d.ts",
@@ -43,5 +43,5 @@
43
43
  "volta": {
44
44
  "extends": "../../package.json"
45
45
  },
46
- "gitHead": "a7238f801af75497d68409d8d1e974d383126e5d"
46
+ "gitHead": "fd084f1f649d42476b4102d692c1a62e32d10986"
47
47
  }