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

stapigen

v1.4.1

Published

Generate static APIs for any set of files

Downloads

6

Readme

Table of Contents

About

Stapigen allows you to generate a static, file-based JSON API out of an existing set of files. You can, for example, use it to generate an API for yaml or markdown files, like a JAMstack blog.

You can easily provide your own file parser, which allows you to generate an API for any filetype.

It's completely static, so you can host it with any static webserver or even Github Pages.

Quickstart

  1. Generate an example config file:
npx stapigen init
  1. Change configuration file as needed (see Configuration)

  2. Build api:

npx stapigen build

Commands

Run npx stapigen help [command] for detailed and up-to-date documentation.

init:

Usage: stapigen init [options]

generates an example config file

Options:
  -f, --file-name <filename>  config file name (default: "stapigen.conf.js")
  -h, --help                  display help for command

build:

Usage: stapigen build [options]

builds a json api from input files

Options:
  -c, --config-file <file-path>  path to config file (default: "stapigen.conf.js")
  -h, --help                     display help for command

Stapigen will build .json files using a parser for every entpoint (see output.schema)

Output JSON Structure

  • index.json: array containing all resources for a path
  • ID.json: file containing data for a specific resource

The id is the same as the filename, but always in lowercase.

Generated json for a single resource has following structure:

{
	"id": "RESOURCE_ID",
	"tags": { "TAGNAME": "TAG_VALUE", "TAGNAME2": "TAG_VALUE2" },
	"data": { "PARSED_PROPERTY": "VALUE", "PARSED_PROPERTY2": "VALUE" }
}

index.json contains an array:

[
	{
		"id": "RESOURCE_ID1",
		"tags": { "TAGNAME": "TAG_VALUE", "TAGNAME2": "TAG_VALUE2" },
		"data": { "PARSED_PROPERTY": "VALUE", "PARSED_PROPERTY2": "VALUE" }
	}
]

Configuration

Stapigen is configured through a configuration file. It looks for stapigen.conf.js by default. This can be changed through the --config flag. (see npx stapigen help build)

The configuration is a file exporting a javascript object as NodeJS module.

example:

module.exports = {
	input: {
		dir: 'input',
		include: '**/*.txt',
		schema: 'year/month/day',
	},
	output: {
		dir: 'output',
		schema: 'category/year',
	},
	parser: [
		{
			extensions: ['.txt'],
			parse: ({ name, content }) => ({ filename: name, content }),
		},
	],
	plugins: [],
};

input

Defines how the source files are structured.

input.dir

Location of input files.

input.include (optional)

Glob pattern for files to include. Everything not matching this pattern will be ignored.

examples:

  • only include specific files: **/*.txt
  • only include files in a specific directory: +(a|b)/**/*

Matching is done using minimatch.

input.schema (optional)

Structure of input files. e.g. year/month/day Stapigen generates tags out of the input directories (e.g. year, month, day). These are written in to the output json files and are used to generate output collections. (see output.schema)

If omitted or empty (''), it just parses everything recursively in input.dir, ignoring the file structure.

output

Defines how the api should be structured.

output.dir

Location of output files.

output.schema (optional)

Defines the folder structure for the generated json files. e.g. category/year

Stapigen generates collections for each folder name based on input folders (tags, see input.schema). If it can't find a input folder with the same name, it filters the json data by properties with the output foldername.

For example:

When defining: input.schema: "year/month/day" and output.schema: "category/year" Stapigen will filter all input files by the property category and by the tag year (tag = input folder name).

With this example, the file input/2020/12/13/myfile.md with following content:

---
category: magic
---

# my file

will result in a file output/magic/2020/myfile.json. (when providing a parser for .md files)

If omitted or empty (''), is just generates files directly in output.dir without creating folders.

parser

Array containing parsers for input files.

Stapigen does currently not include a parser, so you have to write your own!

A parser is a object with following properties:

  • extensions: array containing supported file extensions, e.g.['.md', '.txt']
  • parse: a parse function receiving a file object {name, content} and returning an object with the parsed data.

Typescript typedefinitions:

type GenericObjectData = {
	[key: string]: unknown;
};

type Parser = {
	extensions: string[];
	parse: ParserFunction;
};

type ParserFunction = (file: {
	name: string;
	content: string;
}) => GenericObjectData;

For example, this configuration:

// [...]
  parser: [
		{
			extensions: ['.txt'],
			parse: ({ name, content }) => ({ filename: name, content }),
		},
	],
// [...]

will generate .json files from .txt files with following content:

{
	// [...] (metadata)
	"data": {
		"filename": "FILE_NAME",
		"content": "FILE_CONTENT_AS_STRING"
	}
}

plugins

Array containing plugins, you might want to use.

stapigen allows you to add plugins, powered by krog

const myPlugin = require('./myPlugin');
//...
	plugins: [
		myPlugin,
	],
//...

For plugin authors: A plugin is just an object with the following properties:

  • name: the name of the plugin
  • hooks: an object with hooks (e.g. { 'before:write_collections' : () => {} })

A plugin can hook into specific hook points. The following hooks are available:

hooks

  • before:write_collections Called before writing json files, receives the parsed collections as argument. You can also modify the collections or add new ones by returning a new array.

For example:

const plugin = {
	name: 'collections-logger',
	hooks: {
		'before:write_collections': ({ collections }) => {
			console.log('before:write_collections');
			console.log(collections);

			// modify collections by returning a new arguments object
			return {
				collections: [
					...collections,
					{
						id: 'my-new-collection',
						tags: {
							myTag: 'my-tag-value',
						},
						data: {
							myProperty: 'my-property-value',
						},
					},
				],
			};
		},
	},
};

Development

Run tests

yarn run test

Author

👤 Timo Bechtel

🤝 Contributing

Contributions, issues and feature requests are welcome!

  1. Check issues
  2. Fork the Project
  3. Create your Feature Branch (git checkout -b feat/AmazingFeature)
  4. Test your changes yarn run test
  5. Commit your Changes (git commit -m 'feat: add amazingFeature')
  6. Push to the Branch (git push origin feat/AmazingFeature)
  7. Open a Pull Request

Commit messages

This project uses semantic-release for automated release versions. So commits in this project follow the Conventional Commits guidelines. I recommend using commitizen for automated commit messages.

Show your support

Give a ⭐️ if this project helped you!


This README was generated with ❤️ by readme-md-generator