Files
tswatch/ts/tswatch.classes.confighandler.ts

186 lines
4.1 KiB
TypeScript

import * as plugins from './tswatch.plugins.js';
import * as paths from './tswatch.paths.js';
import * as interfaces from './interfaces/index.js';
const CONFIG_KEY = '@git.zone/tswatch';
/**
* Preset configurations matching legacy watch modes
*/
const presets: Record<string, interfaces.ITswatchConfig> = {
npm: {
watchers: [
{
name: 'npm-test',
watch: ['./ts/**/*', './test/**/*'],
command: 'npm run test',
restart: true,
debounce: 300,
runOnStart: true,
},
],
},
test: {
watchers: [
{
name: 'test2',
watch: ['./ts/**/*', './test/**/*'],
command: 'npm run test2',
restart: true,
debounce: 300,
runOnStart: true,
},
],
},
service: {
watchers: [
{
name: 'service',
watch: './ts/**/*',
command: 'npm run startTs',
restart: true,
debounce: 300,
runOnStart: true,
},
],
},
element: {
server: {
enabled: true,
port: 3002,
serveDir: './dist_watch/',
liveReload: true,
},
bundles: [
{
name: 'element-bundle',
from: './html/index.ts',
to: './dist_watch/bundle.js',
watchPatterns: ['./ts_web/**/*'],
triggerReload: true,
},
{
name: 'html',
from: './html/index.html',
to: './dist_watch/index.html',
watchPatterns: ['./html/**/*'],
triggerReload: true,
},
],
watchers: [
{
name: 'ts-build',
watch: './ts/**/*',
command: 'npm run build',
restart: false,
debounce: 300,
runOnStart: false,
},
],
},
website: {
bundles: [
{
name: 'website-bundle',
from: './ts_web/index.ts',
to: './dist_serve/bundle.js',
watchPatterns: ['./ts_web/**/*'],
triggerReload: false,
},
{
name: 'html',
from: './html/index.html',
to: './dist_serve/index.html',
watchPatterns: ['./html/**/*'],
triggerReload: false,
},
{
name: 'assets',
from: './assets/',
to: './dist_serve/assets/',
watchPatterns: ['./assets/**/*'],
triggerReload: false,
},
],
watchers: [
{
name: 'backend',
watch: './ts/**/*',
command: 'npm run startTs',
restart: true,
debounce: 300,
runOnStart: true,
},
],
},
};
/**
* Handles loading and managing tswatch configuration
*/
export class ConfigHandler {
private npmextra: plugins.npmextra.Npmextra;
private cwd: string;
constructor(cwdArg?: string) {
this.cwd = cwdArg || paths.cwd;
this.npmextra = new plugins.npmextra.Npmextra(this.cwd);
}
/**
* Check if a tswatch configuration exists
*/
public hasConfig(): boolean {
const config = this.npmextra.dataFor<interfaces.ITswatchConfig>(CONFIG_KEY, null);
return config !== null;
}
/**
* Load configuration from npmextra.json
* If a preset is specified, merge preset defaults with user overrides
*/
public loadConfig(): interfaces.ITswatchConfig | null {
const config = this.npmextra.dataFor<interfaces.ITswatchConfig>(CONFIG_KEY, null);
if (!config) {
return null;
}
// If a preset is specified, merge it with user config
if (config.preset && presets[config.preset]) {
const preset = presets[config.preset];
return {
...preset,
...config,
// Merge arrays instead of replacing
watchers: config.watchers || preset.watchers,
bundles: config.bundles || preset.bundles,
server: config.server !== undefined ? config.server : preset.server,
};
}
return config;
}
/**
* Get a preset configuration by name
*/
public getPreset(presetName: string): interfaces.ITswatchConfig | null {
return presets[presetName] || null;
}
/**
* Get all available preset names
*/
public getPresetNames(): string[] {
return Object.keys(presets);
}
/**
* Get the config key for npmextra.json
*/
public getConfigKey(): string {
return CONFIG_KEY;
}
}