Skip to content

Commit 9ee1102

Browse files
Merge pull request #156 from pyscript/pyodide-packages-graph
Augment Pyodide with pre-fetched packages details
2 parents 59c140e + 704f8e3 commit 9ee1102

20 files changed

+8409
-209
lines changed

docs/index.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/index.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/zip-COrdYVp5.js

Lines changed: 13 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/zip-COrdYVp5.js.map

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/zip-CakRHzZu.js

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/zip-CakRHzZu.js.map

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

esm/interpreter/pyodide.js

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ const type = 'pyodide';
88
const toJsOptions = { dict_converter: Object.fromEntries };
99

1010
const { stringify } = JSON;
11+
const { hasOwn } = Object;
1112

1213
const { apply } = Reflect;
1314
const FunctionPrototype = Function.prototype;
@@ -70,12 +71,35 @@ const indexURLs = new WeakMap();
7071

7172
export default {
7273
type,
73-
module: (version = '0.28.3') =>
74+
module: (version = '0.29.0') =>
7475
`https://cdn.jsdelivr.net/pyodide/v${version}/full/pyodide.mjs`,
7576
async engine({ loadPyodide, version }, config, url, baseURL) {
7677
progress('Loading Pyodide');
7778
let { packages, index_urls } = config;
78-
if (packages) packages = packages.map(fixedRelative, baseURL);
79+
if (packages) {
80+
packages = packages.map(fixedRelative, baseURL);
81+
if (!index_urls) {
82+
progress('Loading Packages Graph');
83+
const { default: graph } = await import(/* webpackIgnore: true */'./pyodide_graph.js');
84+
progress('Loaded Packages Graph');
85+
if (hasOwn(graph, version)) {
86+
const invalid = packages.filter(entry => {
87+
// consider only packages by name
88+
if (/^[a-zA-Z0-9_]/.test(entry)) {
89+
const [name, ...rest] = entry.split(/[>=<]=/);
90+
const known = hasOwn(graph[version], name);
91+
return !known || (rest.length > 0 && rest[1] !== graph[version][name]);
92+
}
93+
return false;
94+
});
95+
if (invalid.length > 0) {
96+
throw new Error(
97+
`These packages are not supported in Pyodide ${version}: ${invalid.join(', ')}`
98+
);
99+
}
100+
}
101+
}
102+
}
79103
progress('Loading Storage');
80104
const indexURL = url.slice(0, url.lastIndexOf('/'));
81105
// each pyodide version shares its own cache

0 commit comments

Comments
 (0)