New Research: Supply Chain Attack on Axios Pulls Malicious Dependency from npm.Details →
Socket
Book a DemoSign in
Socket

sticky

Package Overview
Dependencies
Maintainers
1
Versions
10
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

sticky

Map model objects across different domains

latest
npmnpm
Version
0.8.0
Version published
Maintainers
1
Created
Source

sticky

Build Status NPM version

Map model objects across different domains.

This library is pre-1.0 and should not be considered stable.

All methods/classes under util/ are going to be split out into their own modules.

browser support

Installation

$ npm install sticky

Usage

var ModelStore = require('sticky').ModelStore;

var db = new ModelStore();

Source our store by specifying a model type and a repository or provider (see Provider Interface)

// sticky-postgres-repo
db.source(User, new PostgresRepo('app_users'));

// sticky-object-repo
db.source(User, new ObjectRepo());

// sticky-ajax-rest
db.source(User, new RestfulRepo('api/user'));

Provide any input/output transforms as needed (see Transforms)

// sticky-camelize
db.use(User, camelize());

// sticky-momentize
db.use(User, momentize(['dateCreated', 'dateModified']);

// custom transform
db.use(User, function(input, output) {
  ...
});

Fire off methods, regardless of the backing provider

db.get(User)(userId).then( ... );

db.remove(User)(currentUser).then( ... );

db.getAll(User)().then( ... );

The query method on the store will forward all arguments to the underlying provider. This means that more than likely, there will be somewhat of a leaky abstraction, depending on how you sourced the store.

// e.g., sticky-postgres-repo
db.query(User)('select * from #table where email = @email', user)

// e.g., sticky-object-repo
db.query(User)(function(x) { return x.email === user.email; })

// e.g., sticky-ajax-rest
db.query(User)({ email: user.email })

Provider Interface

Any time a Repository is sourced with a provider, it looks for the following methods to use during CRUD operations. While the Repository API will ensure that all methods return a Promise, the providers themselves don't necessarily have to.

Providers simply have to return an anonymous object representation of the model, let the mapper handle getting into actual typed-objects. This allows the provider to be a very thin layer on top of your existing persistence layer.

A provider will implement some or all of the following methods:

  • get(id): object Return a single model by its id.
  • getAll(): [object] Return all models as an array.
  • query(q1, q2, ..): [object] Return the results of a query in an array of models. Variable arity.
  • add(object): object Add a model to the provider and return an updated representation.
  • remove(object): object Remove a model from the provider.
  • fetch(object): object Populate a model with all data from the provider (read from provider).
  • update(object): object Persist an existing model back to the provider (write to provider).

See sticky-object-repo as a reference implementation that uses an in-memory object to store models.

Transforms

In addition to a source Provider, a repository can consist of a stack of transforms that all output from the provider passes through. Data is passed through the same stack of transforms, in reverse, when sending data to a repo.

  • Data coming from the provider is output, and is altered via calling all transform functions in order.
  • Data going to the provider is input, and is altered via calling all transform functions in reverse order.
db.use(User, function(input, output) {
  if (output) {

    // if called with an output object, we're processing the output
    output.date = moment(output.date);

  } else {

    // otherwise, we're processing input
    input.date = input.date.format();
  }
});

Tern Support

The source files are all decorated with JSDoc3-style annotations that work great with the Tern code inference system. Combined with the Node plugin (see this project's .tern-project file), you can have intelligent autocomplete for methods in this library.

Testing

Testing is done with Tape and can be run with the command npm test.

Automated CI cross-browser testing is provided by Testling, and server-side testing is done with Travis CI.

License

Copyright 2014 Brandon Valosek

sticky is released under the MIT license.

FAQs

Package last updated on 31 May 2014

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts