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

baseplate-core

v1.8.6

Published

A tool for building prototypes and pattern libraries.

Downloads

584

Readme

baseplate-core

Circle CI npm

A tool for building prototypes and pattern libraries.

Inspired heavily by component-styleguide. This is still very specific to our use-case so you probably want to look at component-styleguide first.

Details

Templating

Handlebars is used as the template engine.

Helpers

Handlebars is a logicless templating engine so you need helpers to do anything interesting in them. A set of helpers are provided in the templates to make prototyping as simple as possible.

| Helper | Description | | ------ | ----------- | |{{capitalize 'example'}} | Capitalize a given string | |{{couldBeTrue threshold}}| Returns true/false based on threshold, e.g. 0.9 will return true 90% of the time. | | {{debug object}} | Will log the provided value to the console | |{{envIs 'production'}} | Check the current environment | |{{envIsNot 'production'}} | Reverse of envIs check | |{{getOrElse maybeValue "Default" }}| Get a value if it exists otherwise return a default | |{{htmlEscape '<h1>Hello</h1>'}} | Escape HTML entities | |{{inlineFile 'path/to/file.ext'}}| Returns the contents of a file | |{{isEqual value1 value2)}} | Test if two values are equal | |{{isUndefined value}} | Test if a value is undefined | |{{lorem count}}| Lorem ipsum generator. Returns count sentences | |{{loremWords min max}}| Lorem ipsum generator. Returns random words between min and max | |{{prefixClass array 'letter'}} | Takes an array of values and adds a prefix | |{{{{raw}}}}Raw {{block}} helper{{{{/raw}}}} | Block helper which disables handlebars processing for contents | |{{#queryString 'param' matches='value' }} | Block helper to check if a query string parameter matches a certain value | |{{#repeat count}}block{{/repeat}}| Repeat a block count times | |{{#repeatRange min max}}block{{/repeatRange}}| Repeat a block between min and max times | |{{stringify obj }} | Passes input to JSON.stringify. Useful for debugging |

Common Variables

A handful of root level common variables are exposed for use in templates. They are only available in listings as they are mostly used to get the current URL. If you need this data in a partial then pass it in as an argument.

| Variable | Description | | -------- | ----------- | | {{@root.link}} | Relative link to the current page | | {{@root.absoluteLink}} | Absolute link to the current page | | {{@root.queryString}} | Raw query string object |

Partials

Everything under components/patterns is automatically registered as a partial. For example {{> patterns/objects/icon}} will render components/patterns/objects/icon.html). This is powerful for making components comprised of other components.

Usage Notes

You can add markdown files in the patterns/ directory and the contents will be displayed alongside the pattern. The file needs to be named the same as the pattern e.g., patterns/base/text.md alongside patterns/base/text.html.

Default Collection Mock Data

Any pattern in a collecion can have default JSON data to be rendered in a collections list view. The file needs to be named the same as the file e.g., patterns/base/text.json alongside patterns/base/text.html. The format is:

{
	"defaults": [{}]"
}

If more than one object is provided in the "defaults" array the app will randomly select an item from the array. Useful for providing a few variations of mock data.

Global Mock data

All JSON files under data/ are concatenated into one context for the templates. E.g. users.json containing [] and profile.json containing {} will result in the following data for the templates:

{
   "users": [],
   "profile": {}
}

Now, the {{#users}} collection can be iterated over in any template.

Static assets

By default anything under /static will be exposed by the server under /static (this is configurable). This is just a static directory so you are responsible for loading them in your layout, but this means you have full control over how you manage your assets.

Installation Steps

If you don't want to start with the example app, need to configure some custom options, or just want to start from scratch you should follow these steps:

1. Install baseplate-core

npm init
npm install MadeHQ/baseplate-core --save

2. Structure

Create a directory structure similar to this:

├── baseplate-config.json
├── components
│   ├── pages
│   │   └── example-page.html
│   └── patterns
│       ├── base
│       └── modules
├── data
├── server.js
├── static
│   ├── images
│   ├── javascripts
│   └── stylesheets
└── views
    └── layout.html

3. Components

There are two types of component directories: listings which are a simple list of items (used by default for pages) and collections which display items on a single page grouped by folder (used by default for patterns).

You can configure any custom sections you want in baseplate-config.json, by adding a sections config.

{
    "sections": [{
        "type": "list",
        "title": "Pages",
        "path": "/pages",
        "directory": "pages",
        "partials": false
    }, {
        "type": "collection",
        "title": "Patterns",
        "path": "/patterns",
        "directory": "patterns",
        "partials": true,
        "showUsage": true,
        "ordering": [
            "base",
            "objects",
            "modules",
            "collections"
        ]
    }, {
        "type": "collection",
        "title": "Widgets",
        "path": "/widgets",
        "directory": "widgets",
        "showUsage": true,
        "partials": true
    }]
}

Available options are as follows:

| Option | Description | | ------ | ----------- | |type | Type of view: either list or collection | |title | Navigation title, shown in toolbar | |path | URL path | |directory | Directory, relative to components/ | |partials | Should these items be available as partials?. If so they will be namespaced under the directory name, e.g. {{> patterns/a/b }} | |showUsage | If enabled and there is a .md file with the same name as the file (e.g., example.html and example.md then usage notes will be shown alongside the item. Only available for collection type. | | showSource | If enabled a "Show source" button will be shown to show the raw Handlebars source for the template | |ordering | By default collections will be ordered by directory name, if you want to customise the order, or exclude a directory from listings (but still have it available as partials) then a custom ordering will let you do this. Only available for collection type. |

4. Layout

In order to display anything you need to add a layout.html file under views/.

Three snippets are required: {{> baseplate/styles}} which returns a link to the pattern library styles and {{> baseplate/scripts}} which returns a link to the pattern library styles and {{{body}}} which renders the current view. Otherwise you are free to provide any html you like.

For example:

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>My Project</title>
    <meta name="viewport" content="width=device-width,initial-scale=1">
    {{> baseplate/styles}}
    <link rel="stylesheet" href="/static/stylesheets/my-styles.css"/>
</head>
<body>
    {{{body}}}
    {{> baseplate/scripts}}
    <script src="/static/javascripts/my-app.js" async></script>
</body>
</html>

Custom partials: You can provide custom partials under views/partials which are then available in your layout as {{> partials/nameOfPartial }}. This is mostly useful if you want to break your layout template into smaller parts.

5. Start

Add a server.js using the following template.

var baseplateConfig = require('./baseplate-config.json');
var baseplate = require('baseplate-core')(baseplateConfig);

baseplate(baseplateConfig).then(function (server) {
    server.start();
});

Run it with node server.js

API

baseplate(config<Object>) // returns <Promise>
baseplate(styleguide).then(function (server) {
	/**
	 * server.app contains the Express app used internally
	 * Helpful if you want to add your own routes or modify the server
	 */
	server.app.get('/my-custom-route', function(req, res){
	  res.send('hello world');
	});

	/**
	 * Start the server
	 */
	 server.start();
});

License

MIT