Gathering detailed insights and metrics for style-loader
Gathering detailed insights and metrics for style-loader
Gathering detailed insights and metrics for style-loader
Gathering detailed insights and metrics for style-loader
vue-style-loader
Vue.js style loader module for webpack
isomorphic-style-loader
CSS style loader for Webpack optimized for critical path CSS rendering and isomoprhic web apps
@polymer/esm-amd-loader
Minimal AMD-style loader for replicating ES module behavior.
iso-morphic-style-loader
isomorphic style loader module for webpack
npm install style-loader
54.9
Supply Chain
68.9
Quality
80.7
Maintenance
100
Vulnerability
99.6
License
Module System
Min. Node Version
Typescript Support
Node Version
NPM Version
1,657 Stars
425 Commits
470 Forks
34 Watching
2 Branches
107 Contributors
Updated on 25 Nov 2024
Minified
Minified + Gzipped
JavaScript (95.04%)
CSS (2.39%)
HTML (2.19%)
SCSS (0.37%)
Cumulative downloads
Total Downloads
Last day
-4.3%
3,000,581
Compared to previous day
Last week
2.4%
15,680,147
Compared to previous week
Last month
11.5%
65,666,147
Compared to previous month
Last year
-13.4%
749,599,259
Compared to previous year
1
31
Inject CSS into the DOM.
To begin, you'll need to install style-loader
:
1npm install --save-dev style-loader
or
1yarn add -D style-loader
or
1pnpm add -D style-loader
It's recommended to combine style-loader
with the css-loader
Then add the loader to your webpack
config. For example:
style.css
1body { 2 background: green; 3}
component.js
1import "./style.css";
webpack.config.js
1module.exports = { 2 module: { 3 rules: [ 4 { 5 test: /\.css$/i, 6 use: ["style-loader", "css-loader"], 7 }, 8 ], 9 }, 10};
This loader is primarily meant for development. The default settings are not safe for production environments. See the recommended example configuration and the section on nonces for details.
injectType
Type:
1type injectType = 2 | "styleTag" 3 | "singletonStyleTag" 4 | "autoStyleTag" 5 | "lazyStyleTag" 6 | "lazySingletonStyleTag" 7 | "lazyAutoStyleTag" 8 | "linkTag";
Default: styleTag
Allows to setup how styles will be injected into the DOM.
Possible values:
styleTag
Automatically injects styles into the DOM using multiple <style></style>
. It is default behaviour.
component.js
1import "./styles.css";
Example with Locals (CSS Modules):
component-with-css-modules.js
1import * as styles from "./styles.css"; 2 3const divElement = document.createElement("div"); 4divElement.className = styles["my-class"];
All local variables (class names) are exported as named exports. To achieve this behaviour you also have to setup modules
option for css-loader
. For more information consult with css-loader
documentation
.
webpack.config.js
1module.exports = { 2 module: { 3 rules: [ 4 { 5 test: /\.css$/i, 6 use: [ 7 // The `injectType` option can be avoided because it is default behaviour 8 { loader: "style-loader", options: { injectType: "styleTag" } }, 9 { 10 loader: "css-loader", 11 // Uncomment it if you want to use CSS modules 12 // options: { modules: true } 13 }, 14 ], 15 }, 16 ], 17 }, 18};
The loader inject styles like:
1<style> 2 .foo { 3 color: red; 4 } 5</style> 6<style> 7 .bar { 8 color: blue; 9 } 10</style>
singletonStyleTag
Automatically injects styles into the DOM using one <style></style>
.
[!WARNING]
Source maps do not work.
component.js
1import "./styles.css";
component-with-css-modules.js
1import * as styles from "./styles.css"; 2 3const divElement = document.createElement("div"); 4divElement.className = styles["my-class"];
All local variables (class names) are exported as named exports. To achieve this behaviour you also have to setup modules
option for css-loader
. For more information consult with css-loader
documentation
.
webpack.config.js
1module.exports = { 2 module: { 3 rules: [ 4 { 5 test: /\.css$/i, 6 use: [ 7 { 8 loader: "style-loader", 9 options: { injectType: "singletonStyleTag" }, 10 }, 11 { 12 loader: "css-loader", 13 // Uncomment it if you want to use CSS modules 14 // options: { modules: true } 15 }, 16 ], 17 }, 18 ], 19 }, 20};
The loader inject styles like:
1<style> 2 .foo { 3 color: red; 4 } 5 .bar { 6 color: blue; 7 } 8</style>
autoStyleTag
Works the same as a styleTag
, but if the code is executed in IE6-9, turns on the singletonStyleTag
mode.
lazyStyleTag
Injects styles into the DOM using multiple <style></style>
on demand.
We recommend following .lazy.css
naming convention for lazy styles and the .css
for basic style-loader
usage (similar to other file types, i.e. .lazy.less
and .less
).
When you lazyStyleTag
value the style-loader
injects the styles lazily making them useable on-demand via style.use()
/ style.unuse()
.
⚠️ Behavior is undefined when
unuse
is called more often thanuse
. Don't do that.
component.js
1import styles from "./styles.lazy.css"; 2 3styles.use(); 4// For removing styles you can use 5// styles.unuse();
component-with-css-modules.js
1import styles, { "my-class" as myClass } from "./styles.lazy.css"; 2 3styles.use(); 4 5const divElement = document.createElement("div"); 6divElement.className = myClass;
All local variables (class names) are exported as named exports. To achieve this behaviour you also have to setup modules
option for css-loader
. For more information consult with css-loader
documentation
.
webpack.config.js
1module.exports = { 2 module: { 3 rules: [ 4 { 5 test: /\.css$/i, 6 exclude: /\.lazy\.css$/i, 7 use: ["style-loader", "css-loader"], 8 }, 9 { 10 test: /\.lazy\.css$/i, 11 use: [ 12 { loader: "style-loader", options: { injectType: "lazyStyleTag" } }, 13 { 14 loader: "css-loader", 15 // Uncomment it if you want to use CSS modules 16 // options: { modules: true } 17 }, 18 ], 19 }, 20 ], 21 }, 22};
The loader inject styles like:
1<style> 2 .foo { 3 color: red; 4 } 5</style> 6<style> 7 .bar { 8 color: blue; 9 } 10</style>
lazySingletonStyleTag
Injects styles into the DOM using one <style></style>
on demand.
We recommend following .lazy.css
naming convention for lazy styles and the .css
for basic style-loader
usage (similar to other file types, i.e. .lazy.less
and .less
).
When you lazySingletonStyleTag
value the style-loader
injects the styles lazily making them useable on-demand via style.use()
/ style.unuse()
.
⚠️ Source maps do not work.
⚠️ Behavior is undefined when
unuse
is called more often thanuse
. Don't do that.
component.js
1import styles from "./styles.css"; 2 3styles.use(); 4// For removing styles you can use 5// styles.unuse();
component-with-css-modules.js
1import styles, { "my-class" as myClass } from "./styles.lazy.css"; 2 3styles.use(); 4 5const divElement = document.createElement("div"); 6divElement.className = myClass;
All local variables (class names) are exported as named exports. To achieve this behaviour you also have to setup modules
option for css-loader
. For more information consult with css-loader
documentation
.
webpack.config.js
1module.exports = { 2 module: { 3 rules: [ 4 { 5 test: /\.css$/i, 6 exclude: /\.lazy\.css$/i, 7 use: ["style-loader", "css-loader"], 8 }, 9 { 10 test: /\.lazy\.css$/i, 11 use: [ 12 { 13 loader: "style-loader", 14 options: { injectType: "lazySingletonStyleTag" }, 15 }, 16 { 17 loader: "css-loader", 18 // Uncomment it if you want to use CSS modules 19 // options: { modules: true } 20 }, 21 ], 22 }, 23 ], 24 }, 25};
The loader generate this:
1<style> 2 .foo { 3 color: red; 4 } 5 .bar { 6 color: blue; 7 } 8</style>
lazyAutoStyleTag
Works the same as a lazyStyleTag
, but if the code is executed in IE6-9, turns on the lazySingletonStyleTag
mode.
linkTag
Injects styles into the DOM using multiple <link rel="stylesheet" href="path/to/file.css">
.
ℹ️ The loader will dynamically insert the
<link href="path/to/file.css" rel="stylesheet">
tag at runtime via JavaScript. You should use MiniCssExtractPlugin if you want to include a static<link href="path/to/file.css" rel="stylesheet">
.
1import "./styles.css"; 2import "./other-styles.css";
webpack.config.js
1module.exports = { 2 module: { 3 rules: [ 4 { 5 test: /\.link\.css$/i, 6 use: [ 7 { loader: "style-loader", options: { injectType: "linkTag" } }, 8 { loader: "file-loader" }, 9 ], 10 }, 11 ], 12 }, 13};
The loader generate this:
1<link rel="stylesheet" href="path/to/style.css" /> 2<link rel="stylesheet" href="path/to/other-styles.css" />
attributes
Type:
1type attributes = HTMLAttributes;
Default: {}
If defined, the style-loader
will attach given attributes with their values on <style>
/ <link>
element.
component.js
1import "./file.css";
webpack.config.js
1module.exports = { 2 module: { 3 rules: [ 4 { 5 test: /\.css$/i, 6 use: [ 7 { loader: "style-loader", options: { attributes: { id: "id" } } }, 8 { loader: "css-loader" }, 9 ], 10 }, 11 ], 12 }, 13};
1<style id="id"></style>
insert
Type:
1type insert = string;
Default: head
By default, the style-loader
appends <style>
/<link>
elements to the end of the style target, which is the <head>
tag of the page unless specified by insert
.
This will cause CSS created by the loader to take priority over CSS already present in the target.
You can use other values if the standard behavior is not suitable for you, but we do not recommend doing this.
If you target an iframe make sure you have sufficient access rights, the styles will be injected into the content document head.
Selector
Allows to setup custom query selector where styles inject into the DOM.
webpack.config.js
1module.exports = { 2 module: { 3 rules: [ 4 { 5 test: /\.css$/i, 6 use: [ 7 { 8 loader: "style-loader", 9 options: { 10 insert: "body", 11 }, 12 }, 13 "css-loader", 14 ], 15 }, 16 ], 17 }, 18};
Absolute path to function
Allows to setup absolute path to custom function that allows to override default behavior and insert styles at any position.
[!WARNING]
Do not forget that this code will be used in the browser and not all browsers support latest ECMA features like
let
,const
,arrow function expression
and etc. We recommend usingbabel-loader
for support latest ECMA features.
[!WARNING]
Do not forget that some DOM methods may not be available in older browsers, we recommended use only DOM core level 2 properties, but it is depends what browsers you want to support
webpack.config.js
1module.exports = { 2 module: { 3 rules: [ 4 { 5 test: /\.css$/i, 6 use: [ 7 { 8 loader: "style-loader", 9 options: { 10 insert: require.resolve("./path-to-insert-module"), 11 }, 12 }, 13 "css-loader", 14 ], 15 }, 16 ], 17 }, 18};
A new <style>
/<link>
elements will be inserted into at bottom of body
tag.
Examples:
Insert styles at top of head
tag:
insert-function.js
1function insertAtTop(element) {
2 var parent = document.querySelector("head");
3 // eslint-disable-next-line no-underscore-dangle
4 var lastInsertedElement = window._lastElementInsertedByStyleLoader;
5
6 if (!lastInsertedElement) {
7 parent.insertBefore(element, parent.firstChild);
8 } else if (lastInsertedElement.nextSibling) {
9 parent.insertBefore(element, lastInsertedElement.nextSibling);
10 } else {
11 parent.appendChild(element);
12 }
13
14 // eslint-disable-next-line no-underscore-dangle
15 window._lastElementInsertedByStyleLoader = element;
16}
17
18module.exports = insertAtTop;
webpack.config.js
1module.exports = { 2 module: { 3 rules: [ 4 { 5 test: /\.css$/i, 6 use: [ 7 { 8 loader: "style-loader", 9 options: { 10 insert: require.resolve("./insert-function"), 11 }, 12 }, 13 "css-loader", 14 ], 15 }, 16 ], 17 }, 18};
You can pass any parameters to style.use(options)
and this value will be passed to insert
and styleTagTransform
functions.
insert-function.js
1function insertIntoTarget(element, options) { 2 var parent = options.target || document.head; 3 4 parent.appendChild(element); 5} 6 7module.exports = insertIntoTarget;
webpack.config.js
1module.exports = { 2 module: { 3 rules: [ 4 { 5 test: /\.css$/i, 6 use: [ 7 { 8 loader: "style-loader", 9 options: { 10 injectType: "lazyStyleTag", 11 // Do not forget that this code will be used in the browser and 12 // not all browsers support latest ECMA features like `let`, `const`, `arrow function expression` and etc, 13 // we recommend use only ECMA 5 features, 14 // but it depends what browsers you want to support 15 insert: require.resolve("./insert-function.js"), 16 }, 17 }, 18 "css-loader", 19 ], 20 }, 21 ], 22 }, 23};
Insert styles to the provided element or to the head
tag if target isn't provided. Now you can inject styles into Shadow DOM (or any other element).
custom-square.css
1div { 2 width: 50px; 3 height: 50px; 4 background-color: red; 5}
custom-square.js
1import customSquareStyles from "./custom-square.css"; 2 3class CustomSquare extends HTMLElement { 4 constructor() { 5 super(); 6 7 this.attachShadow({ mode: "open" }); 8 9 const divElement = document.createElement("div"); 10 11 divElement.textContent = "Text content."; 12 13 this.shadowRoot.appendChild(divElement); 14 15 customSquareStyles.use({ target: this.shadowRoot }); 16 17 // You can override injected styles 18 const bgPurple = new CSSStyleSheet(); 19 const width = this.getAttribute("w"); 20 const height = this.getAttribute("h"); 21 22 bgPurple.replace(`div { width: ${width}px; height: ${height}px; }`); 23 24 this.shadowRoot.adoptedStyleSheets = [bgPurple]; 25 26 // `divElement` will have `100px` width, `100px` height and `red` background color 27 } 28} 29 30customElements.define("custom-square", CustomSquare); 31 32export default CustomSquare;
styleTagTransform
Type:
1type styleTagTransform = string;
Default: undefined
string
Allows to setup absolute path to custom function that allows to override default behavior styleTagTransform.
[!WARNING]
Do not forget that this code will be used in the browser and not all browsers support latest ECMA features like
let
,const
,arrow function expression
and etc, we recommend use only ECMA 5 features, but it is depends what browsers you want to support
[!WARNING]
Do not forget that some DOM methods may not be available in older browsers, we recommended use only DOM core level 2 properties, but it depends what browsers you want to support
webpack.config.js
1module.exports = { 2 module: { 3 rules: [ 4 { 5 test: /\.css$/i, 6 use: [ 7 { 8 loader: "style-loader", 9 options: { 10 injectType: "styleTag", 11 styleTagTransform: require.resolve("style-tag-transform-code"), 12 }, 13 }, 14 "css-loader", 15 ], 16 }, 17 ], 18 }, 19};
base
1type base = number;
This setting is primarily used as a workaround for css clashes when using one or more DllPlugin's. base
allows you to prevent either the app's css (or DllPlugin2's css) from overwriting DllPlugin1's css by specifying a css module id base which is greater than the range used by DllPlugin1 e.g.:
webpack.dll1.config.js
1module.exports = { 2 module: { 3 rules: [ 4 { 5 test: /\.css$/i, 6 use: ["style-loader", "css-loader"], 7 }, 8 ], 9 }, 10};
webpack.dll2.config.js
1module.exports = { 2 module: { 3 rules: [ 4 { 5 test: /\.css$/i, 6 use: [ 7 { loader: "style-loader", options: { base: 1000 } }, 8 "css-loader", 9 ], 10 }, 11 ], 12 }, 13};
webpack.app.config.js
1module.exports = { 2 module: { 3 rules: [ 4 { 5 test: /\.css$/i, 6 use: [ 7 { loader: "style-loader", options: { base: 2000 } }, 8 "css-loader", 9 ], 10 }, 11 ], 12 }, 13};
esModule
Type:
1type esModule = boolean;
Default: true
By default, style-loader
generates JS modules that use the ES modules syntax.
There are some cases in which using ES modules is beneficial, like in the case of module concatenation and tree shaking.
You can enable a CommonJS modules syntax using:
webpack.config.js
1module.exports = { 2 module: { 3 rules: [ 4 { 5 test: /\.css$/i, 6 loader: "style-loader", 7 options: { 8 esModule: false, 9 }, 10 }, 11 ], 12 }, 13};
For production
builds it's recommended to extract the CSS from your bundle being able to use parallel loading of CSS/JS resources later on.
This can be achieved by using the mini-css-extract-plugin, because it creates separate css files.
For development
mode (including webpack-dev-server
) you can use style-loader
, because it injects CSS into the DOM using multiple <style></style>
and works faster.
[!WARNING]
Do not use together
style-loader
andmini-css-extract-plugin
.
webpack.config.js
1const MiniCssExtractPlugin = require("mini-css-extract-plugin"); 2const devMode = process.env.NODE_ENV !== "production"; 3 4module.exports = { 5 module: { 6 rules: [ 7 { 8 test: /\.(sa|sc|c)ss$/, 9 use: [ 10 devMode ? "style-loader" : MiniCssExtractPlugin.loader, 11 "css-loader", 12 "postcss-loader", 13 "sass-loader", 14 ], 15 }, 16 ], 17 }, 18 plugins: [].concat(devMode ? [] : [new MiniCssExtractPlugin()]), 19};
[!WARNING]
It is not allowed to use JavaScript reserved words in css class names.
[!WARNING]
Options
esModule
andmodules.namedExport
incss-loader
should be enabled (by default forcss-loader@7
it is true).
styles.css
1.fooBaz { 2 color: red; 3} 4.bar { 5 color: blue; 6} 7.my-class { 8 color: green; 9}
index.js
1import { fooBaz, bar, "my-class" as myClass } from "./styles.css"; 2 3console.log(fooBaz, bar, myClass);
Or:
index.js
1import * as styles from "./styles.css"; 2 3console.log(styles.fooBaz, styles.bar, styles["my-class"]);
You can enable a ES module named export using:
webpack.config.js
1module.exports = { 2 module: { 3 rules: [ 4 { 5 test: /\.css$/, 6 use: [ 7 { 8 loader: "style-loader", 9 }, 10 { 11 loader: "css-loader", 12 options: { 13 modules: { 14 namedExport: true, 15 }, 16 }, 17 }, 18 ], 19 }, 20 ], 21 }, 22};
The loader automatically inject source maps when previous loader emit them.
Therefore, to generate source maps, set the sourceMap
option to true
for the previous loader.
webpack.config.js
1module.exports = { 2 module: { 3 rules: [ 4 { 5 test: /\.css$/i, 6 use: [ 7 "style-loader", 8 { loader: "css-loader", options: { sourceMap: true } }, 9 ], 10 }, 11 ], 12 }, 13};
If you are using a Content Security Policy (CSP), the injected code will usually be blocked. A workaround is to use a nonce. Note, however, that using a nonce significantly reduces the protection provided by the CSP. You can read more about the security impact in the specification. The better solution is not to use this loader in production.
There are two ways to work with nonce
:
attributes
option__webpack_nonce__
variable[!WARNING]
the
attributes
option takes precedence over the__webpack_nonce__
variable
attributes
component.js
1import "./style.css";
webpack.config.js
1module.exports = { 2 module: { 3 rules: [ 4 { 5 test: /\.css$/i, 6 use: [ 7 { 8 loader: "style-loader", 9 options: { 10 attributes: { 11 nonce: "12345678", 12 }, 13 }, 14 }, 15 "css-loader", 16 ], 17 }, 18 ], 19 }, 20};
The loader generate:
1<style nonce="12345678"> 2 .foo { 3 color: red; 4 } 5</style>
__webpack_nonce__
create-nonce.js
1__webpack_nonce__ = "12345678";
component.js
1import "./create-nonce.js"; 2import "./style.css";
Alternative example for require
:
component.js
1__webpack_nonce__ = "12345678"; 2 3require("./style.css");
webpack.config.js
1module.exports = { 2 module: { 3 rules: [ 4 { 5 test: /\.css$/i, 6 use: ["style-loader", "css-loader"], 7 }, 8 ], 9 }, 10};
The loader generate:
1<style nonce="12345678"> 2 .foo { 3 color: red; 4 } 5</style>
Insert styles at top of head
tag.
insert-function.js
1function insertAtTop(element) {
2 var parent = document.querySelector("head");
3 var lastInsertedElement = window._lastElementInsertedByStyleLoader;
4
5 if (!lastInsertedElement) {
6 parent.insertBefore(element, parent.firstChild);
7 } else if (lastInsertedElement.nextSibling) {
8 parent.insertBefore(element, lastInsertedElement.nextSibling);
9 } else {
10 parent.appendChild(element);
11 }
12
13 window._lastElementInsertedByStyleLoader = element;
14}
15
16module.exports = insertAtTop;
webpack.config.js
1module.exports = { 2 module: { 3 rules: [ 4 { 5 test: /\.css$/i, 6 use: [ 7 { 8 loader: "style-loader", 9 options: { 10 insert: require.resolve("./insert-function.js"), 11 }, 12 }, 13 "css-loader", 14 ], 15 }, 16 ], 17 }, 18};
Inserts styles before #id
element.
insert-function.js
1function insertBeforeAt(element) { 2 const parent = document.querySelector("head"); 3 const target = document.querySelector("#id"); 4 5 const lastInsertedElement = window._lastElementInsertedByStyleLoader; 6 7 if (!lastInsertedElement) { 8 parent.insertBefore(element, target); 9 } else if (lastInsertedElement.nextSibling) { 10 parent.insertBefore(element, lastInsertedElement.nextSibling); 11 } else { 12 parent.appendChild(element); 13 } 14 15 window._lastElementInsertedByStyleLoader = element; 16} 17 18module.exports = insertBeforeAt;
webpack.config.js
1module.exports = { 2 module: { 3 rules: [ 4 { 5 test: /\.css$/i, 6 use: [ 7 { 8 loader: "style-loader", 9 options: { 10 insert: require.resolve("./insert-function.js"), 11 }, 12 }, 13 "css-loader", 14 ], 15 }, 16 ], 17 }, 18};
You can define custom target for your styles for the lazyStyleTag
type.
insert-function.js
1function insertIntoTarget(element, options) { 2 var parent = options.target || document.head; 3 4 parent.appendChild(element); 5} 6 7module.exports = insertIntoTarget;
webpack.config.js
1module.exports = { 2 module: { 3 rules: [ 4 { 5 test: /\.css$/i, 6 use: [ 7 { 8 loader: "style-loader", 9 options: { 10 injectType: "lazyStyleTag", 11 // Do not forget that this code will be used in the browser and 12 // not all browsers support latest ECMA features like `let`, `const`, `arrow function expression` and etc, 13 // we recommend use only ECMA 5 features, 14 // but it is depends what browsers you want to support 15 insert: require.resolve("./insert-function.js"), 16 }, 17 }, 18 "css-loader", 19 ], 20 }, 21 ], 22 }, 23};
Insert styles to the provided element or to the head
tag if target isn't provided.
custom-square.css
1div { 2 width: 50px; 3 height: 50px; 4 background-color: red; 5}
custom-square.js
1import customSquareStyles from "./custom-square.css"; 2 3class CustomSquare extends HTMLElement { 4 constructor() { 5 super(); 6 7 this.attachShadow({ mode: "open" }); 8 9 const divElement = document.createElement("div"); 10 11 divElement.textContent = "Text content."; 12 13 this.shadowRoot.appendChild(divElement); 14 15 customSquareStyles.use({ target: this.shadowRoot }); 16 17 // You can override injected styles 18 const bgPurple = new CSSStyleSheet(); 19 const width = this.getAttribute("w"); 20 const height = this.getAttribute("h"); 21 22 bgPurple.replace(`div { width: ${width}px; height: ${height}px; }`); 23 24 this.shadowRoot.adoptedStyleSheets = [bgPurple]; 25 26 // `divElement` will have `100px` width, `100px` height and `red` background color 27 } 28} 29 30customElements.define("custom-square", CustomSquare); 31 32export default CustomSquare;
Please take a moment to read our contributing guidelines if you haven't yet done so.
No vulnerabilities found.
Reason
no dangerous workflow patterns detected
Reason
GitHub workflow tokens follow principle of least privilege
Details
Reason
no binaries found in the repo
Reason
license file detected
Details
Reason
Found 16/24 approved changesets -- score normalized to 6
Reason
dependency not pinned by hash detected -- score normalized to 4
Details
Reason
1 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
Reason
no effort to earn an OpenSSF best practices badge detected
Reason
security policy file not detected
Details
Reason
project is not fuzzed
Details
Reason
SAST tool is not run on all commits -- score normalized to 0
Details
Reason
10 existing vulnerabilities detected
Details
Score
Last Scanned on 2024-11-18
The Open Source Security Foundation is a cross-industry collaboration to improve the security of open source software (OSS). The Scorecard provides security health metrics for open source projects.
Learn More