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

open-parse

v0.1.2

Published

The collection of middleware which provides REST API interface for data and schema access, users and security management.

Downloads

4

Readme

Open Parse

NPM Version NPM Downloads Average time to resolve an issue Percentage of issues still open

Open Parse = Parse.com + JSON API + koa

The collection of middleware which provides flexible RESTful API for accessing to application data store and schemas, users and security management. Save your time to bootstrap new web and mobile projects.

Open Parse is open source BaaS (Backend as a Service). On the schema below that is "Data Proccessing / Management":

BaaS

Out of the box Open Parse supports:

  • bunyan-logger which could be connected to Logentries, Loggly, NewRelic and other cloud log management services just in a 15 seconds.

  • MongoDB as default data provider. But you could implement custom data providers for any other databases (it takes ~20 min).

Built with love to Functional Principles and.. yes, koa.

Content

How It Works?

Open Parse is incredibly simple. It's just a glue which is connecting 2 pieces:

  • Middleware to get RESTful API end-point on your web server. It's implemented according to JSON API specification.
  • Data Providers to work with any data storage (by default is MongoDB).

You can extend any of those points.

Installation

npm install --save open-parse

Basic Usage

The following example has been written with using promised-mongo and koa-router packages.

Setup the environment

import Router from 'koa-router';
import pmongo from 'promised-mongo';

const router = new Router();
const db = new pmongo('localhost/my-app');

const dataRequired = function *(next) {
  if (typeof this.request.body['data'] === 'object') {
    yield next;
  } else {
    this.throw(400, 'Request data is required');
  }
};

Bring up Users API

const users = {
  dataProvider: new UsersDataProvider({
    collection: db.collection('users')
  })
};
router.post('/users', dataRequired, handleUserSignUp(users));
router.get('/login', handleUserLogin(users));
router.post('/logout', handleUserLogout(users));
router.get('/users/me', handleUserFetch(users));

Bring up Classes API

In this example we're using a local data from JSON file.

const classes = {
  dataProvider: new ObjectsDataProvider({
    collection: db.collection('objects'),
    initialCache: require('./cached-objects.json')
  }),
};
router.post('/classes/:className', dataRequired, handleObjectCreate(classes));
router.get('/classes/:className', handleObjectsList(classes));
router.get('/classes/:className/:objectId', handleObjectFetch(classes));
router.patch('/classes/:className/:objectId', dataRequired, handleObjectUpdate(classes));
router.delete('/classes/:className/:objectId', handleObjectDelete(classes));

For ObjectsDataProvider an initial cache should be specified as a [className][objectId] hash object:

cached-objects.json

{ 
  "company": {
    "our": {
      "title": "Startup Makers",
      "about": "We are consulting and outsourcing a web-development with cutting-edge JavaScript technologies (ES6, Node.js, React, Redux, koa)"
    }
  }
}

Bring up Schemas API

const schemas = {
  dataProvider: new SchemasDataProvider({
    collection: db.collection('schemas')
  })
};
router.get('/schemas/:className', handleSchemaFetch(schemas));

Connect the router to your application

import koa from 'koa';
import cors from 'kcors';
import qs from 'koa-qs';
import bodyParser from 'koa-bodyparser';
import mount from 'koa-mount';

// Create the server instance
const app = koa();
app.use(cors());
qs(app);
app.use(bodyParser());

// ...paste your routes here...

// Connect API router
app.use(mount('/api', router));

// Go LIVE
app.listen(process.env['PORT'] || 3000);

Work with Open Parse API from the browser or mobile apps

For example how to implement login in your browser scripts when you have connected Open Parse:

const login = (email, password) => {
  const loginURL =
    '/api/login'
    + '?email=' + encodeURIComponent(email)
    + '&password=' + encodeURIComponent(password);
  fetch(loginURL, {
    headers: {
      'Accept': 'application/json',
    },
    credentials: 'same-origin'
  }).then((response) => response.json()).then((body) => {
    if (body['data']) {
      const userId = body['data']['id'];
      const userName = body['data']['attributes']['name'];
      console.log('Logged as user %s (%s)', userName, userId);
    } else {
      body['errors'].forEach(error =>
        console.error('Auth error: %s (%s)', error['title'], error['source']['parameter'])
      );
    }
  });
};

FAQ

How To Connect a Cloud Log Service?

It's really easy. Did you initialize a logger? If you didn't, let's do it right now:

import bunyan from 'bunyan';
import { LogentriesBunyanStream } from 'bunyan-logentries';

const logger = bunyan.createLogger({
  name: 'awesome-app',
  streams: {
    stream: new LogentriesBunyanStream({
      token: process.env['LOGENTRIES_TOKEN']
    }),
    level: 'debug',
    type: 'raw'
  }
});

Add just a one line to your code

const users = {
  dataProvider: new UsersDataProvider({
    collection: db.collection('users')
  }),
  logger // THIS LINE!
};
router.post('/users', dataRequired, handleUserSignUp(users));
router.get('/login', handleUserLogin(users));
router.post('/logout', handleUserLogout(users));
router.get('/users/me', handleUserFetch(users));

That's all. You will get a messages (about login, logout and fetching the data about users) in your Logentries account.

Inspiration

  • Parse.com - Commercial Backend-as-a-Service platform
  • BaasBox API - Java-based open source Backend-as-a-Service solution
  • DeployD API - first generation open source BaaS platform
  • Sails.js - first generation MVC framework for Node.js
  • Reindex.io - Commercial BaaS platform with GraphQL API

Contribution

Are you ready to make the world better?

1. Fork this repo

2. Checkout your repo:

git clone [email protected]:YourAccount/open-parse.git

3. Create your feature (or issue) branch:

git checkout -b my-new-feature

4. Commit your changes:

git commit -am 'Add some changes'

5. Push to the branch:

git push origin my-new-feature

6. Create new pull request

Thank you very much. Your support is greatly appreciated.

Roadmap

Version 0.2

  • Support access control layer (ACL)
  • Add real world example
  • Improve the documentation and architecture schema
  • Add 'Access-Control-Allow-Origin' header

Version 0.3

  • Add Express middleware adapter
  • Support jobs feature
  • Support e-mail service

Version 0.4

  • Add client SDK for JavaScript and React Native
  • Support files feature

Version 0.5

  • Support web hooks