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

@griffel/babel-preset

v1.6.4

Published

Babel preset with build time transforms for Griffel

Downloads

7,281

Readme

Babel preset for Griffel

A Babel preset that performs build time transforms for @griffel/react.

[!CAUTION] We don't recommend to use this preset directly, it's intended to be used by other tools like webpack loader or Vite plugin.

Install

yarn add --dev @griffel/babel-preset
# or
npm install --save-dev @griffel/babel-preset

Usage

.babelrc

{
  "presets": ["@griffel"]
}

Importing Griffel from custom packages

import { makeStyles } from 'custom-package';
// 👇 custom import names are also supported
import { createStyles } from 'custom-package';

By default, preset handles imports from @griffel/react & @fluentui/react-components, to handle imports from custom packages settings should be tweaked:

{
  "presets": [
    [
      "@griffel",
      {
        "modules": [{ "moduleSource": "custom-package", "importName": "makeStyles" }]
      }
    ]
  ]
}

Note: "custom-package" should re-export __styles function from @griffel/react

Configuring Babel settings

If you need to specify custom Babel configuration, you can pass them to babelOptions. These options will be used by the preset when parsing and evaluating modules.

{
  "presets": [
    [
      "@griffel",
      {
        "babelOptions": {
          "plugins": ["@babel/plugin-proposal-class-static-block"],
          "presets": ["@babel/preset-typescript"]
        }
      }
    ]
  ]
}

Configuring module evaluation

{
  "presets": [
    [
      "@griffel",
      {
        "evaluationRules": []
      }
    ]
  ]
}

The set of rules that defines how the matched files will be transformed during the evaluation. EvalRule is an object with two fields:

  • test is a regular expression or a function (path: string) => boolean
  • action is an Evaluator function, "ignore" or a name of the module that exports Evaluator function as a default export

If test is omitted, the rule is applicable for all the files.

The last matched rule is used for transformation. If the last matched action for a file is "ignore" the file will be evaluated as is, so that file must not contain any js code that cannot be executed in nodejs environment (it's usually true for any lib in node_modules).

If you need to compile certain modules under /node_modules/ (which can be the case in monorepo projects), it's recommended to do it on a module by module basis for faster transforms, e.g. ignore: /node_modules[\/\\](?!some-module|other-module)/.

The default setup is:

module.exports = {
  presets: [
    [
      '@griffel',
      {
        evaluationRules: [
          {
            action: require('@griffel/babel-preset').shakerEvaluator,
          },
          {
            test: /[/\\]node_modules[/\\]/,
            action: 'ignore',
          },
        ],
      },
    ],
  ],
};

Transforms

This preset is designed to perform build time transforms for @griffel/react, it supports both ES modules and CommonJS, thus can be used in post-processing after TypeScript, for example.

Transforms applied by this preset allow stripping runtime part of makeStyles() and improve performance.

Example

Transforms

import { makeStyles } from '@griffel/react';

const useStyles = makeStyles({
  root: { color: 'red' },
});

roughly to

import { __styles } from '@griffel/react';

const useStyles = __styles(/* resolved styles */);

Access CSS output from code

It's possible to configure the preset to return all the evaluated styles of a file. This metadata looks something like below:

const output = {
  // makeStyles
  cssEntries: {
    // by each hook
    useStyles1: {
      // by each slot
      root: [".fxxxxx { color: 'red' }"],
    },
    useStyles2: {
      root: [".fxxxxx { color: 'red' }"],
    },
  },
  // makeResetStyles
  cssResetEntries: {
    // by each hook
    useResetStyles1: [".fxxxxx { color: 'red' }"],
    useResetStyles2: [".fxxxxx { color: 'red' }"],
  },
};

This is intended for programmatic transforms in code so that they can be reused by other tooling without extra steps to determine the output styles

import { griffelPreset, BabelPluginMetadata } from '@griffel/babel-preset';

const babelFileResult = Babel.transformFromAstSync(babelAST, sourceCode, {
  babelrc: false,
  configFile: false,
  presets: [[griffelPreset, { generateMetadata: true }]],

  filename: options.filename,

  sourceMaps: options.enableSourceMaps,
  sourceFileName: options.filename,
  inputSourceMap: options.inputSourceMap,
});

// metadata
console.log(babelFileResult.metadata as unknown as BabelPluginMetadata);

Troubleshooting

This section focuses mainly on troubleshooting this babel preset in the microsoft/fluentui repo. However, the concepts are not coupled to the repo setup.

Module evaluation

The preset uses tools from linaria to evaluate runtime calls of makeStyles. Linaria's debugging documentation can help here.

Debugging output can be activated with following environment variables:

$ DEBUG=linaria\* LINARIA_LOG=debug yarn build

On Windows it's required to set environment variables via set or you can use cross-env, for example:

$ cross-env DEBUG=linaria\* LINARIA_LOG=debug yarn build

The debug output will include:

  • Prepared code
  • Evaluated code
  • AST that indicates what code has been shaken with @linaria/shaker