prop-proxy
v2.3.1
Published
Prop-Proxy allows you to intercept getters and setters of class attributes through decorators
Downloads
175
Maintainers
Readme
Prop-Proxy
Proxy for class properties
Prop-Proxy allows you to intercept getters and setters of class attributes through decorators
Installation
This package need to be used with Typescript
npm install prop-proxy --save
yarn add prop-proxy
Configuration
You need to enable in tsconfig.json:
{
"compilerOptions": {
{
"experimentalDecorators": true,
"emitDecoratorMetadata": true
}
}
Usage
Using proxy for interception
import { usePropertyProxy } from 'prop-proxy'
interface Struct {
title: string;
isActive: boolean;
}
const { Property, proxy } = usePropertyProxy<Struct>();
class Category implements Struct {
@Property()
title!: string;
@Property()
isActive!: boolean;
constructor({title, isActive}: Struct){
Object.assign(this, {title, isActive})
}
}
//getter intercept
proxy.getTitle((value) => `other_${value}`)
//setter intercept
proxy.setIsActive(({setValue, value}) => setValue(true));
const category = new Category({title: 'title', isActive: false})
console.log(category.title) // output: other_title
console.log(category.isActive) // output: true
Using validator with class-validator
import { usePropertyProxy } from 'prop-proxy'
import { Length } from 'class-validator'
interface Struct {
title: string;
isActive: boolean;
}
const { Property, Validate } = usePropertyProxy<Struct>();
@Validate()
class Category implements Struct {
@Property()
@Length(0, 10)
title!: string;
@Property()
isActive!: boolean;
constructor({title, isActive}: Struct){
Object.assign(this, {title, isActive})
}
}
const category = new Category({title: 'title longer than 10 characters', isActive: true})
// output: an error is thrown, as the title length cannot be greater than 10 characters, according to schema.
The error is thrown both for values sent by the constructor and for those modified by the Class instance.
Using validator with zod
import { usePropertyProxy } from 'prop-proxy'
import { z } from 'zod'
interface Struct {
title: string;
isActive: boolean;
}
const SchemaCategory: z.ZodType<Struct> = z.object({
title: z.string().max(10),
isActive: z.boolean(),
})
const { Property, Validate } = usePropertyProxy<Struct>();
@Validate(SchemaCategory)
class Category implements Struct {
@Property()
title!: string;
@Property()
isActive!: boolean;
constructor({title, isActive}: Struct){
Object.assign(this, {title, isActive})
}
}
const category = new Category({title: 'title longer than 10 characters', isActive: true})
// output: an error is thrown, as the title length cannot be greater than 10 characters, according to schema.
The error is thrown both for values sent by the constructor and for those modified by the Class instance.
Using validator with yup
import { usePropertyProxy } from 'prop-proxy'
import { object, string, boolean } from 'yup';
interface Struct {
title: string;
isActive: boolean;
}
const SchemaCategory = object({
title: string().required().max(10),
isActive: boolean().required(),
});
const { Property, Validate } = usePropertyProxy<Struct>();
@Validate(SchemaCategory)
class Category implements Struct {
@Property()
title!: string;
@Property()
isActive!: boolean;
constructor({title, isActive}: Struct){
Object.assign(this, {title, isActive})
}
}
const category = new Category({title: 'title longer than 10 characters', isActive: true})
// output: an error is thrown, as the title length cannot be greater than 10 characters, according to schema.
The error is thrown both for values sent by the constructor and for those modified by the Class instance.
License
MIT Free Software, Yeah!