UNPKG

ima-gulp-tasks

Version:

Default gulp tasks for IMA.js applications.

386 lines (364 loc) 8.89 kB
const autoprefixer = require('autoprefixer'); const coreDependencies = require('ima/build.js'); const path = require('path'); const fs = require('fs'); const sharedTasksState = require('./gulpState'); const macroTasks = require('./macroTasks.js'); function getModuleChildPath(parentModule, childModule) { const paths = [ `./node_modules/ima-gulp-tasks/${parentModule}/node_modules/${childModule}`, `./node_modules/${parentModule}/node_modules/${childModule}`, `./node_modules/${childModule}` ]; for (let modulePath of paths) { if (fs.existsSync(modulePath)) { return modulePath; } } throw Error( `Could not find path for child module ${childModule} of parent module ${parentModule}` ); } let environment; try { const environmentConfig = require(path.resolve('./app/environment.js')); const nodeEnv = process.env.NODE_ENV === 'development' || process.env.NODE_ENV === undefined ? 'dev' : process.env.NODE_ENV; environment = require('ima-helpers').resolveEnvironmentSetting( environmentConfig, nodeEnv ); } catch (error) { console.info(error.message); console.info('The default environment config will be used.'); environment = { $Server: { port: 3001 } }; } let appDependencies; try { appDependencies = require(path.resolve('.', 'app/build.js')); } catch (error) { console.info(error.message); console.info('The default application dependencies will be used.'); appDependencies = { js: [], languages: [], less: [], vendors: { common: [], server: [], client: [] }, bundle: { js: [], es: [], css: [] } }; } sharedTasksState.watchMode = process.argv.some(arg => /^dev$/.test(arg)); const isProduction = ['production', 'prod', 'test'].includes( process.env.NODE_ENV ); const vendorOptions = { debug: false, insertGlobals: false, basedir: '.', cache: {}, packageCache: {}, noParse: ['clone'] }; const esPlugins = [ '@babel/plugin-transform-react-constant-elements', '@babel/plugin-transform-react-inline-elements' ]; const baseBabelPlugins = [ '@babel/plugin-external-helpers', ['@babel/plugin-transform-react-jsx', { useBuiltIns: true }], 'babel-plugin-react-prop-types-remover' ]; let babelConfig = { esVendor: { transform: [ [ 'babelify', { babelrc: false, global: true, presets: ['@babel/preset-react'], plugins: isProduction ? [].concat(baseBabelPlugins, esPlugins) : baseBabelPlugins } ], [ 'loose-envify', { NODE_ENV: process.env.NODE_ENV || 'development' } ], ['ima-clientify'] ], plugin: sharedTasksState.watchMode ? [['watchify']] : [], options: Object.assign({}, vendorOptions) }, vendor: { transform: [ [ 'babelify', { babelrc: false, global: true, presets: [ ['@babel/preset-env', { loose: true }], '@babel/preset-react' ], plugins: baseBabelPlugins } ], [ 'loose-envify', { NODE_ENV: process.env.NODE_ENV || 'development' } ], ['ima-clientify'] ], plugin: sharedTasksState.watchMode ? [['watchify']] : [], options: Object.assign({}, vendorOptions) }, serverApp: { presets: ['@babel/preset-react'], plugins: ['@babel/plugin-transform-modules-systemjs'].concat( baseBabelPlugins ) }, esApp: { presets: [], plugins: [ '@babel/plugin-external-helpers', 'babel-plugin-react-prop-types-remover' ] }, app: { presets: [['@babel/preset-env', { loose: true }]], plugins: [ '@babel/plugin-external-helpers', 'babel-plugin-react-prop-types-remover' ] }, server: { presets: ['@babel/preset-react'], plugins: [ '@babel/plugin-transform-modules-commonjs', ['@babel/plugin-transform-react-jsx', { useBuiltIns: true }] ] } }; let $Debug = true; let legacyCompactMode = false; if (isProduction) { babelConfig.esApp.plugins = babelConfig.esApp.plugins.concat(esPlugins); $Debug = false; legacyCompactMode = true; } if ( ['dev', undefined].includes(process.env.NODE_ENV) && (process.argv.some(arg => /^--legacy-compat-mode$/.test(arg)) || Object.keys(process.env).includes('npm_config_legacy_compat_mode')) ) { legacyCompactMode = true; } exports.legacyCompactMode = legacyCompactMode; exports.babelConfig = babelConfig; exports.$Debug = $Debug; exports.uglifyCompression = { global_defs: { $Debug: $Debug }, ecma: 7, dead_code: true }; exports.liveServer = { port: undefined }; exports.vendorDependencies = { common: coreDependencies.vendors.common.concat( appDependencies.vendors.common ), server: coreDependencies.vendors.server.concat( appDependencies.vendors.server ), client: coreDependencies.vendors.client.concat( appDependencies.vendors.client ), test: coreDependencies.vendors.test.concat(appDependencies.vendors.test) }; exports.tasks = { dev: macroTasks.DEFAULT_DEV_SUBTASKS, build: macroTasks.DEFAULT_BUILD_SUBTASKS, spa: macroTasks.DEFAULT_SPA_SUBTASKS }; exports.files = { vendor: { src: { client: 'vendor.client.src.js' }, name: { server: 'vendor.server.js', esClient: 'vendor.client.es.js', client: 'vendor.client.js' }, dest: { server: './build/ima/', client: './build/static/js/', tmp: './build/ima/' }, watch: ['./app/build.js', './ima/build.js'] }, app: { name: { server: 'app.server.js', client: 'app.client.js', esClient: 'app.client.es.js' }, clearServerSide: isProduction, src: [].concat(appDependencies.js, appDependencies.mainjs), dest: { server: './build/ima/', client: './build/static/js/' }, watch: ['./app/**/*.{js,jsx}', './app/main.js', '!./app/environment.js'] }, server: { cwd: '/', src: ['./server/*.js', './server/**/*.js'], base: './server/', dest: './build/', watch: [ './server/*.js', './server/**/*.js', './app/*.js', '!./server/ima/config/*.js' ] }, less: { cwd: '/', base: './app/assets/less/', name: './app/assets/less/app.less', src: appDependencies.less, dest: './build/static/css/', watch: ['./app/**/*.less', '!./app/assets/bower/'], postCssPlugins: [autoprefixer()] }, locale: { src: appDependencies.languages, dest: { server: './build/ima/locale/', client: './build/static/js/locale/' }, watch: ['./app/**/*.json'] }, shim: { js: { name: 'shim.js', src: ['./node_modules/ima/polyfill/collectionEnumeration.js'], dest: { client: './build/static/js/' } }, es: { name: 'shim.es.js', src: [], dest: { client: './build/static/js/', server: './build/ima/' } } }, polyfill: { js: { name: 'polyfill.js', src: [ './node_modules/@babel/polyfill/dist/polyfill.min.js', './node_modules/custom-event-polyfill/polyfill.js' ], dest: { client: './build/static/js/' } }, es: { name: 'polyfill.es.js', src: [], dest: { client: './build/static/js/' } }, fetch: { name: 'fetch-polyfill.js', src: [ getModuleChildPath('@babel/polyfill', 'core-js') + '/client/shim.min.js', './node_modules/whatwg-fetch/dist/fetch.umd.js' ], dest: { client: './build/static/js/' } }, ima: { name: 'ima-polyfill.js', src: [ './node_modules/ima/polyfill/imaLoader.js', './node_modules/ima/polyfill/imaRunner.js' ], dest: { client: './build/static/js/' } } }, bundle: { js: { name: 'app.bundle.min.js', src: appDependencies.bundle.js, dest: './build/static/js/' }, es: { name: 'app.bundle.es.min.js', src: appDependencies.bundle.es, dest: './build/static/js/' }, css: { name: 'app.bundle.min.css', src: appDependencies.bundle.css, dest: './build/static/css/' }, postCssPlugins: [] } }; const defaultNotifyServer = { enable: false, jobRunTimeout: 200, server: 'localhost', port: 4445, messageJobs: { '(js|ejs|jsx)': ['vendor:build'], '(css|sass|less)': ['less:build'] } }; exports.occupiedPorts = { server: environment.$Server.port, notifyServer: defaultNotifyServer.port, livereload: exports.liveServer.port || 35729, 'fb-flo': 5888 }; exports.notifyServer = defaultNotifyServer; exports.onTerminate = () => { setTimeout(() => { process.exit(); }); };