1// Copyright (C) 2018 The Android Open Source Project 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14 15/** 16 * Configuration file for lite-server. Contains configuration for auto rerunning 17 * ninja on file change. 18 */ 19'use strict'; 20 21const { spawn } = require('child_process'); 22const path = require('path'); 23 24// Print without added new line. 25const print = data => process.stdout.write(data); 26const printErr = data => process.stderr.write(data); 27 28const ninjaOutDir = process.env.OUT_DIR; 29const uiOutDir = path.join(ninjaOutDir, 'ui'); 30const perfettoRoot = process.env.ROOT_DIR; 31const ninjaPath = path.join(perfettoRoot, 'tools', 'ninja'); 32let ninjaRunning = false; 33 34function rebasePath(relative_path) { 35 return path.join(perfettoRoot, relative_path); 36} 37 38module.exports = function(bs) { 39 return { 40 files: [ 41 { 42 match: [ 43 "ui/**", 44 "src/trace_processor/**", 45 "protos/**", 46 ].map(rebasePath), 47 fn: function(event, file) { 48 console.log(`Change detected on ${file}`); 49 if (ninjaRunning) { 50 console.log("Already have a ninja build running. Doing nothing."); 51 return; 52 } 53 54 ninjaRunning = true; 55 56 console.log(`Executing: ninja -C ${ninjaOutDir} ui`); 57 const ninja = spawn(ninjaPath, ['-C', ninjaOutDir, 'ui']); 58 ninja.stdout.on('data', data => print(data.toString())); 59 ninja.stderr.on('data', data => printErr(data.toString())); 60 61 // We can be smarter and load just the file we need. Need to 62 // resolve to the dist/location of the file in that case. 63 // For now, we're reloading the whole page. 64 ninja.on('exit', () => { 65 ninjaRunning = false; 66 bs.reload(); 67 }); 68 }, 69 options: { 70 ignored: [ 71 "ui/dist/", 72 "ui/.git/", 73 "ui/node_modules/", 74 ].map(rebasePath), 75 ignoreInitial: true, 76 } 77 } 78 ], 79 server: { 80 baseDir: uiOutDir, 81 }, 82 }; 83}; 84