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

content-maestro

v0.0.1-alpha.19

Published

A text based, structured content framework, for edition and consumption.

Downloads

6

Readme

Content Maestro 💁‍♂️📚

A text based, structured content framework, for edition and consumption.

Warning: Under heavy development

Highlights

  • Manage your content in a predictable way
  • Prevents entropy for ever growing knowledge base
  • Future-proof: based on standards, idioms and popular tools
  • Transform and serve your content
  • Generate type-safe import Helpers
  • Agnostic API: target any consumer type

You might have 10 wiki entries, it's easy to refactor for a category name typo.
But what if we have hundreds of entries accross dozens of differents collections types?

That's where Content Maestro shines, by establishing a schema first based workflow.
The whole content pipeline originate from a seed: your schemas definitions.

Current state of DX for code edition is phenomenal thanks to TypeScript, languages servers, linting tools, smart IDEs…
Thankfully, we are making some progress regarding content management and EX (editor experience).



Installation

Create project

# Create the parent housing folder for your project
mkdir ./my-project && cd ./my-project

# Content Maestro boilerplate + CLI
pnpx degit \
JulianCataldo/content-maestro/demo/content-base ./content-base

# (Optional) Demo front-end content consumer
# `content-base` package is linked-imported in this front-end
pnpx degit \
JulianCataldo/content-maestro/demo/front-astro ./front-astro

# Bootstrap all dependencies
pnpm install --recursive --shamefully-hoist

Launch content server & front end

# Terminal A — Content server
cd ./content-base
pnpm run start

# Terminal B — Consumer web GUI
cd ./front-astro
# Development mode
pnpm run dev

# -OR- pack + launch server side rendered website
pnpm run build:serve

Create content

# Terminal C — Content creation CLI utilities
cd ./content-base

# Bootstrap a singleton entity
pnpm maestro create profile

# Bootstrap a collection of entities
pnpm maestro create people person
#                       ↑      ↑
# Collection name ——————·      |
# Entity singular name ————————·
#
# Yields:
#
# content/people
# ├── person.schema.yaml     (basic schema)
# └── voice-hay-lif          (random words)
#     ├── body.md            (basic frontmatter + markdown)
#     └── meta.yaml          (basic extra metadata)

# ··············································································

# Create a new entity inside an existing collection
pnpm maestro create people elisabeth
#                       ↑        ↑
# Collection name ——————·        |
# New entity name ———————————————·
#
# Yields:
#
# content/people
# └── elisabeth
#     ├── […].md            (schema generated fake data frontmatter + markdown)
#     └── […].yaml          (schema generated fake metadata)

Recommended VS Code extensions

code --install-extension redhat.vscode-yaml
code --install-extension unifiedjs.vscode-remark

Typical structure

Example project setup is made of:

  • A package folder where all your content with its dedicated environment lives:
    • The content server, which can act both for dev. and prod.
    • Content helpers, exported as a package for consumers to import
    • Pre-configured local dev. static tooling for edition
  • (Optional) A folder with your front end consumer, could be anything:
    Nuxt, Next, Gatsby, Astro, plain TypeScript…
    Here we use Astro.

Content ingestion

As for now, supports: pure Markdown* and YAML.

*with advanced features like GFM, directives, TOC…

Helper

import content from 'content/get';

const articles = await content.getArticles();

console.log(articles?.someNamedArticle);
console.log(articles?.someNamedArticle?.main?.body);

Astro template

See demo front-end implementations.
Pre-configured for SSR bundling, then serve.

Front-end works in concert with content server and will fast-refresh its changes in dev. mode.

---
import content from 'content/get';

import { Markup } from 'astro-remote';
import Gallery from 'src/components/Gallery.astro';
import Link from 'src/components/Link.astro';

const articles = await content.getArticles();

const someNamedArticle = articles?.someNamedArticle
const content = someNamedArticle?.main?.body;
const title = someNamedArticle?.main?.frontmatter?.title;
const someMeta = someNamedArticle?.meta?.foo;

/* Augment markup by mapping your Astro / React / Vue / Svelte components
   Server-side rendering only (no client-side hydration) */
const components = { Gallery, 'a': Link, /* … */ };
---

{ title && <h1>{title}</h1> }

{ content && <Markup {content} {components} /> }

{ someMeta || 'nothing…' }

<!-- ... -->

Consumers

You could really use anything on the other side of the wire, though, Content Maestro is made with the Astro framework in mind, as it provides easy way to integrate and "augment" remote markup.
Content helpers are just plain typescript functions, with no ties, outside of AJV.

Demo

See the demo workspace

Configuration

See the Configuration API

Let's get into the details

For whom?

Mainly for us, developers 🤓.
We enjoy building tools that make content editing simpler for non-technical people.
Still, for us, text-based editing is unbeatable.
However, this presents a challenge: how do we keep track of structural changes?
How can we make this predictable for content consumers like your wiki, documentation, blog, web garden, or any server-rendered or static website?

What's in the box?

  • Sensible defaults for a quick new project bootstrap
  • State-of-the-art Markdown (and friends) environment
  • A command line initializer, with options
  • A command line editing server
  • Fake entries mock server, with valid content for lorem ipsum purposes
  • A command line assistant for scaffolding new entries
  • An open gate for adding your own transformers
  • A graphical interface for content preview / problems reviews
  • Linting / checking pre-configured and orchestrated for you
  • Refactoring assistance, thanks to all your IDE toolings

Markdown

These are the already bundled Mardown transformers

Checking (linting + validation)

  • Preset — Recommended
  • Preset — Style Guide
  • Preset — Consistent
  • YAML frontmatter schema validation

Transformer

  • Transform markdown directives to custom components
  • Load GitHub-flavored Markdown features
  • Extract YAML frontmatter
  • Convert to formatted HTML
  • Pass <Components /> for front-end to handle
  • Bundle and build entries static JSONs

How does it works? An eagle view

See the diagram here