|
1 | 1 | var loaderUtils = require('loader-utils')
|
| 2 | +var selectorPath = require.resolve('./selector') |
| 3 | +var parserPath = require.resolve('./parser') |
| 4 | +var cssRewriterPath = require.resolve('./css-rewriter') |
2 | 5 |
|
3 | 6 | module.exports = function (content) {
|
4 | 7 | var self = this
|
@@ -26,74 +29,76 @@ module.exports = function (content) {
|
26 | 29 | script: 'js'
|
27 | 30 | }
|
28 | 31 |
|
29 |
| - /** |
30 |
| - * Determine the loaders to use for an extracted part. |
31 |
| - * |
32 |
| - * @param {String} part - style|script|template |
33 |
| - * @param {String} lang |
34 |
| - * @return {String} |
35 |
| - */ |
36 |
| - function loader (part, lang) { |
37 |
| - lang = lang || defaultLang[part] |
38 |
| - var loader = loaders[lang] !== undefined |
39 |
| - ? loaders[lang] |
40 |
| - : loaderPrefix[part] + lang |
41 |
| - return loader ? loader + '!' : '' |
| 32 | + function getRequire (type, part, index) { |
| 33 | + return 'require(' + |
| 34 | + loaderUtils.stringifyRequest(self, |
| 35 | + // disable system loaders (except post loaders) |
| 36 | + '-!' + |
| 37 | + // check for local CSS rewrite |
| 38 | + (part.local ? cssRewriterPath + '!' : '') + |
| 39 | + // get loader string for pre-processors |
| 40 | + getPreprocessorString(type, part.lang) + |
| 41 | + // select the corresponding part from the vue file |
| 42 | + getSelectorString(type, index || 0) + |
| 43 | + // the url to the actual vuefile |
| 44 | + vueUrl |
| 45 | + ) + |
| 46 | + ')\n' |
42 | 47 | }
|
43 | 48 |
|
44 |
| - /** |
45 |
| - * Generate a require call for an extracted part. |
46 |
| - * |
47 |
| - * @param {String} part - style|script|template |
48 |
| - * @param {String} lang |
49 |
| - * @return {String} |
50 |
| - */ |
51 |
| - function getRequire (part, lang) { |
| 49 | + function getRequireForImport (include) { |
52 | 50 | return 'require(' +
|
53 | 51 | loaderUtils.stringifyRequest(self,
|
54 |
| - '-!' + loader(part, lang) + |
55 |
| - require.resolve('./selector.js') + '?' + part + '/' + lang + '!' + |
56 |
| - vueUrl |
| 52 | + '-!' + |
| 53 | + getPreprocessorString(include.type, include.lang) + |
| 54 | + include.src |
57 | 55 | ) +
|
58 |
| - ')' |
| 56 | + ')\n' |
| 57 | + } |
| 58 | + |
| 59 | + function getPreprocessorString (type, lang) { |
| 60 | + lang = lang || defaultLang[type] |
| 61 | + var loader = loaders[lang] !== undefined |
| 62 | + ? loaders[lang] |
| 63 | + : loaderPrefix[type] + lang |
| 64 | + return loader ? loader + '!' : '' |
59 | 65 | }
|
60 | 66 |
|
61 |
| - var url = '!!' + require.resolve('./parser.js') + '!' + vueUrl |
| 67 | + function getSelectorString (type, index) { |
| 68 | + return selectorPath + |
| 69 | + '?type=' + type + |
| 70 | + '&index=' + index + '!' |
| 71 | + } |
| 72 | + |
| 73 | + var url = '!!' + parserPath + '!' + vueUrl |
62 | 74 | this.loadModule(url, function (err, source) {
|
63 | 75 | if (err) return cb(err)
|
64 | 76 |
|
65 | 77 | // up to this part, what we have done is basically executing
|
66 | 78 | // parser.js on the raw vue file and get the parsing result
|
67 | 79 | // which is an object that contains info about the vue file.
|
68 | 80 | var parts = self.exec(source, url)
|
69 |
| - var lang |
70 |
| - |
71 |
| - // add require for all the src imports |
72 |
| - for (var i = 0; i < parts.includes.length; i++) { |
73 |
| - var include = parts.includes[i] |
74 |
| - output += 'require(' + loaderUtils.stringifyRequest(this, |
75 |
| - '-!' + loader(include.type, include.lang) + include.src |
76 |
| - ) + ')\n' |
77 |
| - } |
78 | 81 |
|
79 |
| - // add require for styles |
80 |
| - for (lang in parts.style) { |
81 |
| - output += getRequire('style', lang) + '\n' |
82 |
| - } |
| 82 | + // add requires for src imports |
| 83 | + parts.includes.forEach(function (include) { |
| 84 | + output += getRequireForImport(include) |
| 85 | + }) |
| 86 | + |
| 87 | + // add requires for styles |
| 88 | + parts.style.forEach(function (style, i) { |
| 89 | + output += getRequire('style', style, i) |
| 90 | + }) |
83 | 91 |
|
84 |
| - // add require for script |
85 |
| - for (lang in parts.script) { |
86 |
| - output += 'module.exports = ' + getRequire('script', lang) + '\n' |
| 92 | + // only one script tag allowed |
| 93 | + if (parts.script.length) { |
| 94 | + output += 'module.exports = ' + |
| 95 | + getRequire('script', parts.script[0]) |
87 | 96 | }
|
88 | 97 |
|
89 |
| - // add require for template |
90 |
| - var hasTemplate = false |
91 |
| - for (lang in parts.template) { |
92 |
| - if (hasTemplate) { |
93 |
| - return cb(new Error('Only one template element allowed per vue component!')) |
94 |
| - } |
95 |
| - output += 'module.exports.template = ' + getRequire('template', lang) |
96 |
| - hasTemplate = true |
| 98 | + // only one template tag allowed |
| 99 | + if (parts.template.length) { |
| 100 | + output += 'module.exports.template = ' + |
| 101 | + getRequire('template', parts.template[0]) |
97 | 102 | }
|
98 | 103 |
|
99 | 104 | // done
|
|
0 commit comments