🎁 typed-scss-modules
Generate TypeScript definitions (.d.ts
) files for CSS Modules that are written in SCSS (.scss
). Check out this post to learn more about the rationale and inspiration behind this package.
For example, given the following SCSS:
@import "variables";
.text {
color: $blue;
&-highlighted {
color: $yellow;
}
}
The following type definitions will be generated:
export const text: string;
export const textHighlighted: string;
Basic Usage
Run with npm package runner:
npx tsm src
Or, install globally:
yarn global add typed-scss-modules
tsm src
Or, install and run as a devDependency
:
yarn add -D typed-scss-modules
yarn tsm src
Advanced Usage
For all possible commands, run tsm --help
.
The only required argument is the directoy where all SCSS files are located. Running tsm src
will search for all files matching src/**/*.scss
. This can be overridden by providing a glob pattern instead of a directory. For example, tsm src/*.scss
--watch
(-w
)
-
Type:
boolean
-
Default:
false
-
Example:
tsm src --watch
Watch for files that get added or are changed and generate the corresponding type definitions.
--includePaths
(-i
)
-
Type:
string[]
-
Default:
[]
-
Example:
tsm src --includePaths src/core
An array of paths to look in to attempt to resolve your @import
declarations. This example will search the src/core
directory when resolving imports.
--aliases
(-a
)
-
Type:
object
-
Default:
{}
-
Example:
tsm src --aliases.~some-alias src/core/variables
An object of aliases to map to their corresponding paths. This example will replace any @import '~alias'
with @import 'src/core/variables'
.
--aliasPrefixes
(-p
)
-
Type:
object
-
Default:
{}
-
Example:
tsm src --aliasPrefixes.~ node_modules/
An object of prefix strings to replace with their corresponding paths. This example will replace any @import '~bootstrap/lib/bootstrap'
with @import 'node_modules/bootstrap/lib/bootstrap'
.
This matches the common use-case for importing scss files from node_modules when sass-loader
will be used with webpack
to compile the project.
--nameFormat
(-n
)
-
Type:
"camel" | "kebab" | "param" | "dashes" | "none"
-
Default:
"camel"
-
Example:
tsm src --nameFormat camel
The class naming format to use when converting the classes to type definitions.
-
camel: convert all class names to camel-case, e.g.
App-Logo
=>appLogo
. -
kebab/param: convert all class names to kebab/param case, e.g.
App-Logo
=>app-logo
(all lower case with '-' separators). -
dashes: only convert class names containing dashes to camel-case, leave others alone, e.g.
App
=>App
,App-Logo
=>appLogo
. Matches the webpack css-loader camelCase 'dashesOnly' option. -
none: do not modify the given class names (you should use
--exportType default
when using--nameFormat none
as any classes with a-
in them are invalid as normal variable names). Note: If you are using create-react-app v2.x and have NOT ejected,--nameFormat none --exportType default
matches the class names that are generated in CRA's webpack's config.
--listDifferent
(-l
)
-
Type:
boolean
-
Default:
false
-
Example:
tsm src --listDifferent
List any type definition files that are different than those that would be generated. If any are different, exit with a status code 1
.
--exportType
(-e
)
-
Type:
"named" | "default"
-
Default:
"named"
-
Example:
tsm src --exportType default
The export type to use when generating type definitions.
named
Given the following SCSS:
.text {
color: blue;
&-highlighted {
color: yellow;
}
}
The following type definitions will be generated:
export const text: string;
export const textHighlighted: string;
default
Given the following SCSS:
.text {
color: blue;
&-highlighted {
color: yellow;
}
}
The following type definitions will be generated:
interface Styles {
text: string;
textHighlighted: string;
}
declare const styles: Styles;
export default styles;
This export type is useful when using kebab (param) cased class names since variables with a -
are not valid variables and will produce invalid types or when a class name is a TypeScript keyword (eg: while
or delete
)
Examples
For examples, see the examples
directory:
Alternatives
This package was heavily influenced on typed-css-modules which generates TypeScript definitions (.d.ts
) files for CSS Modules that are written in CSS (.css
).
This package is currently used as a CLI. There are also packages that generate types as a webpack loader.