Skip to content

Commit

Permalink
feat(Editor): enable AI code completion for codemirror
Browse files Browse the repository at this point in the history
  • Loading branch information
hatemhosny committed Apr 24, 2024
1 parent 49c245a commit ac2c6f3
Show file tree
Hide file tree
Showing 7 changed files with 122 additions and 1 deletion.
68 changes: 68 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@
"@replit/codemirror-vscode-keymap": "6.0.2",
"@snackbar/core": "1.7.0",
"@types/deep-diff": "1.0.1",
"@valtown/codemirror-codeium": "0.2.3",
"codejar": "4.1.1",
"codemirror": "6.0.1",
"deep-diff": "1.0.2",
Expand Down
1 change: 1 addition & 0 deletions scripts/vendors.js
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ const buildVendors = () => {
'codemirror-vim.ts',
'codemirror-emacs.ts',
'codemirror-emmet.ts',
'codemirror-codeium.ts',
'languages/codemirror-lang-json.ts',
'languages/codemirror-lang-markdown.ts',
'languages/codemirror-lang-python.ts',
Expand Down
24 changes: 24 additions & 0 deletions src/livecodes/editor/codemirror/codemirror-codeium.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { copilotPlugin, codeiumOtherDocumentsConfig, Language } from '@valtown/codemirror-codeium';
import type { CodeiumEditor } from './codemirror';

const EDITOR_API_KEY = 'd49954eb-cfba-4992-980f-d8fb37f0e942';

export const codeium = (editors: CodeiumEditor[], mapLanguage: (lang: string) => string) => [
codeiumOtherDocumentsConfig.of({
override: () =>
editors.map((editor) => {
const language = editor.getLanguage();
return {
absolutePath: `https://livecodes.io/v/${editor.editorId}/${language}`,
text: editor.getValue(),
language:
Language[mapLanguage(language).toUpperCase() as keyof typeof Language] ||
Language.TYPESCRIPT,
editorLanguage: mapLanguage(language),
};
}),
}),
copilotPlugin({
apiKey: EDITOR_API_KEY,
}),
];
15 changes: 15 additions & 0 deletions src/livecodes/editor/codemirror/codemirror.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,11 @@ import { editorLanguages } from './editor-languages';
import { colorPicker, indentationMarkers, vscodeKeymap } from './extras';
import { codemirrorThemes, customThemes } from './codemirror-themes';

export type CodeiumEditor = Pick<CodeEditor, 'getLanguage' | 'getValue'> & {
editorId: EditorOptions['editorId'];
};
const editors: CodeiumEditor[] = [];

export const createEditor = async (options: EditorOptions): Promise<CodeEditor> => {
const { container, readonly, isEmbed, editorId, getFormatterConfig, getFontFamily } = options;
let editorSettings: EditorConfig = { ...options };
Expand Down Expand Up @@ -78,16 +83,21 @@ export const createEditor = async (options: EditorOptions): Promise<CodeEditor>
let vim: (() => Extension) | undefined;
let emacs: (() => Extension) | undefined;
let emmet: Extension | undefined;
let codeium:
| ((editors: CodeiumEditor[], mapLanguage: (lang: Language) => Language) => Extension)
| undefined;

const loadExtensions = async (opt: EditorConfig) => {
const modules = {
vim: `./vendor/codemirror/${process.env.codemirrorVersion}/codemirror-vim.js`,
emacs: `./vendor/codemirror/${process.env.codemirrorVersion}/codemirror-emacs.js`,
emmet: `./vendor/codemirror/${process.env.codemirrorVersion}/codemirror-emmet.js`,
codeium: `./vendor/codemirror/${process.env.codemirrorVersion}/codemirror-codeium.js`,
};
vim = opt.editorMode === 'vim' ? (await import(modules.vim)).vim : undefined;
emacs = opt.editorMode === 'emacs' ? (await import(modules.emacs)).emacs : undefined;
emmet = opt.emmet ? (await import(modules.emmet)).emmet : undefined;
codeium = opt.enableAI ? (await import(modules.codeium)).codeium : undefined;
};

await loadExtensions(options);
Expand All @@ -107,6 +117,7 @@ export const createEditor = async (options: EditorOptions): Promise<CodeEditor>
const useTabs = settings.useTabs ?? editorSettings.useTabs;
const wordWrap = settings.wordWrap ?? editorSettings.wordWrap;
const enableEmmet = settings.emmet ?? editorSettings.emmet;
const enableAI = settings.enableAI ?? editorSettings.enableAI;
const editorMode = settings.editorMode ?? editorSettings.editorMode;

return [
Expand All @@ -115,6 +126,7 @@ export const createEditor = async (options: EditorOptions): Promise<CodeEditor>
...(wordWrap ? [EditorView.lineWrapping] : []),
...(editorMode === 'vim' && vim ? [vim()] : editorMode === 'emacs' && emacs ? [emacs()] : []),
...(enableEmmet && emmet ? [emmet] : []),
...(enableAI && codeium ? [codeium(editors, mapLanguage)] : []),
EditorView.theme({
'&': {
height: '100%',
Expand Down Expand Up @@ -217,6 +229,8 @@ export const createEditor = async (options: EditorOptions): Promise<CodeEditor>
setValue(value);
}
};
const codeiumEditor: CodeiumEditor = { editorId, getLanguage, getValue };
editors.push(codeiumEditor);

const onContentChanged = (fn: Listener) => {
listeners.push(fn);
Expand Down Expand Up @@ -339,6 +353,7 @@ export const createEditor = async (options: EditorOptions): Promise<CodeEditor>
keyBindings.length = 0;
view.destroy();
container.innerHTML = '';
editors.splice(editors.indexOf(codeiumEditor), 1);
};

return {
Expand Down
12 changes: 12 additions & 0 deletions src/livecodes/styles/app.scss
Original file line number Diff line number Diff line change
Expand Up @@ -3268,6 +3268,18 @@ i.arrow {
}
}

// CodeMirror Codeium
.cm-ghostText,
.cm-ghostText * {
opacity: 0.6;
filter: grayscale(20%);
cursor: pointer;
}

.cm-ghostText:hover {
background: #eee;
}

/* Prism JS */

.prism {
Expand Down
2 changes: 1 addition & 1 deletion src/livecodes/templates/starter/react-starter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ export const reactStarter: Template = {
script: {
language: 'jsx',
content: `
import { useState } from "react"
import { useState } from "react";
function Counter(props) {
const [count, setCount] = useState(0);
Expand Down

0 comments on commit ac2c6f3

Please sign in to comment.