UNPKG

1.95 kBJavaScriptView Raw
1(function (Prism) {
2
3 Prism.languages.typescript = Prism.languages.extend('javascript', {
4 'class-name': {
5 pattern: /(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,
6 lookbehind: true,
7 greedy: true,
8 inside: null // see below
9 },
10 'builtin': /\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/,
11 });
12
13 // The keywords TypeScript adds to JavaScript
14 Prism.languages.typescript.keyword.push(
15 /\b(?:abstract|declare|is|keyof|readonly|require)\b/,
16 // keywords that have to be followed by an identifier
17 /\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,
18 // This is for `import type *, {}`
19 /\btype\b(?=\s*(?:[\{*]|$))/
20 );
21
22 // doesn't work with TS because TS is too complex
23 delete Prism.languages.typescript['parameter'];
24 delete Prism.languages.typescript['literal-property'];
25
26 // a version of typescript specifically for highlighting types
27 var typeInside = Prism.languages.extend('typescript', {});
28 delete typeInside['class-name'];
29
30 Prism.languages.typescript['class-name'].inside = typeInside;
31
32 Prism.languages.insertBefore('typescript', 'function', {
33 'decorator': {
34 pattern: /@[$\w\xA0-\uFFFF]+/,
35 inside: {
36 'at': {
37 pattern: /^@/,
38 alias: 'operator'
39 },
40 'function': /^[\s\S]+/
41 }
42 },
43 'generic-function': {
44 // e.g. foo<T extends "bar" | "baz">( ...
45 pattern: /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,
46 greedy: true,
47 inside: {
48 'function': /^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,
49 'generic': {
50 pattern: /<[\s\S]+/, // everything after the first <
51 alias: 'class-name',
52 inside: typeInside
53 }
54 }
55 }
56 });
57
58 Prism.languages.ts = Prism.languages.typescript;
59
60}(Prism));