This repository has been archived on 2023-03-18. You can view files and clone it, but cannot push or open issues or pull requests.
osr-discourse-src/app/assets/javascripts/discourse/app/app.js
David Taylor 4c4ac9cc47
Revert "DEV: Normalize event handling to improve Glimmer + Classic component compat (#18490)" (#18725)
This reverts commit 28be5d3037 and fcb4675415

This caused qunit timeouts in our internal CI environments. Not sure of the exact cause yet, but we're reverting for now while we investigate.
2022-10-24 18:30:08 +01:00

126 lines
3.1 KiB
JavaScript

import Application from "@ember/application";
import { buildResolver } from "discourse-common/resolver";
import { isTesting } from "discourse-common/config/environment";
const _pluginCallbacks = [];
let _unhandledThemeErrors = [];
const Discourse = Application.extend({
modulePrefix: "discourse",
rootElement: "#main",
customEvents: {
paste: "paste",
},
Resolver: buildResolver("discourse"),
_prepareInitializer(moduleName) {
const themeId = moduleThemeId(moduleName);
let module = null;
try {
module = requirejs(moduleName, null, null, true);
if (!module) {
throw new Error(moduleName + " must export an initializer.");
}
} catch (error) {
if (!themeId || isTesting()) {
throw error;
}
fireThemeErrorEvent({ themeId, error });
return;
}
const init = module.default;
const oldInitialize = init.initialize;
init.initialize = (app) => {
try {
return oldInitialize.call(init, app.__container__, app);
} catch (error) {
if (!themeId || isTesting()) {
throw error;
}
fireThemeErrorEvent({ themeId, error });
}
};
return init;
},
// Start up the Discourse application by running all the initializers we've defined.
start() {
document.querySelector("noscript")?.remove();
if (Error.stackTraceLimit) {
// We need Errors to have full stack traces for `lib/source-identifier`
Error.stackTraceLimit = Infinity;
}
Object.keys(requirejs._eak_seen).forEach((key) => {
if (/\/pre\-initializers\//.test(key)) {
const initializer = this._prepareInitializer(key);
if (initializer) {
this.initializer(initializer);
}
} else if (/\/(api\-)?initializers\//.test(key)) {
const initializer = this._prepareInitializer(key);
if (initializer) {
this.instanceInitializer(initializer);
}
}
});
// Plugins that are registered via `<script>` tags.
const withPluginApi = requirejs("discourse/lib/plugin-api").withPluginApi;
let initCount = 0;
_pluginCallbacks.forEach((cb) => {
this.instanceInitializer({
name: `_discourse_plugin_${++initCount}`,
after: "inject-objects",
initialize: () => withPluginApi(cb.version, cb.code),
});
});
},
_registerPluginCode(version, code) {
_pluginCallbacks.push({ version, code });
},
ready() {
performance.mark("discourse-ready");
const event = new CustomEvent("discourse-ready");
document.dispatchEvent(event);
},
});
function moduleThemeId(moduleName) {
const match = moduleName.match(/^discourse\/theme\-(\d+)\//);
if (match) {
return parseInt(match[1], 10);
}
}
function fireThemeErrorEvent({ themeId, error }) {
const event = new CustomEvent("discourse-error", {
cancelable: true,
detail: { themeId, error },
});
const unhandled = document.dispatchEvent(event);
if (unhandled) {
_unhandledThemeErrors.push(event);
}
}
export function getAndClearUnhandledThemeErrors() {
const copy = _unhandledThemeErrors;
_unhandledThemeErrors = [];
return copy;
}
export default Discourse;