@@ -27,7 +27,8 @@ import {
27
27
parse_npm_url ,
28
28
resolve_local ,
29
29
resolve_subpath ,
30
- resolve_version
30
+ resolve_version ,
31
+ type Package
31
32
} from '../npm' ;
32
33
import type { BundleResult } from '$lib/public' ;
33
34
@@ -180,6 +181,14 @@ async function get_bundle(
180
181
// importing from a URL
181
182
if ( / ^ [ a - z ] + : / . test ( importee ) ) return importee ;
182
183
184
+ /** The npm package we're importing from, if any */
185
+ let current : null | Package ;
186
+
187
+ if ( importer . startsWith ( NPM ) ) {
188
+ const { name, version } = parse_npm_url ( importer ) ;
189
+ current = await fetch_package ( name , name === 'svelte' ? svelte_version : version ) ;
190
+ }
191
+
183
192
// importing a relative file
184
193
if ( importee [ 0 ] === '.' ) {
185
194
if ( importer . startsWith ( VIRTUAL ) ) {
@@ -199,18 +208,24 @@ async function get_bundle(
199
208
) ;
200
209
}
201
210
202
- if ( importer . startsWith ( NPM ) ) {
203
- const { name , version } = parse_npm_url ( importer ) ;
204
-
205
- const pkg = await fetch_package ( name , name === 'svelte' ? svelte_version : version ) ;
206
- const path = new URL ( importee , importer ) . href . replace ( ` ${ NPM } / ${ name } @ ${ version } /` , '' ) ;
211
+ if ( current ) {
212
+ const path = new URL ( importee , importer ) . href . replace (
213
+ ` ${ NPM } / ${ current . meta . name } @ ${ current . meta . version } /` ,
214
+ ''
215
+ ) ;
207
216
208
- return normalize_path ( pkg , path ) ;
217
+ return normalize_path ( current , path ) ;
209
218
}
210
219
211
220
return new URL ( importee , importer ) . href ;
212
221
}
213
222
223
+ // importing a file from the same package via pkg.imports
224
+ if ( importee [ 0 ] === '#' && current ) {
225
+ const subpath = resolve_subpath ( current , importee ) ;
226
+ return normalize_path ( current , subpath . slice ( 2 ) ) ;
227
+ }
228
+
214
229
// importing an external package -> `npm://$/<name>@<version>/<path>`
215
230
const match = / ^ ( (?: @ [ ^ / ] + \/ ) ? [ ^ / @ ] + ) (?: @ ( [ ^ / ] + ) ) ? ( \/ .+ ) ? $ / . exec ( importee ) ;
216
231
if ( ! match ) throw new Error ( `Invalid import "${ importee } "` ) ;
@@ -223,11 +238,9 @@ async function get_bundle(
223
238
224
239
let default_version = 'latest' ;
225
240
226
- if ( importer . startsWith ( NPM ) ) {
241
+ if ( current ) {
227
242
// use the version specified in importer's package.json, not `latest`
228
- const { name, version } = parse_npm_url ( importer ) ;
229
-
230
- const { meta } = await fetch_package ( name , name === 'svelte' ? svelte_version : version ) ;
243
+ const { meta } = current ;
231
244
232
245
if ( meta . name === pkg_name ) {
233
246
default_version = meta . version ;
0 commit comments