ide/deploy/watch.js (55 lines of code) (raw):

// Licensed to the Apache Software Foundation (ASF) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The ASF licenses this file // to you under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. const SKIPDIR = ["virtualenv", "node_modules", "__pycache__"]; import {watch} from 'chokidar'; import {resolve} from 'path'; import {deploy} from './deploy.js'; import {logs, serve} from './client.js'; import process from 'process'; /** * This function will return true when the file should * be ignored by fs watcher or the deployer * @param path * @returns {*|boolean} */ export function shouldIgnoreFile(path) { return path.endsWith('.zip') || /\.tmp\d*$/.test(path); } /** * This function will receive fs watcher events and * decide if the file should be deployed * * @param changeType * @param path */ export function checkAndDeploy(changeType, path) { path = resolve(path); if (shouldIgnoreFile(path)) return; const curDirLen = process.cwd().length + 1; const src = path.slice(curDirLen); if (changeType !== 'change') return; if (src.endsWith('/')) return; if (!src) return; for (const dir of src.split('/').slice(0, -1)) { if (SKIPDIR.includes(dir)) return; } // this should not even happen if (shouldIgnoreFile(src)) return; deploy(src); } /** * Called by `watchAndDeploy`, this function will install * a filesystem watcher on packages dir and catch every * event and send them to `checkAndDeploy` * @returns {Promise<unknown>} */ async function redeploy() { console.log("> Watching:"); const watcher = watch('packages', { persistent: true, ignoreInitial: true, recursive: true, //awaitWriteFinish: true, atomic: 250, ignored: (file) => shouldIgnoreFile(file), }); watcher.on('all', (event, path) => { try { checkAndDeploy(event, path); } catch (error) { console.error(error); } }); return new Promise((resolve, reject) => { watcher.on('error', reject); process.on('SIGTERM', () => { console.log("Ending task."); watcher.close(); resolve(); }); }); } /** * This function is the entry point and is called when * the program is started with the watch flag on */ export function watchAndDeploy() { serve(); logs(); redeploy().catch((error) => { console.error("Watcher failed:", error); }); }