1 | "use strict";
|
2 |
|
3 | const
|
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 |
|
15 |
|
16 |
|
17 |
|
18 | exports.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 |
|
93 |
|
94 |
|
95 |
|
96 | function 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 |