1 | const loaderUtils = require('loader-utils')
|
2 | const mime = require('mime')
|
3 | const getOptions = loaderUtils.getOptions
|
4 | const parseQuery = loaderUtils.parseQuery
|
5 |
|
6 | function isStyle (request) {
|
7 | let elements = request.replace(/^-?!+/, '').replace(/!!+/g, '!').split('!')
|
8 | elements.pop()
|
9 | for (let i = 0; i < elements.length; i++) {
|
10 | let element = elements[i]
|
11 | let queryString = '?'
|
12 | let loaderString = element
|
13 | let idx = element.indexOf('?')
|
14 | if (idx >= 0) {
|
15 | queryString = element.substr(idx)
|
16 | loaderString = element.substr(0, idx)
|
17 | }
|
18 | if (/css-loader/.test(loaderString)) {
|
19 | return true
|
20 | }
|
21 | if (/content-loader/.test(loaderString)) {
|
22 | let query = parseQuery(queryString)
|
23 | if (query.type === 'styles') {
|
24 | return true
|
25 | }
|
26 | }
|
27 | }
|
28 | return false
|
29 | }
|
30 |
|
31 | module.exports = function (src) {
|
32 | let transBase64 = false
|
33 | const options = getOptions(this) || {}
|
34 |
|
35 | const filePath = this.resourcePath
|
36 | const mimetype = options.mimetype || mime.getType(filePath)
|
37 | const issuer = this._module.issuer
|
38 |
|
39 | if (issuer && issuer.request && isStyle(issuer.request)) {
|
40 | if (options.publicPath) {
|
41 | const limit = options.limit
|
42 | if (!limit || src.length < limit) {
|
43 | transBase64 = true
|
44 | }
|
45 | const queryOption = parseQuery(this.resourceQuery || '?')
|
46 | if (queryOption.fallback) {
|
47 | transBase64 = false
|
48 | }
|
49 | } else {
|
50 | transBase64 = true
|
51 | }
|
52 | }
|
53 |
|
54 | if (transBase64) {
|
55 | if (typeof src === 'string') {
|
56 | src = Buffer.from(src)
|
57 | }
|
58 | return `module.exports = ${JSON.stringify(
|
59 | `data:${mimetype || ''};base64,${src.toString('base64')}`
|
60 | )}`
|
61 | } else {
|
62 | const fallback = require(options.fallback ? options.fallback : './file-loader')
|
63 | return fallback.call(this, src)
|
64 | }
|
65 | }
|
66 |
|
67 | module.exports.raw = true
|