diff --git a/js/dist-typings/@types/shims.d.ts b/js/dist-typings/@types/shims.d.ts
new file mode 100644
index 0000000..d560006
--- /dev/null
+++ b/js/dist-typings/@types/shims.d.ts
@@ -0,0 +1,10 @@
+import User from 'flarum/common/models/User';
+
+declare module 'flarum/common/models/User' {
+ export default interface User {
+ mustEnable2FA: () => boolean;
+ twoFactorEnabled: () => boolean;
+ canDisable2FA: () => boolean;
+ backupCodesRemaining: () => number;
+ }
+}
diff --git a/js/dist-typings/admin/components/ExtractedGroupBar.d.ts b/js/dist-typings/admin/components/ExtractedGroupBar.d.ts
new file mode 100644
index 0000000..65c979c
--- /dev/null
+++ b/js/dist-typings/admin/components/ExtractedGroupBar.d.ts
@@ -0,0 +1,8 @@
+///
+import Component from 'flarum/common/Component';
+/**
+ * This is just the group bar from the permissions page, extracted into its own component so it can be used again.
+ */
+export default class ExtractedGroupBar extends Component {
+ view(): JSX.Element;
+}
diff --git a/js/dist-typings/admin/components/SettingsPage.d.ts b/js/dist-typings/admin/components/SettingsPage.d.ts
new file mode 100644
index 0000000..41d3aa8
--- /dev/null
+++ b/js/dist-typings/admin/components/SettingsPage.d.ts
@@ -0,0 +1,5 @@
+///
+import ExtensionPage from 'flarum/admin/components/ExtensionPage';
+export default class SettingsPage extends ExtensionPage {
+ content(): JSX.Element;
+}
diff --git a/js/dist-typings/admin/extend.d.ts b/js/dist-typings/admin/extend.d.ts
new file mode 100644
index 0000000..af1fdf2
--- /dev/null
+++ b/js/dist-typings/admin/extend.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import("flarum/common/extenders/Model").default[];
+export default _default;
diff --git a/js/dist-typings/admin/extendEditGroupModal.d.ts b/js/dist-typings/admin/extendEditGroupModal.d.ts
new file mode 100644
index 0000000..327cde8
--- /dev/null
+++ b/js/dist-typings/admin/extendEditGroupModal.d.ts
@@ -0,0 +1 @@
+export default function extendEditGroupModal(): void;
diff --git a/js/dist-typings/admin/extendUserListPage.d.ts b/js/dist-typings/admin/extendUserListPage.d.ts
new file mode 100644
index 0000000..3fade41
--- /dev/null
+++ b/js/dist-typings/admin/extendUserListPage.d.ts
@@ -0,0 +1 @@
+export default function extendUserListPage(): void;
diff --git a/js/dist-typings/admin/index.d.ts b/js/dist-typings/admin/index.d.ts
new file mode 100644
index 0000000..6d2293d
--- /dev/null
+++ b/js/dist-typings/admin/index.d.ts
@@ -0,0 +1 @@
+export { default as extend } from './extend';
diff --git a/js/dist-typings/common/extend.d.ts b/js/dist-typings/common/extend.d.ts
new file mode 100644
index 0000000..af1fdf2
--- /dev/null
+++ b/js/dist-typings/common/extend.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import("flarum/common/extenders/Model").default[];
+export default _default;
diff --git a/js/dist-typings/common/index.d.ts b/js/dist-typings/common/index.d.ts
new file mode 100644
index 0000000..cb0ff5c
--- /dev/null
+++ b/js/dist-typings/common/index.d.ts
@@ -0,0 +1 @@
+export {};
diff --git a/js/dist-typings/forum/alertTwoFactorAuthentication.d.ts b/js/dist-typings/forum/alertTwoFactorAuthentication.d.ts
new file mode 100644
index 0000000..65d6539
--- /dev/null
+++ b/js/dist-typings/forum/alertTwoFactorAuthentication.d.ts
@@ -0,0 +1,6 @@
+/**
+ * Shows an alert if the user has not enabled 2FA.
+ *
+ * @param {import('../ForumApplication').default} app
+ */
+export default function alertTwoFactorAuthentication(app: any): void;
diff --git a/js/dist-typings/forum/checkForTwoFactor.d.ts b/js/dist-typings/forum/checkForTwoFactor.d.ts
new file mode 100644
index 0000000..5d8f6d0
--- /dev/null
+++ b/js/dist-typings/forum/checkForTwoFactor.d.ts
@@ -0,0 +1 @@
+export default function checkForTwoFactor(): Promise;
diff --git a/js/dist-typings/forum/components/TwoFactorDisableConfirmModal .d.ts b/js/dist-typings/forum/components/TwoFactorDisableConfirmModal .d.ts
new file mode 100644
index 0000000..8c70642
--- /dev/null
+++ b/js/dist-typings/forum/components/TwoFactorDisableConfirmModal .d.ts
@@ -0,0 +1,9 @@
+///
+export default class TwoFactorDisableConfirmModal extends Modal {
+ constructor();
+ oninit(vnode: any): void;
+ title(): import("@askvortsov/rich-icu-message-formatter").NestedStringArray;
+ content(): JSX.Element;
+ disable(): void;
+}
+import Modal from "flarum/common/components/Modal";
diff --git a/js/dist-typings/forum/components/TwoFactorEnableModal.d.ts b/js/dist-typings/forum/components/TwoFactorEnableModal.d.ts
new file mode 100644
index 0000000..55f416f
--- /dev/null
+++ b/js/dist-typings/forum/components/TwoFactorEnableModal.d.ts
@@ -0,0 +1,32 @@
+///
+import Modal, { IInternalModalAttrs } from 'flarum/common/components/Modal';
+import Stream from 'flarum/common/utils/Stream';
+import User from 'flarum/common/models/User';
+import type Mithril from 'mithril';
+export interface TwoFactorEnableModalAttrs extends IInternalModalAttrs {
+ user: User;
+ forced: boolean;
+ onEnabled: () => void | null;
+}
+export default class TwoFactorEnableModal extends Modal {
+ user: User;
+ status: string;
+ qrCodeUrl: string | null;
+ backupCodes: Array;
+ token: Stream;
+ code: string | null;
+ activeTab: string;
+ loading: boolean;
+ protected static isDismissibleViaCloseButton: boolean;
+ protected static isDismissibleViaEscKey: boolean;
+ protected static isDismissibleViaBackdropClick: boolean;
+ oninit(vnode: Mithril.Vnode): void;
+ className(): string;
+ title(): import("@askvortsov/rich-icu-message-formatter").NestedStringArray;
+ oncreate(vnode: Mithril.Vnode): void;
+ onupdate(): void;
+ content(): JSX.Element;
+ verifyToken(): void;
+ finish(): void;
+ onSubmit(e: any): void;
+}
diff --git a/js/dist-typings/forum/components/TwoFactorGrid.d.ts b/js/dist-typings/forum/components/TwoFactorGrid.d.ts
new file mode 100644
index 0000000..7a704cb
--- /dev/null
+++ b/js/dist-typings/forum/components/TwoFactorGrid.d.ts
@@ -0,0 +1,18 @@
+export default class TwoFactorGrid extends Component {
+ constructor();
+ oninit(vnode: any): void;
+ user: any;
+ twoFactorEnabled: any;
+ canDisableTwoFactor: any;
+ backupCodesRemaining: any;
+ view(): JSX.Element;
+ twoFactorItems(): ItemList;
+ getDisableAction(): JSX.Element;
+ enableTwoFactor(): void;
+ onTwoFactorEnabled(): void;
+ disableTwoFactor(): void;
+ onTwoFactorDisabled(): void;
+ generateBackupCodes(): void;
+}
+import Component from "flarum/common/Component";
+import ItemList from "flarum/common/utils/ItemList";
diff --git a/js/dist-typings/forum/components/TwoFactorGridItem.d.ts b/js/dist-typings/forum/components/TwoFactorGridItem.d.ts
new file mode 100644
index 0000000..a7e877d
--- /dev/null
+++ b/js/dist-typings/forum/components/TwoFactorGridItem.d.ts
@@ -0,0 +1,5 @@
+export default class TwoFactorGridItem extends Component {
+ constructor();
+ view(): JSX.Element;
+}
+import Component from "flarum/common/Component";
diff --git a/js/dist-typings/forum/components/TwoFactorSettings.d.ts b/js/dist-typings/forum/components/TwoFactorSettings.d.ts
new file mode 100644
index 0000000..c0ac790
--- /dev/null
+++ b/js/dist-typings/forum/components/TwoFactorSettings.d.ts
@@ -0,0 +1,9 @@
+export default class TwoFactorSettings extends Component {
+ constructor();
+ oninit(vnode: any): void;
+ twoFactorEnabled: any;
+ canDisableTwoFactor: any;
+ loading: boolean | undefined;
+ view(): JSX.Element;
+}
+import Component from "flarum/common/Component";
diff --git a/js/dist-typings/forum/extend.d.ts b/js/dist-typings/forum/extend.d.ts
new file mode 100644
index 0000000..af1fdf2
--- /dev/null
+++ b/js/dist-typings/forum/extend.d.ts
@@ -0,0 +1,2 @@
+declare const _default: import("flarum/common/extenders/Model").default[];
+export default _default;
diff --git a/js/dist-typings/forum/extendLogInModal.d.ts b/js/dist-typings/forum/extendLogInModal.d.ts
new file mode 100644
index 0000000..d8f357f
--- /dev/null
+++ b/js/dist-typings/forum/extendLogInModal.d.ts
@@ -0,0 +1 @@
+export default function extendLogInModal(): void;
diff --git a/js/dist-typings/forum/extendUserSecurityPage.d.ts b/js/dist-typings/forum/extendUserSecurityPage.d.ts
new file mode 100644
index 0000000..52463b5
--- /dev/null
+++ b/js/dist-typings/forum/extendUserSecurityPage.d.ts
@@ -0,0 +1 @@
+export default function extendUserSecurityPage(): void;
diff --git a/js/dist-typings/forum/index.d.ts b/js/dist-typings/forum/index.d.ts
new file mode 100644
index 0000000..6d2293d
--- /dev/null
+++ b/js/dist-typings/forum/index.d.ts
@@ -0,0 +1 @@
+export { default as extend } from './extend';