Nuclear Potato Monster

    @justinseibert/depends-on
    TypeScript icon, indicating that this package has built-in type declarations

    1.2.1 • Public • Published

    dependsOn

    NPM version NPM downloads Build status

    A decorator for caching class getters and updating the cache based on dependent properties

    Installation

    npm install @justinseibert/depends-on --save

    Support

    Make sure ES6 @decorators are supported in your environment. For instance, in .tsconfig:

    {
      "compilerOptions": {
        ...
        "experimentalDecorators": true,
      }
    }

    Usage

    Dependency Array

    Apply decorator to a public get accessor. Add string identifiers of other properties to the dependency array that will trigger a cache update.

    Properties added to the dependency array are also tracked in the cache, but do not require their own decoration.

    If all of the dependencies are unchanged, the accessor will return the last cached value instead of executing it's underlying function.

    import dependsOn from '@justinseibert/depends-on'
    
    class Plant {
      hasWater = true
      hasLight = true
    
      @dependsOn(['hasWater', 'hasLight'])
      public get canGrow() {
        return this.hasWater && this.hasLight
      }
    }

    Permanent Caching

    If the dependency array is empty, the value of the function will be permanently cached during it's first access.

    class Boulder {
      @dependsOn([])
      public get mineralComposition() {
        const feldspar = Math.random()
        const quartz: 1 - feldspar
    
        return {s
          feldspar,
          quartz,
        }
      }
    }

    Setter Functions

    A setter function will update the cached value and perform any additional computation within.

    Related dependencies that are updated within the set function are cache-validated so that they do not needlessly trigger a reload during the next get

    class Lake {
      volume = 100
      topography = [ ... ]
    
      @dependsOn(['topography', 'volume'])
      public get shoreline() {
        const perimeter = []
        this.topography.forEach((sector) => {
          perimeter.push(...calculatePoints(sector, this.volume))
        })
        return perimeter
      }
    
      public set shoreline(perimeter) {
        this.volume = calculateVolume(perimeter, this.topography)
      }
    }

    License

    MIT

    Install

    npm i @justinseibert/depends-on

    DownloadsWeekly Downloads

    2

    Version

    1.2.1

    License

    MIT

    Unpacked Size

    63 kB

    Total Files

    12

    Last publish

    Collaborators

    • justinseibert