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

@konfirm/trap

v2.0.3

Published

Provide traps for use as Proxy handler, allowing to keep track of changes and choose to commit or rollback changes

Downloads

19

Readme

tests release

Trap Module

Provide traps for use as Proxy handler, allowing to keep track of changes and choose to commit or rollback changes

Installation

$ npm install --save @konfirm/trap

Usage

The Trap module is designed to handle and reflect Proxy manipulations to an object Proxy, during its handler assignment you can provide a Trap-instance or parts of it.

Trap all mutations

//  include the Trap module
// const { Trap } = require('@konfirm/trap');
import { Trap } from '@konfirm/trap';
//  create a trap instance
const trap = new Trap();
//  create the affected object
const affect = { foo: 'bar', bar: 'baz' };
//  create the proxy
const proxy = new Proxy(affect, trap);

proxy.foo = 'hello world';

console.log(proxy.foo);       //  'hello world'
console.log(affect.foo);      //  'bar'

delete proxy.bar;

console.log('bar' in proxy);   //  false
console.log('bar' in affect);  //  true

//  commit all trapped changes
trap.commit();

console.log(affect.foo);  //  'hello world'
console.log('bar' in affect);  //  false

API

Trap keeps track of changes within proxied objects, and exposes two methods besides the implemented trap functions.

Exports

| name | description | | --------------------- | ---------------------------------------------------------------------------------------------------------------------------- | | Trap | The Trap class itself | | MutationInterface | TypeScript interface describing Mutations | | isMutationInterface | Type Guard validating whether the input is a MutationInterface | | MutationOptions | TypeScript type describing the target, key and optional value members of a MutationInterface | | isMutationOptions | Type Guard validating whether the input is MutationOptions | | DeletionMutation | Mutation describing deletion mutations, created by deleteProperty (delete target.key) operations | | PropertyMutation | Mutation describing property mutations, created by defineProperty (Object.defineProperty(target, key, {...})) operations | | ValueMutation | Mutation describing value mutations, created by set (target.key = ...) operations | | AbstractMutation | abstract implementation of a Mutation |

type MutationOptions

| property | type | required | notes | | -------- | ------------------------- | -------- | ----------------------------------------------------------------------------------------------------------- | | target | Object\|Function\|Array | yes | this can be narrowed down (e.g. only objects of a specific type), but never widened (e.g. not add booleans) | | key | string | symbol | yes | this can be narrowed doen (e.g. only strings), but not wideneded (e.g. not add numbers) | | value | any | no |

Trap([trackOnlyLastMutation])

The Trap constructor accepts the trackOnlyLastMutation argument (default false) indicating whether or not the mutations should be limited to one per property. If trackOnlyLastMutation is set to true value, any previous change to the trapped object is remove before applying the next value. Should the next value effectively restore the original state, no new mutations is created and the number of mutations is decreased.

commit

Apply collected mutations (optionally filtered by a search parameter) to the target and reset the mutation list.

trap.commit({ target: myTarget }); // applies all collected mutations with target myTarget
trap.commit({ key: 'sample' });    // applies all collected mutations for key 'sample'
trap.commit();                     // applies all collected mutations

rollback

Drop mutations (optionally filtered by a search parameter) so these will never be applied to the target.

trap.rollback({ target: myTarget }); // removes all collected mutations with target myTarget
trap.rollback({ key: 'sample' });    // removes all collected mutations for key 'sample'
trap.rollback();                     // removes all collected mutations

count

As v2.0 of Trap removed the mutations collection from direct access, the count method allows for counting the number of mutations (optionally filtered by a search parameter).

trap.count({ target: myTarget }); // counts all mutations with target myTarget
trap.count({ key: 'sample' });    // counts all mutations for key 'sample'
trap.count();                     // counts all mutations

Implemented Trap functions

Trap provides most of the Proxy handler methods which directly change object properties.

Trap functions not implemented

The following functions are currently not implemented by the Trap module, if there is a need for them to be added, feel free to submit an issue or create a pull request.

Licence

MIT License

Copyright (c) 2017-2023 Rogier Spieker (Konfirm)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.