mirror of
				https://github.com/NodeBB/NodeBB.git
				synced 2025-10-31 02:55:58 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			204 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			204 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| 
 | |
| const path = require('path');
 | |
| const nconf = require('nconf');
 | |
| nconf.argv().env({
 | |
| 	separator: '__',
 | |
| });
 | |
| const winston = require('winston');
 | |
| const fork = require('child_process').fork;
 | |
| const env = process.env;
 | |
| var worker;
 | |
| 
 | |
| env.NODE_ENV = env.NODE_ENV || 'development';
 | |
| 
 | |
| const configFile = path.resolve(__dirname, nconf.any(['config', 'CONFIG']) || 'config.json');
 | |
| const prestart = require('./src/prestart');
 | |
| prestart.loadConfig(configFile);
 | |
| 
 | |
| var db = require('./src/database');
 | |
| 
 | |
| module.exports = function (grunt) {
 | |
| 	var args = [];
 | |
| 
 | |
| 	if (!grunt.option('verbose')) {
 | |
| 		args.push('--log-level=info');
 | |
| 		nconf.set('log-level', 'info');
 | |
| 	}
 | |
| 	prestart.setupWinston();
 | |
| 
 | |
| 	grunt.initConfig({
 | |
| 		watch: {},
 | |
| 	});
 | |
| 
 | |
| 	grunt.loadNpmTasks('grunt-contrib-watch');
 | |
| 
 | |
| 	grunt.registerTask('default', ['watch']);
 | |
| 
 | |
| 	grunt.registerTask('init', async function () {
 | |
| 		var done = this.async();
 | |
| 		let plugins = [];
 | |
| 		if (!process.argv.includes('--core')) {
 | |
| 			await db.init();
 | |
| 			plugins = await db.getSortedSetRange('plugins:active', 0, -1);
 | |
| 			addBaseThemes(plugins);
 | |
| 			if (!plugins.includes('nodebb-plugin-composer-default')) {
 | |
| 				plugins.push('nodebb-plugin-composer-default');
 | |
| 			}
 | |
| 			if (!plugins.includes('nodebb-theme-persona')) {
 | |
| 				plugins.push('nodebb-theme-persona');
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		const styleUpdated_Client = plugins.map(p => 'node_modules/' + p + '/*.less')
 | |
| 			.concat(plugins.map(p => 'node_modules/' + p + '/*.css'))
 | |
| 			.concat(plugins.map(p => 'node_modules/' + p + '/+(public|static|less)/**/*.less'))
 | |
| 			.concat(plugins.map(p => 'node_modules/' + p + '/+(public|static)/**/*.css'));
 | |
| 
 | |
| 		const styleUpdated_Admin = plugins.map(p => 'node_modules/' + p + '/*.less')
 | |
| 			.concat(plugins.map(p => 'node_modules/' + p + '/*.css'))
 | |
| 			.concat(plugins.map(p => 'node_modules/' + p + '/+(public|static|less)/**/*.less'))
 | |
| 			.concat(plugins.map(p => 'node_modules/' + p + '/+(public|static)/**/*.css'));
 | |
| 
 | |
| 		const clientUpdated = plugins.map(p => 'node_modules/' + p + '/+(public|static)/**/*.js');
 | |
| 		const serverUpdated = plugins.map(p => 'node_modules/' + p + '/*.js')
 | |
| 			.concat(plugins.map(p => 'node_modules/' + p + '/+(lib|src)/**/*.js'));
 | |
| 
 | |
| 		const templatesUpdated = plugins.map(p => 'node_modules/' + p + '/+(public|static|templates)/**/*.tpl');
 | |
| 		const langUpdated = plugins.map(p => 'node_modules/' + p + '/+(public|static|languages)/**/*.json');
 | |
| 
 | |
| 		grunt.config(['watch'], {
 | |
| 			styleUpdated_Client: {
 | |
| 				files: [
 | |
| 					'public/less/**/*.less',
 | |
| 					...styleUpdated_Client,
 | |
| 				],
 | |
| 				options: {
 | |
| 					interval: 1000,
 | |
| 				},
 | |
| 			},
 | |
| 			styleUpdated_Admin: {
 | |
| 				files: [
 | |
| 					'public/less/**/*.less',
 | |
| 					...styleUpdated_Admin,
 | |
| 				],
 | |
| 				options: {
 | |
| 					interval: 1000,
 | |
| 				},
 | |
| 			},
 | |
| 			clientUpdated: {
 | |
| 				files: [
 | |
| 					'public/src/**/*.js',
 | |
| 					...clientUpdated,
 | |
| 					'node_modules/benchpressjs/build/benchpress.js',
 | |
| 				],
 | |
| 				options: {
 | |
| 					interval: 1000,
 | |
| 				},
 | |
| 			},
 | |
| 			serverUpdated: {
 | |
| 				files: [
 | |
| 					'app.js',
 | |
| 					'install/*.js',
 | |
| 					'src/**/*.js',
 | |
| 					'public/src/modules/translator.js',
 | |
| 					'public/src/modules/helpers.js',
 | |
| 					'public/src/utils.js',
 | |
| 					serverUpdated,
 | |
| 					'!src/upgrades/**',
 | |
| 				],
 | |
| 				options: {
 | |
| 					interval: 1000,
 | |
| 				},
 | |
| 			},
 | |
| 			templatesUpdated: {
 | |
| 				files: [
 | |
| 					'src/views/**/*.tpl',
 | |
| 					...templatesUpdated,
 | |
| 				],
 | |
| 				options: {
 | |
| 					interval: 1000,
 | |
| 				},
 | |
| 			},
 | |
| 			langUpdated: {
 | |
| 				files: [
 | |
| 					'public/language/en-GB/*.json',
 | |
| 					'public/language/en-GB/**/*.json',
 | |
| 					...langUpdated,
 | |
| 				],
 | |
| 				options: {
 | |
| 					interval: 1000,
 | |
| 				},
 | |
| 			},
 | |
| 		});
 | |
| 		const build = require('./src/meta/build');
 | |
| 		if (!grunt.option('skip')) {
 | |
| 			await build.build(true);
 | |
| 		}
 | |
| 		run();
 | |
| 		done();
 | |
| 	});
 | |
| 
 | |
| 	function run() {
 | |
| 		if (worker) {
 | |
| 			worker.kill();
 | |
| 		}
 | |
| 		worker = fork('app.js', args, {
 | |
| 			env: env,
 | |
| 		});
 | |
| 	}
 | |
| 
 | |
| 	grunt.task.run('init');
 | |
| 
 | |
| 	grunt.event.removeAllListeners('watch');
 | |
| 	grunt.event.on('watch', function update(action, filepath, target) {
 | |
| 		var compiling;
 | |
| 		if (target === 'styleUpdated_Client') {
 | |
| 			compiling = 'clientCSS';
 | |
| 		} else if (target === 'styleUpdated_Admin') {
 | |
| 			compiling = 'acpCSS';
 | |
| 		} else if (target === 'clientUpdated') {
 | |
| 			compiling = 'js';
 | |
| 		} else if (target === 'templatesUpdated') {
 | |
| 			compiling = 'tpl';
 | |
| 		} else if (target === 'langUpdated') {
 | |
| 			compiling = 'lang';
 | |
| 		} else if (target === 'serverUpdated') {
 | |
| 			// empty require cache
 | |
| 			const paths = ['./src/meta/build.js', './src/meta/index.js'];
 | |
| 			paths.forEach(p => delete require.cache[require.resolve(p)]);
 | |
| 			return run();
 | |
| 		}
 | |
| 
 | |
| 		require('./src/meta/build').build([compiling], function (err) {
 | |
| 			if (err) {
 | |
| 				winston.error(err.stack);
 | |
| 			}
 | |
| 			if (worker) {
 | |
| 				worker.send({ compiling: compiling });
 | |
| 			}
 | |
| 		});
 | |
| 	});
 | |
| };
 | |
| 
 | |
| function addBaseThemes(plugins) {
 | |
| 	let themeId = plugins.find(p => p.includes('nodebb-theme-'));
 | |
| 	if (!themeId) {
 | |
| 		return plugins;
 | |
| 	}
 | |
| 	let baseTheme;
 | |
| 	do {
 | |
| 		try {
 | |
| 			baseTheme = require(themeId + '/theme').baseTheme;
 | |
| 		} catch (err) {
 | |
| 			console.log(err);
 | |
| 		}
 | |
| 
 | |
| 		if (baseTheme) {
 | |
| 			plugins.push(baseTheme);
 | |
| 			themeId = baseTheme;
 | |
| 		}
 | |
| 	} while (baseTheme);
 | |
| 	return plugins;
 | |
| }
 |