UNPKG

@git.zone/tswatch

Version:

A development tool for automatically watching and re-compiling TypeScript projects upon detecting file changes, enhancing developer workflows.

182 lines 16.7 kB
import * as plugins from './tswatch.plugins.js'; import * as paths from './tswatch.paths.js'; import * as interfaces from './interfaces/index.js'; import { Watcher } from './tswatch.classes.watcher.js'; import { logger } from './tswatch.logging.js'; export class TsWatch { constructor(watchmodeArg) { this.watcherMap = new plugins.lik.ObjectMap(); this.watchmode = watchmodeArg; } /** * starts the TsWatch instance */ async start() { const tsbundle = new plugins.tsbundle.TsBundle(); const assetsHandler = new plugins.tsbundle.AssetsHandler(); const htmlHandler = new plugins.tsbundle.HtmlHandler(); switch (this.watchmode) { case 'test': /** * this strategy runs test whenever there is a change in the ts directory */ this.watcherMap.add(new Watcher({ filePathToWatch: paths.cwd, commandToExecute: 'npm run test2', timeout: null, })); break; case 'node': this.watcherMap.add(new Watcher({ filePathToWatch: paths.cwd, commandToExecute: 'npm run test', timeout: null, })); break; case 'element': await (async () => { /** * this strategy runs a standard server and bundles the ts files to a dist_watch directory */ // lets create a standard server logger.log('info', 'bundling TypeScript files to "dist_watch" Note: This is for development only!'); this.typedserver = new plugins.typedserver.TypedServer({ cors: true, injectReload: true, serveDir: plugins.path.join(paths.cwd, './dist_watch/'), port: 3002, enableCompression: true, preferredCompressionMethod: 'gzip', }); const bundleAndReloadElement = async () => { await tsbundle.build(paths.cwd, './html/index.ts', './dist_watch/bundle.js', { bundler: 'esbuild', }); await this.typedserver.reload(); }; this.watcherMap.add(new Watcher({ filePathToWatch: plugins.path.join(paths.cwd, './ts_web/'), functionToCall: async () => { await bundleAndReloadElement(); }, timeout: null, })); // lets get the other ts folders let tsfolders = await plugins.smartfile.fs.listFolders(paths.cwd); tsfolders = tsfolders.filter((itemArg) => itemArg.startsWith('ts') && itemArg !== 'ts_web'); const smartshellInstance = new plugins.smartshell.Smartshell({ executor: 'bash', }); for (const tsfolder of tsfolders) { logger.log('info', `creating watcher for folder ${tsfolder}`); this.watcherMap.add(new Watcher({ filePathToWatch: plugins.path.join(paths.cwd, `./${tsfolder}/`), functionToCall: async () => { logger.log('info', `building ${tsfolder}`); await smartshellInstance.exec(`(cd ${paths.cwd} && npm run build)`); await bundleAndReloadElement(); }, timeout: null, })); } this.watcherMap.add(new Watcher({ filePathToWatch: plugins.path.join(paths.cwd, './html/'), functionToCall: async () => { await htmlHandler.processHtml({ from: plugins.path.join(paths.cwd, './html/index.html'), to: plugins.path.join(paths.cwd, './dist_watch/index.html'), minify: false, }); await bundleAndReloadElement(); }, timeout: null, })); })(); break; case 'website': await (async () => { const websiteExecution = new plugins.smartshell.SmartExecution('npm run startTs'); const bundleAndReloadWebsite = async () => { await tsbundle.build(paths.cwd, './ts_web/index.ts', './dist_serve/bundle.js', { bundler: 'esbuild', }); }; let tsfolders = await plugins.smartfile.fs.listFolders(paths.cwd); tsfolders = tsfolders.filter((itemArg) => itemArg.startsWith('ts') && itemArg !== 'ts_web'); for (const tsfolder of tsfolders) { this.watcherMap.add(new Watcher({ filePathToWatch: plugins.path.join(paths.cwd, `./${tsfolder}/`), functionToCall: async () => { await websiteExecution.restart(); await bundleAndReloadWebsite(); }, timeout: null, })); } this.watcherMap.add(new Watcher({ filePathToWatch: plugins.path.join(paths.cwd, './ts_web/'), functionToCall: async () => { await bundleAndReloadWebsite(); }, timeout: null, })); this.watcherMap.add(new Watcher({ filePathToWatch: plugins.path.join(paths.cwd, './html/'), functionToCall: async () => { await htmlHandler.processHtml({ from: plugins.path.join(paths.cwd, './html/index.html'), to: plugins.path.join(paths.cwd, './dist_serve/index.html'), minify: false, }); await bundleAndReloadWebsite(); }, timeout: null, })); this.watcherMap.add(new Watcher({ filePathToWatch: plugins.path.join(paths.cwd, './assets/'), functionToCall: async () => { await assetsHandler.processAssets(); await bundleAndReloadWebsite(); }, timeout: null, })); })(); break; case 'service': this.watcherMap.add(new Watcher({ filePathToWatch: plugins.path.join(paths.cwd, './ts/'), commandToExecute: 'npm run startTs', timeout: null, })); break; case 'echo': const tsWatchInstanceEchoSomething = new Watcher({ filePathToWatch: plugins.path.join(paths.cwd, './ts'), commandToExecute: 'npm -v', timeout: null, }); this.watcherMap.add(tsWatchInstanceEchoSomething); break; default: break; } this.watcherMap.forEach(async (watcher) => { await watcher.start(); }); if (this.typedserver) { await this.typedserver.start(); } } /** * stops the execution of any active Watchers */ async stop() { if (this.typedserver) { await this.typedserver.stop(); } this.watcherMap.forEach(async (watcher) => { await watcher.stop(); }); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHN3YXRjaC5jbGFzc2VzLnRzd2F0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy90c3dhdGNoLmNsYXNzZXMudHN3YXRjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLHNCQUFzQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxLQUFLLE1BQU0sb0JBQW9CLENBQUM7QUFDNUMsT0FBTyxLQUFLLFVBQVUsTUFBTSx1QkFBdUIsQ0FBQztBQUVwRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRTlDLE1BQU0sT0FBTyxPQUFPO0lBS2xCLFlBQVksWUFBb0M7UUFIekMsZUFBVSxHQUFHLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQVcsQ0FBQztRQUl2RCxJQUFJLENBQUMsU0FBUyxHQUFHLFlBQVksQ0FBQztJQUNoQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsS0FBSztRQUNoQixNQUFNLFFBQVEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDakQsTUFBTSxhQUFhLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzNELE1BQU0sV0FBVyxHQUFHLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN2RCxRQUFRLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN2QixLQUFLLE1BQU07Z0JBQ1Q7O21CQUVHO2dCQUNILElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUNqQixJQUFJLE9BQU8sQ0FBQztvQkFDVixlQUFlLEVBQUUsS0FBSyxDQUFDLEdBQUc7b0JBQzFCLGdCQUFnQixFQUFFLGVBQWU7b0JBQ2pDLE9BQU8sRUFBRSxJQUFJO2lCQUNkLENBQUMsQ0FDSCxD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