Code Monkey home page Code Monkey logo

sass-vars-loader's Introduction

Sass Vars Loader

Import Sass vars from Webpack config or from JS/JSON files

Travis Maintainability Codecov npm version npm installs dependencies

This loader allows you to use Sass variables defined in:
  • ✅ JSON Files
  • ✅ JavaScript Files
  • ✅ Inlined in Webpack Config
  • Supports both syntax types:
  • ✅ SASS Syntax
  • ✅ SCSS Syntax
  • Supports hot reload:
  • ✅ HMR Enabled

  • Install

    using npm

    npm install @epegzz/sass-vars-loader --save-dev

    using yarn

    yarn add @epegzz/sass-vars-loader --dev

    Usage

    Look at the Example Webpack Config File to see how to use this loader in conjunction with style-loader and css-loader

    Option 1: Inline Sass vars in the webpack config

    // styles.css:
    
    .some-class {
      background: $greenFromWebpackConfig;
    }
    // webpack.config.js
    
    var path = require('path');
    
    module.exports = {
      entry: './src/index.js',
      module: {
        rules: [{
          test: /\.scss$/,
          use: [
            // Inserts all imported styles into the html document
            { loader: "style-loader" },
    
            // Translates CSS into CommonJS
            { loader: "css-loader" },
    
            // Compiles Sass to CSS
            { loader: "sass-loader", options: { includePaths: ["app/styles.scss"] } },
    
            // Reads Sass vars from files or inlined in the options property
            { loader: "@epegzz/sass-vars-loader", options: {
              syntax: 'scss',
              // Option 1) Specify vars here
              vars: {
                greenFromWebpackConfig: '#0f0'
              }
            }
          }]
        }]
      },
      output: {
        filename: 'bundle.js',
        path: path.resolve(__dirname, 'dist')
      }
    };

    Option 2: Load Sass vars from JSON file

    // config/sassVars.json
    
    {
      "purpleFromJSON": "purple"
    }
    // styles.css:
    
    .some-class {
      background: $purpleFromJSON;
    }
    // webpack.config.js
    
    var path = require('path');
    
    module.exports = {
      entry: './src/index.js',
      module: {
        rules: [{
          test: /\.scss$/,
          use: [
            // Inserts all imported styles into the html document
            { loader: "style-loader" },
    
            // Translates CSS into CommonJS
            { loader: "css-loader" },
    
            // Compiles Sass to CSS
            { loader: "sass-loader", options: { includePaths: ["app/styles.scss"] } },
    
            // Reads Sass vars from files or inlined in the options property
            { loader: "@epegzz/sass-vars-loader", options: {
              syntax: 'scss',
              files: [
                // Option 2) Load vars from JSON file
                path.resolve(__dirname, 'config/sassVars.json')
              ]
            }
          }]
        }]
      },
      output: {
        filename: 'bundle.js',
        path: path.resolve(__dirname, 'dist')
      }
    };

    Option 3: Load Sass vars from JavaScript file

    // config/sassVars.js
    
    module.exports = {
      blueFromJavaScript: 'blue'
    };
    // styles.css:
    
    .some-class {
      background: $blueFromJavaScript;
    }
    // webpack.config.js
    
    var path = require('path');
    
    module.exports = {
      entry: './src/index.js',
      module: {
        rules: [{
          test: /\.scss$/,
          use: [
            // Inserts all imported styles into the html document
            { loader: "style-loader" },
    
            // Translates CSS into CommonJS
            { loader: "css-loader" },
    
            // Compiles Sass to CSS
            { loader: "sass-loader", options: { includePaths: ["app/styles.scss"] } },
    
            // Reads Sass vars from files or inlined in the options property
            { loader: "@epegzz/sass-vars-loader", options: {
              syntax: 'scss',
              files: [
                // Option 3) Load vars from JavaScript file
                path.resolve(__dirname, 'config/sassVars.js')
              ]
            }
          }]
        }]
      },
      output: {
        filename: 'bundle.js',
        path: path.resolve(__dirname, 'dist')
      }
    };

    Pro Tip: Using objects as Sass vars!

    Use map_get in order to use objects as Sass vars:

    // config/sassVars.js
    
    module.exports = {
      lightTheme: {
        background: 'white',
        color: 'black'
      },
      darkTheme: {
        background: 'black',
        color: 'gray'
      }
    };
    // styles.css:
    
    $theme: $lightTheme;
    
    .some-class {
      background: map_get($theme, background);
      color: map_get($theme, color);
    }

    sass-vars-loader's People

    Contributors

    alesjiranek avatar benjamingr avatar brandon-pereira avatar dependabot[bot] avatar dword-design avatar epegzz avatar flenter avatar iamtheiam avatar jschill avatar termie avatar theninja avatar

    Stargazers

     avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

    Watchers

     avatar  avatar  avatar  avatar

    sass-vars-loader's Issues

    Changes do not get applied when using with webpack watch

    Currently if you use webpack to watch files, when there are any changes in the javascript which sass-vars-loader is used, it will not tigger the rebuild or when it is triggered, it still return the old values.

    I am wondering if this is something sass-vars-loader can handle so that webpack watch can work properly.

    Many thanks.

    Assertion error on precommit hook

    Hello.
    I wrote some useful code for this library (netstuff/sass-vars-loader) and want to commit changes to new branch to create a pull-request for you. But on committing to I get an error:

    prettier-eslint [ERROR]: There was trouble creating the ESLint CLIEngine.
    prettier-eslint-cli [ERROR]: There was an error formatting "src/sassVarsLoader.test.js": 
      AssertionError [ERR_ASSERTION]: 'basePath' should be an absolute path.
          at new IgnorePattern (/Users/netstuff/Sites/forks/sass-vars-loader/node_modules/eslint/lib/cli-engine/config-array/ignore-pattern.js:178:9)
          at ConfigArrayFactory._normalizeObjectConfigDataBody (/Users/netstuff/Sites/forks/sass-vars-loader/node_modules/eslint/lib/cli-engine/config-array-factory.js:651:49)
          at _normalizeObjectConfigDataBody.next (<anonymous>)
          at ConfigArrayFactory._normalizeObjectConfigData (/Users/netstuff/Sites/forks/sass-vars-loader/node_modules/eslint/lib/cli-engine/config-array-factory.js:594:20)
          at _normalizeObjectConfigData.next (<anonymous>)
          at createConfigArray (/Users/netstuff/Sites/forks/sass-vars-loader/node_modules/eslint/lib/cli-engine/config-array-factory.js:338:25)
          at ConfigArrayFactory.create (/Users/netstuff/Sites/forks/sass-vars-loader/node_modules/eslint/lib/cli-engine/config-array-factory.js:393:16)
          at createBaseConfigArray (/Users/netstuff/Sites/forks/sass-vars-loader/node_modules/eslint/lib/cli-engine/cascading-config-array-factory.js:96:48)
          at new CascadingConfigArrayFactory (/Users/netstuff/Sites/forks/sass-vars-loader/node_modules/eslint/lib/cli-engine/cascading-config-array-factory.js:211:30)
          at new CLIEngine (/Users/netstuff/Sites/forks/sass-vars-loader/node_modules/eslint/lib/cli-engine/cli-engine.js:563:36)
    

    which repeats 25 times!

    Please help me to resolve this issue!

    Is it possible to load the JSON file using inline loaders?

    The documented config means that the scssVars.json file would be included for every loaded SCSS file and always at the start.

    Is there a way to declare the loader inline so you can control when and where it is imported? So something like:

    sass1.scss

    @import "./fileA.scss";
    @import "./fileA.scss";
    

    sass2.scss

    @import "./fileC.scss";
    @import "@epegzz/sass-vars-loader!variables.json";
    @import "./fileD.scss";
    

    In this instance sass1.scss would not have access to the variables.json file. However sass2.scss will and the declarations will be made after fileC but before fileD is imported.

    I'm not actually sure whether it's possible to use inline-loaders through the SCSS import statement. I'm curious to know if it's possible or if there is a way to make it possible.

    Unable to pass version string to add inside css comment

    I am trying to pass the application version to the SCSS so that i can add it to the comments in the CSS file along with other useful info, but it gets translated from "4.2.0" into "4.2 0" is there a way to disable this auto transformation/parsing?

          {
            test: /\.(sass|scss)$/,
            use: [
              MiniCssExtractPlugin.loader,
              "css-loader",
              "sass-loader",
              {
                loader: "@epegzz/sass-vars-loader",
                options: {
                  vars: {
                    appVersion: `4.2.0`,
                  },
                },
              },
            ],
          },

    Error when using sass indentedSyntax: true,

    Hello I like to use your solution for import json vars into sass, that give me opportunity to use it also in js in my Vue.js project but, I am using indented sass syntax not scss.
    I have error in each my sass file like this expected 1 selector or at-rule, was "{}"
    So I clone your project and rewrite scss file to sass syntax and change webpack.config.js and index.js import to include sass and have same issue here is the error from terminal

    Version: webpack 2.7.0
    Time: 318ms
        Asset     Size  Chunks             Chunk Names
    bundle.js  16.2 kB       0  [emitted]  main
       [0] ./src/styles.sass 1.28 kB {0} [built]
       [1] ./~/css-loader!./~/sass-loader/lib/loader.js?{"includePaths":["app/styles.sass"]}!./~/@epegzz/sass-vars-loader/dist/sassVarsLoader.js?{"vars":{"greenFromWebpackConfig":"green"},"files":["/home/struers/sass-vars-loader/example/config/sassVars.json","/home/struers/sass-vars-loader/example/config/sassVars.js"]}!./src/styles.sass 256 bytes {0} [built] [failed] [1 error]
       [2] ./~/style-loader/addStyles.js 8.51 kB {0} [built]
       [3] ./~/style-loader/fixUrls.js 3.01 kB {0} [built]
       [4] ./src/index.js 141 bytes {0} [built]
    
    ERROR in ./~/css-loader!./~/sass-loader/lib/loader.js?{"includePaths":["app/styles.sass"]}!./~/@epegzz/sass-vars-loader/dist/sassVarsLoader.js?{"vars":{"greenFromWebpackConfig":"green"},"files":["/home/struers/sass-vars-loader/example/config/sassVars.json","/home/struers/sass-vars-loader/example/config/sassVars.js"]}!./src/styles.sass
    Module build failed: 
    body
                                 ^
          Invalid CSS after "...ckConfig:green;": expected 1 selector or at-rule, was "{}"
          in /home/struers/sass-vars-loader/example/src/styles.sass (line 1, column 31)
     @ ./src/styles.sass 4:14-202
     @ ./src/index.js
    
    

    Can you help me somehow.
    Do you counting with this possibility or is possible to add it?

    Calling sass functions in Javascript file

    Hi there,

    First of all, thank you for writing this great plugin!

    I'm currently moving all of our variables to a constants file where I want to optimize it as much as possible. I'm currently facing an issue where functions are not being called and just showing up as strings. Below is an example of the code that I am using.

    Example:

    module.exports = {
      colors: {
        red: "#abc",
        blue: "#def",
      }
      styles: {
        border: "1px solid color(red)",
      }
    }
    @function color($color, $shade:false) {
      @if map-has-key($colors, $color) {
        $color: map-get($colors, $color);
        @if $shade {
          @return rgba($color, $shade);
        } @else {
          @return $color;
        }
      }
    
      @error "\"#{$color}\" is not a valid color.";
    }

    When calling border: map-get($styles, border) the string border: 1px solid color(red) is being returned, which makes total sense, so when replacing color(red) with #{color(red)} the output remains the same.

    Do you have any idea on how to fix this? Or is it simply not possible to call sass functions within the constants.js file?

    Thanks for your help!

    Variables undefined when use sass-loader.options.data attribute

    Hello! I use sass-vars-loader with Vue Cli 3 and I try to move common scss-files to app config:

    const path = require('path');
    
    module.exports = {
      chainWebpack: (config) => {
        const moduleTypes = ['vue-modules', 'vue', 'normal-modules', 'normal'];
        moduleTypes.forEach(moduleType =>
          config.module
            .rule('scss')
            .oneOf(moduleType)
            .use('@epegzz/sass-vars-loader')
            .loader('@epegzz/sass-vars-loader')
            .options({
              syntax: 'scss',
              files: [
                path.resolve(__dirname, 'src/assets/styles/contracts/variables.json'),
                path.resolve(__dirname, 'src/assets/styles/contracts/icons.json')
              ],
            })
        )
      },
    
      css: {
        loaderOptions: {
          sass: {
            data: `
              @import '~@/assets/styles/vars';
              @import '~@/assets/styles/util';
              @import '~@/assets/styles/func';
              @import '~@/assets/styles/mixins';
              @import '~@/assets/styles/colors';
            `,
          },
        },
      },
    }
    

    But on app loaded I have got an error: "Undefined variable: $palette".
    It works properly, when I importing common scss-files directly, but I want to import it all in one place.

    Can you help me?

    Passing transformer function as option

    I have a situation where I want to read the variable from a global JSON file & I want the file to be watched as well. I think it would be great if we could have a function to passed as option that will transform the JSON content to something the loader could handle

    Deprecation warning thrown by webpack 2.

    DeprecationWarning: loaderUtils.parseQuery() received a non-string value which can be problematic, see webpack/loader-utils#56
    parseQuery() will be replaced with getOptions() in the next major version of loader-utils.

    Trace -

    at Object.parseQuery (/home/ubuntu/toppr-web-v4/client/node_modules/loader-utils/index.js:78:3)
        at Object.exports.getLoaderConfig (/home/ubuntu/toppr-web-v4/client/node_modules/loader-utils/index.js:121:22)
        at Object.loader (/home/ubuntu/toppr-web-v4/client/node_modules/@epegzz/sass-vars-loader/index.js:12:30)
        at LOADER_EXECUTION (/home/ubuntu/toppr-web-v4/client/node_modules/loader-runner/lib/LoaderRunner.js:119:14)
        at runSyncOrAsync (/home/ubuntu/toppr-web-v4/client/node_modules/loader-runner/lib/LoaderRunner.js:120:4)
        at iterateNormalLoaders (/home/ubuntu/toppr-web-v4/client/node_modules/loader-runner/lib/LoaderRunner.js:229:2)
        at Array.<anonymous> (/home/ubuntu/toppr-web-v4/client/node_modules/loader-runner/lib/LoaderRunner.js:202:4)
        at Storage.finished (/home/ubuntu/toppr-web-v4/client/node_modules/enhanced-resolve/lib/CachedInputFileSystem.js:40:15)
        at /home/ubuntu/toppr-web-v4/client/node_modules/enhanced-resolve/lib/CachedInputFileSystem.js:77:9
        at /home/ubuntu/toppr-web-v4/client/node_modules/graceful-fs/graceful-fs.js:78:16
        at FSReqWrap.readFileAfterClose [as oncomplete] (fs.js:511:3)
    

    npm module not found

    I tried to do npm install, but got this:

    npm ERR! Invalid name: "@epegzz/sass-vars-loader"
    npm ERR!
    npm ERR! If you need help, you may report this error at:
    npm ERR!     <https://github.com/npm/npm/issues>
    
    npm ERR! Please include the following file with any support request:
    npm ERR!     /Users/SeanYang/workspace/video-discovery-web/npm-debug.log
    ➜  video-discovery-web git:(re-branding) ✗ npm install @epegzz/sass-vars-loader
    npm ERR! Darwin 15.6.0
    npm ERR! argv "/usr/local/bin/node" "/usr/local/bin/npm" "install" "@epegzz/sass-vars-loader"
    npm ERR! node v6.5.0
    npm ERR! npm  v2.14.7
    
    npm ERR! Invalid name: "@epegzz/sass-vars-loader"
    npm ERR!
    npm ERR! If you need help, you may report this error at:
    npm ERR!     <https://github.com/npm/npm/issues>
    

    Improve documentation

    As mentioned by @franciscolourenco in #32 🙏 the documentation could use some update to include the recommended way of configuring webpack with vue.js.

    // vue.config.js
    module.exports = {
    	chainWebpack: config => {
    		const moduleTypes = ['vue-modules', 'vue', 'normal-modules', 'normal']
    		moduleTypes.forEach(type =>
    			config.module
    				.rule('scss')
    				.oneOf(type)
    				.use('@epegzz/sass-vars-loader')
    				.loader('@epegzz/sass-vars-loader')
    				.options({
    					syntax: 'scss',
    					files: [path.resolve(__dirname, './src/styles/colors.js')],
    				})
    		)
    	},
    }

    Originally posted by @franciscolourenco in #32 (comment)

    Where to place sassVars with multiple loaders?

    The variables that I'm declaring in sassVars do not seem to be getting injected.

    It just says "Undefined Variable"

    Here is a part of my webpack config.

     module: {
        loaders: [
          {
            test: /\.jsx?$/,
            exclude: /node_modules/,
            loader: 'babel-loader'
          },
          {
            test   : /\.css$/,
            loaders: ['style', 'css', 'resolve-url']
          },
          {
            test: /\.scss$/,
            loaders: ['style', 'css', '@epegzz/sass-vars-loader', 'resolve-url', 'sass?sourceMap'],
    
          },
          {
            test: /\.json$/,
            loader: 'json-loader'
          },
          {
            test: /\.(woff2?|ttf|svg|eot|jpe?g)$/,
            loader: 'ignore-loader'
          },
        ],
      },
      sassVars: {
        vars: {
          favouriteColor: 'red',
        }
      },

    SassError: Invalid CSS after "..., -apple-system": expected ":", was ", BlinkMacSystemFon"

    trying to import a JSON file ,it works great except the strings are not quoted so if JSON has a property
    "typography": {
    "font-family": "Arial, -apple-content, BlinkMacSystemFont"
    }
    it gives an error as it gets imported without quotes and build fails.

    I see there are some call backs I can send in options will that help in keeping the quotes of values returned ? if so can someone help me with an example pls.

    Note: I cannot change to double quote the values.

    SyntaxError: Unexpected token ']', web pack

    Hello - trying this out but running into this issue.

    Used yarn add @epegzz/sass-vars-loader --dev

    Trying to use Option 2.

    /Users/danielcrabbe/Sites/foundlocations.co.uk/wp-content/themes/found-theme-sage-test/resources/assets/build/webpack.config.js:124
              ],
              ^
    
    SyntaxError: Unexpected token ']'
    
    // assets/vars.json
    {
      "colors": {
        "primary": "#2c97de"
    }
    
    
    // assets/build/webpack.config.js:124
    
                { 
                  loader: "@epegzz/sass-vars-loader", options: {
                  syntax: 'scss',
                  files:   [path.resolve(__dirname, '../../vars.json')] // tried a few variations always same error.
                },
    
    :124          ],
    
    

    Do I need to declare '@epegzz/sass-vars-loader' anywhere?

    Many thanks, Dan.

    Broken as of version 4.3.0

    doing a map-get from a map inside js file is broken as most likely 4.3.0
    currently i'm backing to 4.0.0 to get rid of this issue.

    module.exports = {
      lightTheme: {
        background: 'white',
        color: "#000",
      },
    }
    
    
    @function color($map, $key, $alpha: 1) {
      $color: map-get($map, $key);
      @if $alpha == 1  {
        @return rgba($color, $alpha);
      }
      @else {
        @return $color;
      }
    }
    
    body {
      background-color: color($lightTheme, color);
    }
    

    background-color: color($lightTheme, color); returns background-color: "#000"; and therefore doesn't work..

    i could do unqote(map-get($map, $key) but that doesn't work if i want to do rgba

    Module build failed with Vue-CLI

    Hello. Thank you for this work :)
    I try to use it with Vue-CLI through vue.conf.js with next config:

    chainWebpack: config => {
        config.module
          .rule('scss')
          .use('sass-vars-loader')
          .loader('sass-vars-loader')
          .options({
            loader: 'sass-vars-loader',
            options: {
              syntax: 'scss',
              files: [
                path.resolve(__dirname, '@/assets/styles/contracts/variables.json'),
              ],
            },
          })
      },
    

    But when project starts I have error in console for every using Vue-component:

    Module build failed (from ./node_modules/sass-vars-loader/index.js):
    TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string. Received type undefined
        at assertPath (path.js:39:11)
        at Object.join (path.js:1155:7)
        at read (/Users/netstuff/Sites/bspb/ui/node_modules/fs-readdir-recursive/index.js:11:18)
        at requireFresh (/Users/netstuff/Sites/bspb/ui/node_modules/require-fresh/index.js:67:21)
        at Object.SassImports (/Users/netstuff/Sites/bspb/ui/node_modules/sass-vars-loader/index.js:39:46)
    

    What I do wrong?

    Variables not getting to scss files

    After I got the issue resolved in #18, now the variables are not getting passed to any .scss files.

    Undefined variable: "$env".
    

    sass-js-vars.js

    module.exports = {
          env: METADATA.ENV, // doesnt work even thought this value exists
    };
    

    scss file

    // Set the default environment for all scss files to refer to
    $dev: false;
    
    // Env variable - coming from Sass-Vars-Loader
    @if $env == 'development' {
       $dev: true;
    }

    Worked fine in 2.x, not 3.x

    If i switch to

    const sassVarsConfig = {
       syntax: 'scss',
       vars : {
          env: METADATA.ENV,
       } 
    };
    

    The error is the same, for some reason its not getting passed into my scss files. Any ideas?

    Compatibility with Webpack HMR (Hot Module Replacement)

    Hey again, it seems that when updating the values in a .js or .json file, webpack-dev-server triggers the incremental recompile, but Hot Module Replacement doesn't kick in and update the module with the new .scss.

    Is it compatible with HMR? It's not a major need, rather cool to have feature. Just wondering.

    Respect file order

    Currently, the files passed as option are ordered by type. But this is not obvious to the user and should hence be changed.

    Passing in object breaks

    Passing in a variable via query parameters will break if the object is already object.

    webpack.config.js

    loader: 'style!css?modules=true!sass!@epegzz/sass-vars-loader?' +JSON.stringify({vars: [config.sassVars]}),
    

    config.dev.js

    module.exports = {
      target: 'dev',
      sassVars: {
        color: 'orange'
      },
    

    ERROR in .//css-loader?modules=true!.//sass-loader!./~/@epegzz/sass-vars-loader?{"vars":{"color":"orange"}}!./src/styles/modal.scss
    Module build failed: SyntaxError: Unexpected token o
    at Object.parse (native)
    at Object.content (/Users/brandonp/Sites/Nifti/nna-geolocation/node_modules/@epegzz/sass-vars-loader/index.js:33:32)
    @ ./src/styles/modal.scss 4:14-224 13:2-17:4 14:20-230

    Module build failed: TypeError: files.forEach is not a function

    After updating 2.2.0 to 3.0.0:

    Module build failed: TypeError: files.forEach is not a function
        at exports.default (C:\Source\node_modules\@epegzz\sass-vars-loader\dist\utils\watchFilesForChanges.js:6:9)
        at Object.exports.default (C:\node_modules\@epegzz\sass-vars-loader\dist\sassVarsLoader.js:13:38)
    

    The file exists, but webpack cannot resolve it. Is there a breaking change?

    Leading zero in string gets removed

    We were using a setup similar to below:

    const BUILD_ID = "012345"; // (generated git hash)
    options: {
      vars: {
        version: BUILD_ID
      }
    }
    

    The issue we were running into was that upon using $version in our sass files, the leading 0 was being removed from the string which was causing our assets to look at the wrong path on our server.

    I was able to "solve" this by setting version to

    `"${BUILD_ID}"`
    

    so that the string value we were sending in included double quotes around it. This solved our problem but figured 1) you may want to know about this in case someone else raises the issue and 2) it's probably a good idea to handle that scenario by default.

    Line 22 of convertJsToSass.js could be altered to:

    if (typeof value === 'string') {
        return `"${value}"`;
    }
    

    I'm not totally sure if this creates other problems, but just throwing it out there!

    Missing additional loader? Any help?

    I got the following error when running the sample code posted in the readme file (js or json Option 3 the Pro Tip sample).

    ModuleParseError: Module parse failed: Unexpected token (2:24)
    File was processed with these loaders:

    • ./node_modules/@epegzz/sass-vars-loader/src/sassVarsLoader.js
      You may need an additional loader to handle the result of these loaders.
      |

    $lightTheme: (background: white, color: black);
    | $darkTheme: (background: black, color: gray);

    Module not found: Error: Can't resolve 'sass-vars'

    Webpack cannot find the module after installing

    Module not found: Error: Can't resolve 'sass-vars'

    Not sure why. Any Ideas?

    its in node_modules/@epegzz/sass-vars-loader

    Using "webpack": "^2.1.0-beta.25",

    Color names in JSON keys are interpreted as color objects by SASS

    First off, thanks for a really useful loader!

    I came across an issue this morning where if I use CSS color names as my JSON keys, e.g.

    {
      "colors": {
        "fg": {
          "default": "#2c2c2c",
          "pink": "#ffabab"
        }
    }

    ...and then use map-deep-get (source) to extract the values, like this:

    .button {
        background: map-deep-get($colors, 'fg', 'pink');
    }

    ...that despite my quoting the keys in the latter fragment, I found that CSS color names (e.g. pink) don't work (returning nothing), while custom names (e.g. default) do. What I think is happening is that when sass-vars-loader converts my JSON, the color names in my JSON file become unquoted and are then interpreted as colour objects by SASS. So when I use map-deep-get to look up the colour, it returns nothing (because my string lookup doesn't match the color object) and so that property doesn't get written into my CSS.

    I found I could fix the issue by double-quoting the names in m JSON, e.g.

    {
      "colors": {
        "fg": {
          "'default'": "#2c2c2c",
          "'pink'": "#ffabab"
        }
    }

    Is it possible to force sass-vars-loader to quote all keys when it creates maps from JSON? Either way, I thought I had better report this in case anyone else has the same issue.

    Missing dependencies in 4.1.0

    For the latest version (4.1.0), you're missing dependencies typescript and require-from-string. See https://github.com/epegzz/sass-vars-loader/blob/184ab81ea5c8e246196fc7788f36f8f18dd0c028/src/utils/readVarsFromTypescriptFiles.js - you're requiring them during runtime but you'll notice that you have those 2 modules as dev dependencies in your package.json.

    Here's the failing logs:

    Module build failed (from ./node_modules/@epegzz/sass-vars-loader/src/sassVarsLoader.js):
    Error: Cannot find module 'typescript'
        at Function.Module._resolveFilename (module.js:547:15)
        at Function.Module._load (module.js:474:25)
        at Module.require (module.js:596:17)
        at require (internal/module.js:11:18)
        at Object.<anonymous> (C:\Users\334835170\SrcCode\pi-frontend\node_modules\@epegzz\sass-vars-loader\src\utils\readVarsFromTypescriptFiles.js:2:12)
        at Module._compile (module.js:652:30)
        at Object.Module._extensions..js (module.js:663:10)
        at Module.load (module.js:565:32)
        at tryModuleLoad (module.js:505:12)
        at Function.Module._load (module.js:497:3)
        at Module.require (module.js:596:17)
        at require (internal/module.js:11:18)
        at Object.<anonymous> (C:\Users\334835170\SrcCode\pi-frontend\node_modules\@epegzz\sass-vars-loader\src\sassVarsLoader.js:4:37)
    

    Recommend Projects

    • React photo React

      A declarative, efficient, and flexible JavaScript library for building user interfaces.

    • Vue.js photo Vue.js

      🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

    • Typescript photo Typescript

      TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

    • TensorFlow photo TensorFlow

      An Open Source Machine Learning Framework for Everyone

    • Django photo Django

      The Web framework for perfectionists with deadlines.

    • D3 photo D3

      Bring data to life with SVG, Canvas and HTML. 📊📈🎉

    Recommend Topics

    • javascript

      JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

    • web

      Some thing interesting about web. New door for the world.

    • server

      A server is a program made to process requests and deliver data to clients.

    • Machine learning

      Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

    • Game

      Some thing interesting about game, make everyone happy.

    Recommend Org

    • Facebook photo Facebook

      We are working to build community through open source technology. NB: members must have two-factor auth.

    • Microsoft photo Microsoft

      Open source projects and samples from Microsoft.

    • Google photo Google

      Google ❤️ Open Source for everyone.

    • D3 photo D3

      Data-Driven Documents codes.