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

@hydrofoil/labyrinth

v0.4.5

Published

Build Hydra APIs on top of hydra-box

Downloads

336

Readme

@hydrofoil/labyrinth

Labyrinth is an opinionated, batteries-included middleware for setting up a Hydra API with ease in data-centric manner.

It uses hydra-box internally and extends it to provide ready to use building blocks for rapid RDF-base API development.

Installation

npm i --save @hydrofoil/labyrinth

Setting up

Labyrinth exports an async factory function which creates an express handler.

import express from 'express'
import * as path from 'path'
import { hydraBox } from '@hydrofoil/labyrinth'

// base path to load JavaScript code referenced in Api Documentation
const codePath = path.join(__dirname, 'lib')
// path to load the Api Documentation from Turtle files
const apiPath = path.join(__dirname, 'hydra')
// base resource namespace
const baseUri = 'http://example.com/'

async function main() {
  const app = express()
    
  app.use(await hydraBox({
    codePath,
    apiPath,
    baseUri,
    path,        // (optional) ApiDocumentation URL path
    defaultBase, // (optional) base URI to parse API Documentation
    loader,      // (optional) hydra-box resource loader
    // SPARQL endpoint
    sparql: {
      endpointUrl, // Query
      updateUrl,   // (optional) Update 
      storeUrl,    // (optional) Graph Protocol,
      user,        // (optional) endpoint user name
      password     // (optional) endpoint password
    },
    options: {
      collection: {
        pageSize   // (optional) default page size of paged collections   
      }  
    },
    errorMappers: [] // (optional) map errors into problem+json
    middleware: {    // (optional) hydra-box middleware (arrays or function)
      operations,    // runs before final operation is selected. modify `req.hydra.operations` here
      resource,      // runs before operation is invoked. modify `req.hydra.resource` here
    }
  }))
  
  app.listen(8080)
}

main()

Features

  • Generic handlers for getting individual resources
    • Eager loading linked resources
    • Resource preprocessor for custom resource logic before handler
  • Generic hydra:Collection handler
    • Create any collection using hydra:manages block
    • Custom filtering
    • Ordering using property paths
    • Paging using hydra:pageIndex
  • Secured using JWT tokens
    • Permission-based restrictions to operations
    • Restricting select properties or entire classes
  • Error handling using Problem Details for HTTP APIs (RFC 7807)

Difference from hydra-box

In contrast to hydra-box it also makes some limiting assumptions:

  1. All resources are stored in triple store in named graph-per resource fashion
  2. Labyrinth provides its own loader which does SPARQL CONSTRUCT query to load said resources
    • Another loader can be used
  3. At the moment ApiDocumentation is only loaded from the filesystem. In the future loading from other sources may be added