@voiceflow/utils-designer 1.2.3 → 1.3.1

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);
@@ -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';
@@ -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.3",
3
+ "version": "1.3.1",
4
4
  "exports": {
5
5
  ".": {
6
6
  "types": "./build/cjs/main.d.ts",
@@ -36,9 +36,10 @@
36
36
  },
37
37
  "dependencies": {
38
38
  "@voiceflow/common": "8.2.2",
39
- "@voiceflow/dtos": "1.10.0",
39
+ "@voiceflow/dtos": "1.12.0",
40
40
  "bidirectional-adapter": "1.2.1",
41
- "ts-pattern": "^5.0.5"
41
+ "ts-pattern": "^5.0.5",
42
+ "zod": "3.22.4"
42
43
  },
43
44
  "devDependencies": {
44
45
  "@voiceflow-meta/eslint-config": "2.1.0",
@@ -48,5 +49,5 @@
48
49
  "tsd": {
49
50
  "directory": "src"
50
51
  },
51
- "gitHead": "f676981c3604883c5fd045db0fdb0cd2c8e17c94"
52
+ "gitHead": "8d1adc86d2ccfd79bb79991ca925a8d5853f8dcc"
52
53
  }