Skip to content

Commit

Permalink
feat: exposed argsFromObj for utility-style use
Browse files Browse the repository at this point in the history
  • Loading branch information
BlvckBytes committed Nov 26, 2021
1 parent 6e5d216 commit 38b7019
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 18 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "ctor-ensure",
"author": "BlvckBytes",
"version": "1.0.12",
"version": "1.0.13",
"license": "GPL-3.0",
"repository": {
"type": "git",
Expand Down
2 changes: 1 addition & 1 deletion src/ctor-ensure.decorator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ export const META_KEY_VALIDATION = 'CTOR_ENSURE:VALIDATION';
export const META_KEY_DISPLAYNAME = 'CTOR_ENSURE:DISPLAYNAME';

// Unique metadata valiation key
const META_KEY_VALIDATION_UNIQUE = (displayname: string) => `CTOR_ENSURE:${displayname}:VALIDATION`;
export const META_KEY_VALIDATION_UNIQUE = (displayname: string) => `CTOR_ENSURE:${displayname}:VALIDATION`;

export const classRegistry = <{ [ key: string ]: {
clazz: Constructable,
Expand Down
37 changes: 23 additions & 14 deletions src/ctor-validator.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,15 @@
import { CtorEnsureArgError } from '.';
import { Constructable, CtorEnsureArgError, META_KEY_DISPLAYNAME } from '.';
import { getActiveControls, classRegistry, validateClassCtor } from './ctor-ensure.decorator';

/**
* Validate a constructor from the k-v pairs of a plain object
* @param className Schema name
* @param value Plain object containing contructor fields
* @param templateLang Language to use for rendering ensure templates
* @returns List of errors
* Extract all constructor arguments form a plain object
* @param clazz Class to get constructor args from
* @param value Plain object to extract from
* @returns List of arguments in right order
*/
const validateCtor = (className: string, value: any, templateLang = ''): CtorEnsureArgError[] | null => {
// Find target class
const clazz = classRegistry[className]?.clazz;
if (!clazz) return null;

export const argsFromObj = (clazz: Constructable, value: any): any[] => {
// Get all controls of this class and find the highest validated ctor index
const className = Reflect.getOwnMetadata(META_KEY_DISPLAYNAME, clazz);
const ctls = getActiveControls(clazz, className, []);
const maxCtorInd = ctls.reduce((acc, curr) => (curr.ctorInd > acc ? curr.ctorInd : acc), 0);

Expand All @@ -24,8 +20,21 @@ const validateCtor = (className: string, value: any, templateLang = ''): CtorEns
ctorArgs[ctl.ctorInd] = currValue;
});

// Call validation
return validateClassCtor(className, ctorArgs, templateLang);
return ctorArgs;
};

export default validateCtor;
/**
* Validate a constructor from the k-v pairs of a plain object
* @param className Schema name
* @param value Plain object containing contructor fields
* @param templateLang Language to use for rendering ensure templates
* @returns List of errors
*/
export const validateCtor = (className: string, value: any, templateLang = ''): CtorEnsureArgError[] | null => {
// Find target class
const clazz = classRegistry[className]?.clazz;
if (!clazz) return null;

// Call validation
return validateClassCtor(className, argsFromObj(clazz, value), templateLang);
};
4 changes: 2 additions & 2 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,8 @@ export { ValidationControl } from './validation-control.interface';
export { Constructable } from './constructable.type';

// Misc
export { META_KEY_VALIDATION, META_KEY_DISPLAYNAME } from './ctor-ensure.decorator';
export { META_KEY_VALIDATION, META_KEY_DISPLAYNAME, META_KEY_VALIDATION_UNIQUE } from './ctor-ensure.decorator';
export { registerTemplateFunction, getRegisteredTemplateFunctions, template } from './description-template.factory';
export { strOpt, pluralize, evalDesc } from './util';
export { default as validateCtor } from './ctor-validator';
export { validateCtor, argsFromObj } from './ctor-validator';
export { default as UnknownLanguageException } from './unknown-language.exception';

0 comments on commit 38b7019

Please sign in to comment.