UNPKG

3.75 kBJavaScriptView Raw
1"use strict";
2
3const
4 CompileModule = require( "./compile-module" ),
5 FS = require( "fs" ),
6 MinifyJS = require( "./minifyJS" ),
7 ModuleAnalyser = require( "./module-analyser" ),
8 Source = require( "./source" ),
9 Tpl = require( "./template" ),
10 Transpiler = require( "./transpiler" ),
11 Util = require( "./util" );
12
13/**
14 * @param {object} prj - Current project.
15 * @param {array} compiledFiles - Array of compiled Html files.
16 * @returns {undefined}
17 */
18exports.compile = function compile( prj, compiledFiles ) {
19 const
20 modules = [],
21 webWorkerFiles = [];
22
23 compiledFiles.forEach( function forEachCompiledFile( file ) {
24 const output = file.tag( 'output' );
25 output.modules.forEach( function forEachModule( mod ) {
26 if ( Util.isInArray( modules, mod ) ) {
27 const
28 webWorkerName = `${mod}.wrk`,
29 webWorkerFile = prj.srcPath( webWorkerName );
30 if ( FS.existsSync( webWorkerFile ) ) {
31 webWorkerFiles.push( new Source( prj, webWorkerName ) );
32 }
33 modules.push( mod );
34 }
35 } );
36 } );
37
38 if ( Util.isEmpty( webWorkerFiles ) ) return;
39
40 console.log( "WebWorkers...".cyan );
41 webWorkerFiles.forEach( function forEachwebWorkerFile( webWorkerFile ) {
42 const
43 nameAsJs = Util.replaceExtension( Util.removeFirstSubFolder( webWorkerFile.name() ), ".js" ),
44 dst = prj.wwwPath( nameAsJs ),
45 sourceCode = webWorkerFile.read(),
46 ast = Transpiler.parseToAST( sourceCode ),
47 fringe = ModuleAnalyser.extractInfoFromAst( ast ).requires,
48 dependentModules = [ '$' ];
49
50 let output = `const window = self;\n\n${Tpl.file( 'require.js' ).out}`;
51
52 while ( fringe.length > 0 ) {
53 const module = fringe.pop();
54 if ( Util.isInArray( dependentModules, module ) ) continue;
55 dependentModules.push( module );
56 const
57 modContent = new Source( prj, `mod/${module}.js` ).read(),
58 ast2 = Transpiler.parseToAST( modContent ),
59 requires = ModuleAnalyser.extractInfoFromAst( ast2 ).requires;
60 requires.forEach( function forEachRequire( childModule ) {
61 if ( Util.isInArray( fringe, childModule ) ) return;
62 fringe.push( childModule );
63 } );
64 }
65
66 output += processDependentModules( prj, dependentModules ) +
67 webWorkerFile.read();
68 const transpiled = Transpiler.transpile( output );
69 output = transpiled.code;
70
71 console.log( `>>> ${dst.cyan} ${Util.convertToKiloBytes(output.length)} kb.` );
72 if ( !prj.options.debug ) {
73 const minification = MinifyJS.minify( {
74 name: webWorkerFile.name(),
75 content: output
76 } );
77 output = minification.zip;
78 console.log( `Minified to ${Util.convertToKiloBytes(output.length)} kb.` );
79 }
80
81 const stream = FS.createWriteStream( dst );
82 stream.once( 'open', function onStreamOpen() {
83 stream.write( output );
84 stream.end();
85 } );
86 } );
87
88};
89
90
91/**
92 * @param {object} project - Current project.
93 * @param {array} dependentModules - Name of modules the WebWorker depends on.
94 * @returns {string} Source code to output.
95 */
96function processDependentModules( project, dependentModules ) {
97 let output = '';
98 dependentModules.sort();
99 dependentModules.forEach( function forEachDependentModule( moduleName ) {
100 const result = CompileModule( project, moduleName );
101 output += result.code;
102 } );
103 return output;
104}
\No newline at end of file