mirror of
https://github.com/flarum/core.git
synced 2025-08-06 08:27:42 +02:00
feat: export registry (#3842)
* feat: registry first iteration Signed-off-by: Sami Mazouz <sychocouldy@gmail.com> * feat: improve webpack auto export loader Signed-off-by: Sami Mazouz <sychocouldy@gmail.com> * chore: remove `compat` API Signed-off-by: Sami Mazouz <sychocouldy@gmail.com> * chore: cleanup Signed-off-by: Sami Mazouz <sychocouldy@gmail.com> --------- Signed-off-by: Sami Mazouz <sychocouldy@gmail.com>
This commit is contained in:
2
framework/core/js/src/@types/global.d.ts
vendored
2
framework/core/js/src/@types/global.d.ts
vendored
@@ -98,6 +98,8 @@ interface FlarumObject {
|
||||
* }
|
||||
*/
|
||||
extensions: Readonly<Record<string, ESModule>>;
|
||||
|
||||
reg: any;
|
||||
}
|
||||
|
||||
declare const flarum: FlarumObject;
|
||||
|
40
framework/core/js/src/admin/admin.ts
Normal file
40
framework/core/js/src/admin/admin.ts
Normal file
@@ -0,0 +1,40 @@
|
||||
import '../common/common';
|
||||
|
||||
import './utils/saveSettings';
|
||||
import './utils/ExtensionData';
|
||||
import './utils/isExtensionEnabled';
|
||||
import './utils/getCategorizedExtensions';
|
||||
import './utils/generateElementId';
|
||||
|
||||
import './components/SettingDropdown';
|
||||
import './components/EditCustomFooterModal';
|
||||
import './components/SessionDropdown';
|
||||
import './components/HeaderPrimary';
|
||||
import './components/AdminPage';
|
||||
import './components/AppearancePage';
|
||||
import './components/StatusWidget';
|
||||
import './components/ExtensionsWidget';
|
||||
import './components/HeaderSecondary';
|
||||
import './components/SettingsModal';
|
||||
import './components/DashboardWidget';
|
||||
import './components/ExtensionPage';
|
||||
import './components/ExtensionLinkButton';
|
||||
import './components/PermissionGrid';
|
||||
import './components/ExtensionPermissionGrid';
|
||||
import './components/MailPage';
|
||||
import './components/UploadImageButton';
|
||||
import './components/LoadingModal';
|
||||
import './components/DashboardPage';
|
||||
import './components/BasicsPage';
|
||||
import './components/UserListPage';
|
||||
import './components/EditCustomHeaderModal';
|
||||
import './components/PermissionsPage';
|
||||
import './components/PermissionDropdown';
|
||||
import './components/AdminNav';
|
||||
import './components/AdminHeader';
|
||||
import './components/EditCustomCssModal';
|
||||
import './components/EditGroupModal';
|
||||
import './components/CreateUserModal';
|
||||
|
||||
import './routes';
|
||||
import './AdminApplication';
|
@@ -1,77 +0,0 @@
|
||||
import compat from '../common/compat';
|
||||
|
||||
import saveSettings from './utils/saveSettings';
|
||||
import ExtensionData from './utils/ExtensionData';
|
||||
import isExtensionEnabled from './utils/isExtensionEnabled';
|
||||
import getCategorizedExtensions from './utils/getCategorizedExtensions';
|
||||
import SettingDropdown from './components/SettingDropdown';
|
||||
import EditCustomFooterModal from './components/EditCustomFooterModal';
|
||||
import SessionDropdown from './components/SessionDropdown';
|
||||
import HeaderPrimary from './components/HeaderPrimary';
|
||||
import AdminPage from './components/AdminPage';
|
||||
import AppearancePage from './components/AppearancePage';
|
||||
import StatusWidget from './components/StatusWidget';
|
||||
import ExtensionsWidget from './components/ExtensionsWidget';
|
||||
import HeaderSecondary from './components/HeaderSecondary';
|
||||
import SettingsModal from './components/SettingsModal';
|
||||
import DashboardWidget from './components/DashboardWidget';
|
||||
import ExtensionPage from './components/ExtensionPage';
|
||||
import ExtensionLinkButton from './components/ExtensionLinkButton';
|
||||
import PermissionGrid from './components/PermissionGrid';
|
||||
import ExtensionPermissionGrid from './components/ExtensionPermissionGrid';
|
||||
import MailPage from './components/MailPage';
|
||||
import UploadImageButton from './components/UploadImageButton';
|
||||
import LoadingModal from './components/LoadingModal';
|
||||
import DashboardPage from './components/DashboardPage';
|
||||
import BasicsPage from './components/BasicsPage';
|
||||
import UserListPage from './components/UserListPage';
|
||||
import EditCustomHeaderModal from './components/EditCustomHeaderModal';
|
||||
import PermissionsPage from './components/PermissionsPage';
|
||||
import PermissionDropdown from './components/PermissionDropdown';
|
||||
import AdminNav from './components/AdminNav';
|
||||
import AdminHeader from './components/AdminHeader';
|
||||
import EditCustomCssModal from './components/EditCustomCssModal';
|
||||
import EditGroupModal from './components/EditGroupModal';
|
||||
import routes from './routes';
|
||||
import AdminApplication from './AdminApplication';
|
||||
import generateElementId from './utils/generateElementId';
|
||||
import CreateUserModal from './components/CreateUserModal';
|
||||
|
||||
export default Object.assign(compat, {
|
||||
'utils/saveSettings': saveSettings,
|
||||
'utils/ExtensionData': ExtensionData,
|
||||
'utils/isExtensionEnabled': isExtensionEnabled,
|
||||
'utils/getCategorizedExtensions': getCategorizedExtensions,
|
||||
'utils/generateElementId': generateElementId,
|
||||
'components/SettingDropdown': SettingDropdown,
|
||||
'components/EditCustomFooterModal': EditCustomFooterModal,
|
||||
'components/SessionDropdown': SessionDropdown,
|
||||
'components/HeaderPrimary': HeaderPrimary,
|
||||
'components/AdminPage': AdminPage,
|
||||
'components/AppearancePage': AppearancePage,
|
||||
'components/StatusWidget': StatusWidget,
|
||||
'components/ExtensionsWidget': ExtensionsWidget,
|
||||
'components/HeaderSecondary': HeaderSecondary,
|
||||
'components/SettingsModal': SettingsModal,
|
||||
'components/DashboardWidget': DashboardWidget,
|
||||
'components/ExtensionPage': ExtensionPage,
|
||||
'components/ExtensionLinkButton': ExtensionLinkButton,
|
||||
'components/PermissionGrid': PermissionGrid,
|
||||
'components/ExtensionPermissionGrid': ExtensionPermissionGrid,
|
||||
'components/MailPage': MailPage,
|
||||
'components/UploadImageButton': UploadImageButton,
|
||||
'components/LoadingModal': LoadingModal,
|
||||
'components/DashboardPage': DashboardPage,
|
||||
'components/BasicsPage': BasicsPage,
|
||||
'components/UserListPage': UserListPage,
|
||||
'components/EditCustomHeaderModal': EditCustomHeaderModal,
|
||||
'components/PermissionsPage': PermissionsPage,
|
||||
'components/PermissionDropdown': PermissionDropdown,
|
||||
'components/AdminNav': AdminNav,
|
||||
'components/AdminHeader': AdminHeader,
|
||||
'components/EditCustomCssModal': EditCustomCssModal,
|
||||
'components/EditGroupModal': EditGroupModal,
|
||||
'components/CreateUserModal': CreateUserModal,
|
||||
routes: routes,
|
||||
AdminApplication: AdminApplication,
|
||||
});
|
@@ -2,13 +2,4 @@ import app from './app';
|
||||
|
||||
export { app };
|
||||
|
||||
// Export public API
|
||||
|
||||
// Export compat API
|
||||
import compatObj from './compat';
|
||||
import proxifyCompat from '../common/utils/proxifyCompat';
|
||||
|
||||
// @ts-expect-error The `app` instance needs to be available on compat.
|
||||
compatObj.app = app;
|
||||
|
||||
export const compat = proxifyCompat(compatObj, 'admin');
|
||||
import './admin';
|
||||
|
58
framework/core/js/src/common/ExportRegistry.ts
Normal file
58
framework/core/js/src/common/ExportRegistry.ts
Normal file
@@ -0,0 +1,58 @@
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
export interface IExportRegistry {
|
||||
moduleExports: Map<string, Map<string, any>>;
|
||||
onLoads: Map<string, Map<string, Function[]>>;
|
||||
|
||||
/**
|
||||
* Add an instance to the registry.
|
||||
*/
|
||||
add(namespace: string, id: string, object: any): void;
|
||||
|
||||
/**
|
||||
* Add a function to run when object of id "id" is added (or overriden).
|
||||
* If such an object is already registered, the handler will be applied immediately.
|
||||
*/
|
||||
onLoad(namespace: string, id: string, handler: Function): void;
|
||||
|
||||
/**
|
||||
* Retrieve an object of type `id` from the registry.
|
||||
*/
|
||||
get(namespace: string, id: string): any;
|
||||
}
|
||||
|
||||
export default class ExportRegistry implements IExportRegistry {
|
||||
moduleExports = new Map<string, Map<string, any>>();
|
||||
onLoads = new Map<string, Map<string, Function[]>>();
|
||||
|
||||
add(namespace: string, id: string, object: any): void {
|
||||
this.moduleExports.set(namespace, this.moduleExports.get(namespace) || new Map());
|
||||
this.moduleExports.get(namespace)?.set(id, object);
|
||||
|
||||
this.onLoads
|
||||
.get(namespace)
|
||||
?.get(id)
|
||||
?.forEach((handler) => handler(object));
|
||||
}
|
||||
|
||||
onLoad(namespace: string, id: string, handler: Function): void {
|
||||
if (this.moduleExports.has(namespace) && this.moduleExports.get(namespace)?.has(id)) {
|
||||
handler(this.moduleExports.get(namespace)?.get(id));
|
||||
} else {
|
||||
this.onLoads.set(namespace, this.onLoads.get(namespace) || new Map());
|
||||
this.onLoads.get(namespace)?.set(id, this.onLoads.get(namespace)?.get(id) || []);
|
||||
this.onLoads.get(namespace)?.get(id)?.push(handler);
|
||||
}
|
||||
}
|
||||
|
||||
get(namespace: string, id: string): any {
|
||||
const module = this.moduleExports.get(namespace)?.get(id);
|
||||
|
||||
if (!module) {
|
||||
console.warn(`No module found for ${namespace}:${id}`);
|
||||
}
|
||||
|
||||
return module;
|
||||
}
|
||||
}
|
89
framework/core/js/src/common/common.ts
Normal file
89
framework/core/js/src/common/common.ts
Normal file
@@ -0,0 +1,89 @@
|
||||
import './extend';
|
||||
import './extenders';
|
||||
|
||||
import './states/PaginatedListState';
|
||||
import './states/AlertManagerState';
|
||||
import './states/ModalManagerState';
|
||||
import './states/PageState';
|
||||
|
||||
import './utils/isObject';
|
||||
import './utils/mixin';
|
||||
import './utils/insertText';
|
||||
import './utils/styleSelectedText';
|
||||
import './utils/Drawer';
|
||||
import './utils/anchorScroll';
|
||||
import './utils/RequestError';
|
||||
import './utils/abbreviateNumber';
|
||||
import './utils/escapeRegExp';
|
||||
import './utils/string';
|
||||
import './utils/throttleDebounce';
|
||||
import './utils/Stream';
|
||||
import './utils/SubtreeRetainer';
|
||||
import './utils/setRouteWithForcedRefresh';
|
||||
import './utils/extract';
|
||||
import './utils/ScrollListener';
|
||||
import './utils/stringToColor';
|
||||
import './utils/subclassOf';
|
||||
import './utils/patchMithril';
|
||||
import './utils/classList';
|
||||
import './utils/extractText';
|
||||
import './utils/formatNumber';
|
||||
import './utils/mapRoutes';
|
||||
import './utils/withAttr';
|
||||
import './utils/focusTrap';
|
||||
import './utils/isDark';
|
||||
import './utils/KeyboardNavigatable';
|
||||
|
||||
import './models/Notification';
|
||||
import './models/User';
|
||||
import './models/Post';
|
||||
import './models/Discussion';
|
||||
import './models/Group';
|
||||
import './models/Forum';
|
||||
|
||||
import './components/AlertManager';
|
||||
import './components/Page';
|
||||
import './components/Switch';
|
||||
import './components/Badge';
|
||||
import './components/LoadingIndicator';
|
||||
import './components/Placeholder';
|
||||
import './components/Separator';
|
||||
import './components/Dropdown';
|
||||
import './components/SplitDropdown';
|
||||
import './components/RequestErrorModal';
|
||||
import './components/FieldSet';
|
||||
import './components/Select';
|
||||
import './components/Navigation';
|
||||
import './components/Alert';
|
||||
import './components/Link';
|
||||
import './components/LinkButton';
|
||||
import './components/Checkbox';
|
||||
import './components/ColorPreviewInput';
|
||||
import './components/SelectDropdown';
|
||||
import './components/ModalManager';
|
||||
import './components/Button';
|
||||
import './components/Modal';
|
||||
import './components/GroupBadge';
|
||||
import './components/TextEditor';
|
||||
import './components/TextEditorButton';
|
||||
import './components/EditUserModal';
|
||||
import './components/Tooltip';
|
||||
|
||||
import './helpers/fullTime';
|
||||
import './helpers/avatar';
|
||||
import './helpers/icon';
|
||||
import './helpers/humanTime';
|
||||
import './helpers/punctuateSeries';
|
||||
import './helpers/highlight';
|
||||
import './helpers/username';
|
||||
import './helpers/userOnline';
|
||||
import './helpers/listItems';
|
||||
import './helpers/textContrastClass';
|
||||
|
||||
import './resolvers/DefaultResolver';
|
||||
|
||||
import './Component';
|
||||
import './Translator';
|
||||
import './Model';
|
||||
import './Application';
|
||||
import './Fragment';
|
@@ -1,187 +0,0 @@
|
||||
import * as extend from './extend';
|
||||
import extenders from './extenders';
|
||||
import Session from './Session';
|
||||
import Store from './Store';
|
||||
import BasicEditorDriver from './utils/BasicEditorDriver';
|
||||
import evented from './utils/evented';
|
||||
import EventEmitter from './utils/EventEmitter';
|
||||
import KeyboardNavigatable from './utils/KeyboardNavigatable';
|
||||
import liveHumanTimes from './utils/liveHumanTimes';
|
||||
import ItemList from './utils/ItemList';
|
||||
import mixin from './utils/mixin';
|
||||
import humanTime from './utils/humanTime';
|
||||
import computed from './utils/computed';
|
||||
import insertText from './utils/insertText';
|
||||
import styleSelectedText from './utils/styleSelectedText';
|
||||
import Drawer from './utils/Drawer';
|
||||
import anchorScroll from './utils/anchorScroll';
|
||||
import RequestError from './utils/RequestError';
|
||||
import abbreviateNumber from './utils/abbreviateNumber';
|
||||
import escapeRegExp from './utils/escapeRegExp';
|
||||
import * as string from './utils/string';
|
||||
import * as ThrottleDebounce from './utils/throttleDebounce';
|
||||
import Stream from './utils/Stream';
|
||||
import SubtreeRetainer from './utils/SubtreeRetainer';
|
||||
import setRouteWithForcedRefresh from './utils/setRouteWithForcedRefresh';
|
||||
import extract from './utils/extract';
|
||||
import ScrollListener from './utils/ScrollListener';
|
||||
import stringToColor from './utils/stringToColor';
|
||||
import subclassOf from './utils/subclassOf';
|
||||
import patchMithril from './utils/patchMithril';
|
||||
import proxifyCompat from './utils/proxifyCompat';
|
||||
import classList from './utils/classList';
|
||||
import extractText from './utils/extractText';
|
||||
import formatNumber from './utils/formatNumber';
|
||||
import mapRoutes from './utils/mapRoutes';
|
||||
import withAttr from './utils/withAttr';
|
||||
import * as FocusTrap from './utils/focusTrap';
|
||||
import isDark from './utils/isDark';
|
||||
import Notification from './models/Notification';
|
||||
import User from './models/User';
|
||||
import Post from './models/Post';
|
||||
import Discussion from './models/Discussion';
|
||||
import Group from './models/Group';
|
||||
import Forum from './models/Forum';
|
||||
import Component from './Component';
|
||||
import Translator from './Translator';
|
||||
import AlertManager from './components/AlertManager';
|
||||
import Page from './components/Page';
|
||||
import Switch from './components/Switch';
|
||||
import Badge from './components/Badge';
|
||||
import LoadingIndicator from './components/LoadingIndicator';
|
||||
import Placeholder from './components/Placeholder';
|
||||
import Separator from './components/Separator';
|
||||
import Dropdown from './components/Dropdown';
|
||||
import SplitDropdown from './components/SplitDropdown';
|
||||
import RequestErrorModal from './components/RequestErrorModal';
|
||||
import FieldSet from './components/FieldSet';
|
||||
import Select from './components/Select';
|
||||
import Navigation from './components/Navigation';
|
||||
import Alert from './components/Alert';
|
||||
import Link from './components/Link';
|
||||
import LinkButton from './components/LinkButton';
|
||||
import Checkbox from './components/Checkbox';
|
||||
import ColorPreviewInput from './components/ColorPreviewInput';
|
||||
import SelectDropdown from './components/SelectDropdown';
|
||||
import ModalManager from './components/ModalManager';
|
||||
import Button from './components/Button';
|
||||
import Modal from './components/Modal';
|
||||
import GroupBadge from './components/GroupBadge';
|
||||
import TextEditor from './components/TextEditor';
|
||||
import TextEditorButton from './components/TextEditorButton';
|
||||
import EditUserModal from './components/EditUserModal';
|
||||
import Tooltip from './components/Tooltip';
|
||||
import Model from './Model';
|
||||
import Application from './Application';
|
||||
import fullTime from './helpers/fullTime';
|
||||
import avatar from './helpers/avatar';
|
||||
import icon from './helpers/icon';
|
||||
import humanTimeHelper from './helpers/humanTime';
|
||||
import punctuateSeries from './helpers/punctuateSeries';
|
||||
import highlight from './helpers/highlight';
|
||||
import username from './helpers/username';
|
||||
import userOnline from './helpers/userOnline';
|
||||
import listItems from './helpers/listItems';
|
||||
import textContrastClass from './helpers/textContrastClass';
|
||||
import Fragment from './Fragment';
|
||||
import DefaultResolver from './resolvers/DefaultResolver';
|
||||
import PaginatedListState from './states/PaginatedListState';
|
||||
import isObject from './utils/isObject';
|
||||
import AlertManagerState from './states/AlertManagerState';
|
||||
import ModalManagerState from './states/ModalManagerState';
|
||||
import PageState from './states/PageState';
|
||||
|
||||
export default {
|
||||
extenders,
|
||||
extend: extend,
|
||||
Session: Session,
|
||||
Store: Store,
|
||||
'utils/BasicEditorDriver': BasicEditorDriver,
|
||||
'utils/evented': evented,
|
||||
'utils/EventEmitter': EventEmitter,
|
||||
'utils/KeyboardNavigatable': KeyboardNavigatable,
|
||||
'utils/liveHumanTimes': liveHumanTimes,
|
||||
'utils/ItemList': ItemList,
|
||||
'utils/mixin': mixin,
|
||||
'utils/humanTime': humanTime,
|
||||
'utils/computed': computed,
|
||||
'utils/insertText': insertText,
|
||||
'utils/styleSelectedText': styleSelectedText,
|
||||
'utils/Drawer': Drawer,
|
||||
'utils/anchorScroll': anchorScroll,
|
||||
'utils/RequestError': RequestError,
|
||||
'utils/abbreviateNumber': abbreviateNumber,
|
||||
'utils/string': string,
|
||||
'utils/SubtreeRetainer': SubtreeRetainer,
|
||||
'utils/escapeRegExp': escapeRegExp,
|
||||
'utils/extract': extract,
|
||||
'utils/ScrollListener': ScrollListener,
|
||||
'utils/stringToColor': stringToColor,
|
||||
'utils/Stream': Stream,
|
||||
'utils/subclassOf': subclassOf,
|
||||
'utils/setRouteWithForcedRefresh': setRouteWithForcedRefresh,
|
||||
'utils/patchMithril': patchMithril,
|
||||
'utils/proxifyCompat': proxifyCompat,
|
||||
'utils/classList': classList,
|
||||
'utils/extractText': extractText,
|
||||
'utils/formatNumber': formatNumber,
|
||||
'utils/mapRoutes': mapRoutes,
|
||||
'utils/withAttr': withAttr,
|
||||
'utils/throttleDebounce': ThrottleDebounce,
|
||||
'utils/isObject': isObject,
|
||||
'utils/focusTrap': FocusTrap,
|
||||
'utils/isDark': isDark,
|
||||
'models/Notification': Notification,
|
||||
'models/User': User,
|
||||
'models/Post': Post,
|
||||
'models/Discussion': Discussion,
|
||||
'models/Group': Group,
|
||||
'models/Forum': Forum,
|
||||
Component: Component,
|
||||
Fragment: Fragment,
|
||||
Translator: Translator,
|
||||
'components/AlertManager': AlertManager,
|
||||
'components/Page': Page,
|
||||
'components/Switch': Switch,
|
||||
'components/Badge': Badge,
|
||||
'components/LoadingIndicator': LoadingIndicator,
|
||||
'components/Placeholder': Placeholder,
|
||||
'components/Separator': Separator,
|
||||
'components/Dropdown': Dropdown,
|
||||
'components/SplitDropdown': SplitDropdown,
|
||||
'components/RequestErrorModal': RequestErrorModal,
|
||||
'components/FieldSet': FieldSet,
|
||||
'components/Select': Select,
|
||||
'components/Navigation': Navigation,
|
||||
'components/Alert': Alert,
|
||||
'components/Link': Link,
|
||||
'components/LinkButton': LinkButton,
|
||||
'components/Checkbox': Checkbox,
|
||||
'components/ColorPreviewInput': ColorPreviewInput,
|
||||
'components/SelectDropdown': SelectDropdown,
|
||||
'components/ModalManager': ModalManager,
|
||||
'components/Button': Button,
|
||||
'components/Modal': Modal,
|
||||
'components/GroupBadge': GroupBadge,
|
||||
'components/TextEditor': TextEditor,
|
||||
'components/TextEditorButton': TextEditorButton,
|
||||
'components/Tooltip': Tooltip,
|
||||
'components/EditUserModal': EditUserModal,
|
||||
Model: Model,
|
||||
Application: Application,
|
||||
'helpers/fullTime': fullTime,
|
||||
'helpers/avatar': avatar,
|
||||
'helpers/icon': icon,
|
||||
'helpers/humanTime': humanTimeHelper,
|
||||
'helpers/punctuateSeries': punctuateSeries,
|
||||
'helpers/highlight': highlight,
|
||||
'helpers/username': username,
|
||||
'helpers/userOnline': userOnline,
|
||||
'helpers/listItems': listItems,
|
||||
'helpers/textContrastClass': textContrastClass,
|
||||
'resolvers/DefaultResolver': DefaultResolver,
|
||||
'states/PaginatedListState': PaginatedListState,
|
||||
'states/AlertManagerState': AlertManagerState,
|
||||
'states/ModalManagerState': ModalManagerState,
|
||||
'states/PageState': PageState,
|
||||
};
|
@@ -3,9 +3,11 @@ import PostTypes from './PostTypes';
|
||||
import Routes from './Routes';
|
||||
import Store from './Store';
|
||||
|
||||
export default {
|
||||
const extenders = {
|
||||
Model,
|
||||
PostTypes,
|
||||
Routes,
|
||||
Store,
|
||||
};
|
||||
|
||||
export default extenders;
|
||||
|
@@ -15,6 +15,8 @@ import localizedFormat from 'dayjs/plugin/localizedFormat';
|
||||
dayjs.extend(relativeTime);
|
||||
dayjs.extend(localizedFormat);
|
||||
|
||||
import './registry';
|
||||
|
||||
import patchMithril from './utils/patchMithril';
|
||||
|
||||
patchMithril(window);
|
||||
|
3
framework/core/js/src/common/registry.ts
Normal file
3
framework/core/js/src/common/registry.ts
Normal file
@@ -0,0 +1,3 @@
|
||||
import ExportRegistry from './ExportRegistry';
|
||||
|
||||
flarum.reg = new ExportRegistry();
|
@@ -1,12 +0,0 @@
|
||||
export default function proxifyCompat(compat: Record<string, unknown>, namespace: string) {
|
||||
// regex to replace common/ and NAMESPACE/ for core & core extensions
|
||||
// and remove .js, .ts and .tsx extensions
|
||||
// e.g. admin/utils/extract --> utils/extract
|
||||
// e.g. tags/common/utils/sortTags --> tags/utils/sortTags
|
||||
const regex = new RegExp(String.raw`(\w+\/)?(${namespace}|common)\/`);
|
||||
const fileExt = /(\.js|\.tsx?)$/;
|
||||
|
||||
return new Proxy(compat, {
|
||||
get: (obj, prop: string) => obj[prop] || obj[prop.replace(regex, '$1').replace(fileExt, '')],
|
||||
});
|
||||
}
|
@@ -1,3 +1,3 @@
|
||||
// Re-exports `throttle-debounce` to be used in `compat.js`.
|
||||
// Re-exports `throttle-debounce` to be added in the export registry.
|
||||
|
||||
export { throttle, debounce } from 'throttle-debounce';
|
||||
|
@@ -9,7 +9,8 @@
|
||||
* Replaces m.withAttr for Mithril 2.0.
|
||||
* @see https://mithril.js.org/archive/v0.2.5/mithril.withAttr.html
|
||||
*/
|
||||
export default (key: string, cb: Function) =>
|
||||
function (this: Element) {
|
||||
export default function withAttr(key: string, cb: Function) {
|
||||
return function (this: Element) {
|
||||
cb(this.getAttribute(key) || (this as any)[key]);
|
||||
};
|
||||
}
|
||||
|
@@ -1,156 +0,0 @@
|
||||
import compat from '../common/compat';
|
||||
|
||||
import PostControls from './utils/PostControls';
|
||||
import KeyboardNavigatable from '../common/utils/KeyboardNavigatable';
|
||||
import slidable from './utils/slidable';
|
||||
import History from './utils/History';
|
||||
import DiscussionControls from './utils/DiscussionControls';
|
||||
import alertEmailConfirmation from './utils/alertEmailConfirmation';
|
||||
import UserControls from './utils/UserControls';
|
||||
import Pane from './utils/Pane';
|
||||
import ComposerState from './states/ComposerState';
|
||||
import DiscussionListState from './states/DiscussionListState';
|
||||
import GlobalSearchState from './states/GlobalSearchState';
|
||||
import NotificationListState from './states/NotificationListState';
|
||||
import PostStreamState from './states/PostStreamState';
|
||||
import SearchState from './states/SearchState';
|
||||
import UserSecurityPageState from './states/UserSecurityPageState';
|
||||
import AffixedSidebar from './components/AffixedSidebar';
|
||||
import DiscussionPage from './components/DiscussionPage';
|
||||
import DiscussionListPane from './components/DiscussionListPane';
|
||||
import LogInModal from './components/LogInModal';
|
||||
import ComposerBody from './components/ComposerBody';
|
||||
import ForgotPasswordModal from './components/ForgotPasswordModal';
|
||||
import Notification from './components/Notification';
|
||||
import LogInButton from './components/LogInButton';
|
||||
import DiscussionsUserPage from './components/DiscussionsUserPage';
|
||||
import Composer from './components/Composer';
|
||||
import SessionDropdown from './components/SessionDropdown';
|
||||
import HeaderPrimary from './components/HeaderPrimary';
|
||||
import PostEdited from './components/PostEdited';
|
||||
import PostStream from './components/PostStream';
|
||||
import ChangePasswordModal from './components/ChangePasswordModal';
|
||||
import IndexPage from './components/IndexPage';
|
||||
import DiscussionRenamedNotification from './components/DiscussionRenamedNotification';
|
||||
import DiscussionsSearchSource from './components/DiscussionsSearchSource';
|
||||
import HeaderSecondary from './components/HeaderSecondary';
|
||||
import ComposerButton from './components/ComposerButton';
|
||||
import DiscussionList from './components/DiscussionList';
|
||||
import ReplyPlaceholder from './components/ReplyPlaceholder';
|
||||
import AvatarEditor from './components/AvatarEditor';
|
||||
import Post from './components/Post';
|
||||
import SettingsPage from './components/SettingsPage';
|
||||
import TerminalPost from './components/TerminalPost';
|
||||
import ChangeEmailModal from './components/ChangeEmailModal';
|
||||
import NotificationsDropdown from './components/NotificationsDropdown';
|
||||
import UserPage from './components/UserPage';
|
||||
import PostUser from './components/PostUser';
|
||||
import UserCard from './components/UserCard';
|
||||
import UsersSearchSource from './components/UsersSearchSource';
|
||||
import UserSecurityPage from './components/UserSecurityPage';
|
||||
import NotificationGrid from './components/NotificationGrid';
|
||||
import PostPreview from './components/PostPreview';
|
||||
import EventPost from './components/EventPost';
|
||||
import DiscussionHero from './components/DiscussionHero';
|
||||
import PostMeta from './components/PostMeta';
|
||||
import DiscussionRenamedPost from './components/DiscussionRenamedPost';
|
||||
import DiscussionComposer from './components/DiscussionComposer';
|
||||
import LogInButtons from './components/LogInButtons';
|
||||
import NotificationList from './components/NotificationList';
|
||||
import WelcomeHero from './components/WelcomeHero';
|
||||
import SignUpModal from './components/SignUpModal';
|
||||
import CommentPost from './components/CommentPost';
|
||||
import ComposerPostPreview from './components/ComposerPostPreview';
|
||||
import ReplyComposer from './components/ReplyComposer';
|
||||
import NotificationsPage from './components/NotificationsPage';
|
||||
import PostStreamScrubber from './components/PostStreamScrubber';
|
||||
import EditPostComposer from './components/EditPostComposer';
|
||||
import RenameDiscussionModal from './components/RenameDiscussionModal';
|
||||
import Search from './components/Search';
|
||||
import DiscussionListItem from './components/DiscussionListItem';
|
||||
import LoadingPost from './components/LoadingPost';
|
||||
import PostsUserPage from './components/PostsUserPage';
|
||||
import DiscussionPageResolver from './resolvers/DiscussionPageResolver';
|
||||
import BasicEditorDriver from '../common/utils/BasicEditorDriver';
|
||||
import routes from './routes';
|
||||
import ForumApplication from './ForumApplication';
|
||||
import isSafariMobile from './utils/isSafariMobile';
|
||||
|
||||
export default Object.assign(compat, {
|
||||
'utils/PostControls': PostControls,
|
||||
// @deprecated import from 'flarum/common/utils/KeyboardNavigatable' instead
|
||||
'utils/KeyboardNavigatable': KeyboardNavigatable,
|
||||
'utils/slidable': slidable,
|
||||
'utils/History': History,
|
||||
'utils/DiscussionControls': DiscussionControls,
|
||||
'utils/alertEmailConfirmation': alertEmailConfirmation,
|
||||
'utils/UserControls': UserControls,
|
||||
'utils/Pane': Pane,
|
||||
'utils/BasicEditorDriver': BasicEditorDriver,
|
||||
'utils/isSafariMobile': isSafariMobile,
|
||||
'states/ComposerState': ComposerState,
|
||||
'states/DiscussionListState': DiscussionListState,
|
||||
'states/GlobalSearchState': GlobalSearchState,
|
||||
'states/NotificationListState': NotificationListState,
|
||||
'states/PostStreamState': PostStreamState,
|
||||
'states/SearchState': SearchState,
|
||||
'states/UserSecurityPageState': UserSecurityPageState,
|
||||
'components/AffixedSidebar': AffixedSidebar,
|
||||
'components/DiscussionPage': DiscussionPage,
|
||||
'components/DiscussionListPane': DiscussionListPane,
|
||||
'components/LogInModal': LogInModal,
|
||||
'components/ComposerBody': ComposerBody,
|
||||
'components/ForgotPasswordModal': ForgotPasswordModal,
|
||||
'components/Notification': Notification,
|
||||
'components/LogInButton': LogInButton,
|
||||
'components/DiscussionsUserPage': DiscussionsUserPage,
|
||||
'components/Composer': Composer,
|
||||
'components/SessionDropdown': SessionDropdown,
|
||||
'components/HeaderPrimary': HeaderPrimary,
|
||||
'components/PostEdited': PostEdited,
|
||||
'components/PostStream': PostStream,
|
||||
'components/ChangePasswordModal': ChangePasswordModal,
|
||||
'components/IndexPage': IndexPage,
|
||||
'components/DiscussionRenamedNotification': DiscussionRenamedNotification,
|
||||
'components/DiscussionsSearchSource': DiscussionsSearchSource,
|
||||
'components/HeaderSecondary': HeaderSecondary,
|
||||
'components/ComposerButton': ComposerButton,
|
||||
'components/DiscussionList': DiscussionList,
|
||||
'components/ReplyPlaceholder': ReplyPlaceholder,
|
||||
'components/AvatarEditor': AvatarEditor,
|
||||
'components/Post': Post,
|
||||
'components/SettingsPage': SettingsPage,
|
||||
'components/TerminalPost': TerminalPost,
|
||||
'components/ChangeEmailModal': ChangeEmailModal,
|
||||
'components/NotificationsDropdown': NotificationsDropdown,
|
||||
'components/UserPage': UserPage,
|
||||
'components/PostUser': PostUser,
|
||||
'components/UserCard': UserCard,
|
||||
'components/UsersSearchSource': UsersSearchSource,
|
||||
'components/UserSecurityPage': UserSecurityPage,
|
||||
'components/NotificationGrid': NotificationGrid,
|
||||
'components/PostPreview': PostPreview,
|
||||
'components/EventPost': EventPost,
|
||||
'components/DiscussionHero': DiscussionHero,
|
||||
'components/PostMeta': PostMeta,
|
||||
'components/DiscussionRenamedPost': DiscussionRenamedPost,
|
||||
'components/DiscussionComposer': DiscussionComposer,
|
||||
'components/LogInButtons': LogInButtons,
|
||||
'components/NotificationList': NotificationList,
|
||||
'components/WelcomeHero': WelcomeHero,
|
||||
'components/SignUpModal': SignUpModal,
|
||||
'components/CommentPost': CommentPost,
|
||||
'components/ComposerPostPreview': ComposerPostPreview,
|
||||
'components/ReplyComposer': ReplyComposer,
|
||||
'components/NotificationsPage': NotificationsPage,
|
||||
'components/PostStreamScrubber': PostStreamScrubber,
|
||||
'components/EditPostComposer': EditPostComposer,
|
||||
'components/RenameDiscussionModal': RenameDiscussionModal,
|
||||
'components/Search': Search,
|
||||
'components/DiscussionListItem': DiscussionListItem,
|
||||
'components/LoadingPost': LoadingPost,
|
||||
'components/PostsUserPage': PostsUserPage,
|
||||
'resolvers/DiscussionPageResolver': DiscussionPageResolver,
|
||||
routes: routes,
|
||||
ForumApplication: ForumApplication,
|
||||
});
|
75
framework/core/js/src/forum/forum.ts
Normal file
75
framework/core/js/src/forum/forum.ts
Normal file
@@ -0,0 +1,75 @@
|
||||
import '../common/common';
|
||||
import '../common/utils/BasicEditorDriver';
|
||||
|
||||
import './utils/PostControls';
|
||||
import './utils/slidable';
|
||||
import './utils/History';
|
||||
import './utils/DiscussionControls';
|
||||
import './utils/alertEmailConfirmation';
|
||||
import './utils/UserControls';
|
||||
import './utils/Pane';
|
||||
import './states/ComposerState';
|
||||
import './states/DiscussionListState';
|
||||
import './states/GlobalSearchState';
|
||||
import './states/NotificationListState';
|
||||
import './states/PostStreamState';
|
||||
import './states/SearchState';
|
||||
import './states/UserSecurityPageState';
|
||||
import './components/AffixedSidebar';
|
||||
import './components/DiscussionPage';
|
||||
import './components/DiscussionListPane';
|
||||
import './components/LogInModal';
|
||||
import './components/ComposerBody';
|
||||
import './components/ForgotPasswordModal';
|
||||
import './components/Notification';
|
||||
import './components/LogInButton';
|
||||
import './components/DiscussionsUserPage';
|
||||
import './components/Composer';
|
||||
import './components/SessionDropdown';
|
||||
import './components/HeaderPrimary';
|
||||
import './components/PostEdited';
|
||||
import './components/PostStream';
|
||||
import './components/ChangePasswordModal';
|
||||
import './components/IndexPage';
|
||||
import './components/DiscussionRenamedNotification';
|
||||
import './components/DiscussionsSearchSource';
|
||||
import './components/HeaderSecondary';
|
||||
import './components/ComposerButton';
|
||||
import './components/DiscussionList';
|
||||
import './components/ReplyPlaceholder';
|
||||
import './components/AvatarEditor';
|
||||
import './components/Post';
|
||||
import './components/SettingsPage';
|
||||
import './components/TerminalPost';
|
||||
import './components/ChangeEmailModal';
|
||||
import './components/NotificationsDropdown';
|
||||
import './components/UserPage';
|
||||
import './components/PostUser';
|
||||
import './components/UserCard';
|
||||
import './components/UsersSearchSource';
|
||||
import './components/UserSecurityPage';
|
||||
import './components/NotificationGrid';
|
||||
import './components/PostPreview';
|
||||
import './components/EventPost';
|
||||
import './components/DiscussionHero';
|
||||
import './components/PostMeta';
|
||||
import './components/DiscussionRenamedPost';
|
||||
import './components/DiscussionComposer';
|
||||
import './components/LogInButtons';
|
||||
import './components/NotificationList';
|
||||
import './components/WelcomeHero';
|
||||
import './components/SignUpModal';
|
||||
import './components/CommentPost';
|
||||
import './components/ComposerPostPreview';
|
||||
import './components/ReplyComposer';
|
||||
import './components/NotificationsPage';
|
||||
import './components/PostStreamScrubber';
|
||||
import './components/EditPostComposer';
|
||||
import './components/RenameDiscussionModal';
|
||||
import './components/Search';
|
||||
import './components/DiscussionListItem';
|
||||
import './components/LoadingPost';
|
||||
import './components/PostsUserPage';
|
||||
import './resolvers/DiscussionPageResolver';
|
||||
import './routes';
|
||||
import './ForumApplication';
|
@@ -6,11 +6,4 @@ import app from './app';
|
||||
|
||||
export { app };
|
||||
|
||||
// Export compat API
|
||||
import compatObj from './compat';
|
||||
import proxifyCompat from '../common/utils/proxifyCompat';
|
||||
|
||||
// @ts-ignore
|
||||
compatObj.app = app;
|
||||
|
||||
export const compat = proxifyCompat(compatObj, 'forum');
|
||||
import './forum';
|
||||
|
@@ -12,7 +12,7 @@ import extractText from '../../common/utils/extractText';
|
||||
* The `DiscussionControls` utility constructs a list of buttons for a
|
||||
* discussion which perform actions on it.
|
||||
*/
|
||||
export default {
|
||||
const DiscussionControls = {
|
||||
/**
|
||||
* Get a list of controls for a discussion.
|
||||
*
|
||||
@@ -240,3 +240,5 @@ export default {
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
export default DiscussionControls;
|
||||
|
@@ -9,7 +9,7 @@ import extractText from '../../common/utils/extractText';
|
||||
* The `PostControls` utility constructs a list of buttons for a post which
|
||||
* perform actions on it.
|
||||
*/
|
||||
export default {
|
||||
const PostControls = {
|
||||
/**
|
||||
* Get a list of controls for a post.
|
||||
*
|
||||
@@ -183,3 +183,5 @@ export default {
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
export default PostControls;
|
||||
|
@@ -9,7 +9,7 @@ import ItemList from '../../common/utils/ItemList';
|
||||
* The `UserControls` utility constructs a list of buttons for a user which
|
||||
* perform actions on it.
|
||||
*/
|
||||
export default {
|
||||
const UserControls = {
|
||||
/**
|
||||
* Get a list of controls for a user.
|
||||
*
|
||||
@@ -146,3 +146,5 @@ export default {
|
||||
app.modal.show(EditUserModal, { user });
|
||||
},
|
||||
};
|
||||
|
||||
export default UserControls;
|
||||
|
Reference in New Issue
Block a user