JSPM

  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 6320
  • Score
    100M100P100Q141411F
  • License MIT

The hapi utility toy chest

Package Exports

  • @hapipal/toys
  • @hapipal/toys/lib/index.js

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (@hapipal/toys) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

toys

The hapi utility toy chest

Build Status Coverage Status

Lead Maintainer - Devin Ivy

Installation

npm install @hapipal/toys

Usage

See also the API Reference

Toys is intended for use with hapi v20+ and nodejs v16+ (see v3 for lower support).

Toys is a collection of utilities made to reduce common boilerplate in hapi v20+ projects.

Below is an example featuring Toys.auth.strategy() and Toys.withRouteDefaults(). The API Reference is also filled with examples.

const Hapi = require('@hapi/hapi');
const Boom = require('@hapi/boom');
const Toys = require('@hapipal/toys');

(async () => {

    const server = Hapi.server();

    // Make a one-off auth strategy for testing
    Toys.auth.strategy(server, 'name-from-param', (request, h) => {

        // Yes, perhaps not the most secure
        const { username } = request.params;

        if (!username) {
            throw Boom.unauthorized(null, 'Custom');
        }

        return h.authenticated({ credentials: { user: { name: username } } });
    });

    // Default all route methods to "get", unless otherwise specified
    const defaultToGet = Toys.withRouteDefaults({ method: 'get' });

    server.route(
        defaultToGet([
            {
                method: 'post',
                path: '/',
                handler: (request) => {

                    return { posted: true };
                }
            },
            {   // Look ma, my method is defaulting to "get"!
                path: '/as/{username}',
                options: {
                    auth: 'name-from-param', // Here's our simple auth strategy
                    handler: (request) => {

                        const username = request.auth.credentials?.user?.name;

                        return { username };
                    }
                }
            }
        ])
    );

    await server.start();

    console.log(`Now, go forth and ${server.info.uri}/as/your-name`);
})();