diff --git a/twitter-text/twitter-text-tests.ts b/twitter-text/twitter-text-tests.ts
new file mode 100644
index 0000000000..84e02232bb
--- /dev/null
+++ b/twitter-text/twitter-text-tests.ts
@@ -0,0 +1,62 @@
+///
+
+import * as twitter from "twitter-text";
+
+const text: string = twitter.htmlEscape("@you #hello < @world > https://github.com");
+const entities = twitter.extractEntitiesWithIndices(text);
+
+function isHashtagEntity(e: twitter.EntityWithIndices): e is twitter.HashtagWithIndices {
+ return "hashtag" in e;
+}
+
+function isUrlEntity(e: twitter.EntityWithIndices): e is twitter.UrlWithIndices {
+ return "url" in e;
+}
+
+function isMentionEntity(e: twitter.EntityWithIndices): e is twitter.MentionWithIndices {
+ return "screenName" in e;
+}
+
+function isCashtagEntity(e: twitter.EntityWithIndices): e is twitter.CashtagWithIndices {
+ return "cashtag" in e;
+}
+
+for (let e of entities) {
+ e = twitter.modifyIndicesFromUnicodeToUTF16(e);
+ if (isHashtagEntity(e)) {
+ console.log("hashtag: ", e.hashtag);
+ } else if (isUrlEntity(e)) {
+ console.log("url: ", e.url);
+ } else if (isMentionEntity(e)) {
+ console.log("screenName: ", e.screenName);
+ } else if (isCashtagEntity(e)) {
+ console.log("cashtag: ", e.cashtag);
+ } else {
+ console.error("Unreachable");
+ }
+ console.log(`indices: (${e.indices[0]}, ${e.indices[1]})`);
+}
+
+let result: string;
+result = twitter.autoLink(text);
+result = twitter.autoLinkUsernamesOrLists(text);
+result = twitter.autoLinkHashtags(text);
+result = twitter.autoLinkCashtags(text);
+result = twitter.autoLinkUrlsCustom(text);
+
+const len: number = twitter.getTweetLength(text);
+
+const linked: string = twitter.autoLink("link @user, and expand url... http://t.co/0JG5Mcq", {
+ urlEntities: [
+ {
+ url: "http://t.co/0JG5Mcq",
+ display_url: "blog.twitter.com/2011/05/twitte…",
+ expanded_url: "http://blog.twitter.com/2011/05/twitter-for-mac-update.html",
+ indices: [
+ 30,
+ 48
+ ]
+ }
+ ]});
+
+const usernames: string[] = twitter.extractMentions("Mentioning @twitter and @jack");
diff --git a/twitter-text/twitter-text.d.ts b/twitter-text/twitter-text.d.ts
new file mode 100644
index 0000000000..e880c0d796
--- /dev/null
+++ b/twitter-text/twitter-text.d.ts
@@ -0,0 +1,103 @@
+// Type definitions for twitter-text v1.13.4
+// Project: https://github.com/twitter/twitter-text
+// Definitions by: rhysd
+// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
+
+declare module "twitter-text" {
+ export interface HashtagWithIndices {
+ hashtag: string;
+ indices: [number, number];
+ }
+ export interface UrlWithIndices {
+ url: string;
+ indices: [number, number];
+ }
+ export interface MentionWithIndices {
+ screenName: string;
+ indices: [number, number];
+ }
+ export interface MentionOrListWithIndices {
+ screenName: string;
+ listSlug: string;
+ indices: [number, number];
+ }
+ export interface CashtagWithIndices {
+ cashtag: string;
+ indices: [number, number];
+ }
+ export type EntityWithIndices =
+ HashtagWithIndices |
+ UrlWithIndices |
+ MentionWithIndices |
+ MentionOrListWithIndices |
+ CashtagWithIndices;
+
+ interface Indices {
+ indices: [number, number];
+ }
+
+ export function htmlEscape(text: string): string;
+ export function splitTags(text: string): string[];
+
+ export function extractHashtags(text: string): string[];
+ export function extractHashtagsWithIndices(text: string): HashtagWithIndices[];
+ export function extractUrls(text: string): string[];
+ export function extractUrlsWithIndices(text: string): UrlWithIndices[];
+ export function extractMentions(text: string): string[];
+ export function extractMentionsWithIndices(text: string): MentionWithIndices[];
+ export function extractMentionsOrListsWithIndices(text: string): MentionOrListWithIndices[];
+ export function extractReplies(text: string): string[];
+ export function extractCashtags(text: string): string[];
+ export function extractCashtagsWithIndices(text: string): CashtagWithIndices[];
+ export function extractEntitiesWithIndices(text: string): EntityWithIndices[];
+
+ export function modifyIndicesFromUnicodeToUTF16(i: I): I;
+ export function modifyIndicesFromUTF16ToUnicode(i: I): I;
+
+ export interface UrlEntity {
+ url: string;
+ display_url: string;
+ expanded_url: string;
+ indices: [number, number];
+ }
+ export interface AutoLinkOptions {
+ hashtagClass?: string;
+ hashtagUrlBase?: string;
+ cashtagClass?: string;
+ cashtagUrlBase?: string;
+ listClass?: string;
+ usernameClass?: string;
+ usernameUrlBase?: string;
+ listUrlBase?: string;
+ htmlAttrs?: string;
+ invisibleTagAttrs?: string;
+ htmlEscapeNonEntities?: boolean;
+ urlEntities?: UrlEntity[];
+ }
+
+ export function autoLink(text: string, options?: AutoLinkOptions): string;
+ export function autoLinkUsernamesOrLists(text: string, options?: AutoLinkOptions): string;
+ export function autoLinkHashtags(text: string, options?: AutoLinkOptions): string;
+ export function autoLinkCashtags(text: string, options?: AutoLinkOptions): string;
+ export function autoLinkUrlsCustom(text: string, options?: AutoLinkOptions): string;
+ export function autoLinkEntities(text: string, entities: EntityWithIndices[], options?: AutoLinkOptions): string;
+
+ interface TweetLengthOptions {
+ short_url_length: number;
+ short_url_length_https: number;
+ }
+ export function getTweetLength(text: string, options?: TweetLengthOptions): number;
+
+ export function isValidUsername(username: string): boolean;
+ export function isValidList(usernameList: string): boolean;
+ export function isValidHashtag(hashtag: string): boolean;
+ // Note: unicodeDomainsa and requireProtocol can be null
+ export function isValidUrl(url: string, unicodeDomains: boolean, requireProtocol: boolean): boolean;
+ export function isInvalidTweet(text: string): string;
+
+ export function getUnicodeTextLength(text: string): number;
+ // Note: This function directly modify entities" indices
+ export function convertUnicodeIndices(text: string, entities: EntityWithIndices[], indicesInUTF16?: boolean): void;
+
+ export function hitHighlight(text: string, hits?: number[][], options?: {tag: string}): string;
+}