Skip to content

JavaScript + TypeScript Integration ​

Generate JavaScript (with TypeScript declarations) from your Design Tokens Community Group (DTCG) tokens.

Setup ​

TIP

Make sure you have the Cobalt CLI installed!

Install the plugin from npm:

bash
npm i -D @cobalt-ui/plugin-js

Then add to your tokens.config.mjs file:

js
import pluginJS from "@cobalt-ui/plugin-js"; 

/** @type {import("@cobalt-ui/core").Config} */
export default {
  tokens: "./tokens.json",
  outDir: "./tokens/",
  plugins: [
    pluginJS({ 
      /** output JS (with TS types)? boolean or filename (default: true) */
      js: true, 
    }), 
  ],
};

And run:

sh
npx co build

You’ll then get generated JS with a token() function you can use to grab token values:

js
import { token } from "./tokens/index.js";

// get default token
const red = token("color.red.10");

// get token for mode: dark
const redDark = token("color.red.10", "dark");

// cubicBezier + bezier-easing library
import BezierEasing from "bezier-easing";
const easing = BezierEasing(...token("ease.cubic-in-out"));

INFO

The default plugin exports a plain .js with invisible .d.ts TypeScript declarations alongside it, which means you don’t have to configure anything whether using TypeScript or not.

API ​

In addition to token(), you’ll also find the following named exports:

NameTypeDescription
tokensobjectObject of token ID → value (all aliases resolved & all transformations applied)
metaobjectObject of token ID → metadata ($type, $description, etc.)
modesobjectObject of token ID → mode → values (note: tokens without any modes will be missing from the object)

Config ​

Here are all plugin options, along with their default values:

js
import pluginJS from "@cobalt-ui/plugin-js";

/** @type {import("@cobalt-ui/core").Config} */
export default {
  tokens: "./tokens.json",
  outDir: "./tokens/",
  plugins: [
    pluginJS({
      /** output JS? boolean or filename */
      js: "./index.js",
      /** output JSON? boolean or filename */
      json: false,
      /** include meta object in output? */
      meta: true,
      /** (optional) transform specific token values */
      transform: () => null,
    }),
  ],
};

Exclude Metadata ​

In some cases the meta API object can become very large. Setting the meta option to false will remove it from the output JavaScript.

js
/** @type {import("@cobalt-ui/core").Config} */
export default {
  tokens: "./tokens.json",
  outDir: "./tokens/",
  plugins: [
    pluginJS({
      meta: false,
    }),
  ],
};

Transform ​

Inside plugin options, you can specify an optional transform() function.

js
/** @type {import("@cobalt-ui/core").Config} */
export default {
  tokens: "./tokens.json",
  outDir: "./tokens/",
  plugins: [
    pluginJS({
      transform(token, mode) {
        const oldFont = "sans-serif";
        const newFont = "Custom Sans";
        if (token.$type === "fontFamily") {
          return token.$value.map((value) => (value === oldFont ? newFont : value));
        }
      },
    }),
  ],
};

Your transform will only take place if you return a truthy value, otherwise the default transformer will take place.