JSPM

  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 89
  • Score
    100M100P100Q89351F
  • License MIT

Prop-Proxy allows you to intercept getters and setters of class attributes through decorators

Package Exports

    This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (prop-proxy) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

    Readme

    Prop-Proxy

    Proxy for class properties

    npm version unpkg install size

    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}) => value ? 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!