@voiceflow/utils-designer 1.2.2 → 1.3.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.
@@ -1,4 +1,36 @@
1
- import type { EntityVariant } from '@voiceflow/dtos';
1
+ import type { Entity, EntityVariant, Intent, Variable } from '@voiceflow/dtos';
2
2
  export declare const isDefaultEntityName: (name?: string | null) => boolean;
3
3
  export declare const isEntityVariantLikeEmpty: ({ value, synonyms }: Pick<EntityVariant, 'value' | 'synonyms'>) => boolean;
4
+ export declare const entityNameSpellingValidator: (value: string) => import("./main").IValidatorResult<string>;
5
+ export declare const entityNameUniqEntitiesValidator: import("./main").IValidatorWithContext<string, {
6
+ entities: Entity[];
7
+ entityID: string | null;
8
+ }>;
9
+ export declare const entityNameUniqVariablesValidator: import("./main").IValidatorWithContext<string, {
10
+ variables: Variable[];
11
+ }>;
12
+ export declare const entityNameUniqIntentsValidator: import("./main").IValidatorWithContext<string, {
13
+ intents: Intent[];
14
+ }>;
15
+ export declare const entityNameValidator: import("./main").IValidatorWithContext<string, {
16
+ entities: Entity[];
17
+ entityID: string | null;
18
+ } & {
19
+ variables: Variable[];
20
+ } & {
21
+ intents: Intent[];
22
+ }>;
23
+ export declare const entityVariantsValidator: import("./main").IValidatorWithContext<Pick<{
24
+ id: string;
25
+ value: string;
26
+ createdAt: string;
27
+ updatedAt: string;
28
+ assistantID: string;
29
+ environmentID: string;
30
+ entityID: string;
31
+ language: "en-us";
32
+ synonyms: string[];
33
+ }, "value" | "synonyms">[], {
34
+ classifier: string | null;
35
+ }>;
4
36
  //# sourceMappingURL=entity.util.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"entity.util.d.ts","sourceRoot":"","sources":["../../src/entity.util.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD,eAAO,MAAM,mBAAmB,UAAW,MAAM,GAAG,IAAI,YAAqD,CAAC;AAE9G,eAAO,MAAM,wBAAwB,wBAAyB,KAAK,aAAa,EAAE,OAAO,GAAG,UAAU,CAAC,YACxC,CAAC"}
1
+ {"version":3,"file":"entity.util.d.ts","sourceRoot":"","sources":["../../src/entity.util.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAK/E,eAAO,MAAM,mBAAmB,UAAW,MAAM,GAAG,IAAI,YAAqD,CAAC;AAE9G,eAAO,MAAM,wBAAwB,wBAAyB,KAAK,aAAa,EAAE,OAAO,GAAG,UAAU,CAAC,YACxC,CAAC;AAEhE,eAAO,MAAM,2BAA2B,8DAAuC,CAAC;AAEhF,eAAO,MAAM,+BAA+B;cACS,MAAM,EAAE;cAAY,MAAM,GAAG,IAAI;EAGrF,CAAC;AAEF,eAAO,MAAM,gCAAgC;eACA,QAAQ,EAAE;EAGtD,CAAC;AAEF,eAAO,MAAM,8BAA8B;aACF,MAAM,EAAE;EAGhD,CAAC;AAEF,eAAO,MAAM,mBAAmB;cAjBqB,MAAM,EAAE;cAAY,MAAM,GAAG,IAAI;;eAMzC,QAAQ,EAAE;;aAMd,MAAM,EAAE;EAUhD,CAAC;AAEF,eAAO,MAAM,uBAAuB;;;;;;;;;;;gBACoD,MAAM,GAAG,IAAI;EAGpG,CAAC"}
@@ -1,7 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isEntityVariantLikeEmpty = exports.isDefaultEntityName = void 0;
3
+ exports.entityVariantsValidator = exports.entityNameValidator = exports.entityNameUniqIntentsValidator = exports.entityNameUniqVariablesValidator = exports.entityNameUniqEntitiesValidator = exports.entityNameSpellingValidator = exports.isEntityVariantLikeEmpty = exports.isDefaultEntityName = void 0;
4
+ const common_1 = require("@voiceflow/common");
5
+ const dtos_1 = require("@voiceflow/dtos");
6
+ const validator_util_1 = require("./validator/validator.util");
4
7
  const isDefaultEntityName = (name) => !name || name.toLowerCase().startsWith('entity');
5
8
  exports.isDefaultEntityName = isDefaultEntityName;
6
9
  const isEntityVariantLikeEmpty = ({ value, synonyms }) => !value.trim() && synonyms.every((synonym) => !synonym.trim());
7
10
  exports.isEntityVariantLikeEmpty = isEntityVariantLikeEmpty;
11
+ exports.entityNameSpellingValidator = (0, validator_util_1.validatorZodFactory)(dtos_1.VariableNameDTO);
12
+ exports.entityNameUniqEntitiesValidator = (0, validator_util_1.validatorFactory)((name, { entities, entityID }) => entities.every((entity) => entity.id === entityID || entity.name.toLocaleLowerCase() !== name.toLocaleLowerCase()), (name) => `The '${name}' entity already exists.`);
13
+ exports.entityNameUniqVariablesValidator = (0, validator_util_1.validatorFactory)((name, { variables }) => variables.every((variable) => variable.name.toLocaleLowerCase() !== name.toLocaleLowerCase()), (name) => `You have a variable defined with the '${name}' name already. Entity/Variable/Intent name must be unique.`);
14
+ exports.entityNameUniqIntentsValidator = (0, validator_util_1.validatorFactory)((name, { intents }) => intents.every((intent) => intent.name.toLocaleLowerCase() !== name.toLocaleLowerCase()), (name) => `You have an intent defined with the '${name}' name already. Entity/Intent/Variable name must be unique.`);
15
+ exports.entityNameValidator = (0, validator_util_1.composeValidators)(exports.entityNameSpellingValidator, exports.entityNameUniqEntitiesValidator, exports.entityNameUniqVariablesValidator, exports.entityNameUniqIntentsValidator);
16
+ exports.entityVariantsValidator = (0, validator_util_1.validatorFactory)((variants, { classifier }) => classifier !== common_1.CUSTOM_SLOT_TYPE || variants.some(({ value }) => value.trim().length), 'Custom entities require at least one value.');
@@ -1,4 +1,6 @@
1
1
  export * from './entity.util';
2
2
  export * from './intent.util';
3
3
  export * from './markup.util';
4
+ export * from './validator/validator.interface';
5
+ export * from './validator/validator.util';
4
6
  //# sourceMappingURL=main.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,iCAAiC,CAAC;AAChD,cAAc,4BAA4B,CAAC"}
package/build/cjs/main.js CHANGED
@@ -17,3 +17,5 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./entity.util"), exports);
18
18
  __exportStar(require("./intent.util"), exports);
19
19
  __exportStar(require("./markup.util"), exports);
20
+ __exportStar(require("./validator/validator.interface"), exports);
21
+ __exportStar(require("./validator/validator.util"), exports);
@@ -1,14 +1,14 @@
1
1
  import type { Entity, Markup, MarkupSpan, Variable } from '@voiceflow/dtos';
2
2
  import type { MultiAdapter } from 'bidirectional-adapter';
3
- import type { Descendant } from 'slate';
4
- type MarkupItem = Markup[number];
5
- interface MarkupSpanText extends Omit<MarkupSpan, 'text'> {
3
+ export type MarkupItem = Markup[number];
4
+ export declare const ENTITY_OR_VARIABLE_TEXT_REGEXP: RegExp;
5
+ export interface MarkupSpanText extends Omit<MarkupSpan, 'text'> {
6
6
  text: [string];
7
7
  attributes: {
8
8
  __type: 'text';
9
9
  };
10
10
  }
11
- interface MarkupSpanLink extends MarkupSpan {
11
+ export interface MarkupSpanLink extends MarkupSpan {
12
12
  attributes: {
13
13
  __type: 'link';
14
14
  url: string;
@@ -51,8 +51,5 @@ export declare const replaceMarkupEntity: (markup: Markup, { oldEntityID, newEnt
51
51
  }) => Markup;
52
52
  export declare const fillMarkupWithVariablesValues: (promptText: string, variables: Record<string, string>) => string;
53
53
  export declare const markupToString: MultiAdapter<Markup, string, [MarkupToStringFromOptions], [MarkupToStringToOptions]>;
54
- export declare const markupToSlate: MultiAdapter<Markup, Descendant[], [] | [{
55
- iteration?: number | undefined;
56
- }], []>;
57
54
  export {};
58
55
  //# sourceMappingURL=markup.util.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"markup.util.d.ts","sourceRoot":"","sources":["../../src/markup.util.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAIxC,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AAIjC,UAAU,cAAe,SAAQ,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC;IACvD,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC;IACf,UAAU,EAAE;QACV,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,UAAU,cAAe,SAAQ,UAAU;IACzC,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;AAEJ,eAAO,MAAM,aAAa;;OAkHzB,CAAC"}
1
+ {"version":3,"file":"markup.util.d.ts","sourceRoot":"","sources":["../../src/markup.util.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAI1D,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"}
@@ -1,12 +1,10 @@
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 = void 0;
3
+ 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;
4
4
  const common_1 = require("@voiceflow/common");
5
- const ui_next_1 = require("@voiceflow/ui-next");
6
5
  const bidirectional_adapter_1 = require("bidirectional-adapter");
7
- const slate_1 = require("slate");
8
6
  const ts_pattern_1 = require("ts-pattern");
9
- const ENTITY_OR_VARIABLE_TEXT_REGEXP = /{(\w*)}/g;
7
+ exports.ENTITY_OR_VARIABLE_TEXT_REGEXP = /{(\w*)}/g;
10
8
  const isMarkupVariableReference = (markupItem) => {
11
9
  return markupItem.variableID !== undefined;
12
10
  };
@@ -110,7 +108,7 @@ exports.markupToString = (0, bidirectional_adapter_1.createMultiAdapter)((markup
110
108
  ? ''
111
109
  : `{${variablesMapByID[variableID]?.name ?? variableID}}`)
112
110
  .exhaustive(), ''), (text, { entitiesMapByName, variablesMapByName }) => {
113
- const matches = [...text.matchAll(ENTITY_OR_VARIABLE_TEXT_REGEXP)];
111
+ const matches = [...text.matchAll(exports.ENTITY_OR_VARIABLE_TEXT_REGEXP)];
114
112
  if (!matches.length)
115
113
  return [{ text: [text] }];
116
114
  const span = {
@@ -150,86 +148,3 @@ exports.markupToString = (0, bidirectional_adapter_1.createMultiAdapter)((markup
150
148
  }
151
149
  return [span];
152
150
  });
153
- exports.markupToSlate = (0, bidirectional_adapter_1.createMultiAdapter)((markup, { iteration = 0 } = {}) => {
154
- if (!markup.length)
155
- return iteration === 0 ? ui_next_1.SlateEditor.StaticEditor.createTextState('') : [{ text: '' }];
156
- if (markup.length === 1 && typeof markup[0] === 'string')
157
- return iteration === 0 ? ui_next_1.SlateEditor.StaticEditor.createTextState(markup[0]) : [{ text: markup[0] }];
158
- return markup.reduce((acc, item) => [
159
- ...acc,
160
- (0, ts_pattern_1.match)(item)
161
- .when(exports.isMarkupString, (item) => ({ text: item }))
162
- .when(exports.isMarkupEntity, ({ entityID }) => ({
163
- type: ui_next_1.SlateEditor.ElementType.VARIABLE,
164
- children: [{ text: '' }],
165
- variableID: entityID,
166
- variableVariant: ui_next_1.SlateEditor.VariableElementVariant.ENTITY,
167
- }))
168
- .when(exports.isMarkupVariable, ({ variableID }) => ({
169
- type: ui_next_1.SlateEditor.ElementType.VARIABLE,
170
- children: [{ text: '' }],
171
- variableID,
172
- variableVariant: ui_next_1.SlateEditor.VariableElementVariant.VARIABLE,
173
- }))
174
- .when(exports.isMarkupSpan, (span) => (0, ts_pattern_1.match)(span)
175
- .when(exports.isMarkupSpanText, ({ text: [text], attributes: { __type, ...attrs } }) => ({ ...attrs, text }))
176
- .when(exports.isMarkupSpanLink, ({ text, attributes: { url } }) => ({
177
- url,
178
- type: ui_next_1.SlateEditor.ElementType.LINK,
179
- children: exports.markupToSlate.fromDB(text, { iteration: iteration + 1 }),
180
- }))
181
- .otherwise(({ text, attributes: { __type, ...attrs } = {} }) => ({
182
- ...attrs,
183
- children: exports.markupToSlate.fromDB(text, { iteration: iteration + 1 }),
184
- })))
185
- .exhaustive(),
186
- ], []);
187
- },
188
- // eslint-disable-next-line sonarjs/cognitive-complexity
189
- (slate) => {
190
- if (ui_next_1.SlateEditor.StaticEditor.isEmptyState(slate))
191
- return (0, exports.markupFactory)();
192
- return slate.reduce((acc, item) => [
193
- ...acc,
194
- (0, ts_pattern_1.match)(item)
195
- .when(ui_next_1.SlateEditor.StaticEditor.isLink, (item) => {
196
- const { url = '', children } = item;
197
- return {
198
- text: exports.markupToSlate.toDB(children),
199
- attributes: { __type: 'link', url },
200
- };
201
- })
202
- .when(ui_next_1.SlateEditor.StaticEditor.isVariable, (item) => {
203
- const { variableID, variableVariant } = item;
204
- return variableVariant === ui_next_1.SlateEditor.VariableElementVariant.VARIABLE
205
- ? { variableID }
206
- : { entityID: variableID };
207
- })
208
- .when(slate_1.Text.isText, (item) => {
209
- // TODO: fix any
210
- const { text, color, italic, underline, fontWeight, fontFamily, strikeThrough, backgroundColor } = item;
211
- if (!color && !italic && !underline && !fontWeight && !fontFamily && !strikeThrough && !backgroundColor) {
212
- return text;
213
- }
214
- return {
215
- text: [text],
216
- attributes: {
217
- __type: 'text',
218
- ...(color && { color }),
219
- ...(italic && { italic }),
220
- ...(underline && { underline }),
221
- ...(fontWeight && { fontWeight }),
222
- ...(fontFamily && { fontFamily }),
223
- ...(strikeThrough && { strikeThrough }),
224
- ...(backgroundColor && { backgroundColor }),
225
- },
226
- };
227
- })
228
- .otherwise(
229
- // TODO: fix any
230
- ({ type: _, children, textAlign }) => ({
231
- text: exports.markupToSlate.toDB(children),
232
- ...(textAlign && { attributes: { textAlign } }),
233
- })),
234
- ], []);
235
- });
@@ -0,0 +1,34 @@
1
+ export interface IValidatorSuccessResult<T> {
2
+ data: T;
3
+ success: true;
4
+ }
5
+ export interface IValidatorErrorResult {
6
+ error: Error;
7
+ success: false;
8
+ }
9
+ export type IValidatorResult<T> = IValidatorSuccessResult<T> | IValidatorErrorResult;
10
+ export interface IValidator<T> {
11
+ _input?: T;
12
+ _context?: void;
13
+ (value: T): IValidatorResult<T>;
14
+ }
15
+ export interface IValidatorWithContext<T, C> {
16
+ _input?: T;
17
+ _context?: C;
18
+ (value: T, context: C): IValidatorResult<T>;
19
+ }
20
+ export interface IValidatorFactory {
21
+ <T>(refinement: (value: T) => unknown, message: string | ((arg: T) => string)): IValidator<T>;
22
+ <T, C>(refinement: (value: T, context: C) => unknown, message: string | ((value: T, context: C) => string)): IValidatorWithContext<T, C>;
23
+ }
24
+ export interface IComposeValidators {
25
+ <T>(...validators: Array<IValidator<T>>): IValidator<T>;
26
+ <T, C1>(validator1: IValidatorWithContext<T, C1>): IValidatorWithContext<T, C1>;
27
+ <T, C1, C2>(validator1: IValidatorWithContext<T, C1>, validator2: IValidatorWithContext<T, C2>): IValidatorWithContext<T, C1 & C2>;
28
+ <T, C1, C2, C3>(validator1: IValidatorWithContext<T, C1>, validator2: IValidatorWithContext<T, C2>, validator3: IValidatorWithContext<T, C3>): IValidatorWithContext<T, C1 & C2 & C3>;
29
+ <T, C1, C2, C3, C4>(validator1: IValidatorWithContext<T, C1>, validator2: IValidatorWithContext<T, C2>, validator3: IValidatorWithContext<T, C3>, validator4: IValidatorWithContext<T, C4>): IValidatorWithContext<T, C1 & C2 & C3 & C4>;
30
+ <T, C1, C2, C3, C4, C5>(validator1: IValidatorWithContext<T, C1>, validator2: IValidatorWithContext<T, C2>, validator3: IValidatorWithContext<T, C3>, validator4: IValidatorWithContext<T, C4>, validator5: IValidatorWithContext<T, C5>): IValidatorWithContext<T, C1 & C2 & C3 & C4 & C5>;
31
+ <T, C1, C2, C3, C4, C5, C6>(validator1: IValidatorWithContext<T, C1>, validator2: IValidatorWithContext<T, C2>, validator3: IValidatorWithContext<T, C3>, validator4: IValidatorWithContext<T, C4>, validator5: IValidatorWithContext<T, C5>, validator6: IValidatorWithContext<T, C6>): IValidatorWithContext<T, C1 & C2 & C3 & C4 & C5 & C6>;
32
+ <T, C>(...validators: Array<(value: T, context: C) => IValidatorResult<T>>): IValidatorWithContext<T, C>;
33
+ }
34
+ //# sourceMappingURL=validator.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.interface.d.ts","sourceRoot":"","sources":["../../../src/validator/validator.interface.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,6 @@
1
+ import type { z } from 'zod';
2
+ import type { IComposeValidators, IValidatorFactory, IValidatorResult } from './validator.interface';
3
+ export declare const validatorZodFactory: <T extends z.ZodTypeAny>(scheme: T) => (value: z.input<T>) => IValidatorResult<z.output<T>>;
4
+ export declare const validatorFactory: IValidatorFactory;
5
+ export declare const composeValidators: IComposeValidators;
6
+ //# sourceMappingURL=validator.util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.util.d.ts","sourceRoot":"","sources":["../../../src/validator/validator.util.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAErG,eAAO,MAAM,mBAAmB,6FAQ7B,CAAC;AAEJ,eAAO,MAAM,gBAAgB,EAAE,iBAW5B,CAAC;AAEJ,eAAO,MAAM,iBAAiB,EAAE,kBAc7B,CAAC"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.composeValidators = exports.validatorFactory = exports.validatorZodFactory = void 0;
4
+ const validatorZodFactory = (scheme) => (value) => {
5
+ const result = scheme.safeParse(value);
6
+ if (result.success)
7
+ return result;
8
+ return { success: false, error: new Error(result.error.issues[0].message) };
9
+ };
10
+ exports.validatorZodFactory = validatorZodFactory;
11
+ const validatorFactory = (refinement, message) => (value, context) => {
12
+ if (refinement(value, context)) {
13
+ return { success: true, data: value };
14
+ }
15
+ return { success: false, error: new Error(typeof message === 'function' ? message(value, context) : message) };
16
+ };
17
+ exports.validatorFactory = validatorFactory;
18
+ const composeValidators = (...validators) => (value, context) => {
19
+ let result = { success: true, data: value };
20
+ for (const validator of validators) {
21
+ result = validator(result.data, context);
22
+ if (!result.success) {
23
+ return result;
24
+ }
25
+ }
26
+ return result;
27
+ };
28
+ exports.composeValidators = composeValidators;
@@ -1,4 +1,36 @@
1
- import type { EntityVariant } from '@voiceflow/dtos';
1
+ import type { Entity, EntityVariant, Intent, Variable } from '@voiceflow/dtos';
2
2
  export declare const isDefaultEntityName: (name?: string | null) => boolean;
3
3
  export declare const isEntityVariantLikeEmpty: ({ value, synonyms }: Pick<EntityVariant, 'value' | 'synonyms'>) => boolean;
4
+ export declare const entityNameSpellingValidator: (value: string) => import("./main.js").IValidatorResult<string>;
5
+ export declare const entityNameUniqEntitiesValidator: import("./main.js").IValidatorWithContext<string, {
6
+ entities: Entity[];
7
+ entityID: string | null;
8
+ }>;
9
+ export declare const entityNameUniqVariablesValidator: import("./main.js").IValidatorWithContext<string, {
10
+ variables: Variable[];
11
+ }>;
12
+ export declare const entityNameUniqIntentsValidator: import("./main.js").IValidatorWithContext<string, {
13
+ intents: Intent[];
14
+ }>;
15
+ export declare const entityNameValidator: import("./main.js").IValidatorWithContext<string, {
16
+ entities: Entity[];
17
+ entityID: string | null;
18
+ } & {
19
+ variables: Variable[];
20
+ } & {
21
+ intents: Intent[];
22
+ }>;
23
+ export declare const entityVariantsValidator: import("./main.js").IValidatorWithContext<Pick<{
24
+ id: string;
25
+ value: string;
26
+ createdAt: string;
27
+ updatedAt: string;
28
+ assistantID: string;
29
+ environmentID: string;
30
+ entityID: string;
31
+ language: "en-us";
32
+ synonyms: string[];
33
+ }, "value" | "synonyms">[], {
34
+ classifier: string | null;
35
+ }>;
4
36
  //# sourceMappingURL=entity.util.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"entity.util.d.ts","sourceRoot":"","sources":["../../src/entity.util.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD,eAAO,MAAM,mBAAmB,UAAW,MAAM,GAAG,IAAI,YAAqD,CAAC;AAE9G,eAAO,MAAM,wBAAwB,wBAAyB,KAAK,aAAa,EAAE,OAAO,GAAG,UAAU,CAAC,YACxC,CAAC"}
1
+ {"version":3,"file":"entity.util.d.ts","sourceRoot":"","sources":["../../src/entity.util.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAK/E,eAAO,MAAM,mBAAmB,UAAW,MAAM,GAAG,IAAI,YAAqD,CAAC;AAE9G,eAAO,MAAM,wBAAwB,wBAAyB,KAAK,aAAa,EAAE,OAAO,GAAG,UAAU,CAAC,YACxC,CAAC;AAEhE,eAAO,MAAM,2BAA2B,8DAAuC,CAAC;AAEhF,eAAO,MAAM,+BAA+B;cACS,MAAM,EAAE;cAAY,MAAM,GAAG,IAAI;EAGrF,CAAC;AAEF,eAAO,MAAM,gCAAgC;eACA,QAAQ,EAAE;EAGtD,CAAC;AAEF,eAAO,MAAM,8BAA8B;aACF,MAAM,EAAE;EAGhD,CAAC;AAEF,eAAO,MAAM,mBAAmB;cAjBqB,MAAM,EAAE;cAAY,MAAM,GAAG,IAAI;;eAMzC,QAAQ,EAAE;;aAMd,MAAM,EAAE;EAUhD,CAAC;AAEF,eAAO,MAAM,uBAAuB;;;;;;;;;;;gBACoD,MAAM,GAAG,IAAI;EAGpG,CAAC"}
@@ -1,2 +1,11 @@
1
+ import { CUSTOM_SLOT_TYPE } from '@voiceflow/common';
2
+ import { VariableNameDTO } from '@voiceflow/dtos';
3
+ import { composeValidators, validatorFactory, validatorZodFactory } from './validator/validator.util.js';
1
4
  export const isDefaultEntityName = (name) => !name || name.toLowerCase().startsWith('entity');
2
5
  export const isEntityVariantLikeEmpty = ({ value, synonyms }) => !value.trim() && synonyms.every((synonym) => !synonym.trim());
6
+ export const entityNameSpellingValidator = validatorZodFactory(VariableNameDTO);
7
+ export const entityNameUniqEntitiesValidator = validatorFactory((name, { entities, entityID }) => entities.every((entity) => entity.id === entityID || entity.name.toLocaleLowerCase() !== name.toLocaleLowerCase()), (name) => `The '${name}' entity already exists.`);
8
+ export const entityNameUniqVariablesValidator = validatorFactory((name, { variables }) => variables.every((variable) => variable.name.toLocaleLowerCase() !== name.toLocaleLowerCase()), (name) => `You have a variable defined with the '${name}' name already. Entity/Variable/Intent name must be unique.`);
9
+ export const entityNameUniqIntentsValidator = validatorFactory((name, { intents }) => intents.every((intent) => intent.name.toLocaleLowerCase() !== name.toLocaleLowerCase()), (name) => `You have an intent defined with the '${name}' name already. Entity/Intent/Variable name must be unique.`);
10
+ export const entityNameValidator = composeValidators(entityNameSpellingValidator, entityNameUniqEntitiesValidator, entityNameUniqVariablesValidator, entityNameUniqIntentsValidator);
11
+ export const entityVariantsValidator = validatorFactory((variants, { classifier }) => classifier !== CUSTOM_SLOT_TYPE || variants.some(({ value }) => value.trim().length), 'Custom entities require at least one value.');
@@ -1,4 +1,6 @@
1
1
  export * from './entity.util.js';
2
2
  export * from './intent.util.js';
3
3
  export * from './markup.util.js';
4
+ export * from './validator/validator.interface.js';
5
+ export * from './validator/validator.util.js';
4
6
  //# sourceMappingURL=main.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,iCAAiC,CAAC;AAChD,cAAc,4BAA4B,CAAC"}
package/build/esm/main.js CHANGED
@@ -1,3 +1,5 @@
1
1
  export * from './entity.util.js';
2
2
  export * from './intent.util.js';
3
3
  export * from './markup.util.js';
4
+ export * from './validator/validator.interface.js';
5
+ export * from './validator/validator.util.js';
@@ -1,14 +1,14 @@
1
1
  import type { Entity, Markup, MarkupSpan, Variable } from '@voiceflow/dtos';
2
2
  import type { MultiAdapter } from 'bidirectional-adapter';
3
- import type { Descendant } from 'slate';
4
- type MarkupItem = Markup[number];
5
- interface MarkupSpanText extends Omit<MarkupSpan, 'text'> {
3
+ export type MarkupItem = Markup[number];
4
+ export declare const ENTITY_OR_VARIABLE_TEXT_REGEXP: RegExp;
5
+ export interface MarkupSpanText extends Omit<MarkupSpan, 'text'> {
6
6
  text: [string];
7
7
  attributes: {
8
8
  __type: 'text';
9
9
  };
10
10
  }
11
- interface MarkupSpanLink extends MarkupSpan {
11
+ export interface MarkupSpanLink extends MarkupSpan {
12
12
  attributes: {
13
13
  __type: 'link';
14
14
  url: string;
@@ -51,8 +51,5 @@ export declare const replaceMarkupEntity: (markup: Markup, { oldEntityID, newEnt
51
51
  }) => Markup;
52
52
  export declare const fillMarkupWithVariablesValues: (promptText: string, variables: Record<string, string>) => string;
53
53
  export declare const markupToString: MultiAdapter<Markup, string, [MarkupToStringFromOptions], [MarkupToStringToOptions]>;
54
- export declare const markupToSlate: MultiAdapter<Markup, Descendant[], [] | [{
55
- iteration?: number | undefined;
56
- }], []>;
57
54
  export {};
58
55
  //# sourceMappingURL=markup.util.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"markup.util.d.ts","sourceRoot":"","sources":["../../src/markup.util.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAIxC,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AAIjC,UAAU,cAAe,SAAQ,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC;IACvD,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC;IACf,UAAU,EAAE;QACV,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,UAAU,cAAe,SAAQ,UAAU;IACzC,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;AAEJ,eAAO,MAAM,aAAa;;OAkHzB,CAAC"}
1
+ {"version":3,"file":"markup.util.d.ts","sourceRoot":"","sources":["../../src/markup.util.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAI1D,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"}
@@ -1,9 +1,7 @@
1
1
  import { Utils } from '@voiceflow/common';
2
- import { SlateEditor } from '@voiceflow/ui-next';
3
2
  import { createMultiAdapter } from 'bidirectional-adapter';
4
- import { Text } from 'slate';
5
3
  import { match } from 'ts-pattern';
6
- const ENTITY_OR_VARIABLE_TEXT_REGEXP = /{(\w*)}/g;
4
+ export const ENTITY_OR_VARIABLE_TEXT_REGEXP = /{(\w*)}/g;
7
5
  export const isMarkupVariableReference = (markupItem) => {
8
6
  return markupItem.variableID !== undefined;
9
7
  };
@@ -132,86 +130,3 @@ export const markupToString = createMultiAdapter((markup, { entitiesMapByID, var
132
130
  }
133
131
  return [span];
134
132
  });
135
- export const markupToSlate = createMultiAdapter((markup, { iteration = 0 } = {}) => {
136
- if (!markup.length)
137
- return iteration === 0 ? SlateEditor.StaticEditor.createTextState('') : [{ text: '' }];
138
- if (markup.length === 1 && typeof markup[0] === 'string')
139
- return iteration === 0 ? SlateEditor.StaticEditor.createTextState(markup[0]) : [{ text: markup[0] }];
140
- return markup.reduce((acc, item) => [
141
- ...acc,
142
- match(item)
143
- .when(isMarkupString, (item) => ({ text: item }))
144
- .when(isMarkupEntity, ({ entityID }) => ({
145
- type: SlateEditor.ElementType.VARIABLE,
146
- children: [{ text: '' }],
147
- variableID: entityID,
148
- variableVariant: SlateEditor.VariableElementVariant.ENTITY,
149
- }))
150
- .when(isMarkupVariable, ({ variableID }) => ({
151
- type: SlateEditor.ElementType.VARIABLE,
152
- children: [{ text: '' }],
153
- variableID,
154
- variableVariant: SlateEditor.VariableElementVariant.VARIABLE,
155
- }))
156
- .when(isMarkupSpan, (span) => match(span)
157
- .when(isMarkupSpanText, ({ text: [text], attributes: { __type, ...attrs } }) => ({ ...attrs, text }))
158
- .when(isMarkupSpanLink, ({ text, attributes: { url } }) => ({
159
- url,
160
- type: SlateEditor.ElementType.LINK,
161
- children: markupToSlate.fromDB(text, { iteration: iteration + 1 }),
162
- }))
163
- .otherwise(({ text, attributes: { __type, ...attrs } = {} }) => ({
164
- ...attrs,
165
- children: markupToSlate.fromDB(text, { iteration: iteration + 1 }),
166
- })))
167
- .exhaustive(),
168
- ], []);
169
- },
170
- // eslint-disable-next-line sonarjs/cognitive-complexity
171
- (slate) => {
172
- if (SlateEditor.StaticEditor.isEmptyState(slate))
173
- return markupFactory();
174
- return slate.reduce((acc, item) => [
175
- ...acc,
176
- match(item)
177
- .when(SlateEditor.StaticEditor.isLink, (item) => {
178
- const { url = '', children } = item;
179
- return {
180
- text: markupToSlate.toDB(children),
181
- attributes: { __type: 'link', url },
182
- };
183
- })
184
- .when(SlateEditor.StaticEditor.isVariable, (item) => {
185
- const { variableID, variableVariant } = item;
186
- return variableVariant === SlateEditor.VariableElementVariant.VARIABLE
187
- ? { variableID }
188
- : { entityID: variableID };
189
- })
190
- .when(Text.isText, (item) => {
191
- // TODO: fix any
192
- const { text, color, italic, underline, fontWeight, fontFamily, strikeThrough, backgroundColor } = item;
193
- if (!color && !italic && !underline && !fontWeight && !fontFamily && !strikeThrough && !backgroundColor) {
194
- return text;
195
- }
196
- return {
197
- text: [text],
198
- attributes: {
199
- __type: 'text',
200
- ...(color && { color }),
201
- ...(italic && { italic }),
202
- ...(underline && { underline }),
203
- ...(fontWeight && { fontWeight }),
204
- ...(fontFamily && { fontFamily }),
205
- ...(strikeThrough && { strikeThrough }),
206
- ...(backgroundColor && { backgroundColor }),
207
- },
208
- };
209
- })
210
- .otherwise(
211
- // TODO: fix any
212
- ({ type: _, children, textAlign }) => ({
213
- text: markupToSlate.toDB(children),
214
- ...(textAlign && { attributes: { textAlign } }),
215
- })),
216
- ], []);
217
- });
@@ -0,0 +1,34 @@
1
+ export interface IValidatorSuccessResult<T> {
2
+ data: T;
3
+ success: true;
4
+ }
5
+ export interface IValidatorErrorResult {
6
+ error: Error;
7
+ success: false;
8
+ }
9
+ export type IValidatorResult<T> = IValidatorSuccessResult<T> | IValidatorErrorResult;
10
+ export interface IValidator<T> {
11
+ _input?: T;
12
+ _context?: void;
13
+ (value: T): IValidatorResult<T>;
14
+ }
15
+ export interface IValidatorWithContext<T, C> {
16
+ _input?: T;
17
+ _context?: C;
18
+ (value: T, context: C): IValidatorResult<T>;
19
+ }
20
+ export interface IValidatorFactory {
21
+ <T>(refinement: (value: T) => unknown, message: string | ((arg: T) => string)): IValidator<T>;
22
+ <T, C>(refinement: (value: T, context: C) => unknown, message: string | ((value: T, context: C) => string)): IValidatorWithContext<T, C>;
23
+ }
24
+ export interface IComposeValidators {
25
+ <T>(...validators: Array<IValidator<T>>): IValidator<T>;
26
+ <T, C1>(validator1: IValidatorWithContext<T, C1>): IValidatorWithContext<T, C1>;
27
+ <T, C1, C2>(validator1: IValidatorWithContext<T, C1>, validator2: IValidatorWithContext<T, C2>): IValidatorWithContext<T, C1 & C2>;
28
+ <T, C1, C2, C3>(validator1: IValidatorWithContext<T, C1>, validator2: IValidatorWithContext<T, C2>, validator3: IValidatorWithContext<T, C3>): IValidatorWithContext<T, C1 & C2 & C3>;
29
+ <T, C1, C2, C3, C4>(validator1: IValidatorWithContext<T, C1>, validator2: IValidatorWithContext<T, C2>, validator3: IValidatorWithContext<T, C3>, validator4: IValidatorWithContext<T, C4>): IValidatorWithContext<T, C1 & C2 & C3 & C4>;
30
+ <T, C1, C2, C3, C4, C5>(validator1: IValidatorWithContext<T, C1>, validator2: IValidatorWithContext<T, C2>, validator3: IValidatorWithContext<T, C3>, validator4: IValidatorWithContext<T, C4>, validator5: IValidatorWithContext<T, C5>): IValidatorWithContext<T, C1 & C2 & C3 & C4 & C5>;
31
+ <T, C1, C2, C3, C4, C5, C6>(validator1: IValidatorWithContext<T, C1>, validator2: IValidatorWithContext<T, C2>, validator3: IValidatorWithContext<T, C3>, validator4: IValidatorWithContext<T, C4>, validator5: IValidatorWithContext<T, C5>, validator6: IValidatorWithContext<T, C6>): IValidatorWithContext<T, C1 & C2 & C3 & C4 & C5 & C6>;
32
+ <T, C>(...validators: Array<(value: T, context: C) => IValidatorResult<T>>): IValidatorWithContext<T, C>;
33
+ }
34
+ //# sourceMappingURL=validator.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.interface.d.ts","sourceRoot":"","sources":["../../../src/validator/validator.interface.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,6 @@
1
+ import type { z } from 'zod';
2
+ import type { IComposeValidators, IValidatorFactory, IValidatorResult } from './validator.interface.js';
3
+ export declare const validatorZodFactory: <T extends z.ZodTypeAny>(scheme: T) => (value: z.input<T>) => IValidatorResult<z.output<T>>;
4
+ export declare const validatorFactory: IValidatorFactory;
5
+ export declare const composeValidators: IComposeValidators;
6
+ //# sourceMappingURL=validator.util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.util.d.ts","sourceRoot":"","sources":["../../../src/validator/validator.util.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAErG,eAAO,MAAM,mBAAmB,6FAQ7B,CAAC;AAEJ,eAAO,MAAM,gBAAgB,EAAE,iBAW5B,CAAC;AAEJ,eAAO,MAAM,iBAAiB,EAAE,kBAc7B,CAAC"}
@@ -0,0 +1,22 @@
1
+ export const validatorZodFactory = (scheme) => (value) => {
2
+ const result = scheme.safeParse(value);
3
+ if (result.success)
4
+ return result;
5
+ return { success: false, error: new Error(result.error.issues[0].message) };
6
+ };
7
+ export const validatorFactory = (refinement, message) => (value, context) => {
8
+ if (refinement(value, context)) {
9
+ return { success: true, data: value };
10
+ }
11
+ return { success: false, error: new Error(typeof message === 'function' ? message(value, context) : message) };
12
+ };
13
+ export const composeValidators = (...validators) => (value, context) => {
14
+ let result = { success: true, data: value };
15
+ for (const validator of validators) {
16
+ result = validator(result.data, context);
17
+ if (!result.success) {
18
+ return result;
19
+ }
20
+ }
21
+ return result;
22
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voiceflow/utils-designer",
3
- "version": "1.2.2",
3
+ "version": "1.3.0",
4
4
  "exports": {
5
5
  ".": {
6
6
  "types": "./build/cjs/main.d.ts",
@@ -36,11 +36,10 @@
36
36
  },
37
37
  "dependencies": {
38
38
  "@voiceflow/common": "8.2.2",
39
- "@voiceflow/dtos": "1.10.0",
40
- "@voiceflow/ui-next": "npm:@voiceflow/ui@2.115.1",
39
+ "@voiceflow/dtos": "1.11.0",
41
40
  "bidirectional-adapter": "1.2.1",
42
- "slate": "0.94.1",
43
- "ts-pattern": "^5.0.5"
41
+ "ts-pattern": "^5.0.5",
42
+ "zod": "3.22.4"
44
43
  },
45
44
  "devDependencies": {
46
45
  "@voiceflow-meta/eslint-config": "2.1.0",
@@ -50,5 +49,5 @@
50
49
  "tsd": {
51
50
  "directory": "src"
52
51
  },
53
- "gitHead": "ad74962617d77921b04cd45b9153b2c28b6d674b"
52
+ "gitHead": "1797e5c8bc5c18848a82404c9332c432f2f82a54"
54
53
  }