Skip to content

Commit 24bb288

Browse files
authored
import correct version, as determined by package.json (#1006)
* import correct version, as determined by package.json * more * fix
1 parent 14871fc commit 24bb288

File tree

2 files changed

+83
-1
lines changed

2 files changed

+83
-1
lines changed

packages/repl/src/lib/workers/bundler/index.ts

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import type { Warning } from '../../types';
1818
import type { CompileError, CompileOptions, CompileResult } from 'svelte/compiler';
1919
import type { File } from 'editor';
2020
import { parseTar, type FileDescription } from 'tarparser';
21+
import { max } from './semver';
2122

2223
// hack for magic-string and rollup inline sourcemaps
2324
// do not put this into a separate module and import it, would be treeshaken in prod
@@ -230,6 +231,8 @@ async function resolve_from_pkg(
230231
return subpath;
231232
}
232233

234+
const versions = Object.create(null);
235+
233236
async function get_bundle(
234237
uid: number,
235238
mode: 'client' | 'server',
@@ -288,10 +291,46 @@ async function get_bundle(
288291
}
289292

290293
const pkg_name = match[1];
294+
295+
let default_version = 'latest';
296+
297+
if (importer?.startsWith(packages_url)) {
298+
const path = importer.slice(packages_url.length + 1);
299+
const parts = path.split('/').slice(0, 2);
300+
if (!parts[0].startsWith('@')) parts.pop();
301+
302+
const importer_name_and_version = parts.join('/');
303+
const importer_name = importer_name_and_version.slice(
304+
0,
305+
importer_name_and_version.indexOf('@', 1)
306+
);
307+
308+
const default_versions = (versions[importer_name_and_version] ??= Object.create(null));
309+
310+
if (!default_versions[pkg_name]) {
311+
const pkg_json_url = `${packages_url}/${importer_name_and_version}/package.json`;
312+
const pkg_json = (await fetch_if_uncached(pkg_json_url, uid))?.body;
313+
const pkg = JSON.parse(pkg_json ?? '""');
314+
315+
if (importer_name === pkg_name) {
316+
default_versions[pkg_name] = pkg.version;
317+
} else {
318+
const version =
319+
pkg.devDependencies?.[pkg_name] ??
320+
pkg.peerDependencies?.[pkg_name] ??
321+
pkg.dependencies?.[pkg_name];
322+
323+
default_versions[pkg_name] = max(version);
324+
}
325+
}
326+
327+
default_version = default_versions[pkg_name];
328+
}
329+
291330
const pkg_url =
292331
pkg_name === 'svelte'
293332
? `${svelte_url}/package.json`
294-
: `${packages_url}/${pkg_name}@${match[2] ?? 'latest'}/package.json`;
333+
: `${packages_url}/${pkg_name}@${match[2] ?? default_version}/package.json`;
295334
const subpath = `.${match[3] ?? ''}`;
296335

297336
// if this was imported by one of our files, add it to the `imports` set
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// https://devhints.io/semver
2+
export function max(version: string) {
3+
if (!version || version === '*' || version === 'x') {
4+
return 'latest';
5+
}
6+
7+
// strip any * parts, e.g. 1.2.x becomes 1.2
8+
version = version.replace(/\.[x*].+/, '');
9+
10+
const match = /^([~^])?(\d+|[*x])(?:\.(\d+|[*x])(?:\.(\d+|[*x]))?)?(?:-.+)?$/.exec(version);
11+
12+
if (!match) {
13+
// bail
14+
console.warn(`Could not resolve version from ${version}`);
15+
return 'latest';
16+
}
17+
18+
const [_, qualifier, major, minor] = match;
19+
20+
// ^ means 'same major', unless 0.x
21+
if (qualifier === '^') {
22+
if (major === '0') {
23+
if (minor === '0') {
24+
return version.slice(1);
25+
}
26+
27+
return `${major}.${minor}`;
28+
}
29+
30+
return major;
31+
}
32+
33+
// ~ means 'same minor'
34+
if (qualifier === '~') {
35+
if (minor !== undefined) {
36+
return `${major}.${minor}`;
37+
}
38+
39+
return major;
40+
}
41+
42+
return version;
43+
}

0 commit comments

Comments
 (0)