
Research
/Security News
10 npm Typosquatted Packages Deploy Multi-Stage Credential Harvester
Socket researchers found 10 typosquatted npm packages that auto-run on install, show fake CAPTCHAs, fingerprint by IP, and deploy a credential stealer.
@startupjs/babel-plugin-rn-stylename-to-style
Advanced tools
Dynamically resolve styleName in RN with support for multi-class selectors (for easier modifiers)
Transform JSX styleName property to style property in react-native. The styleName attribute and syntax are based on babel-plugin-react-css-modules.
This is the fork of https://github.com/kristerkari/babel-plugin-react-native-stylename-to-style
The differences are:
import classnames from 'classnames'
function Button ({
variant, // [string] 'primary' | 'secondary'
dark, // [bool]
disabled // [bool]
}) {
return (
<Text
styleName={classnames('button', [variant, { dark, disabled }])}
>CLICK ME</Text>
)
}
.button
background-color: blue
&.primary
color: #ff0000
&.disabled
color: rgba(#ff0000, 0.5)
&.secondary
color: #00ff00
&.disabled
color: rgba(#00ff00, 0.5)
&.disabled
color: #777
.dark
&.button
background-color: purple
&.primary
color: white
&.disabled
color: #ddd
&.disabled
color: #eee
And what's important is that selectors` specificity is properly emulated. For example:
Styles for .button.primary.disabled (specificity 30) will override styles of .button.disabled (specificity 20),
even though .button.disabled is written later in the CSS.
This simple change brings a lot more capabilities in theming your components for a dynamic look.
Convert any *StyleName attribute to the according *Style attribute. This is very useful for passing the sub-element styles (which are usually exposed by react-native libraries) directly from CSS.
If the styleName value is an object or an array, automatically pipe it through the classnames-like library.
Support for multiple named css file imports is removed
WARNING: This plugin is already built in into the babel-preset-startupjs and is included into the default StartupJS project.
If you want to use this plugin separately from StartupJS:
yarn add --dev @startupjs/babel-plugin-rn-stylename-to-style
or
npm install --save-dev @startupjs/babel-plugin-rn-stylename-to-style
.babelrcYou must give one or more file extensions inside an array in the plugin options.
{
"presets": [
"react-native"
],
"plugins": [
["react-native-dynamic-stylename-to-style", {
"extensions": ["css"]
}]
]
}
extensionsRequired
List of css extensions to process (css, styl, sass, etc.)
useImportDefault: false
Whether to generate ESM import instead of CJS require.
parseJsonDefault: false
Whether the imported css is expected to be a JSON string or an object.
If this flag is specified then JSON string is expected and it will do JSON.parse on it.
Anonymous reference can be used when there is only one stylesheet import.
import "./Button.css";
<View styleName="wrapper">
<Text>Foo</Text>
</View>;
β β β β β β
import Button from "./Button.css";
<View style={Button.wrapper}>
<Text>Foo</Text>
</View>;
import "./Button.css";
<View styleName="wrapper red-background">
<Text>Foo</Text>
</View>;
β β β β β β
import Button from "./Button.css";
<View style={[Button.wrapper, Button["red-background"]]}>
<Text>Foo</Text>
</View>;
import "./Button.css";
const name = "wrapper";
<View styleName={name}>
<Text>Foo</Text>
</View>;
β β β β β β
import Button from "./Button.css";
const name = "wrapper";
<View
style={(name || "")
.split(" ")
.filter(Boolean)
.map(function(name) {
Button[name];
})}
>
<Text>Foo</Text>
</View>;
import "./Button.css";
const condition = true;
const name = "wrapper";
<View styleName={condition ? name : "bar"}>
<Text>Foo</Text>
</View>;
β β β β β β
import Button from "./Button.css";
const condition = true;
const name = "wrapper";
<View
style={((condition ? name : "bar") || "")
.split(" ")
.filter(Boolean)
.map(function(name) {
Button[name];
})}
>
<Text>Foo</Text>
</View>;
styleName and style:import "./Button.css";
<View styleName="wrapper" style={{ height: 10 }}>
<Text>Foo</Text>
</View>;
β β β β β β
import Button from "./Button.css";
<View style={[Button.wrapper, { height: 10 }]}>
<Text>Foo</Text>
</View>;
part attribute.part gets its styles from the {part}Style prop.part='root' is magic -- it's linked to the pure style prop.Here is an example <Card> component which specifies its root container, title and footer as stylizable parts:
// Card.js
function Card ({ title }) {
return (
<View part='root'>
<Text part='header'>{title}</Text>
<Text part='footer'>Copyright</Text>
</View>
)
}
β β β β β β
function Card ({ title, style, headerStyle, footerStyle }) {
return (
<View style={style}>
<Text style={headerStyle}>{title}</Text>
<Text style={footerStyle}>Copyright</Text>
</View>
)
}
::part() selector from CSS file to style any component which uses part attributes.Following an example <Card> component above, we can call <Card> from the <App> and customize its parts styles:
// App.js
import Card from './Card'
import './index.styl'
function App ({ users }) {
return users.map(user => (
<Card styleName='user' title={user.name} />
))
}
// index.styl
.user
margin-top 16px
&:part(header)
background-color black
color white
&:part(footer)
font-weight bold
FAQs
Dynamically resolve styleName in RN with support for multi-class selectors (for easier modifiers)
The npm package @startupjs/babel-plugin-rn-stylename-to-style receives a total of 2,033 weekly downloads. As such, @startupjs/babel-plugin-rn-stylename-to-style popularity was classified as popular.
We found that @startupjs/babel-plugin-rn-stylename-to-style demonstrated a not healthy version release cadence and project activity because the last version was released a year ago.Β It has 6 open source maintainers 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.

Research
/Security News
Socket researchers found 10 typosquatted npm packages that auto-run on install, show fake CAPTCHAs, fingerprint by IP, and deploy a credential stealer.

Product
Socket Firewall Enterprise is now available with flexible deployment, configurable policies, and expanded language support.

Security News
Open source dashboard CNAPulse tracks CVE Numbering Authoritiesβ publishing activity, highlighting trends and transparency across the CVE ecosystem.