-
Notifications
You must be signed in to change notification settings - Fork 388
Expand file tree
/
Copy pathAddModePlugin.js
More file actions
85 lines (78 loc) · 3.42 KB
/
Copy pathAddModePlugin.js
File metadata and controls
85 lines (78 loc) · 3.42 KB
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
73
74
75
76
77
78
79
80
81
82
83
84
85
const path = require('path')
const stringifyQuery = require('../utils/stringify-query')
const parseQuery = require('loader-utils').parseQuery
const { matchCondition } = require('../utils/match-condition')
const addInfix = require('../utils/add-infix')
const { JSON_JS_EXT } = require('../utils/const')
module.exports = class AddModePlugin {
constructor (source, mode, options, target) {
this.source = source
this.target = target
this.mode = mode
this.options = options
}
apply (resolver) {
const target = resolver.ensureHook(this.target)
const { options = {}, mode } = this
const { defaultMode, fileConditionRules, implicitMode } = options
const modePattern = new RegExp(`\\.${mode}(\\.|$)`)
const defaultModePattern = new RegExp(`\\.${defaultMode}(\\.|$)`)
resolver.getHook(this.source).tapAsync('AddModePlugin', (request, resolveContext, callback) => {
if (request.__mpxResolvedExtendComponent || request.mode || request.env) {
return callback()
}
const obj = {
mode
}
const resourcePath = request.path
let extname = ''
if (resourcePath.endsWith(JSON_JS_EXT)) {
extname = JSON_JS_EXT
} else {
extname = path.extname(resourcePath)
}
// 当前资源没有后缀名或者路径不符合fileConditionRules规则时,直接返回
if (!extname || !matchCondition(resourcePath, fileConditionRules)) return callback()
const queryObj = parseQuery(request.query || '?')
const queryInfix = queryObj.infix
// 如果已经确认是mode后缀的文件,添加query与mode后直接返回
if (modePattern.test(path.basename(resourcePath))) {
// 已经被resolved到对应mode的文件,避免重复添加mode
const isResolved = (implicitMode || queryObj.mode === mode) && modePattern.test(queryObj.infix)
if (!isResolved) {
queryObj.infix = `${queryInfix || ''}.${mode}`
if (!implicitMode) queryObj.mode = mode
request.query = stringifyQuery(queryObj)
request.mode = obj.mode
}
return callback()
} else if (defaultMode && defaultModePattern.test(path.basename(resourcePath))) {
const isResolved = (implicitMode || queryObj.mode === mode) && defaultModePattern.test(queryObj.infix)
if (!isResolved) {
queryObj.infix = `${queryInfix || ''}.${defaultMode}`
if (!implicitMode) queryObj.mode = mode
request.query = stringifyQuery(queryObj)
request.mode = obj.mode
}
return callback()
}
if (!implicitMode) queryObj.mode = mode
queryObj.infix = `${queryInfix || ''}.${mode}`
obj.query = stringifyQuery(queryObj)
obj.path = addInfix(resourcePath, mode, extname)
obj.relativePath = request.relativePath && addInfix(request.relativePath, mode, extname)
resolver.doResolve(target, Object.assign({}, request, obj), 'add mode: ' + mode, resolveContext, (err, result) => {
if (defaultMode && !result) {
queryObj.infix = `${queryInfix || ''}.${defaultMode}`
obj.query = stringifyQuery(queryObj)
obj.path = addInfix(resourcePath, defaultMode, extname)
resolver.doResolve(target, Object.assign({}, request, obj), 'add mode: ' + defaultMode, resolveContext, (err, result) => {
callback(err, result)
})
return
}
callback(err, result)
})
})
}
}