Proyecto hecho para la hackaton de midudev en colaboración con co:here.
Usando mi propio editor de código llamado codecrush
que ahora mismo esta en la versión 0.0.5 y decidí poner a prueba el sistema de plugins. Entonces a contnuación voy a explicar como lo hice.
La idea es extender el autocompletado que trae el editor por defecto que es bastante limitado.
Extendiendo el editor
Para crear una extensión del editor tenemos que importar Component desde el core package de codecrush y crear una clase extendiéndola con el Component
AiAutocompletion.ts
_10
import { Component } from "codecrush-core";
_10
_10
export class CohereAutoCompletion extends Component {
_10
constructor() {
_10
super("cohere-autocompletion");
_10
}
_10
}
Petición a co:here
Creamos la función que se va a encargar de hacer el fetching de datos. La misma recibe como parámetro la palabra actual sobre la cual está posicionado el cursor del editor. Lo cual es algo que el mismo editor nos lo da.
AiAutocompletion.ts
_48
import { Component } from "codecrush-core";
_48
_48
export class CohereAutoCompletion extends Component {
prompt: `this program returns text autocompletions for code editor, it can have multiple autocompletions and should only return javascript code like this
_48
--
_48
input:spl
_48
autocompletion:splice,slice
_48
--
_48
input:con
_48
autocompletion:const,console,continue
_48
--
_48
input:for
_48
autocompletion:for(let i = 0; i < array.length, i++),forEach,for(const a in array)
_48
--
_48
input:${currentWord}
_48
autocompletion:`,
_48
temperature: 0.2,
_48
k: 0,
_48
p: 1,
_48
frequency_penalty: 0,
_48
presence_penalty: 0,
_48
stop_sequences: ["--"],
_48
}),
_48
});
_48
}
_48
}
Accediendo a los componentes por defecto del editor
En este ejemplo vamos a tener que usar dos componentes del editor
autocompletion: Para añadir los resultados cuando co:here nos traiga los datos.
activity-bar: Para añadir el evento a la barra de actividades y dar feedback al usuario de cuando se esta haciendo la petición a co:here
El editor tiene una función llamada getComponent con la que accederemos a esos componentes. Así como el siguiente ejemplo en el que registraremos algo en la barra de actividades.
_10
import { ActivityBarComponent } from "codecrush-core";
`co:here -> (${completion.currentWord})`, // -> Texto que deseamos poner
_10
true // -> True si queremos que aparezca un spinner
_10
);
Importamos desde el core package ActivityBarComponent para tener autocompletado sobre las funciones que ya trae activityBar.
En nuestro componente lo haremos creando una función init que va a ser la que va inicializar getResultsFromAi usando debounce y la que va añadir los resultados al editor también.
AiAutocompletion.ts
_60
import {
_60
ActivityBarComponent,
_60
AutocompletionComponent,
_60
Component,
_60
} from "codecrush-core";
_60
import debounce from "@/utils/debounce";
_60
_60
export class CohereAutoCompletion extends Component {
_60
getResultsFromAi: () => void | null;
_60
signal: AbortController | null;
_60
constructor() {
_60
super("cohere-autocompletion");
_60
this.signal = null;
_60
this.getResultsFromAi = () => {}
_60
_60
this.init();
_60
}
_60
_60
init() {
_60
this.getResultsFromAi = debounce(() => {
_60
if (!process.env.NEXT_PUBLIC_COHERE_TOKEN) return;
Gracias a que estamos extendiendo la clase con Component, tenemos los dos eventos que vamos a ejecutar para pedir los resultados o en su defecto para cancelar la petición con el AbortController
AiAutocompletion.ts
_37
import {
_37
ActivityBarComponent,
_37
AutocompletionComponent,
_37
Component,
_37
} from "codecrush-core";
_37
import debounce from "@/utils/debounce";
_37
_37
export class CohereAutoCompletion extends Component {
_37
getResultsFromAi: () => void | null;
_37
signal: AbortController | null;
_37
constructor() {
_37
super("cohere-autocompletion");
_37
this.signal = null;
_37
this.getResultsFromAi = () => {}
_37
_37
this.init();
_37
}
_37
_37
init() {
_37
...
_37
}
_37
_37
async fetchAutoCompletions(currentWord: string) {
_37
...
_37
}
_37
_37
onSearchSuggestions(): void {
_37
this.getResultsFromAi();
_37
}
_37
_37
onAutoCompletionCancel(): void {
_37
if (this.signal) {
_37
this.signal.abort();
_37
this.signal = null;
_37
}
_37
}
_37
}
Y con eso tendriamos un autocompletado extendido con co:here gracias a el sistema de plugins del editor.
React component
Para usar el componente que acabamos de crear simplemente se lo pasamos al Editor como prop.
YourComponent.tsx
_13
import { CohereAutoCompletion } from "@/editorPlugins/AiAutocompletion";