css-in-js-preprocessor
TypeScript icon, indicating that this package has built-in type declarations

1.0.0 • Public • Published

Build Status Coverage Status dependencies Status npm version

css-in-js-preprocessor

Preprocess your css-in-js files to replace references to design system tokens with actual values

Hello friend.

CSS-in-JS is awesome and powerful, but do you miss the ability to preprocess your styles with your token values (like .less & .sass) without having to have your tokens as a dependency?

Well, that's where css-in-js-preprocessor is here to save the day!

With css-in-js-preprocessor, you can use your design system tokens to build your styles while also auto-MAGICALLY replacing the references to them with the actual values! Thus, eliminating the need for a dependency on a tokens package and ensuring that your values are up to date on every compile.

Version: 1.0.0

preprocessor

Preprocesses your css-in-js file by replacing references to design system tokens with actual values

Since v1.0.0

Param Type

file

The string contents of the file
string

tokens

Object containing the key/value pairs representing the token/value
Record<string, unknown>

tokensImport

The string path of the package or file imported for the tokens
string

custom

Array of custom processors
Array<(file: string) => string>

Returns: {(file: string) => string}

Import

import { preprocessor } from 'css-in-js-preprocessor';

Examples

Note

These examples overwrite the original files. I recommend that you preprocess your compiled files as part of your compile process so that you always have reference to the tokens in source. That way if the token value ever changes, the values in your js styles will be updated with the next compile. If you are operating on the compiled files, you will want to overwrite the file you're preprocessing with the updated version which is why the examples are shown the way they are.

Here's an example of how you might add it to your compile process. In this case, I'm running a TypeScript compile and then executing a node script that uses css-in-js-preprocessor:

"scripts": {
  "compile": "tsc && node bin/style-preprocess.js"
}

Basic Example

my-tokens.json
{
  "backgroundAccentColor": "#ccc",
  "fontSizeMedium": 12,
  "paddingMedium": 16
}
styles.js
import tokens from './my-tokens';

export const someStyle = {
  backgroundColor: tokens.backgroundAccentColor,
  fontSize: tokens.fontSizeMedium,
  padding: tokens.paddingMedium,
};
style-preprocess.js
This file should be executed at the end of your compile or build process.
const { preprocessor } = require('css-in-js-preprocessor');
const fs = require('fs');
const path = require('path');
const tokens = require('./my-tokens');

// Setup preprocessor:
const preprocess = preprocessor(tokens, './my-tokens');

// Read the file:
let file = fs.readFileSync('./styles.js', 'utf8');

// Preprocess the file:
file = preprocess(file);

// Save the file:
// Note that this example overwrites the original file which 
// should be the compiled version of the file and not the 
// original source file. 
fs.writeFileSync(path.join('./styles.js'), file, 'utf8');
styles.js
This is the updated version after the preprocessor has run.
export const someStyle = {
  backgroundColor: '#fff',
  fontSize: 12,
  padding: 16,
};

Custom Preprocessors

If you have additional preprocessing work that you'd like to do, you can pass in an array of functions that take in the preprocessed file where you can do your additional work and return the new string version of the file:

style-preprocess.js
This file should be executed at the end of your compile or build process.

Modify the above example with this:

const changePaddingToMargin = file => file.replace('padding: ', 'margin: ');
const addTimeStamp = file => `${file}\n\n// Compiled: ${(new Date()).toString()}`;

// Setup preprocessor:
const preprocess = preprocessor(tokens, './my-tokens', [changePaddingToMargin, addTimeStamp]);
styles.js
This is the updated version after the preprocessor has run.
export const something = {
  backgroundColor: '#fff,
  fontSize: 12,
  margin: 16,
};

// Compiled: Tue Mar 16 2021 06:15:06 GMT-0500 (Central Daylight Time)

Multiple Files

preprocessor conveniently returns a function so you can setup your base preprocessor one time and loop through the files you want to preprocess:

const { preprocessor } = require('css-in-js-preprocessor');
const fs = require('fs');
const path = require('path');
const tokens = require('./my-tokens');

// Setup preprocessor:
const preprocess = preprocessor(tokens, './my-tokens');

const files = (fs.readdirsync(pathToDir) || []).filter(file => file.endsWith('.js'));

for (const fileName of files) {
  // Read the file:
  let file = fs.readFileSync(path.join(pathToDir, fileName), 'utf8');

  // Preprocess the file:
  file = preprocess(file);

  // Save the file:
  // Note that this example overwrites the original files which 
  // should be the compiled versions of the files and not the 
  // original source files. 
  fs.writeFileSync(path.join(pathToDir, fileName), file, 'utf8');
}

Imports

For your token imports, you may use:

  • default import
  • named import
  • default require
  • named require

You may also name your tokens anything you wish:

import tokens from './my-tokens';
import { myTokens } from './my-tokens';
const tokenObj = require('./my-tokens');
const { tokenzzz } = require('./my-tokens');

css-in-js-preprocessor will pick up the name of your tokens object and get to work.


Package Contents

Within the module you'll find the following directories and files:

package.json
CHANGELOG.md -- history of changes to the module
LICENSE
README.md -- this file
/lib
  └───/es5
      └───index.d.ts - 48 Bytes
      └───index.js - 289 Bytes
    └───/preprocessor
      └───index.d.ts - 679 Bytes
      └───index.js - 1.29 KB
    └───/_private
      └───preprocessTokens - 2.16 KB
      └───removeImport - 1.23 KB
      └───utils - 1.16 KB
  └───/es6
      └───index.d.ts - 48 Bytes
      └───index.js - 48 Bytes
    └───/preprocessor
      └───index.d.ts - 679 Bytes
      └───index.js - 1.12 KB
    └───/_private
      └───preprocessTokens - 1.98 KB
      └───removeImport - 1.08 KB
      └───utils - 942 Bytes

License

MIT

Package Sidebar

Install

npm i css-in-js-preprocessor

Weekly Downloads

1

Version

1.0.0

License

MIT

Unpacked Size

23.1 kB

Total Files

24

Last publish

Collaborators

  • paravano