2017-02-03 11:39:31 +03:00
'use strict' ;
2021-02-04 00:06:15 -07:00
const path = require ( 'path' ) ;
const fs = require ( 'fs' ) ;
const assert = require ( 'assert' ) ;
const mkdirp = require ( 'mkdirp' ) ;
const rimraf = require ( 'rimraf' ) ;
const async = require ( 'async' ) ;
2017-02-03 11:39:31 +03:00
2021-02-04 00:06:15 -07:00
const db = require ( './mocks/databasemock' ) ;
const file = require ( '../src/file' ) ;
2017-02-03 11:39:31 +03:00
2021-02-04 00:01:39 -07:00
describe ( 'minifier' , ( ) => {
before ( async ( ) => {
2020-01-31 14:10:00 -05:00
await mkdirp ( path . join ( _ _dirname , '../build/test' ) ) ;
2017-05-18 01:32:20 -06:00
} ) ;
2021-02-04 00:06:15 -07:00
const minifier = require ( '../src/meta/minifier' ) ;
const scripts = [
2017-05-21 18:20:01 -06:00
path . resolve ( _ _dirname , './files/1.js' ) ,
path . resolve ( _ _dirname , './files/2.js' ) ,
2021-02-04 00:01:39 -07:00
] . map ( script => ( {
srcPath : script ,
destPath : path . resolve ( _ _dirname , '../build/test' , path . basename ( script ) ) ,
filename : path . basename ( script ) ,
} ) ) ;
2017-05-25 01:33:04 -06:00
2021-02-04 00:01:39 -07:00
it ( '.js.bundle() should concat scripts' , ( done ) => {
2021-02-04 00:06:15 -07:00
const destPath = path . resolve ( _ _dirname , '../build/test/concatenated.js' ) ;
2017-05-25 01:33:04 -06:00
minifier . js . bundle ( {
files : scripts ,
destPath : destPath ,
filename : 'concatenated.js' ,
2021-02-04 00:01:39 -07:00
} , false , false , ( err ) => {
2017-02-03 11:39:31 +03:00
assert . ifError ( err ) ;
2017-05-25 01:33:04 -06:00
assert ( file . existsSync ( destPath ) ) ;
2017-05-21 18:20:01 -06:00
assert . strictEqual (
2017-05-26 12:51:05 -06:00
fs . readFileSync ( destPath ) . toString ( ) . replace ( /\r\n/g , '\n' ) ,
2018-11-28 20:29:43 -07:00
'(function (window, document) {' +
'\n\twindow.doStuff = function () {' +
'\n\t\tdocument.body.innerHTML = \'Stuff has been done\';' +
'\n\t};' +
'\n})(window, document);' +
'\n' +
'\n;function foo(name, age) {' +
'\n\treturn \'The person known as "\' + name + \'" is \' + age + \' years old\';' +
'\n}' +
'\n'
2017-05-21 18:20:01 -06:00
) ;
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( '.js.bundle() should minify scripts' , ( done ) => {
2021-02-04 00:06:15 -07:00
const destPath = path . resolve ( _ _dirname , '../build/test/minified.js' ) ;
2017-05-25 01:33:04 -06:00
minifier . js . bundle ( {
files : scripts ,
destPath : destPath ,
filename : 'minified.js' ,
2021-02-04 00:01:39 -07:00
} , true , false , ( err ) => {
2017-05-21 18:20:01 -06:00
assert . ifError ( err ) ;
2017-05-25 01:33:04 -06:00
assert ( file . existsSync ( destPath ) ) ;
2017-05-21 18:20:01 -06:00
assert . strictEqual (
2017-05-25 01:33:04 -06:00
fs . readFileSync ( destPath ) . toString ( ) ,
2018-11-28 20:29:43 -07:00
'(function(n,o){n.doStuff=function(){o.body.innerHTML="Stuff has been done"}})(window,document);function foo(n,o){return\'The person known as "\'+n+\'" is \'+o+" years old"}' +
'\n//# sourceMappingURL=minified.js.map'
2017-05-21 18:20:01 -06:00
) ;
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( '.js.minifyBatch() should minify each script' , ( done ) => {
minifier . js . minifyBatch ( scripts , false , ( err ) => {
2017-05-21 18:20:01 -06:00
assert . ifError ( err ) ;
2017-05-25 01:33:04 -06:00
assert ( file . existsSync ( scripts [ 0 ] . destPath ) ) ;
assert ( file . existsSync ( scripts [ 1 ] . destPath ) ) ;
2017-05-21 18:20:01 -06:00
2021-02-04 00:01:39 -07:00
fs . readFile ( scripts [ 0 ] . destPath , ( err , buffer ) => {
2017-05-21 18:20:01 -06:00
assert . ifError ( err ) ;
assert . strictEqual (
buffer . toString ( ) ,
2018-11-28 20:29:43 -07:00
'(function(n,o){n.doStuff=function(){o.body.innerHTML="Stuff has been done"}})(window,document);' +
'\n//# sourceMappingURL=1.js.map'
2017-05-21 18:20:01 -06:00
) ;
done ( ) ;
} ) ;
} ) ;
} ) ;
2021-02-04 00:06:15 -07:00
const styles = [
2017-05-21 18:20:01 -06:00
'@import (inline) "./1.css";' ,
'@import "./2.less";' ,
] . join ( '\n' ) ;
2021-02-04 00:06:15 -07:00
const paths = [
2017-05-21 18:20:01 -06:00
path . resolve ( _ _dirname , './files' ) ,
] ;
2021-02-04 00:01:39 -07:00
it ( '.css.bundle() should concat styles' , ( done ) => {
minifier . css . bundle ( styles , paths , false , false , ( err , bundle ) => {
2017-05-21 18:20:01 -06:00
assert . ifError ( err ) ;
assert . strictEqual ( bundle . code , '.help { margin: 10px; } .yellow { background: yellow; }\n.help {\n display: block;\n}\n.help .blue {\n background: blue;\n}\n' ) ;
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( '.css.bundle() should minify styles' , ( done ) => {
minifier . css . bundle ( styles , paths , true , false , ( err , bundle ) => {
2017-05-21 18:20:01 -06:00
assert . ifError ( err ) ;
2017-10-01 16:19:10 -06:00
assert . strictEqual ( bundle . code , '.help{margin:10px}.yellow{background:#ff0}.help{display:block}.help .blue{background:#00f}' ) ;
2017-05-21 18:20:01 -06:00
done ( ) ;
} ) ;
} ) ;
} ) ;
2017-02-03 11:39:31 +03:00
2021-02-04 00:01:39 -07:00
describe ( 'Build' , ( done ) => {
2021-02-04 00:06:15 -07:00
const build = require ( '../src/meta/build' ) ;
2017-05-21 19:01:41 -06:00
2021-02-04 00:01:39 -07:00
before ( ( done ) => {
2017-05-26 17:16:59 -06:00
async . parallel ( [
2017-05-23 18:00:52 -06:00
async . apply ( rimraf , path . join ( _ _dirname , '../build/public' ) ) ,
2019-10-05 17:05:52 -04:00
async . apply ( db . sortedSetAdd , 'plugins:active' , Date . now ( ) , 'nodebb-plugin-markdown' ) ,
2017-05-23 18:00:52 -06:00
] , done ) ;
2017-05-21 19:01:41 -06:00
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should build plugin static dirs' , ( done ) => {
build . build ( [ 'plugin static dirs' ] , ( err ) => {
2017-05-21 19:01:41 -06:00
assert . ifError ( err ) ;
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should build requirejs modules' , ( done ) => {
build . build ( [ 'requirejs modules' ] , ( err ) => {
2017-05-21 19:01:41 -06:00
assert . ifError ( err ) ;
2021-02-04 00:06:15 -07:00
const filename = path . join ( _ _dirname , '../build/public/src/modules/Chart.js' ) ;
2017-05-21 19:01:41 -06:00
assert ( file . existsSync ( filename ) ) ;
assert ( fs . readFileSync ( filename ) . toString ( ) . startsWith ( '/*!\n * Chart.js' ) ) ;
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should build client js bundle' , ( done ) => {
build . build ( [ 'client js bundle' ] , ( err ) => {
2017-05-21 19:01:41 -06:00
assert . ifError ( err ) ;
2021-02-04 00:06:15 -07:00
const filename = path . join ( _ _dirname , '../build/public/nodebb.min.js' ) ;
2017-05-21 19:01:41 -06:00
assert ( file . existsSync ( filename ) ) ;
assert ( fs . readFileSync ( filename ) . length > 1000 ) ;
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should build admin js bundle' , ( done ) => {
build . build ( [ 'admin js bundle' ] , ( err ) => {
2017-05-21 19:01:41 -06:00
assert . ifError ( err ) ;
2021-02-04 00:06:15 -07:00
const filename = path . join ( _ _dirname , '../build/public/acp.min.js' ) ;
2017-05-21 19:01:41 -06:00
assert ( file . existsSync ( filename ) ) ;
assert ( fs . readFileSync ( filename ) . length > 1000 ) ;
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should build client side styles' , ( done ) => {
build . build ( [ 'client side styles' ] , ( err ) => {
2017-05-21 19:01:41 -06:00
assert . ifError ( err ) ;
2021-02-04 00:06:15 -07:00
const filename = path . join ( _ _dirname , '../build/public/client.css' ) ;
2017-05-21 19:01:41 -06:00
assert ( file . existsSync ( filename ) ) ;
assert ( fs . readFileSync ( filename ) . toString ( ) . startsWith ( '/*! normalize.css' ) ) ;
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should build admin control panel styles' , ( done ) => {
build . build ( [ 'admin control panel styles' ] , ( err ) => {
2017-05-21 19:01:41 -06:00
assert . ifError ( err ) ;
2021-02-04 00:06:15 -07:00
const filename = path . join ( _ _dirname , '../build/public/admin.css' ) ;
2017-05-21 19:01:41 -06:00
assert ( file . existsSync ( filename ) ) ;
2021-02-04 00:06:15 -07:00
const adminCSS = fs . readFileSync ( filename ) . toString ( ) ;
2019-08-28 11:22:39 -04:00
if ( global . env === 'production' ) {
assert ( adminCSS . startsWith ( '@charset "UTF-8";' ) || adminCSS . startsWith ( '@import url' ) ) ;
} else {
assert ( adminCSS . startsWith ( '.recent-replies' ) ) ;
}
2017-05-21 19:01:41 -06:00
done ( ) ;
} ) ;
} ) ;
it ( 'should build templates' , function ( done ) {
2018-10-05 14:24:51 -04:00
this . timeout ( 0 ) ;
2021-02-04 00:01:39 -07:00
build . build ( [ 'templates' ] , ( err ) => {
2017-05-21 19:01:41 -06:00
assert . ifError ( err ) ;
2021-02-04 00:06:15 -07:00
const filename = path . join ( _ _dirname , '../build/public/templates/admin/header.tpl' ) ;
2017-05-21 19:01:41 -06:00
assert ( file . existsSync ( filename ) ) ;
assert ( fs . readFileSync ( filename ) . toString ( ) . startsWith ( '<!DOCTYPE html>' ) ) ;
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should build languages' , ( done ) => {
build . build ( [ 'languages' ] , ( err ) => {
2017-05-21 19:01:41 -06:00
assert . ifError ( err ) ;
2017-05-23 21:55:23 -06:00
2021-02-04 00:06:15 -07:00
const globalFile = path . join ( _ _dirname , '../build/public/language/en-GB/global.json' ) ;
2017-05-24 17:19:04 -06:00
assert ( file . existsSync ( globalFile ) , 'global.json exists' ) ;
2021-02-04 00:06:15 -07:00
const global = fs . readFileSync ( globalFile ) . toString ( ) ;
2017-05-24 17:19:04 -06:00
assert . strictEqual ( JSON . parse ( global ) . home , 'Home' , 'global.json contains correct translations' ) ;
2017-05-23 21:55:23 -06:00
2021-02-04 00:06:15 -07:00
const mdFile = path . join ( _ _dirname , '../build/public/language/en-GB/markdown.json' ) ;
2017-05-24 17:19:04 -06:00
assert ( file . existsSync ( mdFile ) , 'markdown.json exists' ) ;
2021-02-04 00:06:15 -07:00
const md = fs . readFileSync ( mdFile ) . toString ( ) ;
2017-05-24 17:19:04 -06:00
assert . strictEqual ( JSON . parse ( md ) . bold , 'bolded text' , 'markdown.json contains correct translations' ) ;
2017-05-23 21:55:23 -06:00
2017-05-21 19:01:41 -06:00
done ( ) ;
} ) ;
} ) ;
2017-02-03 11:39:31 +03:00
} ) ;