Extensions provide a powerful way to augment the capabilities of the system by exporting blocks to the block manager. These blocks are loaded on startup, enabling you to create custom components and patches. In this guide, we'll outline how to use extensions to create and export components.
Follow Creating Components with the Composition API , you can use the composition API from the mercs_rete
library to create components. First, make sure to import the necessary modules:
import { OAIBaseComponent, WorkerContext, OmniComponentMacroTypes, Composer } from 'mercs_rete';
Then, you can create components and patches using methods provided by OAIBaseComponent
.
Example:
let component = OAIBaseComponent
.create(NS_ONMI, "redactPll")
.fromScratch()
.set('title', 'PII Redaction')
.set('category', 'Compliance')
.set('description', 'Redact Personal Information from text')
.setMethod('X-CUSTOM')
.setMeta({
source: 'summary',
summary: 'A PII redactor built using the solvvy/redact-pii library, implementing regex based PII reduction along with support for Google Cloud',
links: {
'What is PII?': 'https://www.cloudflare.com/learning/privacy/what-is-pii/',
'redact-pii github': 'https://github.com/solvvy/redact-pii',
'google cloud DLP': 'https://cloud.google.com/d1pr',
'Solvy': 'https://www.solvvy.com/'
}
});
Follow Creating Components with the Composition API , you can also define and add inputs/outpus to the component:
const inputs = [
{ name: 'text', type: 'string', description: 'A string', customSocket: 'text' },
// More input definitions...
{ name: 'usSocialSecurityNumber', type: 'boolean', default: true }
];
inputs.forEach(({ name, type, customSocket, description, default: defaultValue }) => {
component.addInput(
component.createInput(name, type, customSocket)
.set('description', description)
.setDefault(defaultValue)
.toOmniIO()
);
});
To prevent any errors from being thrown and to avoid bundling mercs_shared
, which the server already has, you'll need to externalize mercs_rete
. You can do this by adding --external:mercs_rete
to the ESBuild in your package.json
. This step ensures a smooth building process (because it already is loaded in server memory, no need to bundle it).
Add the supports: ["blocks:v2"]
property to the extension.yaml
to tell the server to try to load the blocks:
supports:
- "blocks:v2"
An extension must export an object containing hooks and a createComponents()
function. Once you have defined your components and patches, combine them into an array and return them within the createComponents()
function as described. The system will automatically load these during startup, incorporating them into the available set of components.
export default {
hooks: extensionHooks,
createComponents: () => {
blocks: [ /*array of OmniComponentFormat*/ ],
patches: [ /*array of OmniComponentPatch*/ ]
}
}
After making all the necessary updates to your extension code, run the following command to build the extension:
yarn build
This command compiles your code and generates the extension.js
file, which contains the entire extension ready for use. If you are using TypeScript for your extension development, make sure to update the tsconfig.json
file with the appropriate configuration for your project.
By following these steps, you can create complex and customizable components and integrate them into the system via extensions. Make sure to follow the guidelines for each type of component or patch and consult the specific documentation related to each class or method for more details.