build.js (3296B)
1 /** 2 * @license Apache-2.0 3 * 4 * Copyright (c) 2020 The Stdlib Authors. 5 * 6 * Licensed under the Apache License, Version 2.0 (the "License"); 7 * you may not use this file except in compliance with the License. 8 * You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, software 13 * distributed under the License is distributed on an "AS IS" BASIS, 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 * See the License for the specific language governing permissions and 16 * limitations under the License. 17 */ 18 19 'use strict'; 20 21 // MODULES // 22 23 var resolve = require( 'path' ).resolve; 24 var logger = require( 'debug' ); 25 var readDir = require( '@stdlib/fs/read-dir' ).sync; 26 var exists = require( '@stdlib/fs/exists' ).sync; 27 var writeFile = require( '@stdlib/fs/write-file' ).sync; 28 var isPRNGLike = require( '@stdlib/assert/is-prng-like' ); 29 var licenseHeader = require( '@stdlib/_tools/licenses/header' ); 30 31 32 // VARIABLES // 33 34 var debug = logger( 'reviver:build' ); 35 var OPTS = { 36 'encoding': 'utf8' 37 }; 38 var SPDX = 'Apache-2.0'; 39 var YEAR = (new Date()).getFullYear(); 40 var COPYRIGHT = 'The Stdlib Authors'; 41 42 43 // FUNCTIONS // 44 45 /** 46 * Main execution sequence. 47 * 48 * @private 49 */ 50 function main() { 51 var dpath; 52 var fpath; 53 var opath; 54 var tmp1; 55 var tmp2; 56 var prng; 57 var dirs; 58 var pkgs; 59 var str; 60 var err; 61 var pkg; 62 var p; 63 var i; 64 65 dpath = resolve( __dirname, '..', '..' ); 66 67 debug( 'Reading namespace directory contents: %s', dpath ); 68 dirs = readDir( dpath ); 69 if ( dirs instanceof Error ) { 70 debug( 'Encountered an error when attempting to read namespace directory contents: %s', err.message ); 71 return; 72 } 73 74 debug( 'Finding packages...' ); 75 pkgs = []; 76 for ( i = 0; i < dirs.length; i++ ) { 77 p = resolve( dpath, dirs[ i ] ); 78 fpath = resolve( p, 'package.json' ); 79 if ( exists( fpath ) ) { 80 prng = require( p ); // eslint-disable-line stdlib/no-dynamic-require 81 if ( isPRNGLike( prng ) ) { 82 pkg = require( fpath ); // eslint-disable-line stdlib/no-dynamic-require 83 pkgs.push( [ pkg.name, prng.NAME ] ); 84 } 85 } 86 } 87 debug( 'Found %d packages.', pkgs.length ); 88 89 debug( 'Generating script...' ); 90 str = ''; 91 str += licenseHeader( SPDX, 'js', { 92 'year': YEAR, 93 'copyright': COPYRIGHT 94 }); 95 str += '\n'; 96 97 str += '// This file is generated using `scripts/build.js`.\n\n'; 98 str += '\'use strict\';\n'; 99 str += '\n'; 100 str += '// MODULES //\n'; 101 str += '\n'; 102 tmp1 = []; 103 tmp2 = []; 104 for ( i = 0; i < pkgs.length; i++ ) { 105 pkg = pkgs[ i ]; 106 tmp1.push( 'var prng'+i+' = require( \''+pkg[ 0 ]+'\' );' ); 107 tmp2.push( 'prngs[ \''+pkg[ 1 ]+'\' ] = prng'+i+'.factory;' ); 108 } 109 str += tmp1.join( '\n' ); 110 str += '\n'; 111 str += '\n'; 112 str += '\n'; 113 str += '// MAIN //\n'; 114 str += '\n'; 115 str += 'var prngs = {};\n'; 116 str += tmp2.join( '\n' ); 117 str += '\n'; 118 str += '\n'; 119 str += '\n'; 120 str += '// EXPORTS //\n'; 121 str += '\n'; 122 str += 'module.exports = prngs;\n'; 123 124 opath = resolve( __dirname, '..', 'lib', 'prngs.js' ); 125 debug( 'Writing script to file: %s', opath ); 126 err = writeFile( opath, str, OPTS ); 127 if ( err ) { 128 debug( 'Encountered an error when attempting to write script to file: %s', err.message ); 129 return; 130 } 131 debug( 'Successfully wrote script to file.' ); 132 } 133 134 135 // MAIN // 136 137 main();