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

parsecss

v1.0.3

Published

Simple tool to parse CSS into a JSON structure.

Downloads

7

Readme

parsecss

Convert CSS Stylesheets into a simple JSON structure.

parsecss was written to support critical CSS inlining on dynamic pages. The JSON structure it produces is optimized for figuring out which CSS rules should be applied to a given page. We use postcss to do most of the heavy lifting, but our JSON output makes it easier to use than an AST for certain use cases.

Hex.pm Build Status

Installation

npm install -g parsecss

Usage

To use parsecss you simply pass it the contents of a CSS stylesheet (or path).

parsecss -f path/to/file.css

// via stdin
cat path/to/file.css | parsecss

You can also use parsecss programatically in node:

var parseCSS = require('parsecss');
var output = parseCSS(css);

JSON Structure

parsecss was written to support critical CSS inlining on dynamic pages. As such, the JSON structure it produces is optimized for figuring out which CSS rules should be applied to a given page.

Terminology:

  1. Rules - A CSS rule refers to a selector + its declarations.
  2. Selectors - For each rule, the selectors define which elements are affected.

We consider each rule in a @media query as its own rule to ensure that we don't miss out on any rules that should be included.

Global Rules

We consider all rules with selectors that don't contain class names to be global. Since we don't use IDs in our CSS selectors, this effectively means that all rules that directly affect tags (eg. html, body, a) are global.

Class List Pairs

For each non global rule, we parse the class names that are contained in it (accounting for pseudo selectors).

Eg. .home .link.a {} => ['home', 'link']

@font-face Rules

These rules are split into their own section since they are almost always critical and are required to fetch the fonts as soon as possible.

Keyframes

Keyframe rules are parsed so that they are keyed by their names to allow for conditional inclusion of certain critical keyframes on the page.

Sample Output

Each rule in the output is minified using cssmin.

{
    "globalCss": ["footer{display:none}", "a{text-decoration:underline}"],
    "fontfaceCss": ["@font-face{...}"],
    "keyframesCss":[
        ["fadeOut","@keyframes fadeOut{from{opacity:1}to{opacity:0}}"],
        ["fadeInUp","@-webkit-keyframes fadeInUp{}"]
    ],
    "classListCssPairs": [
        [["Button","Topic"],".Button.Topic{border:0}"],
        [["NavHeader","link"],"@media screen and (max-width:434px){.NavHeader .link{...}}"],
    ]
}