Blame view

node_modules/sass-loader/lib/webpackImporter.js 2.33 KB
aaac7fed   liuqimichale   add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
  "use strict";
  
  /**
   * @name PromisedResolve
   * @type {Function}
   * @param {string} dir
   * @param {string} request
   * @returns Promise
   */
  
  /**
   * @name Importer
   * @type {Function}
   * @param {string} url
   * @param {string} prev
   * @param {Function<Error, string>} done
   */
  
  const path = require("path");
  const tail = require("lodash.tail");
  const importsToResolve = require("./importsToResolve");
  
  const matchCss = /\.css$/;
  
  /**
   * Returns an importer that uses webpack's resolving algorithm.
   *
   * It's important that the returned function has the correct number of arguments
   * (based on whether the call is sync or async) because otherwise node-sass doesn't exit.
   *
   * @param {string} resourcePath
   * @param {PromisedResolve} resolve
   * @param {Function<string>} addNormalizedDependency
   * @returns {Importer}
   */
  function webpackImporter(resourcePath, resolve, addNormalizedDependency) {
      function dirContextFrom(fileContext) {
          return path.dirname(
              // The first file is 'stdin' when we're using the data option
              fileContext === "stdin" ? resourcePath : fileContext
          );
      }
  
      function startResolving(dir, importsToResolve) {
          return importsToResolve.length === 0 ?
              Promise.reject() :
              resolve(dir, importsToResolve[0])
                  .then(resolvedFile => {
                      // Add the resolvedFilename as dependency. Although we're also using stats.includedFiles, this might come
                      // in handy when an error occurs. In this case, we don't get stats.includedFiles from node-sass.
                      addNormalizedDependency(resolvedFile);
                      return {
                          // By removing the CSS file extension, we trigger node-sass to include the CSS file instead of just linking it.
                          file: resolvedFile.replace(matchCss, "")
                      };
                  }, () => startResolving(
                      dir,
                      tail(importsToResolve)
                  ));
      }
  
      return (url, prev, done) => {
          startResolving(
              dirContextFrom(prev),
              importsToResolve(url)
          ) // Catch all resolving errors, return the original file and pass responsibility back to other custom importers
              .catch(() => ({ file: url }))
              .then(done);
      };
  }
  
  module.exports = webpackImporter;