@@ -23,6 +23,8 @@ import {
2323 MAX_CPU_CORES ,
2424 MIN_IMAGE_THRESHOLD_ARTICLELIST_PAGE ,
2525 downloadAndSaveModule ,
26+ downloadAndSaveStartupModule ,
27+ getModuleDependencies ,
2628 genCanonicalLink ,
2729 genHeaderCSSLink ,
2830 genHeaderScript ,
@@ -95,6 +97,8 @@ async function execute(argv: any) {
9597 publisher : _publisher ,
9698 outputDirectory : _outputDirectory ,
9799 addNamespaces : _addNamespaces ,
100+ javaScript : _javaScript ,
101+ addModules : _addModules ,
98102 customZimFavicon,
99103 optimisationCacheUrl,
100104 customFlavour,
@@ -163,6 +167,10 @@ async function execute(argv: any) {
163167 MediaWiki . password = mwPassword
164168 MediaWiki . username = mwUsername
165169
170+ const javaScript = _javaScript || 'trusted'
171+ const addModules = _addModules ? String ( _addModules ) . split ( ',' ) : [ ]
172+ const trustedJs = javaScript === 'none' ? null : javaScript === 'trusted' ? config . output . mw . js_trusted . concat ( addModules ) : [ ]
173+
166174 /* Download helpers; TODO: Merge with something else / expand this. */
167175 Downloader . init = {
168176 uaString : `${ config . userAgent } (${ adminEmail } )` ,
@@ -171,6 +179,7 @@ async function execute(argv: any) {
171179 optimisationCacheUrl,
172180 s3,
173181 webp,
182+ trustedJs,
174183 insecure : argv . insecure ,
175184 }
176185
@@ -431,12 +440,48 @@ async function execute(argv: any) {
431440 const { jsModuleDependencies, cssModuleDependencies, staticFilesList } = await saveArticles ( zimCreator , dump )
432441 logger . log ( `Fetching Articles finished in ${ ( Date . now ( ) - stime ) / 1000 } seconds` )
433442
434- logger . log ( `Found [${ jsModuleDependencies . size } ] js module dependencies` )
435- logger . log ( `Found [${ cssModuleDependencies . size } ] style module dependencies` )
436-
437443 logger . info ( 'Copying Static Resource Files' )
438444 await saveStaticFiles ( staticFilesList , zimCreator )
439445
446+ if ( javaScript === 'none' ) {
447+ jsModuleDependencies . clear ( )
448+ } else {
449+ // Get list of all possible modules from startup
450+ const allModules = await downloadAndSaveStartupModule ( zimCreator )
451+ addModules . forEach ( ( oneModule ) => {
452+ jsModuleDependencies . add ( oneModule )
453+ } )
454+ // Include known dynamic dependencies
455+ const dynamicJsDeps = config . output . mw . js_dynamic_dependencies
456+ Object . keys ( dynamicJsDeps ) . forEach ( ( oneDep : keyof typeof dynamicJsDeps ) => {
457+ if ( jsModuleDependencies . has ( oneDep ) ) {
458+ dynamicJsDeps [ oneDep ] . forEach ( ( extraDep ) => {
459+ jsModuleDependencies . add ( extraDep )
460+ } )
461+ }
462+ } )
463+ // Include all dependencies of the dependencies
464+ jsModuleDependencies . forEach ( ( oneDep ) => {
465+ const oneModule = allModules . find ( ( oneModule ) => oneModule [ 0 ] === oneDep )
466+ if ( ! oneModule ) {
467+ jsModuleDependencies . delete ( oneDep )
468+ return logger . warn ( `Unknown JS module [${ oneDep } ] removed` )
469+ }
470+ getModuleDependencies ( oneModule , allModules ) . forEach ( ( extraDep ) => {
471+ jsModuleDependencies . add ( extraDep )
472+ } )
473+ } )
474+ // Don't store JS for CSS modules
475+ cssModuleDependencies . forEach ( ( oneModule ) => {
476+ if ( ! addModules . includes ( oneModule ) ) {
477+ jsModuleDependencies . delete ( oneModule )
478+ }
479+ } )
480+ }
481+
482+ logger . log ( `Found [${ jsModuleDependencies . size } ] js module dependencies` )
483+ logger . log ( `Found [${ cssModuleDependencies . size } ] style module dependencies` )
484+
440485 const allDependenciesWithType = [
441486 { type : 'js' , moduleList : Array . from ( jsModuleDependencies ) } ,
442487 { type : 'css' , moduleList : Array . from ( cssModuleDependencies ) } ,
@@ -448,6 +493,9 @@ async function execute(argv: any) {
448493 return pmap (
449494 moduleList ,
450495 ( oneModule ) => {
496+ if ( oneModule . startsWith ( 'user' ) ) {
497+ return
498+ }
451499 return downloadAndSaveModule ( zimCreator , oneModule , type as any )
452500 } ,
453501 { concurrency : Downloader . speed } ,
0 commit comments