
Security News
/Research
Popular node-ipc npm Package Infected with Credential Stealer
Socket detected malicious node-ipc versions with obfuscated stealer/backdoor behavior in a developing npm supply chain attack.

Mole is a platform agnostic preprocessor that allows you to create your own design system framework. There are a lot of ways to use mole. Some examples include, creating your own CSS framework, managing design tokens for different platforms, or something else entirely.
Setup your project and install mole as a dependency.
npm install mole --save-dev
Build output files using
mole.build()
Configure mole using one of the methods below.
See the examples for different ways of configuring your project.
By default mole will look for a file called mole.config.js at the root of your project.
// mole.config.js
module.exports = {
theme: 'theme.js', // The path of your theme file (supports .js and .jsonnet)
model: ['model-name'], // The name or path of any models you want to use (optional)
template: ['template-name'], // The name or path of any templates you want to use
output: [ // You can have one or more outputs
{ css: { file: 'styles.css' } },
{ ios: { file: 'styles.h' } },
{ android: { file: 'styles.xml' } }
]
}
You can override the location of the config file by using mole.config().
mole.config('src/mole.config.js')
theme optional
The location of your theme data. Mole supports js, and jsonnet.
Type: String
model optional
Can be either a:
named model,dirpath to a js file which exports a callback.When a dir is used it will look for files or sub directories who's name matches a named output. An array can be used to specify multiple models.
Type: String
template
Can be either a:
named templatedirpath to a js file which exports a callback or template string, or a njk file which contains Nunjucks template code.When a dir is used it will look for sub directories who's name matches a named output and then look for file names matching a top level key inside data. Failing this it will look for files who's name matches a named output inside the directory. Additionally you may wish to name a file index and that will be used instead. An array can be used to specify multiple templates.
Type: String
output
A object with properties specifying where (file) and how to process(model, template) the output. You can specify a different template or model for each output. Create a named output by surrounding it in a key. An array can be used to specify multiple outputs.
{
file: '', // File and directory to output the file
model: '', // Model to use (optional)
template: '' // Template(s) to use (optional)
}
Type: Object | Array
A theme is a file used to describe different design decisions, characteristics, traits or tokens. Mole is fairly unopinionated about how you use it so you can structure your theme data how you like. In fact a theme is completely optional if you prefer.
Below is a trivial example of a theme
{
font: {
size: [ 16, 19, 22, 26, 30, 35 ]
}
}
Theme data is accessible inside models and is immutable from inside them. When you create a model this returns an object which updates the main model and is then available to use by templates when they are rendered.
To avoid logic responsible for describing certain design characteristics being stored in models, you can can describe theme data using a more expressive method using Jsonnet which includes functions from it's standard library.
Example using Jsonnet
{
font: {
size: [
std.ceil(16 * std.pow($.number['golden ratio'], n))
for n in std.range(0, 5)
]
}
}
Models act like middleware which allow you to create a data structure separate from theme data so it can be used by different templates for different platforms and languages.
When more than one model is assigned to an output the data from each model is merged together.
To use a named model
mole.use('model', 'model-name', (theme, name, str) => {
// Do something here to modifying the theme data
theme.newProperty = []
return theme
})
Templates allow you to format data for a specific platform or language. You can create templates by either using template strings (using Nunjucks) or a function.
When multiple templates are specified the strings from each template are merged into one.
An example of using a function
mole.use('template', 'font-size', (model, theme, name, str) => {
let scale = model[name]
for (let i = 0; i < scale.length; i++) {
str`
.$font-${i} {
font-size: ${scale[i]}
}`
}
return str()
})
An example of using a template string
mole.use('template', 'font-size',
`.font-{{modifier}} {
font-size: {{value}};
}`
})
mole.config( path | object ) String | Object
Set the configuration.
mole.theme( path | object ) String | Object
Set or update the theme data.
mole.register( model | template, name, callback ) String, String, Function
Register a model or template for use.
mole.use( [ model | template, ] [ name ] [, callback] ) String, String, Function
Use a model or template directory, or use one that has been registered.
mole.render()
Returns an array of rendered templates.
mole.build()
Builds the output files.
Setup your project and install mole as a dependency.
npm install mole --save-dev
To install
npm install mole@next --save-dev
To run/compile
npm run build
To test
npm run test
To test and watch for changes
npm run dev
FAQs
A tool for managing design decision outputs for different platforms
We found that mole demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
/Research
Socket detected malicious node-ipc versions with obfuscated stealer/backdoor behavior in a developing npm supply chain attack.

Security News
TeamPCP and BreachForums are promoting a Shai-Hulud supply chain attack contest with a $1,000 prize for the biggest package compromise.

Security News
Packagist urges PHP projects to update Composer after a GitHub token format change exposed some GitHub Actions tokens in CI logs.