Skip to content
This repository was archived by the owner on Apr 15, 2026. It is now read-only.

Commit d248838

Browse files
committed
Add snippet completion for TypeScript
FEATURE: Export a `typescriptSnippets` array and include TypeScript keyword completions in the default support extension when in TypeScript mode. Closes #11
1 parent 4fbc934 commit d248838

3 files changed

Lines changed: 28 additions & 4 deletions

File tree

src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
export {javascriptLanguage, typescriptLanguage, jsxLanguage, tsxLanguage, autoCloseTags, javascript} from "./javascript"
2-
export {snippets} from "./snippets"
2+
export {snippets, typescriptSnippets} from "./snippets"
33
export {esLint} from "./eslint"
44
export {localCompletionSource, completionPath, scopeCompletionSource} from "./complete"

src/javascript.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {LRLanguage, LanguageSupport, Sublanguage, sublanguageProp, defineLanguag
66
import {EditorSelection, Text} from "@codemirror/state"
77
import {EditorView} from "@codemirror/view"
88
import {completeFromList, ifNotIn} from "@codemirror/autocomplete"
9-
import {snippets} from "./snippets"
9+
import {snippets, typescriptSnippets} from "./snippets"
1010
import {localCompletionSource, dontComplete} from "./complete"
1111

1212
/// A language provider based on the [Lezer JavaScript
@@ -74,16 +74,20 @@ export const tsxLanguage = javascriptLanguage.configure({
7474
props: [sublanguageProp.add(n => n.isTop ? [jsxSublanguage] : undefined)]
7575
}, "typescript")
7676

77-
const keywords = "break case const continue default delete export extends false finally in instanceof let new return static super switch this throw true typeof var yield".split(" ").map(kw => ({label: kw, type: "keyword"}))
77+
let kwCompletion = (name: string) => ({label: name, type: "keyword"})
78+
79+
const keywords = "break case const continue default delete export extends false finally in instanceof let new return static super switch this throw true typeof var yield".split(" ").map(kwCompletion)
80+
const typescriptKeywords = keywords.concat(["declare", "implements", "private", "protected", "public"].map(kwCompletion))
7881

7982
/// JavaScript support. Includes [snippet](#lang-javascript.snippets)
8083
/// completion.
8184
export function javascript(config: {jsx?: boolean, typescript?: boolean} = {}) {
8285
let lang = config.jsx ? (config.typescript ? tsxLanguage : jsxLanguage)
8386
: config.typescript ? typescriptLanguage : javascriptLanguage
87+
let completions = config.typescript ? typescriptSnippets.concat(typescriptKeywords) : snippets.concat(keywords)
8488
return new LanguageSupport(lang, [
8589
javascriptLanguage.data.of({
86-
autocomplete: ifNotIn(dontComplete, completeFromList(snippets.concat(keywords)))
90+
autocomplete: ifNotIn(dontComplete, completeFromList(completions))
8791
}),
8892
javascriptLanguage.data.of({
8993
autocomplete: localCompletionSource

src/snippets.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,3 +59,23 @@ export const snippets: readonly Completion[] = [
5959
type: "keyword"
6060
})
6161
]
62+
63+
/// A collection of snippet completions for TypeScript. Includes the
64+
/// JavaScript [snippets](#lang-javascript.snippets).
65+
export const typescriptSnippets = snippets.concat([
66+
snip("interface ${name} {\n\t${}\n}", {
67+
label: "interface",
68+
detail: "definition",
69+
type: "keyword"
70+
}),
71+
snip("type ${name} = ${type}", {
72+
label: "type",
73+
detail: "definition",
74+
type: "keyword"
75+
}),
76+
snip("enum ${name} {\n\t${}\n}", {
77+
label: "enum",
78+
detail: "definition",
79+
type: "keyword"
80+
})
81+
])

0 commit comments

Comments
 (0)