1
1
const path = require ( 'path' ) ;
2
+ const fs = require ( 'fs' ) ;
2
3
const relative = require ( 'require-relative' ) ;
3
4
const { createFilter } = require ( '@rollup/pluginutils' ) ;
4
5
const { compile, preprocess } = require ( 'svelte/compiler' ) ;
5
6
6
7
const PREFIX = '[rollup-plugin-svelte]' ;
7
- const pkg_export_errors = new Set ( ) ;
8
8
9
9
const plugin_options = new Set ( [
10
10
'emitCss' ,
@@ -15,6 +15,54 @@ const plugin_options = new Set([
15
15
'preprocess'
16
16
] ) ;
17
17
18
+ const parse_pkg = function ( dir ) {
19
+ const pkg_file = path . join ( dir , 'package.json' ) ;
20
+
21
+ try {
22
+ return JSON . parse ( fs . readFileSync ( pkg_file , 'utf-8' ) ) ;
23
+ } catch ( e ) {
24
+ return false ;
25
+ }
26
+ }
27
+
28
+ const get_dir = ( file , importer ) => relative . resolve ( file , path . dirname ( importer ) ) ;
29
+
30
+ const find_pkg = function ( name , importer ) {
31
+ let dir , pkg ;
32
+
33
+ try {
34
+ const file = `${ name } /package.json` ;
35
+ const resolved = get_dir ( file , importer ) ;
36
+ dir = path . dirname ( resolved ) ;
37
+ pkg = require ( resolved ) ;
38
+ } catch ( err ) {
39
+ if ( err . code === 'MODULE_NOT_FOUND' ) return { pkg : null , dir} ;
40
+ if ( err . code === 'ERR_PACKAGE_PATH_NOT_EXPORTED' ) {
41
+ dir = path . dirname ( get_dir ( file , importer ) ) ;
42
+
43
+ while ( dir ) {
44
+ pkg = parse_pkg ( dir ) ;
45
+
46
+ if ( pkg && pkg . name === name ) {
47
+ return { pkg, dir} ;
48
+ }
49
+
50
+ const parent = path . dirname ( dir ) ;
51
+ if ( parent === dir ) {
52
+ break ;
53
+ }
54
+ dir = parent ;
55
+ }
56
+
57
+ return { pkg : null , dir} ;
58
+ }
59
+
60
+ throw err ;
61
+ }
62
+
63
+ return { pkg, dir} ;
64
+ }
65
+
18
66
/**
19
67
* @param [options] {Partial<import('.').Options>}
20
68
* @returns {import('rollup').Plugin }
@@ -55,27 +103,15 @@ module.exports = function (options = {}) {
55
103
// if this is a bare import, see if there's a valid pkg.svelte
56
104
const parts = importee . split ( '/' ) ;
57
105
58
- let dir , pkg , name = parts . shift ( ) ;
106
+ let name = parts . shift ( ) ;
59
107
if ( name && name [ 0 ] === '@' ) {
60
108
name += `/${ parts . shift ( ) } ` ;
61
109
}
62
110
63
- try {
64
- const file = `${ name } /package.json` ;
65
- const resolved = relative . resolve ( file , path . dirname ( importer ) ) ;
66
- dir = path . dirname ( resolved ) ;
67
- pkg = require ( resolved ) ;
68
- } catch ( err ) {
69
- if ( err . code === 'MODULE_NOT_FOUND' ) return null ;
70
- if ( err . code === 'ERR_PACKAGE_PATH_NOT_EXPORTED' ) {
71
- pkg_export_errors . add ( name ) ;
72
- return null ;
73
- }
74
- throw err ;
75
- }
111
+ const { pkg, dir} = find_pkg ( name , importer ) ;
76
112
77
113
// use pkg.svelte
78
- if ( parts . length === 0 && pkg . svelte ) {
114
+ if ( parts . length === 0 && pkg && pkg . svelte ) {
79
115
return path . resolve ( dir , pkg . svelte ) ;
80
116
}
81
117
} ,
@@ -129,16 +165,6 @@ module.exports = function (options = {}) {
129
165
}
130
166
131
167
return compiled . js ;
132
- } ,
133
-
134
- /**
135
- * All resolutions done; display warnings wrt `package.json` access.
136
- */
137
- generateBundle ( ) {
138
- if ( pkg_export_errors . size > 0 ) {
139
- console . warn ( `\n${ PREFIX } The following packages did not export their \`package.json\` file so we could not check the "svelte" field. If you had difficulties importing svelte components from a package, then please contact the author and ask them to export the package.json file.\n` ) ;
140
- console . warn ( Array . from ( pkg_export_errors , s => `- ${ s } ` ) . join ( '\n' ) + '\n' ) ;
141
- }
142
168
}
143
169
} ;
144
170
} ;
0 commit comments