@mondaydotcomorg/atp-compiler
Version:
Production-ready compiler for transforming async iteration patterns into resumable operations with checkpoint-based state management
180 lines • 4.86 kB
JavaScript
/**
* ATP Compiler Plugin API
*
* Extensible plugin system for custom transformations and detections
*/
/**
* Plugin registry for managing plugins
*/
export class PluginRegistry {
detectors = [];
transformers = [];
optimizers = [];
validators = [];
/**
* Register a plugin
*/
register(plugin) {
// Check for name conflicts
if (this.findPlugin(plugin.name)) {
throw new Error(`Plugin "${plugin.name}" is already registered. ` +
`Please use a unique name or unregister the existing plugin first.`);
}
// Type guards to determine plugin type
if (this.isDetectionPlugin(plugin)) {
this.detectors.push(plugin);
this.detectors.sort((a, b) => (b.priority || 50) - (a.priority || 50));
}
if (this.isTransformationPlugin(plugin)) {
this.transformers.push(plugin);
this.transformers.sort((a, b) => (b.priority || 50) - (a.priority || 50));
}
if (this.isOptimizerPlugin(plugin)) {
this.optimizers.push(plugin);
this.optimizers.sort((a, b) => (b.priority || 50) - (a.priority || 50));
}
if (this.isValidatorPlugin(plugin)) {
this.validators.push(plugin);
this.validators.sort((a, b) => (b.priority || 50) - (a.priority || 50));
}
}
/**
* Find a plugin by name
*/
findPlugin(name) {
const allPlugins = [
...this.detectors,
...this.transformers,
...this.optimizers,
...this.validators,
];
return allPlugins.find((p) => p.name === name);
}
/**
* Unregister a plugin by name
*/
unregister(name) {
let removed = false;
this.detectors = this.detectors.filter((p) => {
if (p.name === name) {
removed = true;
return false;
}
return true;
});
this.transformers = this.transformers.filter((p) => {
if (p.name === name) {
removed = true;
return false;
}
return true;
});
this.optimizers = this.optimizers.filter((p) => {
if (p.name === name) {
removed = true;
return false;
}
return true;
});
this.validators = this.validators.filter((p) => {
if (p.name === name) {
removed = true;
return false;
}
return true;
});
return removed;
}
/**
* Get all detection plugins
*/
getDetectors() {
return this.detectors;
}
/**
* Get all transformation plugins
*/
getTransformers() {
return this.transformers;
}
/**
* Get all optimizer plugins
*/
getOptimizers() {
return this.optimizers;
}
/**
* Get all validator plugins
*/
getValidators() {
return this.validators;
}
/**
* Initialize all plugins
*/
async initializeAll(config) {
const allPlugins = [
...this.detectors,
...this.transformers,
...this.optimizers,
...this.validators,
];
for (const plugin of allPlugins) {
if (plugin.initialize) {
await plugin.initialize(config);
}
}
}
/**
* Dispose all plugins
*/
async disposeAll() {
const allPlugins = [
...this.detectors,
...this.transformers,
...this.optimizers,
...this.validators,
];
for (const plugin of allPlugins) {
if (plugin.dispose) {
await plugin.dispose();
}
}
}
/**
* Type guards
*/
isDetectionPlugin(plugin) {
return 'detect' in plugin && 'patterns' in plugin;
}
isTransformationPlugin(plugin) {
return 'getVisitor' in plugin && 'getMetadata' in plugin && 'reset' in plugin;
}
isOptimizerPlugin(plugin) {
return 'optimize' in plugin;
}
isValidatorPlugin(plugin) {
return 'validate' in plugin;
}
}
/**
* Utility function to create a simple transformation plugin
*/
export function createTransformPlugin(config) {
let transformCount = 0;
return {
name: config.name,
version: config.version,
priority: config.priority || 50,
getVisitor() {
return config.visitor;
},
getMetadata() {
return config.getMetadata ? config.getMetadata() : { loopCount: transformCount };
},
reset() {
transformCount = 0;
},
};
}
//# sourceMappingURL=plugin-api.js.map