A small functional toolset for building static websites.
JavaScript
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
lib
src
.babelrc
.gitignore
.jsdoc.json
.npmignore
README.md
package.json
test.js

README.md

Static Base

A small functional toolset for building static websites.
Check out static-base-contrib for some pre-build functions.

A simple example

import { run } from 'static-base';

run(
  /* get content from files */
  (files) => {
    return files.map(f => { ...f, content: readFile(f.entirePath) });
  },

  /* render markdown */
  (files) => {
    return files.map(f => { ...f, content: markdown(f.content) });
  }

  /* write to disk */
  (files) => {
    return [...files].forEach(file => {
      writeFile(path.join(file.root, 'build', file.path), file.content);
    });
  }

)(
  '**/*.markdown',
  process.cwd()

).then(() => {
  console.log('Build was successful!')

}).catch((err) => {
  console.error('Build error!');
  console.error(err);

});

Documentation

http://icidasset.github.io/static-base

A detailed example and explanation

Note: This example uses functions from static-base-contrib, but the explanation should be easy enough to understand without any knowledge of the contrib library.

/**
 * Make a dictionary.
 *
 * Which is essentially a collection of objects that contain
 * the path to each file that matches the given glob pattern.
 */
const articles = run(
  [read],                         /* puts the content of each file in the 'content' property */
  [frontmatter],                  /* extracts the frontmatter from 'content' and parses it */
  [markdown, markdownRenderer],   /* parses 'content' as markdown */
  [renameExtension, '.html'],     /* change the '.md' extension to '.html' */
)(
  'articles/**/*.md',   /* glob pattern that selects all articles */
  process.cwd()         /* path to the root directory of this project */
);


/**
 * Build collections and store them in the metadata,
 * so that each file has a reference to the other files.
 * Then render their layout and write them to disk.
 */
Promise.all([
  articles
]).then(dictionaries => {
  const [articles] = dictionaries;

  run(
    [ metadata, { collections } ],  /* store dictionaries in every file definition */
    [ template, renderHandlebars ], /* e.g. render article layout */
    [ write, 'build/articles' ]     /* writes all files to disk */
                                    /* -> /process_cwd_path/build/articles/path_from_file */
  )(
    [
      ...articles,
    ]
  );
});

Development

npm install
npm test        # run tests
npm compile     # compile es6 src code
npm run docs    # generate documentation