Skip to content

Commit cedcf46

Browse files
committed
Add scripts to generate browser builds
1 parent 5c1b46d commit cedcf46

File tree

3 files changed

+287
-0
lines changed

3 files changed

+287
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
'use strict';
2+
3+
// MODULES //
4+
5+
var getKeys = require( 'object-keys' ).shim();
6+
var vdom2html = require( 'vdom-to-html' );
7+
var hasOwnProp = require( '@stdlib/assert/has-own-property' );
8+
var deepGet = require( '@stdlib/utils/deep-get' );
9+
var setReadOnly = require( '@stdlib/utils/define-read-only-property' );
10+
var namespace = require( '@stdlib/namespace' );
11+
var docs = require( '@stdlib/repl/help' );
12+
13+
14+
// VARIABLES //
15+
16+
var NO_HELP_TEXT = 'No help information available.';
17+
var NAMESPACE = namespace();
18+
var DOCS = docs();
19+
20+
21+
// FUNCTIONS //
22+
23+
/**
24+
* Returns help information.
25+
*
26+
* @private
27+
* @param {*} alias - variable alias or value
28+
*/
29+
function help( alias ) {
30+
var txt;
31+
var i;
32+
33+
// First check if provided an alias...
34+
if ( hasOwnProp( DOCS, alias ) ) {
35+
txt = DOCS[ alias ];
36+
} else {
37+
// Search through namespace values to see if provided a known value reference...
38+
for ( i = 0; i < NAMESPACE.length; i++ ) {
39+
if ( alias === NAMESPACE[ i ].value ) {
40+
if ( hasOwnProp( DOCS, NAMESPACE[ i ].alias ) ) {
41+
txt = DOCS[ NAMESPACE[ i ].alias ];
42+
}
43+
break;
44+
}
45+
}
46+
// If still unable to resolve help info, inform the user that no info is available...
47+
if ( txt === void 0 ) {
48+
txt = NO_HELP_TEXT;
49+
}
50+
}
51+
console.log( txt );
52+
} // end FUNCTION help()
53+
54+
55+
// MAIN //
56+
57+
/**
58+
* Extends the browser global namespace.
59+
*
60+
* @private
61+
*/
62+
function main() {
63+
var paths;
64+
var parts;
65+
var keys;
66+
var tmp;
67+
var key;
68+
var o;
69+
var i;
70+
var j;
71+
var k;
72+
73+
// Create an object tree from value aliases...
74+
tmp = {
75+
'help': help
76+
};
77+
paths = [];
78+
for ( i = 0; i < NAMESPACE.length; i++ ) {
79+
o = tmp;
80+
81+
// Get the alias of the value to be added to the global context:
82+
key = NAMESPACE[ i ].alias;
83+
84+
// Cache the alias path:
85+
paths.push( key );
86+
87+
// An alias may be nested (e.g., `a.b.c`); if so, we need to recursively generate parent sub-trees...
88+
parts = key.split( '.' );
89+
for ( j = 0; j < parts.length-1; j++ ) {
90+
k = parts[ j ];
91+
if ( !hasOwnProp( o, k ) ) {
92+
o[ k ] = {};
93+
}
94+
o = o[ k ];
95+
}
96+
k = parts[ j ];
97+
98+
// Attempt to add the value to the tree (checking for collisions):
99+
if ( hasOwnProp( o, k ) ) {
100+
throw new Error( 'invalid operation. Alias already exists in the global context. Alias: `'+key+'`. Value: `'+deepGet( tmp, key )+'`.' );
101+
} else {
102+
o[ k ] = NAMESPACE[ i ].value;
103+
}
104+
}
105+
// Walk the context tree and set each nested path to read-only...
106+
for ( i = 0; i < paths.length; i++ ) {
107+
parts = paths[ i ].split( '.' );
108+
if ( parts.length > 1 ) {
109+
o = tmp;
110+
for ( j = 0; j < parts.length; j++ ) {
111+
k = parts[ j ];
112+
setReadOnly( o, k, o[ k ] );
113+
o = o[ k ];
114+
}
115+
}
116+
}
117+
// Extend the global context...
118+
keys = getKeys( tmp );
119+
for ( i = 0; i < keys.length; i++ ) {
120+
key = keys[ i ];
121+
setReadOnly( global, key, tmp[ key ] );
122+
}
123+
// Include any additional third party libraries...
124+
setReadOnly( global, 'vdom2html', vdom2html );
125+
} // end FUNCTION main()
126+
127+
main();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
#!/usr/bin/env node
2+
'use strict';
3+
4+
// MODULES //
5+
6+
var debug = require( 'debug' )( 'repl:browser-build' );
7+
var join = require( 'path' ).join;
8+
var resolve = require( 'path' ).resolve;
9+
var writeFile = require( 'fs' ).writeFile;
10+
var mkdirp = require( 'mkdirp' );
11+
var browserify = require( 'browserify' );
12+
13+
14+
// VARIABLES //
15+
16+
var fpath = join( __dirname, 'browser.js' );
17+
var odir = resolve( __dirname, '..', 'build' );
18+
var opath = join( odir, 'bundle.js' );
19+
20+
21+
// MAIN //
22+
23+
/**
24+
* Main execution sequence.
25+
*
26+
* @private
27+
*/
28+
function main() {
29+
debug( 'Creating output directory...' );
30+
mkdirp( odir, onDir );
31+
32+
/**
33+
* Callback invoked upon creating a directory.
34+
*
35+
* @private
36+
* @param {Error} [error] - error object
37+
* @returns {void}
38+
*/
39+
function onDir( error ) {
40+
var b;
41+
if ( error ) {
42+
debug( 'Encountered an error when creating an output directory: %s', error.message );
43+
return done( error );
44+
}
45+
debug( 'Successfully created an output directory.' );
46+
47+
debug( 'Creating a bundle...' );
48+
b = browserify( [ fpath ], {} );
49+
b.bundle( onBundle );
50+
} // end FUNCTION onDir()
51+
52+
/**
53+
* Callback invoked upon creating a bundle.
54+
*
55+
* @private
56+
* @param {(Error|null)} error - error object
57+
* @param {Buffer} bundle - bundle
58+
* @returns {void}
59+
*/
60+
function onBundle( error, bundle ) {
61+
var opts;
62+
if ( error ) {
63+
debug( 'Encountered an error when creating a bundle: %s', error.message );
64+
return done( error );
65+
}
66+
debug( 'Successfully created a bundle.' );
67+
68+
debug( 'Writing bundle to file...' );
69+
opts = {
70+
'encoding': 'utf8'
71+
};
72+
writeFile( opath, bundle, opts, onWrite );
73+
} // end FUNCTION onBundle()
74+
75+
/**
76+
* Callback invoked upon writing a file.
77+
*
78+
* @private
79+
* @param {(Error|null)} error - error object
80+
* @returns {void}
81+
*/
82+
function onWrite( error ) {
83+
if ( error ) {
84+
debug( 'Encountered an error when writing bundle to file: %s', error.message );
85+
return done( error );
86+
}
87+
debug( 'Successfully wrote bundle to file.' );
88+
done();
89+
} // end FUNCTION onWrite()
90+
91+
/**
92+
* Callback invoked upon completion.
93+
*
94+
* @private
95+
* @param {Error} [error] - error object
96+
*/
97+
function done( error ) {
98+
if ( error ) {
99+
throw error;
100+
}
101+
debug( 'Finished.' );
102+
} // end FUNCTION done()
103+
} // end FUNCTION main()
104+
105+
main();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
#!/usr/bin/env node
2+
'use strict';
3+
4+
// MODULES //
5+
6+
var debug = require( 'debug' )( 'repl:browser-run' );
7+
var join = require( 'path' ).join;
8+
var browserify = require( 'browserify' );
9+
var httpServer = require( '@stdlib/tools/disposable-http-server' );
10+
11+
12+
// VARIABLES //
13+
14+
var fpath = join( __dirname, 'browser.js' );
15+
16+
17+
// MAIN //
18+
19+
/**
20+
* Main execution sequence.
21+
*
22+
* @private
23+
*/
24+
function main() {
25+
var b = browserify( [ fpath ], {} );
26+
27+
debug( 'Creating a bundle...' );
28+
b.bundle( onBundle );
29+
30+
/**
31+
* Callback invoked upon creating a bundle.
32+
*
33+
* @private
34+
* @param {(Error|null)} error - error object
35+
* @param {Buffer} bundle - bundle
36+
* @returns {void}
37+
*/
38+
function onBundle( error, bundle ) {
39+
var opts;
40+
if ( error ) {
41+
debug( 'Encountered an error when creating a bundle: %s', error.message );
42+
return;
43+
}
44+
debug( 'Successfully created a bundle.' );
45+
46+
debug( 'Sending bundle to browser...' );
47+
opts = {
48+
'javascript': bundle,
49+
'open': true
50+
};
51+
httpServer( opts );
52+
} // end FUNCTION onBundle()
53+
} // end FUNCTION main()
54+
55+
main();

0 commit comments

Comments
 (0)