cdp-lib
Version:
Contains npm modules used primarily by cdp boilerplate generator.
201 lines (181 loc) • 5.42 kB
JavaScript
/* eslint-env node, es6 */
'use strict';
const path = require('path');
const fs = require('fs-extra');
const glob = require('glob');
const config = require('../project.config');
const SRC_DIR = path.join(__dirname, '..', config.dir.src);
const PKG_DIR = path.join(__dirname, '..', config.dir.pkg);
const DEV_RESOURCES = (() => {
if (config.build_settings && config.build_settings.copy_src) {
return config.build_settings.copy_src.dev_resource || [];
}
return [];
})();
function queryOptions() {
const argv = process.argv.slice(2);
let settings = {
task: 'build',
release: false,
};
if (0 < argv.length) {
Object.keys(settings).forEach((key) => {
argv.forEach((arg) => {
const option = arg.replace(/^--/, '');
const name = option.split('=')[0];
if ('task' === name) {
settings.task = option.split('=')[1] || 'build';
} else if (name === key) {
settings[key] = true;
}
});
});
}
return settings;
}
function copyFoundation() {
// templates
glob.sync(config.dir.template + '/**/*', {
cwd: SRC_DIR,
nodir: true,
})
.forEach((file) => {
const src = path.join(SRC_DIR, file);
const dst = path.join(PKG_DIR, file);
fs.copySync(src, dst);
});
// index.html
fs.copySync(path.join(SRC_DIR, 'index.html'), path.join(PKG_DIR, 'index.html'));
}
function copyResource(release) {
let ignore_resource = [];
if (release) {
DEV_RESOURCES.forEach((dir) => {
ignore_resource.push(config.dir.res + '/' + dir + '/**/*');
});
}
glob.sync(config.dir.res + '/**/*', {
cwd: SRC_DIR,
nodir: true,
ignore: ignore_resource,
})
.forEach((file) => {
const src = path.join(SRC_DIR, file);
const dst = path.join(PKG_DIR, file);
fs.copySync(src, dst);
});
}
function copyStyleSheetResource() {
// app
glob.sync(config.dir.stylesheet + '/**/*', {
cwd: SRC_DIR,
nodir: true,
ignore: [
'**/*.css',
'**/*.scss',
],
})
.forEach((file) => {
const src = path.join(SRC_DIR, file);
const dst = path.join(PKG_DIR, file);
fs.copySync(src, dst);
});
// lib
glob.sync(config.dir.lib + '/' + config.dir.stylesheet + '/**/*', {
cwd: SRC_DIR,
nodir: true,
ignore: [
'**/*.css',
'**/*.scss',
],
})
.forEach((file) => {
const src = path.join(SRC_DIR, file);
const dst = path.join(PKG_DIR, file);
fs.copySync(src, dst);
});
}
function copyExternalModules(release) {
const version_or_min_suffix_regex = /(-[0-9]+\.[0-9]+\.[A-Za-z0-9_-]+)?(\.min)?(\.[a-zA-Z]+$)/;
const hasVersionString = (src) => {
const match = src.match(version_or_min_suffix_regex);
return (match[1] !== undefined);
};
// no versioning files
glob.sync(config.dir.external + '/**/*', {
cwd: SRC_DIR,
nodir: true,
ignore: [
config.dir.external + '/' + config.dir.types + '/**/*',
'**/*.min.*',
],
})
.forEach((file) => {
if (!hasVersionString(file)) {
const src = path.join(SRC_DIR, file);
const dst = path.join(PKG_DIR, file);
fs.copySync(src, dst);
}
});
// versioned debug files
glob.sync(config.dir.external + '/**/*', {
cwd: SRC_DIR,
nodir: true,
ignore: [
config.dir.external + '/' + config.dir.types + '/**/*',
'**/*.min.*',
],
})
.forEach((file) => {
if (hasVersionString(file)) {
const src = path.join(SRC_DIR, file);
const dst = path.join(PKG_DIR, file).replace(version_or_min_suffix_regex, '$3');
fs.copySync(src, dst);
}
});
// versioned
if (release) {
glob.sync(config.dir.external + '/**/*.min.*', {
cwd: SRC_DIR,
nodir: true,
ignore: [
'**/*.map',
config.dir.external + '/' + config.dir.types + '/**/*',
],
})
.forEach((file) => {
const src = path.join(SRC_DIR, file);
const dst = path.join(PKG_DIR, file).replace(version_or_min_suffix_regex, '$3');
fs.copySync(src, dst);
});
}
}
function copyLibModuleTypes() {
const tempDir = path.join(__dirname, '..', config.dir.temp);
glob.sync(config.dir.types + '/**/*', {
cwd: tempDir,
nodir: true,
})
.forEach((file) => {
const src = path.join(tempDir, file);
const dst = path.join(PKG_DIR, config.dir.lib, config.dir.script, file);
fs.copySync(src, dst);
});
}
function main() {
const options = queryOptions();
switch (options.task) {
case 'build':
copyFoundation();
copyResource(options.release);
copyStyleSheetResource();
copyExternalModules(options.release);
break;
case 'lib-types': // for internal lib module package
copyLibModuleTypes();
break;
default:
break;
}
}
main();