<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Reza Moosavi</title>
    <description>The latest articles on Forem by Reza Moosavi (@rezamoosavidweb).</description>
    <link>https://forem.com/rezamoosavidweb</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F991882%2Fb8631c8c-37b3-484b-b446-502ec0095f78.jpg</url>
      <title>Forem: Reza Moosavi</title>
      <link>https://forem.com/rezamoosavidweb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/rezamoosavidweb"/>
    <language>en</language>
    <item>
      <title>Css Module Type + Nextjs 14!</title>
      <dc:creator>Reza Moosavi</dc:creator>
      <pubDate>Fri, 19 Jan 2024 18:19:54 +0000</pubDate>
      <link>https://forem.com/rezamoosavidweb/css-module-types-nextjs-14-53go</link>
      <guid>https://forem.com/rezamoosavidweb/css-module-types-nextjs-14-53go</guid>
      <description>&lt;h2&gt;
  
  
  In this article
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;In this article&lt;/li&gt;
&lt;li&gt;Introduction&lt;/li&gt;
&lt;li&gt;
Time-saving Webpack plugin &lt;/li&gt;
&lt;li&gt;Steps&lt;/li&gt;
&lt;li&gt;Start Create &lt;strong&gt;Webpack plugin&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rezamoosavidweb/next-css-module-type"&gt;Source Code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In this upcoming article, we're diving into using CSS Modules with Webpack5, Nextjs, and TypeScript. Following my exploration of &lt;strong&gt;Vite&lt;/strong&gt; in &lt;a href="https://dev.to/rezamoosavidweb/css-module-type-vite-5hlm"&gt;&lt;strong&gt;this link&lt;/strong&gt;&lt;/a&gt;, our goal is to assist developers in handling TypeScript errors tied to CSS Modules and share practical tips on styling with style.module.css.&lt;/p&gt;

&lt;p&gt;We aim to demystify the process, making it easy for developers to ensure type safety in their styles and write more robust, maintainable code.&lt;/p&gt;

&lt;p&gt;By the end of this article, you'll have a clear understanding of managing TypeScript errors in the context of CSS Modules, empowering you to create clean, error-free code in your &lt;strong&gt;Nextjs&lt;/strong&gt; projects.&lt;/p&gt;

&lt;p&gt;Whether you're a TypeScript enthusiast or a React developer seeking better styling practices, join us to simplify TypeScript errors and highlight best practices when working with CSS Modules in the &lt;strong&gt;webpack&lt;/strong&gt; environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Time-saving Webpack plugin
&lt;/h2&gt;

&lt;p&gt;Automating the generation of module types for CSS Modules is a game-changer. This tool simplifies the entire process, minimizing manual work and decreasing the likelihood of errors. Specifically designed for Next.js with Webpack, it seamlessly integrates into your projects, effortlessly managing CSS Module type definitions. Whether you're an experienced developer or just diving into Next.js and Webpack, this plugin is your go-to for streamlining the workflow related to CSS Modules in TypeScript. It becomes an indispensable asset for enhancing the development experience in your React projects within the Next.js and Webpack environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Steps
&lt;/h2&gt;

&lt;p&gt;1)Identify all CSS modules.&lt;/p&gt;

&lt;p&gt;2)Extract classes defined within them./&lt;/p&gt;

&lt;p&gt;3)Create a file with a .d.ts extension alongside each module.css, &lt;br&gt;
placing type definitions for classes based on the found classNames.&lt;/p&gt;

&lt;p&gt;4)Format the file content using Prettier ,finally save the file.&lt;/p&gt;

&lt;p&gt;5)All the above steps should be performed for each change in CSS module files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; As noted in &lt;a href="https://dev.to/rezamoosavidweb/css-module-type-vite-5hlm"&gt;&lt;strong&gt;this article&lt;/strong&gt;&lt;/a&gt; for &lt;strong&gt;Vite&lt;/strong&gt; These steps are performed during development so that types are generated once when the app is run. Afterward, when the app is running, each modified &lt;strong&gt;css module&lt;/strong&gt; file is checked, and its type is generated accordingly.&lt;/p&gt;
&lt;h2&gt;
  
  
  Start Create &lt;strong&gt;Webpack plugin&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Before you start, you need to have a React app with Vite and TypeScript, which you can download from &lt;a href="https://stackblitz.com/edit/vitejs-vite-qhjhjj?file=index.html&amp;amp;terminal=dev"&gt;&lt;strong&gt;this link&lt;/strong&gt;&lt;/a&gt;. &lt;br&gt;
Then, create a file named &lt;strong&gt;watching-css-modules.js&lt;/strong&gt; in the root of your project.&lt;/p&gt;

&lt;p&gt;now add blew to watching-css-modules.ts file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;//watching-css-modules.ts

import &lt;span class="o"&gt;{&lt;/span&gt; Plugin &lt;span class="o"&gt;}&lt;/span&gt; from &lt;span class="s2"&gt;"vite"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

class CssModuleTypes &lt;span class="o"&gt;{&lt;/span&gt;
  constructor&lt;span class="o"&gt;(&lt;/span&gt;rootDir &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"./src/"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    this.rootDir &lt;span class="o"&gt;=&lt;/span&gt; rootDir ?? &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
  apply&lt;span class="o"&gt;(&lt;/span&gt;compiler&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    compiler.hooks.emit.tapAsync&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"TranslatePlugin"&lt;/span&gt;, &lt;span class="o"&gt;(&lt;/span&gt;compilation, callback&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      compilation.contextDependencies.add&lt;span class="o"&gt;(&lt;/span&gt;
        path.resolve&lt;span class="o"&gt;(&lt;/span&gt;__dirname, this.rootDir&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      callback&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    compiler.hooks.invalid.tap&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Invalid"&lt;/span&gt;, &lt;span class="o"&gt;(&lt;/span&gt;fileName, changeTime&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      //code will be added later
    &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;function &lt;/span&gt;withCssTypes&lt;span class="o"&gt;(&lt;/span&gt;nextConfig &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{})&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;Object.assign&lt;span class="o"&gt;({}&lt;/span&gt;, nextConfig, &lt;span class="o"&gt;{&lt;/span&gt;
    webpack: &lt;span class="o"&gt;(&lt;/span&gt;config&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      config.plugins.push&lt;span class="o"&gt;(&lt;/span&gt;new CssModuleTypes&lt;span class="o"&gt;())&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;return &lt;/span&gt;config&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;,
  &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

module.exports &lt;span class="o"&gt;=&lt;/span&gt; withCssTypes&lt;span class="p"&gt;;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  about above code:
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;webpack&lt;/strong&gt; Compiler supports watching which monitors the file system and recompiles as files change. When in watch mode, the compiler will emit the additional events such as &lt;strong&gt;watchRun&lt;/strong&gt;, &lt;strong&gt;watchClose&lt;/strong&gt;, and &lt;strong&gt;invalid&lt;/strong&gt;.&lt;br&gt;
I used &lt;strong&gt;invalid&lt;/strong&gt; here because two parameters are passed to it: one is &lt;strong&gt;fileName&lt;/strong&gt;, and the other is &lt;strong&gt;changeTime&lt;/strong&gt;. The &lt;strong&gt;fileName&lt;/strong&gt; is necessary for checking whether the &lt;strong&gt;module.css&lt;/strong&gt; file has changed.&lt;/p&gt;

&lt;p&gt;Now, before proceeding with the development of our plugin, it's necessary to add it to webpack. Therefore, add the css-modules-types plugin to next.config.js:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;//next.config.js

const withCssType &lt;span class="o"&gt;=&lt;/span&gt; require&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"./watching-css-modules"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

/&lt;span class="k"&gt;**&lt;/span&gt; @type &lt;span class="o"&gt;{&lt;/span&gt;import&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'next'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;.NextConfig&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;/
const nextConfig &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

module.exports &lt;span class="o"&gt;=&lt;/span&gt; withCssType&lt;span class="o"&gt;(&lt;/span&gt;nextConfig&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To locate all module.css files during app runtime and track changes in development, two packages, "path" and "fs," are employed. After filtering and finding module.css files, their content is extracted. Utilizing postCss, we then identify all classes used within these files. Subsequently, corresponding types for the found classes are generated. Finally, employing the "prettier" package, we format their content and save them in files with the same names as the source module.css files, appended with the .d.ts extension.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;const fs &lt;span class="o"&gt;=&lt;/span&gt; require&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"fs"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
const postcss &lt;span class="o"&gt;=&lt;/span&gt; require&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"postcss"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
const selectorParse &lt;span class="o"&gt;=&lt;/span&gt; require&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"postcss-selector-parser"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
const prettier &lt;span class="o"&gt;=&lt;/span&gt; require&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"prettier"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
const path &lt;span class="o"&gt;=&lt;/span&gt; require&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"path"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
const srcDir &lt;span class="o"&gt;=&lt;/span&gt; path.join&lt;span class="o"&gt;(&lt;/span&gt;process.cwd&lt;span class="o"&gt;()&lt;/span&gt;, &lt;span class="s2"&gt;"src"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

const removeDupStrFromArray &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;arr&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  const uniqueArray &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;const str of arr&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;uniqueArray.includes&lt;span class="o"&gt;(&lt;/span&gt;str&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      uniqueArray.push&lt;span class="o"&gt;(&lt;/span&gt;str&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;uniqueArray&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;function &lt;/span&gt;isCSSSelectorValid&lt;span class="o"&gt;(&lt;/span&gt;selector&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  try &lt;span class="o"&gt;{&lt;/span&gt;
    selectorParse&lt;span class="o"&gt;()&lt;/span&gt;.processSync&lt;span class="o"&gt;(&lt;/span&gt;selector&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; // If no errors occurred, the selector is valid
  &lt;span class="o"&gt;}&lt;/span&gt; catch &lt;span class="o"&gt;(&lt;/span&gt;error&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    console.error&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;Invalid CSS selector: &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;selector&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; // If an error occurred, the selector is not valid
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
const typeDeceleration &lt;span class="o"&gt;=&lt;/span&gt; async &lt;span class="o"&gt;(&lt;/span&gt;classArray&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  const data &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;declare &lt;/span&gt;const styles: &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;classArray&lt;/span&gt;&lt;span class="p"&gt;
    ?.map((el, index) =&amp;gt; &lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;readonly&lt;/span&gt; &lt;span class="s1"&gt;'${el}'&lt;/span&gt;: string&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)
    .join(&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nb"&gt;export &lt;/span&gt;default styles&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  const formattedData &lt;span class="o"&gt;=&lt;/span&gt; await prettier.format&lt;span class="o"&gt;(&lt;/span&gt;data, &lt;span class="o"&gt;{&lt;/span&gt;
    parser: &lt;span class="s2"&gt;"typescript"&lt;/span&gt;,
  &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;formattedData&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;function &lt;/span&gt;isDir&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  try &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;fs.statSync&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;.isDirectory&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt; catch &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;function &lt;/span&gt;createUniquesClassName&lt;span class="o"&gt;(&lt;/span&gt;fullPath&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;new Promise&lt;span class="o"&gt;((&lt;/span&gt;resolve, reject&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;let &lt;/span&gt;css &lt;span class="o"&gt;=&lt;/span&gt; fs.readFileSync&lt;span class="o"&gt;(&lt;/span&gt;fullPath&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    const classNames &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    postcss&lt;span class="o"&gt;()&lt;/span&gt;
      .process&lt;span class="o"&gt;(&lt;/span&gt;css, &lt;span class="o"&gt;{&lt;/span&gt; from: fullPath, to: fullPath?.replace&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;".css"&lt;/span&gt;, &lt;span class="s2"&gt;".d.css"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;})&lt;/span&gt;
      .then&lt;span class="o"&gt;(&lt;/span&gt;async &lt;span class="o"&gt;(&lt;/span&gt;result&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        result.root.walkRules&lt;span class="o"&gt;((&lt;/span&gt;rule&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;isCSSSelectorValid&lt;span class="o"&gt;(&lt;/span&gt;rule.selector&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          selectorParse&lt;span class="o"&gt;((&lt;/span&gt;selectors&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            selectors.walkClasses&lt;span class="o"&gt;((&lt;/span&gt;selector&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
              classNames.push&lt;span class="o"&gt;(&lt;/span&gt;selector.value&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="o"&gt;})&lt;/span&gt;.process&lt;span class="o"&gt;(&lt;/span&gt;rule.selector&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        const uniquesClassName &lt;span class="o"&gt;=&lt;/span&gt; await removeDupStrFromArray&lt;span class="o"&gt;(&lt;/span&gt;classNames&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        resolve&lt;span class="o"&gt;(&lt;/span&gt;uniquesClassName&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="o"&gt;})&lt;/span&gt;
      .catch&lt;span class="o"&gt;(&lt;/span&gt;reject&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

async &lt;span class="k"&gt;function &lt;/span&gt;createDecelerationFile&lt;span class="o"&gt;(&lt;/span&gt;fullPath&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  const uniquesClassName &lt;span class="o"&gt;=&lt;/span&gt; await createUniquesClassName&lt;span class="o"&gt;(&lt;/span&gt;fullPath&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;uniquesClassName?.length &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; 0&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    const decelerationPath &lt;span class="o"&gt;=&lt;/span&gt; fullPath?.replace&lt;span class="o"&gt;(&lt;/span&gt;
      &lt;span class="s2"&gt;".module.css"&lt;/span&gt;,
      &lt;span class="s2"&gt;".module.css.d.ts"&lt;/span&gt;
    &lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    const formattedDeceleration &lt;span class="o"&gt;=&lt;/span&gt; await typeDeceleration&lt;span class="o"&gt;(&lt;/span&gt;uniquesClassName&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    try &lt;span class="o"&gt;{&lt;/span&gt;
      fs.writeFileSync&lt;span class="o"&gt;(&lt;/span&gt;decelerationPath, formattedDeceleration, &lt;span class="o"&gt;(&lt;/span&gt;error&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
        console.log&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"error in writeFileSync:"&lt;/span&gt;, error&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt; catch &lt;span class="o"&gt;(&lt;/span&gt;err&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      console.log&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"error in writing file:"&lt;/span&gt;, err&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;function &lt;/span&gt;getCssModulesFiles&lt;span class="o"&gt;(&lt;/span&gt;pathDir&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;let &lt;/span&gt;directory &lt;span class="o"&gt;=&lt;/span&gt; pathDir ?? srcDir&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;isDir&lt;span class="o"&gt;(&lt;/span&gt;directory&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    fs.readdirSync&lt;span class="o"&gt;(&lt;/span&gt;directory&lt;span class="o"&gt;)&lt;/span&gt;.forEach&lt;span class="o"&gt;(&lt;/span&gt;async &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      const fullPath &lt;span class="o"&gt;=&lt;/span&gt; path.join&lt;span class="o"&gt;(&lt;/span&gt;directory, &lt;span class="nb"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;isDir&lt;span class="o"&gt;(&lt;/span&gt;fullPath&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="k"&gt;return &lt;/span&gt;getCssModulesFiles&lt;span class="o"&gt;(&lt;/span&gt;fullPath&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;fullPath.endsWith&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;".module.css"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      try &lt;span class="o"&gt;{&lt;/span&gt;
        createDecelerationFile&lt;span class="o"&gt;(&lt;/span&gt;fullPath&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt; catch &lt;span class="o"&gt;(&lt;/span&gt;e&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        console.log&lt;span class="o"&gt;(&lt;/span&gt;e&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;directory.endsWith&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;".module.css"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    createDecelerationFile&lt;span class="o"&gt;(&lt;/span&gt;directory&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

class CssModuleTypes &lt;span class="o"&gt;{&lt;/span&gt;
  constructor&lt;span class="o"&gt;(&lt;/span&gt;rootDir &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"./src/"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    this.rootDir &lt;span class="o"&gt;=&lt;/span&gt; rootDir ?? &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
  apply&lt;span class="o"&gt;(&lt;/span&gt;compiler&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    compiler.hooks.emit.tapAsync&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"TranslatePlugin"&lt;/span&gt;, &lt;span class="o"&gt;(&lt;/span&gt;compilation, callback&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      compilation.contextDependencies.add&lt;span class="o"&gt;(&lt;/span&gt;
        path.resolve&lt;span class="o"&gt;(&lt;/span&gt;__dirname, this.rootDir&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      callback&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    compiler.hooks.invalid.tap&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Invalid"&lt;/span&gt;, &lt;span class="o"&gt;(&lt;/span&gt;fileName, changeTime&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      getCssModulesFiles&lt;span class="o"&gt;(&lt;/span&gt;fileName&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;function &lt;/span&gt;withCssTypes&lt;span class="o"&gt;(&lt;/span&gt;nextConfig &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{})&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;Object.assign&lt;span class="o"&gt;({}&lt;/span&gt;, nextConfig, &lt;span class="o"&gt;{&lt;/span&gt;
    webpack: &lt;span class="o"&gt;(&lt;/span&gt;config&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      config.plugins.push&lt;span class="o"&gt;(&lt;/span&gt;new CssModuleTypes&lt;span class="o"&gt;())&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;return &lt;/span&gt;config&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;,
  &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

module.exports &lt;span class="o"&gt;=&lt;/span&gt; withCssTypes&lt;span class="p"&gt;;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;With this plugin, you can safely leverage the benefits of CSS Modules and TypeScript. Initially planned as a standalone package, I chose to share it through an article format, providing the complete &lt;a href="https://github.com/rezamoosavidweb/next-css-module-type"&gt;&lt;strong&gt;source code&lt;/strong&gt;&lt;/a&gt; on GitHub. Dive into the article and explore the code to spark ideas for your own plugins. &lt;br&gt;
In another article, discover this plugin adapted for &lt;strong&gt;Vite&lt;/strong&gt; and &lt;strong&gt;React&lt;/strong&gt;. Check out &lt;a href="https://dev.to/rezamoosavidweb/css-module-type-vite-5hlm"&gt;&lt;strong&gt;this link&lt;/strong&gt;&lt;/a&gt; where we discuss &lt;strong&gt;Vite&lt;/strong&gt;, &lt;strong&gt;React&lt;/strong&gt;, and &lt;strong&gt;CSS Modules&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>css</category>
      <category>typescript</category>
      <category>webpack</category>
      <category>nextjs</category>
    </item>
    <item>
      <title>Css Module Type + Vite!</title>
      <dc:creator>Reza Moosavi</dc:creator>
      <pubDate>Fri, 19 Jan 2024 16:31:08 +0000</pubDate>
      <link>https://forem.com/rezamoosavidweb/css-module-type-vite-5hlm</link>
      <guid>https://forem.com/rezamoosavidweb/css-module-type-vite-5hlm</guid>
      <description>&lt;h2&gt;
  
  
  In this article
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;In this article&lt;/li&gt;
&lt;li&gt;Introduction&lt;/li&gt;
&lt;li&gt;
Time-saving Vite plugin &lt;/li&gt;
&lt;li&gt;Steps&lt;/li&gt;
&lt;li&gt;Start Create &lt;strong&gt;Vite plugin&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rezamoosavidweb/vite-css-module-type"&gt;Source Code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In this article, we're focusing on making CSS Modules in React with Vite and TypeScript more approachable. Our aim is to help developers tackle TypeScript errors related to CSS Modules and share practical best practices when importing styles from style.module.css.&lt;/p&gt;

&lt;p&gt;We want to demystify the process of handling TypeScript errors, making it easy for developers to ensure type safety in their styles. By understanding different types of CSS Modules, you'll be equipped to write more robust and maintainable code.&lt;/p&gt;

&lt;p&gt;By the end of this article, you'll have a solid grasp of handling TypeScript errors in the context of CSS Modules, empowering you to write clean, error-free code in your React projects built with Vite.&lt;/p&gt;

&lt;p&gt;Whether you're a TypeScript enthusiast exploring CSS Modules or a React developer seeking better styling practices, this guide is designed to offer insights and solutions to common challenges. Join us as we simplify TypeScript errors and highlight best practices when working with CSS Modules in the React and Vite environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Time-saving Vite plugin
&lt;/h2&gt;

&lt;p&gt;automating the creation of module types for CSS Modules. This tool streamlines type generation, eliminating manual efforts and reducing errors. Integrated seamlessly into Vite projects, it handles CSS Module type definitions automatically, providing a smoother development experience. Whether you're a seasoned developer or new to Vite and TypeScript, this plugin simplifies the workflow for CSS Modules in TypeScript, making it an essential tool for React projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Steps
&lt;/h2&gt;

&lt;p&gt;1)Identify all CSS modules.&lt;/p&gt;

&lt;p&gt;2)Extract classes defined within them./&lt;/p&gt;

&lt;p&gt;3)Create a file with a .d.ts extension alongside each module.css, &lt;br&gt;
placing type definitions for classes based on the found classNames.&lt;/p&gt;

&lt;p&gt;4)Format the file content using Prettier ,finally save the file.&lt;/p&gt;

&lt;p&gt;5)All the above steps should be performed for each change in CSS module files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; These steps are performed during development so that types are generated once when the app is run. Afterward, when the app is running, each modified &lt;strong&gt;css module&lt;/strong&gt; file is checked, and its type is generated accordingly.&lt;/p&gt;
&lt;h2&gt;
  
  
  Start Create &lt;strong&gt;Vite plugin&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Before you start, you need to have a React app with Vite and TypeScript, which you can download from &lt;a href="https://stackblitz.com/edit/vitejs-vite-qhjhjj?file=index.html&amp;amp;terminal=dev"&gt;&lt;strong&gt;this link&lt;/strong&gt;&lt;/a&gt;. &lt;br&gt;
Then, create a file named &lt;strong&gt;watching-css-modules.ts&lt;/strong&gt; in the root of your project and place this file in &lt;strong&gt;tsconfig.node.json&lt;/strong&gt; as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;//tsconfig.node.json

&lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"compilerOptions"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"composite"&lt;/span&gt;: &lt;span class="nb"&gt;true&lt;/span&gt;,
    &lt;span class="s2"&gt;"skipLibCheck"&lt;/span&gt;: &lt;span class="nb"&gt;true&lt;/span&gt;,
    &lt;span class="s2"&gt;"module"&lt;/span&gt;: &lt;span class="s2"&gt;"ESNext"&lt;/span&gt;,
    &lt;span class="s2"&gt;"moduleResolution"&lt;/span&gt;: &lt;span class="s2"&gt;"bundler"&lt;/span&gt;,
    &lt;span class="s2"&gt;"allowSyntheticDefaultImports"&lt;/span&gt;: &lt;span class="nb"&gt;true&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;,
  &lt;span class="s2"&gt;"include"&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"vite.config.ts"&lt;/span&gt;, &lt;span class="s2"&gt;"watching-css-modules.ts"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;now add blew to watching-css-modules.ts file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;//watching-css-modules.ts

import &lt;span class="o"&gt;{&lt;/span&gt; Plugin &lt;span class="o"&gt;}&lt;/span&gt; from &lt;span class="s2"&gt;"vite"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="k"&gt;function &lt;/span&gt;CssModuleTypes&lt;span class="o"&gt;()&lt;/span&gt;: Plugin &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    name: &lt;span class="s2"&gt;"css-modules-types"&lt;/span&gt;,
    apply: &lt;span class="s2"&gt;"serve"&lt;/span&gt;,
    async configureServer&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      //code will be added later
    &lt;span class="o"&gt;}&lt;/span&gt;,
    // HMR
    async handleHotUpdate&lt;span class="o"&gt;({&lt;/span&gt; server: &lt;span class="o"&gt;{&lt;/span&gt; config &lt;span class="o"&gt;}&lt;/span&gt;, file &lt;span class="o"&gt;})&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      //code will be added later
    &lt;span class="o"&gt;}&lt;/span&gt;,
  &lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  about above code:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Each Vite plugin needs a &lt;strong&gt;name&lt;/strong&gt; for identification in logs during errors&lt;/li&gt;
&lt;li&gt;the value of &lt;strong&gt;apply:server&lt;/strong&gt; specifies when this plugin should run (server/build)&lt;/li&gt;
&lt;li&gt; The &lt;strong&gt;configureServer&lt;/strong&gt; hook runs only when the server is started, checking all module.css files once and generating their types.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;handleHotUpdate&lt;/strong&gt; hook runs whenever any file changes, creating corresponding types for any changes in module.css files.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now, before proceeding with the development of our plugin, it's necessary to introduce it to Vite. Therefore, add the css-modules-types plugin to vite.config.ts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;//vite.config.ts

import &lt;span class="o"&gt;{&lt;/span&gt; defineConfig &lt;span class="o"&gt;}&lt;/span&gt; from &lt;span class="s2"&gt;"vite"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
import react from &lt;span class="s2"&gt;"@vitejs/plugin-react"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
import &lt;span class="o"&gt;{&lt;/span&gt; CssModuleTypes &lt;span class="o"&gt;}&lt;/span&gt; from &lt;span class="s2"&gt;"./watching-css-modules"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nb"&gt;export &lt;/span&gt;default defineConfig&lt;span class="o"&gt;({&lt;/span&gt;
  plugins: &lt;span class="o"&gt;[&lt;/span&gt;react&lt;span class="o"&gt;()&lt;/span&gt;, CssModuleTypes&lt;span class="o"&gt;()]&lt;/span&gt;,
&lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the &lt;strong&gt;configureServer&lt;/strong&gt; hook, locate all files with the .module.css extension and, using postcss, extract the used classes. Additionally, in the &lt;strong&gt;handleHotUpdate&lt;/strong&gt; hook, which runs for every file change, if the changed file has a .module.css extension, extract the classes using postcss and generate the TypeScript type file based on them. You can find the final watching-css-modules.ts file below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;import fs from &lt;span class="s2"&gt;"fs"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
import path from &lt;span class="s2"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
import postcss from &lt;span class="s2"&gt;"postcss"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
import selectorParse from &lt;span class="s2"&gt;"postcss-selector-parser"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
import prettier from &lt;span class="s2"&gt;"prettier"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
import &lt;span class="o"&gt;{&lt;/span&gt; Plugin, ResolvedConfig &lt;span class="o"&gt;}&lt;/span&gt; from &lt;span class="s2"&gt;"vite"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;function &lt;/span&gt;isDir&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  try &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;fs.statSync&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;.isDirectory&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt; catch &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;function &lt;/span&gt;isCSSSelectorValid&lt;span class="o"&gt;(&lt;/span&gt;selector&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  try &lt;span class="o"&gt;{&lt;/span&gt;
    selectorParse&lt;span class="o"&gt;()&lt;/span&gt;.processSync&lt;span class="o"&gt;(&lt;/span&gt;selector&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; // If no errors occurred, the selector is valid
  &lt;span class="o"&gt;}&lt;/span&gt; catch &lt;span class="o"&gt;(&lt;/span&gt;error&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    console.error&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;Invalid CSS selector: &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;selector&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; // If an error occurred, the selector is not valid
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
const changingFilePath &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;config: ResolvedConfig, file: string&lt;span class="o"&gt;)&lt;/span&gt;: string &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
  path.join&lt;span class="o"&gt;(&lt;/span&gt;config.build.outDir, path.relative&lt;span class="o"&gt;(&lt;/span&gt;config.publicDir, file&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

const removeDupStrFromArray &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;arr: string[]&lt;span class="o"&gt;)&lt;/span&gt;: string[] &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  const uniqueArray &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;const str of arr&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;uniqueArray.includes&lt;span class="o"&gt;(&lt;/span&gt;str&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      uniqueArray.push&lt;span class="o"&gt;(&lt;/span&gt;str&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;uniqueArray&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

const typeDeceleration &lt;span class="o"&gt;=&lt;/span&gt; async &lt;span class="o"&gt;(&lt;/span&gt;classArray: string[]&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  const data &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;declare &lt;/span&gt;const styles: &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;classArray&lt;/span&gt;&lt;span class="p"&gt;
    ?.map((el) =&amp;gt; &lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;readonly&lt;/span&gt; &lt;span class="s1"&gt;'${el}'&lt;/span&gt;: string&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)
    .join(&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nb"&gt;export &lt;/span&gt;default styles&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  const formattedData &lt;span class="o"&gt;=&lt;/span&gt; await prettier.format&lt;span class="o"&gt;(&lt;/span&gt;data, &lt;span class="o"&gt;{&lt;/span&gt;
    parser: &lt;span class="s2"&gt;"typescript"&lt;/span&gt;,
  &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;formattedData&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;function &lt;/span&gt;createUniquesClassName&lt;span class="o"&gt;(&lt;/span&gt;fullPath&lt;span class="o"&gt;)&lt;/span&gt;: Promise&amp;lt;string[]&amp;gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;new Promise&lt;span class="o"&gt;((&lt;/span&gt;resolve, reject&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    const css &lt;span class="o"&gt;=&lt;/span&gt; fs.readFileSync&lt;span class="o"&gt;(&lt;/span&gt;fullPath&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    const classNames &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    postcss&lt;span class="o"&gt;()&lt;/span&gt;
      .process&lt;span class="o"&gt;(&lt;/span&gt;css, &lt;span class="o"&gt;{&lt;/span&gt; from: fullPath, to: fullPath?.replace&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;".css"&lt;/span&gt;, &lt;span class="s2"&gt;".d.css"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;})&lt;/span&gt;
      .then&lt;span class="o"&gt;(&lt;/span&gt;async &lt;span class="o"&gt;(&lt;/span&gt;result&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        result.root.walkRules&lt;span class="o"&gt;((&lt;/span&gt;rule&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;isCSSSelectorValid&lt;span class="o"&gt;(&lt;/span&gt;rule.selector&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          selectorParse&lt;span class="o"&gt;((&lt;/span&gt;selectors&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            selectors.walkClasses&lt;span class="o"&gt;((&lt;/span&gt;selector&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
              classNames.push&lt;span class="o"&gt;(&lt;/span&gt;selector.value&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="o"&gt;})&lt;/span&gt;.process&lt;span class="o"&gt;(&lt;/span&gt;rule.selector&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        const uniquesClassName &lt;span class="o"&gt;=&lt;/span&gt; await removeDupStrFromArray&lt;span class="o"&gt;(&lt;/span&gt;classNames&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        resolve&lt;span class="o"&gt;(&lt;/span&gt;uniquesClassName&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="o"&gt;})&lt;/span&gt;
      .catch&lt;span class="o"&gt;(&lt;/span&gt;reject&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
async &lt;span class="k"&gt;function &lt;/span&gt;createDecelerationFile&lt;span class="o"&gt;(&lt;/span&gt;fullPath&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  const uniquesClassName &lt;span class="o"&gt;=&lt;/span&gt; await createUniquesClassName&lt;span class="o"&gt;(&lt;/span&gt;fullPath&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;uniquesClassName?.length &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; 0&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    const decelerationPath &lt;span class="o"&gt;=&lt;/span&gt; fullPath?.replace&lt;span class="o"&gt;(&lt;/span&gt;
      &lt;span class="s2"&gt;".module.css"&lt;/span&gt;,
      &lt;span class="s2"&gt;".module.css.d.ts"&lt;/span&gt;
    &lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    const formattedDeceleration &lt;span class="o"&gt;=&lt;/span&gt; await typeDeceleration&lt;span class="o"&gt;(&lt;/span&gt;uniquesClassName&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    try &lt;span class="o"&gt;{&lt;/span&gt;
      fs.writeFileSync&lt;span class="o"&gt;(&lt;/span&gt;decelerationPath, formattedDeceleration&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt; catch &lt;span class="o"&gt;(&lt;/span&gt;err&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      console.log&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"error in writing file:"&lt;/span&gt;, err&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;function &lt;/span&gt;getCssModulesFiles&lt;span class="o"&gt;(&lt;/span&gt;pathDir&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  const directory &lt;span class="o"&gt;=&lt;/span&gt; pathDir&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;isDir&lt;span class="o"&gt;(&lt;/span&gt;directory&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    fs.readdirSync&lt;span class="o"&gt;(&lt;/span&gt;directory&lt;span class="o"&gt;)&lt;/span&gt;.forEach&lt;span class="o"&gt;(&lt;/span&gt;async &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      const fullPath &lt;span class="o"&gt;=&lt;/span&gt; path.join&lt;span class="o"&gt;(&lt;/span&gt;directory, &lt;span class="nb"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;isDir&lt;span class="o"&gt;(&lt;/span&gt;fullPath&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="k"&gt;return &lt;/span&gt;getCssModulesFiles&lt;span class="o"&gt;(&lt;/span&gt;fullPath&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;fullPath.endsWith&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;".module.css"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      try &lt;span class="o"&gt;{&lt;/span&gt;
        createDecelerationFile&lt;span class="o"&gt;(&lt;/span&gt;fullPath&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt; catch &lt;span class="o"&gt;(&lt;/span&gt;e&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        console.log&lt;span class="o"&gt;(&lt;/span&gt;e&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;directory.endsWith&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;".module.css"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    createDecelerationFile&lt;span class="o"&gt;(&lt;/span&gt;directory&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="k"&gt;function &lt;/span&gt;CssModuleTypes&lt;span class="o"&gt;()&lt;/span&gt;: Plugin &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    name: &lt;span class="s2"&gt;"css-modules-types"&lt;/span&gt;,
    apply: &lt;span class="s2"&gt;"serve"&lt;/span&gt;,
    async configureServer&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      const directory &lt;span class="o"&gt;=&lt;/span&gt; path.join&lt;span class="o"&gt;(&lt;/span&gt;__dirname, &lt;span class="s2"&gt;"./src"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      await getCssModulesFiles&lt;span class="o"&gt;(&lt;/span&gt;directory&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;,
    // HMR
    async handleHotUpdate&lt;span class="o"&gt;({&lt;/span&gt; server: &lt;span class="o"&gt;{&lt;/span&gt; config &lt;span class="o"&gt;}&lt;/span&gt;, file &lt;span class="o"&gt;})&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;file.endsWith&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"module.css"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        fs.readFile&lt;span class="o"&gt;(&lt;/span&gt;changingFilePath&lt;span class="o"&gt;(&lt;/span&gt;config, file&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="s2"&gt;"utf8"&lt;/span&gt;, &lt;span class="o"&gt;(&lt;/span&gt;err, css&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
          postcss&lt;span class="o"&gt;()&lt;/span&gt;
            .process&lt;span class="o"&gt;(&lt;/span&gt;css, &lt;span class="o"&gt;{&lt;/span&gt;
              from: changingFilePath&lt;span class="o"&gt;(&lt;/span&gt;config, file&lt;span class="o"&gt;)&lt;/span&gt;,
            &lt;span class="o"&gt;})&lt;/span&gt;
            .then&lt;span class="o"&gt;(&lt;/span&gt;async &lt;span class="o"&gt;(&lt;/span&gt;result&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
              const classNames &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
              try &lt;span class="o"&gt;{&lt;/span&gt;
                result.root.walkRules&lt;span class="o"&gt;((&lt;/span&gt;rule&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;isCSSSelectorValid&lt;span class="o"&gt;(&lt;/span&gt;rule.selector&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                  selectorParse&lt;span class="o"&gt;((&lt;/span&gt;selectors&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                    selectors.walkClasses&lt;span class="o"&gt;((&lt;/span&gt;selector&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                      classNames.push&lt;span class="o"&gt;(&lt;/span&gt;selector.value&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                    &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                  &lt;span class="o"&gt;})&lt;/span&gt;.process&lt;span class="o"&gt;(&lt;/span&gt;rule.selector&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

                const uniquesClassName &lt;span class="o"&gt;=&lt;/span&gt; removeDupStrFromArray&lt;span class="o"&gt;(&lt;/span&gt;classNames&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;uniquesClassName?.length &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; 0&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                  const newDestPath &lt;span class="o"&gt;=&lt;/span&gt; changingFilePath&lt;span class="o"&gt;(&lt;/span&gt;config, file&lt;span class="o"&gt;)&lt;/span&gt;?.replace&lt;span class="o"&gt;(&lt;/span&gt;
                    &lt;span class="s2"&gt;".module.css"&lt;/span&gt;,
                    &lt;span class="s2"&gt;".module.css.d.ts"&lt;/span&gt;
                  &lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                  fs.writeFile&lt;span class="o"&gt;(&lt;/span&gt;
                    newDestPath,
                    await typeDeceleration&lt;span class="o"&gt;(&lt;/span&gt;uniquesClassName&lt;span class="o"&gt;)&lt;/span&gt;,
                    &lt;span class="o"&gt;(&lt;/span&gt;error&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; console.log&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"error:"&lt;/span&gt;, error&lt;span class="o"&gt;)&lt;/span&gt;
                  &lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;
              &lt;span class="o"&gt;}&lt;/span&gt; catch &lt;span class="o"&gt;(&lt;/span&gt;error&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                console.log&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;error &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.opts.from&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;:&lt;span class="sb"&gt;`&lt;/span&gt;, error&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
              &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="o"&gt;})&lt;/span&gt;
            .catch&lt;span class="o"&gt;((&lt;/span&gt;err&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; console.log&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;error &lt;span class="k"&gt;in &lt;/span&gt;css file:&lt;span class="sb"&gt;`&lt;/span&gt;, err&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;,
  &lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;with this plugin, you can harness the power of CSS Modules and TypeScript safely. Initially, I intended to publish this plugin as a package, but I decided to present it in the format of an article and provide its complete &lt;a href="https://github.com/rezamoosavidweb/vite-css-module-type"&gt;&lt;strong&gt;source code&lt;/strong&gt;&lt;/a&gt; on GitHub. By examining the article and exploring the full source code of this plugin, you can implement your ideas for your own plugins. &lt;br&gt;
In another article, you can find this plugin adapted for webpack. You can view that article at &lt;a href="https://dev.to/rezamoosavidweb/css-module-types-nextjs-14-53go"&gt;&lt;strong&gt;this link&lt;/strong&gt;&lt;/a&gt;, where we discuss &lt;strong&gt;webpack&lt;/strong&gt;, &lt;strong&gt;Next.js 14&lt;/strong&gt;, and &lt;strong&gt;CSS Modules&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>react</category>
      <category>vite</category>
      <category>css</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
