@ryusei/light
Version:
<div align="center"> <a href="https://light.ryuseijs.com"> <img alt="RyuseiLight" src="https://light.ryuseijs.com/images/svg/logo.svg" width="70"> </a>
43 lines (35 loc) • 1.12 kB
text/typescript
import { Language } from '../../types';
import { CATEGORY_FUNCTION, CATEGORY_KEYWORD } from '../../constants/categories';
import { assign, before } from '../../utils';
import { javascript } from '../javascript/javascript';
/**
* Returns the Typescript language definition.
*
* @return A Language object.
*/
export function typescript(): Language {
const language = assign( javascript(), {
id : 'typescript',
name : 'TypeScript',
alias: [ 'ts' ],
} );
const { grammar } = language;
const { main } = grammar;
before( main, CATEGORY_KEYWORD, [
[
CATEGORY_KEYWORD,
/\b(?:declare|keyof|namespace|readonly|type|string|number|boolean|bigint|symbol|object|any|never|unknown|infer|is)\b/,
],
] );
before( main, CATEGORY_FUNCTION, [
[ '#functions', /([_$a-z\xA0-\uFFFF][_$a-z0-9\xA0-\uFFFF]*)?(?:<[^>]+ )?\s*?\(/ ],
] );
assign( grammar, {
functions: [
[ CATEGORY_FUNCTION, /^[\w$]+/ ],
// Avoid circular references("main" has #functions).
...main.filter( tokenizer => tokenizer[ 0 ] !== '#functions' ),
],
} );
return language;
}