npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

esconform

v0.0.10

Published

Conform JavaScript objects to an external model

Downloads

5

Readme

esconform

esconform is a JavaScript library that allows you to conform JavaScript objects to an external model.

It allows you to transform the keys of an object, then uses setters to ensure that updated values to the output object are transformed. Both transformation functions can use an external specification to determine the validity of the transformation.

All values besides null and undefined are transformed to their corresponding JavaScript Objects (e.g. this 'string' will be transformed into a new String('string')).

Note: Users have to manually specify that spec values should be returned if actual values are undefined. You can also set mirror: true.

Usage


const specification = {
   firstName: 'string',
   lastName: 'string',
   age: 'number',
}


Object.defineProperty(specification, 'address', { value: {type: 'string'} })

const newModel = new Model({

   values: (key, value, spec) => {
       if (value === undefined) value = spec // Default to the specification (user-defined)
       return value
   },

   keys: (key, spec) => {

       const specVal = spec[key]

       let info = {
           value: key, // Specify the new key
           enumerable: specVal?.enumerable ?? true // Specify enumerability
       }

       // Specify links to the new key
       if (key === 'fullName') {
           info.links = [
               {key: 'firstName', update: (value) => value.split(' ')[0]}, 
               {key: 'lastName', update: (value) => value.split(' ')[1]}, 
           ]
       }

       if (!(key in spec)) delete info.value // Silence key if not in spec

       return info
   },

   specification,
})

const person = {
   fullName: 'John Doe',
   age: 30,
   address: '123 Main St',
   extra: 'THIS IS REALLY ANNOYING'
}

const john = model.apply(
   person,
   {
       mirror: true // Mirror all values in the specification that aren't present on provided value
   }
)

// Properties are transformed based on the specification
console.log('firstName', john.firstName) // Result: John
console.log('lastName', john.lastName) // Result: Doe
console.log('fullName', john.fullName) // Result: undefined

// Properties that are out of the specification are not set
console.log('extra', john.extra, 'extra' in john) // Result: undefined, false

// Properties that are out of the specification will also be blocked
john.extra = 'TEST' // Silenced by Proxy
console.log('extra', john.extra, 'extra' in john) // Result Still: undefined, false

// Linked properties will respond to each other (even if the original key is not in the specification)
john.fullName = 'Jane Doe'
console.log('firstName', john.firstName) // Result: Jane
console.log('lastName', john.lastName) // Result: Doe
console.log('fullName', john.fullName) // Result: undefined

// Properties that are originally missing but present in the specification will be processed
const dob = new Date('1990-01-01')
console.log('DoB', dob) // Result: Sun Dec 31 1989 16:00:00 GMT-0800 (Pacific Standard Time)
john.dateOfBirth = dob
console.log('DoB', john.dateOfBirth) // Result: Sun Dec 31 1989 16:00:00 GMT-0800 (Pacific Standard Time)

Notes

  1. Sometimes promises will resolve as undefined (e.g. nwbFile.acquisition.x.data on WebNWB)