@@ -71,37 +71,45 @@ export default {
7171 type,
7272 module : ( version = '0.27.7' ) =>
7373 `https://cdn.jsdelivr.net/pyodide/v${ version } /full/pyodide.mjs` ,
74- async engine ( { loadPyodide } , config , url , baseURL ) {
74+ async engine ( { loadPyodide, version } , config , url , baseURL ) {
7575 progress ( 'Loading Pyodide' ) ;
7676 let { packages, index_urls } = config ;
7777 if ( packages ) packages = packages . map ( fixedRelative , baseURL ) ;
7878 progress ( 'Loading Storage' ) ;
7979 const indexURL = url . slice ( 0 , url . lastIndexOf ( '/' ) ) ;
8080 // each pyodide version shares its own cache
81- const storage = new IDBMapSync ( indexURL ) ;
81+ const storage = new IDBMapSync ( ` ${ indexURL } @ ${ version } ` ) ;
8282 const options = { indexURL } ;
8383 const save = config . packages_cache !== 'never' ;
8484 await storage . sync ( ) ;
8585 // packages_cache = 'never' means: erase the whole DB
8686 if ( ! save ) storage . clear ( ) ;
8787 // otherwise check if cache is known
8888 else if ( packages ) {
89- packages = packages . sort ( ) ;
90- // packages are uniquely stored as JSON key
91- const key = stringify ( packages ) ;
92- if ( storage . has ( key ) ) {
93- const blob = new Blob (
94- [ storage . get ( key ) ] ,
95- { type : 'application/json' } ,
96- ) ;
97- // this should be used to bootstrap loadPyodide
98- options . lockFileURL = URL . createObjectURL ( blob ) ;
99- // versions are not currently understood by pyodide when
100- // a lockFileURL is used instead of micropip.install(packages)
101- // https://github.com/pyodide/pyodide/issues/5135#issuecomment-2441038644
102- // https://github.com/pyscript/pyscript/issues/2245
103- options . packages = packages . map ( name => name . split ( / [ > = < ] = / ) [ 0 ] ) ;
89+ // packages_cache = 'passthrough' means: do not use micropip.install
90+ if ( config . packages_cache === 'passthrough' ) {
91+ options . packages = packages ;
10492 packages = null ;
93+ storage . clear ( ) ;
94+ }
95+ else {
96+ packages = packages . sort ( ) ;
97+ // packages are uniquely stored as JSON key
98+ const key = stringify ( packages ) ;
99+ if ( storage . has ( key ) ) {
100+ const blob = new Blob (
101+ [ storage . get ( key ) ] ,
102+ { type : 'application/json' } ,
103+ ) ;
104+ // this should be used to bootstrap loadPyodide
105+ options . lockFileURL = URL . createObjectURL ( blob ) ;
106+ // versions are not currently understood by pyodide when
107+ // a lockFileURL is used instead of micropip.install(packages)
108+ // https://github.com/pyodide/pyodide/issues/5135#issuecomment-2441038644
109+ // https://github.com/pyscript/pyscript/issues/2245
110+ options . packages = packages . map ( name => name . split ( / [ > = < ] = / ) [ 0 ] ) ;
111+ packages = null ;
112+ }
105113 }
106114 }
107115 progress ( 'Loaded Storage' ) ;
0 commit comments