1
1
const { basename, extname, relative } = require ( 'path' ) ;
2
2
const { getOptions } = require ( 'loader-utils' ) ;
3
3
const VirtualModules = require ( './lib/virtual' ) ;
4
- const requireRelative = require ( 'require-relative' ) ;
5
4
6
5
const hotApi = require . resolve ( './lib/hot-api.js' ) ;
7
6
@@ -11,6 +10,20 @@ const { compile, preprocess } = major_version >= 3
11
10
? require ( 'svelte/compiler' )
12
11
: require ( 'svelte' ) ;
13
12
13
+ const pluginOptions = {
14
+ externalDependencies : true ,
15
+ hotReload : true ,
16
+ hotOptions : true ,
17
+ preprocess : true ,
18
+ emitCss : true ,
19
+
20
+ // legacy
21
+ shared : true ,
22
+ style : true ,
23
+ script : true ,
24
+ markup : true
25
+ } ;
26
+
14
27
function makeHot ( id , code , hotOptions ) {
15
28
const options = JSON . stringify ( hotOptions ) ;
16
29
const replacement = `
@@ -62,7 +75,7 @@ function normalize(compiled) {
62
75
? compiled . css
63
76
: { code : compiled . css , map : compiled . cssMap } ;
64
77
65
- return { js, css, ast : compiled . ast } ;
78
+ return { js, css, ast : compiled . ast , warnings : compiled . warnings || compiled . stats . warnings || [ ] } ;
66
79
}
67
80
68
81
const warned = { } ;
@@ -99,22 +112,27 @@ module.exports = function(source, map) {
99
112
const isServer = this . target === 'node' || ( options . generate && options . generate == 'ssr' ) ;
100
113
const isProduction = this . minimize || process . env . NODE_ENV === 'production' ;
101
114
102
- options . filename = this . resourcePath ;
103
- if ( ! ( 'format' in options ) ) {
104
- options . format = major_version >= 3 ? 'esm' : 'es' ;
115
+ const compileOptions = {
116
+ filename : this . resourcePath ,
117
+ format : options . format || ( major_version >= 3 ? 'esm' : 'es' )
118
+ } ;
119
+
120
+ const handleWarning = warning => this . emitWarning ( new Error ( warning ) ) ;
121
+
122
+ if ( major_version >= 3 ) {
123
+ // TODO anything?
124
+ } else {
125
+ compileOptions . shared = options . shared || 'svelte/shared.js' ;
126
+ compileOptions . name = capitalize ( sanitize ( options . filename ) ) ;
127
+ compileOptions . onwarn = options . onwarn || handleWarning ;
105
128
}
106
- if ( ! ( 'shared' in options ) ) {
107
- const shared = ( major_version >= 3 ? 'svelte/internal.js' : 'svelte/shared.js' ) ;
108
- options . shared = ( options . format === 'es' || options . format === 'esm' ) &&
109
- requireRelative . resolve ( shared , process . cwd ( ) ) ;
129
+
130
+ for ( const option in options ) {
131
+ if ( ! pluginOptions [ option ] ) compileOptions [ option ] = options [ option ] ;
110
132
}
111
- if ( ! ( 'name' in options ) ) options . name = capitalize ( sanitize ( options . filename ) ) ;
112
- if ( ! ( 'onwarn' in options ) ) options . onwarn = warning => this . emitWarning ( new Error ( warning ) ) ;
113
- if ( options . emitCss ) options . css = false ;
114
- if ( options . externalDependencies ) options . externalDependencies . forEach ( dep => this . addDependency ( dep ) ) ;
115
133
116
134
deprecatePreprocessOptions ( options ) ;
117
- options . preprocess . filename = options . filename ;
135
+ options . preprocess . filename = compileOptions . filename ;
118
136
119
137
preprocess ( source , options . preprocess ) . then ( processed => {
120
138
if ( processed . dependencies && this . addDependency ) {
@@ -123,16 +141,24 @@ module.exports = function(source, map) {
123
141
}
124
142
}
125
143
126
- let { js, css } = normalize ( compile ( processed . toString ( ) , options ) ) ;
144
+ let { js, css, warnings } = normalize ( compile ( processed . toString ( ) , compileOptions ) ) ;
145
+
146
+ if ( major_version >= 3 ) {
147
+ warnings . forEach (
148
+ options . onwarn
149
+ ? warning => options . onwarn ( warning , handleWarning )
150
+ : handleWarning
151
+ ) ;
152
+ }
127
153
128
154
if ( options . hotReload && ! isProduction && ! isServer ) {
129
155
const hotOptions = Object . assign ( { } , options . hotOptions ) ;
130
- const id = JSON . stringify ( relative ( process . cwd ( ) , options . filename ) ) ;
156
+ const id = JSON . stringify ( relative ( process . cwd ( ) , compileOptions . filename ) ) ;
131
157
js . code = makeHot ( id , js . code , hotOptions ) ;
132
158
}
133
159
134
160
if ( options . emitCss && css . code ) {
135
- const cssFilepath = options . filename . replace (
161
+ const cssFilepath = compileOptions . filename . replace (
136
162
/ \. [ ^ / . ] + $ / ,
137
163
`.svelte.css`
138
164
) ;
0 commit comments