mirror of
https://github.com/discourse/discourse.git
synced 2024-11-25 09:42:07 +08:00
Start Discourse in an initializer (#9930)
* DEV: To be pedantic, there is more than EMBER in there now * DEV: Use less globals. Have `Discourse` start in an initializer * DEV: Remove another global
This commit is contained in:
parent
ecfce93f28
commit
2b2434b82d
|
@ -1,7 +1,7 @@
|
||||||
var define, requirejs;
|
var define, requirejs;
|
||||||
|
|
||||||
(function() {
|
(function() {
|
||||||
var EMBER_MODULES = {};
|
var JS_MODULES = {};
|
||||||
var ALIASES = {
|
var ALIASES = {
|
||||||
"ember-addons/ember-computed-decorators":
|
"ember-addons/ember-computed-decorators":
|
||||||
"discourse-common/utils/decorators",
|
"discourse-common/utils/decorators",
|
||||||
|
@ -11,7 +11,7 @@ var define, requirejs;
|
||||||
|
|
||||||
// In future versions of ember we don't need this
|
// In future versions of ember we don't need this
|
||||||
if (typeof Ember !== "undefined") {
|
if (typeof Ember !== "undefined") {
|
||||||
EMBER_MODULES = {
|
JS_MODULES = {
|
||||||
jquery: { default: $ },
|
jquery: { default: $ },
|
||||||
"@ember/array": {
|
"@ember/array": {
|
||||||
default: Ember.Array,
|
default: Ember.Array,
|
||||||
|
@ -285,7 +285,7 @@ var define, requirejs;
|
||||||
name = "@ember/object";
|
name = "@ember/object";
|
||||||
}
|
}
|
||||||
|
|
||||||
var mod = EMBER_MODULES[name] || registry[name];
|
var mod = JS_MODULES[name] || registry[name];
|
||||||
if (!mod) {
|
if (!mod) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
"Could not find module `" + name + "` imported from `" + origin + "`"
|
"Could not find module `" + name + "` imported from `" + origin + "`"
|
||||||
|
@ -308,8 +308,8 @@ var define, requirejs;
|
||||||
|
|
||||||
requirejs = require = function(name) {
|
requirejs = require = function(name) {
|
||||||
name = transformForAliases(name);
|
name = transformForAliases(name);
|
||||||
if (EMBER_MODULES[name]) {
|
if (JS_MODULES[name]) {
|
||||||
return EMBER_MODULES[name];
|
return JS_MODULES[name];
|
||||||
}
|
}
|
||||||
|
|
||||||
var mod = registry[name];
|
var mod = registry[name];
|
||||||
|
|
|
@ -0,0 +1,94 @@
|
||||||
|
import PreloadStore from "discourse/lib/preload-store";
|
||||||
|
import I18n from "I18n";
|
||||||
|
import Session from "discourse/models/session";
|
||||||
|
import RSVP from "rsvp";
|
||||||
|
import { isTesting } from "discourse-common/config/environment";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "discourse-bootstrap",
|
||||||
|
|
||||||
|
// The very first initializer to run
|
||||||
|
initialize(container, app) {
|
||||||
|
// Our test environment has its own bootstrap code
|
||||||
|
if (isTesting()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const preloadedDataElement = document.getElementById("data-preloaded");
|
||||||
|
const setupData = document.getElementById("data-discourse-setup").dataset;
|
||||||
|
|
||||||
|
if (preloadedDataElement) {
|
||||||
|
const preloaded = JSON.parse(preloadedDataElement.dataset.preloaded);
|
||||||
|
|
||||||
|
Object.keys(preloaded).forEach(function(key) {
|
||||||
|
PreloadStore.store(key, JSON.parse(preloaded[key]));
|
||||||
|
|
||||||
|
if (setupData.debugPreloadedAppData === "true") {
|
||||||
|
/* eslint-disable no-console */
|
||||||
|
console.log(key, PreloadStore.get(key));
|
||||||
|
/* eslint-enable no-console */
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
app.CDN = setupData.cdn;
|
||||||
|
app.BaseUrl = setupData.baseUrl;
|
||||||
|
app.BaseUri = setupData.baseUri;
|
||||||
|
app.Environment = setupData.environment;
|
||||||
|
app.SiteSettings = PreloadStore.get("siteSettings");
|
||||||
|
app.ThemeSettings = PreloadStore.get("themeSettings");
|
||||||
|
app.LetterAvatarVersion = setupData.letterAvatarVersion;
|
||||||
|
app.MarkdownItURL = setupData.markdownItUrl;
|
||||||
|
app.ServiceWorkerURL = setupData.serviceWorkerUrl;
|
||||||
|
I18n.defaultLocale = setupData.defaultLocale;
|
||||||
|
|
||||||
|
window.Logster = window.Logster || {};
|
||||||
|
window.Logster.enabled = setupData.enableJsErrorReporting === "true";
|
||||||
|
|
||||||
|
app.set("assetVersion", setupData.assetVersion);
|
||||||
|
|
||||||
|
Session.currentProp(
|
||||||
|
"disableCustomCSS",
|
||||||
|
setupData.disableCustomCss === "true"
|
||||||
|
);
|
||||||
|
|
||||||
|
if (setupData.safeMode) {
|
||||||
|
Session.currentProp("safe_mode", setupData.safeMode);
|
||||||
|
}
|
||||||
|
|
||||||
|
app.HighlightJSPath = setupData.highlightJsPath;
|
||||||
|
app.SvgSpritePath = setupData.svgSpritePath;
|
||||||
|
|
||||||
|
if (app.Environment === "development") {
|
||||||
|
app.SvgIconList = setupData.svgIconList;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (setupData.s3BaseUrl) {
|
||||||
|
app.S3CDN = setupData.s3Cdn;
|
||||||
|
app.S3BaseUrl = setupData.s3BaseUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
RSVP.configure("onerror", function(e) {
|
||||||
|
// Ignore TransitionAborted exceptions that bubble up
|
||||||
|
if (e && e.message === "TransitionAborted") {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Discourse.Environment === "development") {
|
||||||
|
/* eslint-disable no-console */
|
||||||
|
if (e) {
|
||||||
|
if (e.message || e.stack) {
|
||||||
|
console.log(e.message);
|
||||||
|
console.log(e.stack);
|
||||||
|
} else {
|
||||||
|
console.log("Uncaught promise: ", e);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
console.log("A promise failed but was not caught.");
|
||||||
|
}
|
||||||
|
/* eslint-enable no-console */
|
||||||
|
}
|
||||||
|
|
||||||
|
window.onerror(e && e.message, null, null, null, e);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
|
@ -15,6 +15,7 @@ const ALL_TARGETS = ["controller", "component", "route", "model", "adapter"];
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "inject-discourse-objects",
|
name: "inject-discourse-objects",
|
||||||
|
after: "discourse-bootstrap",
|
||||||
|
|
||||||
initialize(container, app) {
|
initialize(container, app) {
|
||||||
ALL_TARGETS.forEach(t => app.inject(t, "appEvents", "service:app-events"));
|
ALL_TARGETS.forEach(t => app.inject(t, "appEvents", "service:app-events"));
|
||||||
|
|
|
@ -3,6 +3,7 @@ import { createWidget } from "discourse/widgets/widget";
|
||||||
import transformPost from "discourse/lib/transform-post";
|
import transformPost from "discourse/lib/transform-post";
|
||||||
import { Placeholder } from "discourse/lib/posts-with-placeholders";
|
import { Placeholder } from "discourse/lib/posts-with-placeholders";
|
||||||
import { addWidgetCleanCallback } from "discourse/components/mount-widget";
|
import { addWidgetCleanCallback } from "discourse/components/mount-widget";
|
||||||
|
import { isTesting } from "discourse-common/config/environment";
|
||||||
|
|
||||||
let transformCallbacks = null;
|
let transformCallbacks = null;
|
||||||
export function postTransformCallbacks(transformed) {
|
export function postTransformCallbacks(transformed) {
|
||||||
|
@ -19,7 +20,7 @@ export function addPostTransformCallback(callback) {
|
||||||
transformCallbacks.push(callback);
|
transformCallbacks.push(callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
const CLOAKING_ENABLED = !window.inTestEnv;
|
const CLOAKING_ENABLED = !isTesting();
|
||||||
const DAY = 1000 * 60 * 60 * 24;
|
const DAY = 1000 * 60 * 60 * 24;
|
||||||
|
|
||||||
const _dontCloak = {};
|
const _dontCloak = {};
|
||||||
|
|
|
@ -1,84 +0,0 @@
|
||||||
// discourse-skip-module
|
|
||||||
(function() {
|
|
||||||
const ps = require("discourse/lib/preload-store").default;
|
|
||||||
const preloadedDataElement = document.getElementById("data-preloaded");
|
|
||||||
const setupData = document.getElementById("data-discourse-setup").dataset;
|
|
||||||
const I18n = require("I18n").default;
|
|
||||||
|
|
||||||
if (preloadedDataElement) {
|
|
||||||
const preloaded = JSON.parse(preloadedDataElement.dataset.preloaded);
|
|
||||||
|
|
||||||
Object.keys(preloaded).forEach(function(key) {
|
|
||||||
ps.store(key, JSON.parse(preloaded[key]));
|
|
||||||
|
|
||||||
if (setupData.debugPreloadedAppData === "true") {
|
|
||||||
/* eslint-disable no-console */
|
|
||||||
console.log(key, ps.get(key));
|
|
||||||
/* eslint-enable no-console */
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
window.Logster = window.Logster || {};
|
|
||||||
window.Logster.enabled = setupData.enableJsErrorReporting === "true";
|
|
||||||
|
|
||||||
Discourse.CDN = setupData.cdn;
|
|
||||||
Discourse.BaseUrl = setupData.baseUrl;
|
|
||||||
Discourse.BaseUri = setupData.baseUri;
|
|
||||||
Discourse.Environment = setupData.environment;
|
|
||||||
Discourse.SiteSettings = ps.get("siteSettings");
|
|
||||||
Discourse.ThemeSettings = ps.get("themeSettings");
|
|
||||||
Discourse.LetterAvatarVersion = setupData.letterAvatarVersion;
|
|
||||||
Discourse.MarkdownItURL = setupData.markdownItUrl;
|
|
||||||
Discourse.ServiceWorkerURL = setupData.serviceWorkerUrl;
|
|
||||||
I18n.defaultLocale = setupData.defaultLocale;
|
|
||||||
Discourse.start();
|
|
||||||
Discourse.set("assetVersion", setupData.assetVersion);
|
|
||||||
|
|
||||||
const Session = require("discourse/models/session").default;
|
|
||||||
Session.currentProp(
|
|
||||||
"disableCustomCSS",
|
|
||||||
setupData.disableCustomCss === "true"
|
|
||||||
);
|
|
||||||
|
|
||||||
if (setupData.safeMode) {
|
|
||||||
Session.currentProp("safe_mode", setupData.safeMode);
|
|
||||||
}
|
|
||||||
|
|
||||||
Discourse.HighlightJSPath = setupData.highlightJsPath;
|
|
||||||
Discourse.SvgSpritePath = setupData.svgSpritePath;
|
|
||||||
|
|
||||||
if (Discourse.Environment === "development") {
|
|
||||||
Discourse.SvgIconList = setupData.svgIconList;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (setupData.s3BaseUrl) {
|
|
||||||
Discourse.S3CDN = setupData.s3Cdn;
|
|
||||||
Discourse.S3BaseUrl = setupData.s3BaseUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
// eslint-disable-next-line
|
|
||||||
Ember.RSVP.configure("onerror", function(e) {
|
|
||||||
// Ignore TransitionAborted exceptions that bubble up
|
|
||||||
if (e && e.message === "TransitionAborted") {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Discourse.Environment === "development") {
|
|
||||||
/* eslint-disable no-console */
|
|
||||||
if (e) {
|
|
||||||
if (e.message || e.stack) {
|
|
||||||
console.log(e.message);
|
|
||||||
console.log(e.stack);
|
|
||||||
} else {
|
|
||||||
console.log("Uncaught promise: ", e);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
console.log("A promise failed but was not caught.");
|
|
||||||
}
|
|
||||||
/* eslint-enable no-console */
|
|
||||||
}
|
|
||||||
|
|
||||||
window.onerror(e && e.message, null, null, null, e);
|
|
||||||
});
|
|
||||||
})();
|
|
4
app/assets/javascripts/start-discourse.js
Normal file
4
app/assets/javascripts/start-discourse.js
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
// discourse-skip-module
|
||||||
|
(function() {
|
||||||
|
Discourse.start();
|
||||||
|
})();
|
|
@ -109,7 +109,7 @@
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<div class="hidden" id="data-preloaded" data-preloaded="<%= preloaded_json %>"></div>
|
<div class="hidden" id="data-preloaded" data-preloaded="<%= preloaded_json %>"></div>
|
||||||
<%= preload_script "preload-application-data" %>
|
<%= preload_script "start-discourse" %>
|
||||||
|
|
||||||
<%= yield :data %>
|
<%= yield :data %>
|
||||||
|
|
||||||
|
|
|
@ -154,7 +154,7 @@ module Discourse
|
||||||
service-worker.js
|
service-worker.js
|
||||||
google-tag-manager.js
|
google-tag-manager.js
|
||||||
google-universal-analytics.js
|
google-universal-analytics.js
|
||||||
preload-application-data.js
|
start-discourse.js
|
||||||
print-page.js
|
print-page.js
|
||||||
omniauth-complete.js
|
omniauth-complete.js
|
||||||
activate-account.js
|
activate-account.js
|
||||||
|
|
|
@ -48,7 +48,7 @@ class DiscourseJsProcessor
|
||||||
return false if relative_path.start_with?("#{js_root}/plugins/")
|
return false if relative_path.start_with?("#{js_root}/plugins/")
|
||||||
|
|
||||||
return true if %w(
|
return true if %w(
|
||||||
preload-application-data
|
start-discourse
|
||||||
wizard-start
|
wizard-start
|
||||||
onpopstate-handler
|
onpopstate-handler
|
||||||
google-tag-manager
|
google-tag-manager
|
||||||
|
|
|
@ -53,8 +53,6 @@ sinon.config = {
|
||||||
useFakeServer: false
|
useFakeServer: false
|
||||||
};
|
};
|
||||||
|
|
||||||
window.inTestEnv = true;
|
|
||||||
|
|
||||||
let MessageBus = require("message-bus-client").default;
|
let MessageBus = require("message-bus-client").default;
|
||||||
|
|
||||||
// Stop the message bus so we don't get ajax calls
|
// Stop the message bus so we don't get ajax calls
|
||||||
|
|
Loading…
Reference in New Issue
Block a user