Files
vanillajs-seed/node_modules/pnotify/make.js
2019-04-12 20:01:07 +02:00

265 lines
7.0 KiB
JavaScript

#!/user/bin/env nodejs
'use strict';
/* eslint-env shelljs */
const fs = require('fs');
require('shelljs/make');
let pnotifySrc = {
// Main code.
'core': 'PNotify.html',
'animate': 'PNotifyAnimate.html',
'buttons': 'PNotifyButtons.html',
'callbacks': 'PNotifyCallbacks.html',
'nonblock': 'PNotifyNonBlock.html',
'mobile': 'PNotifyMobile.html',
'history': 'PNotifyHistory.html',
'desktop': 'PNotifyDesktop.html',
'confirm': 'PNotifyConfirm.html',
// Compat module.
'compat': 'PNotifyCompat.js',
// Styles.
'stylematerial': 'PNotifyStyleMaterial.html',
// Reference module.
'reference': 'PNotifyReference.html'
};
let pnotifyJs = {
// Main code.
'core': 'PNotify.js',
'animate': 'PNotifyAnimate.js',
'buttons': 'PNotifyButtons.js',
'callbacks': 'PNotifyCallbacks.js',
'nonblock': 'PNotifyNonBlock.js',
'mobile': 'PNotifyMobile.js',
'history': 'PNotifyHistory.js',
'desktop': 'PNotifyDesktop.js',
'confirm': 'PNotifyConfirm.js',
// Compat module.
'compat': 'PNotifyCompat.js',
// Styles.
'stylematerial': 'PNotifyStyleMaterial.js',
// Reference module.
'reference': 'PNotifyReference.js'
};
let pnotifyCss = {
'brighttheme': 'PNotifyBrightTheme.css'
};
for (let module in pnotifySrc) {
target[module + '_lib'] = (args) => compileJs(module, pnotifySrc[module], args);
((target) => {
const existing = target[module];
target[module] = (args) => {
existing && existing(args);
target[module + '_lib'](args);
};
})(target);
}
for (let module in pnotifyJs) {
target[module + '_js'] = (args) => compressJs(module, pnotifyJs[module], args);
((target) => {
const existing = target[module];
target[module] = (args) => {
existing && existing(args);
target[module + '_js'](args);
};
})(target);
}
for (let module in pnotifyCss) {
target[module + '_css'] = () => compressCss(module, pnotifyCss[module]);
((target) => {
const existing = target[module];
target[module] = (args) => {
existing && existing(args);
target[module + '_css'](args);
};
})(target);
}
target.dist = (args) => {
for (let module in pnotifySrc) {
target[module + '_lib'](args);
}
for (let module in pnotifyJs) {
target[module + '_js'](args);
}
for (let module in pnotifyCss) {
target[module + '_css'](args);
}
};
// Functions
let compileJs = (module, filename, args) => {
let format = setup(args);
const srcFilename = 'src/' + filename;
const dstFilename = 'lib/' + format + '/' + filename.replace(/\.html$/, '.js');
console.log('Compiling JavaScript ' + module + ' from ' + srcFilename + ' to ' + dstFilename);
console.log('Generating source map for ' + dstFilename + ' in ' + dstFilename + '.map');
// Gather code.
let code;
let map;
let inputCode;
let inputMap;
let isSvelte = filename.slice(-4) === 'html';
inputCode = code = fs.readFileSync(srcFilename, 'utf8');
inputMap = map = null;
// Pre-compile transforms.
if (module === 'compat' && format === 'iife') {
inputCode = code = code.replace(/import PNotify(\w*) from ["']\.\/PNotify(\w*)\.html["'];/g, 'var PNotify$1 = window.PNotify$2;');
inputCode = code = code.replace(/export default PNotifyCompat;/g, 'window.PNotifyCompat = PNotifyCompat;');
}
// Compile.
if (isSvelte) {
// Use Svelte to compile the code first.
const svelte = require('svelte');
const { js } = svelte.compile(code, {
format: format,
filename: srcFilename,
name: filename.replace(/\.html$/, ''),
amd: {
id: filename.replace(/\.html$/, '')
},
globals: {
'./PNotify.html': 'PNotify'
},
onerror: err => {
console.error(err);
},
onwarn: warning => {
console.warn(warning);
},
css: true,
cascade: false
});
({ code, map } = js);
[inputCode, inputMap] = [code, map];
inputMap.file = filename.replace(/\.html$/, '.js');
inputCode += '\n//# sourceMappingURL=' + filename.replace(/\.html$/, '.js') + '.map';
}
if (format !== 'es') {
const babel = require('babel-core');
const babelOptions = {
moduleId: filename.replace(/\.(html|js)$/, ''),
filename: filename.replace(/\.html$/, '.js'),
filenameRelative: srcFilename,
sourceMapTarget: srcFilename,
moduleRoot: '',
sourceMaps: 'both',
sourceRoot: '../',
plugins: [
'transform-object-assign'
],
sourceType: (format !== 'es' && isSvelte) ? 'script' : 'module'
};
if (inputMap) {
babelOptions.inputSourceMap = inputMap;
}
if (format === 'umd' && !isSvelte) {
babelOptions.passPerPreset = true;
babelOptions.presets = [
['env', {
modules: 'umd'
}],
'stage-3'
];
babelOptions.plugins.push('add-module-exports');
} else {
babelOptions.presets = [
['env', {
modules: false
}],
'stage-3'
];
}
({ code, map } = babel.transform(inputCode, babelOptions));
}
// Post-compile transforms.
if (format === 'es') {
code = code.replace(/import PNotify(\w*) from ["']\.\/PNotify(\w*)\.html["'];/g, 'import PNotify$1 from "./PNotify$2.js";');
}
if (format === 'umd') {
code = code.replace(/require\(["']\.\/PNotify(\w*)?\.html["']\)/g, 'require(\'./PNotify$1\')');
code = code.replace(/, ["']\.\/PNotify(\w*)?\.html["']/g, ', \'./PNotify$1\'');
}
fs.writeFileSync(dstFilename, code);
if (map) {
fs.writeFileSync(dstFilename + '.map', JSON.stringify(map));
}
};
let compressJs = (module, filename, args) => {
let format = setup(args);
const srcFilename = 'lib/' + format + '/' + filename;
const dstFilename = 'dist/' + format + '/' + filename;
console.log('Compressing JavaScript ' + module + ' from ' + srcFilename + ' to ' + dstFilename);
console.log('Generating source map for ' + dstFilename + ' in ' + dstFilename + '.map');
const UglifyJS = format === 'es' ? require('uglify-es') : require('uglify-js');
const options = {
sourceMap: {
root: '../',
filename: filename,
url: filename + '.map'
}
};
const { code, map, error } = UglifyJS.minify({
[filename]: fs.readFileSync(srcFilename, 'utf8')
}, options);
if (!code) {
console.log('error:', error);
}
fs.writeFileSync(dstFilename, code);
if (map) {
fs.writeFileSync(dstFilename + '.map', map);
}
};
let compressCss = (module, filename) => {
setup();
const srcFilename = 'src/' + filename;
const dstFilename = 'dist/' + filename;
console.log('Compressing CSS ' + module + ' from ' + srcFilename + ' to ' + dstFilename);
const CleanCSS = require('clean-css');
const options = {
rebase: false
};
fs.writeFileSync(dstFilename, (new CleanCSS(options).minify(fs.readFileSync(srcFilename, 'utf8'))).styles);
};
let setup = (args) => {
let format = 'iife';
(args || []).filter(arg => arg.match(/^--format=/)).map(arg => (format = arg.slice(9)));
cd(__dirname);
mkdir('-p', 'lib/' + (args ? format : ''));
mkdir('-p', 'dist/' + (args ? format : ''));
return format;
};