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/initializers/live-development.js.es6
Sam a3e8c3cd7b FEATURE: Native theme support
This feature introduces the concept of themes. Themes are an evolution
of site customizations.

Themes introduce two very big conceptual changes:

- A theme may include other "child themes", children can include grand
children and so on.

- A theme may specify a color scheme

The change does away with the idea of "enabled" color schemes.

It also adds a bunch of big niceties like

- You can source a theme from a git repo

- History for themes is much improved

- You can only have a single enabled theme. Themes can be selected by
    users, if you opt for it.

On a technical level this change comes with a whole bunch of goodies

- All CSS is now compiled using a custom pipeline that uses libsass
    see /lib/stylesheet

- There is a single pipeline for css compilation (in the past we used
    one for customizations and another one for the rest of the app

- The stylesheet pipeline is now divorced of sprockets, there is no
   reliance on sprockets for CSS bundling

- CSS is generated with source maps everywhere (including themes) this
    makes debugging much easier

- Our "live reloader" is smarter and avoid a flash of unstyled content
   we run a file watcher in "puma" in dev so you no longer need to run
   rake autospec to watch for CSS changes
2017-04-12 10:53:49 -04:00

100 lines
2.6 KiB
JavaScript

import DiscourseURL from 'discourse/lib/url';
export function refreshCSS(node, hash, newHref, options) {
let $orig = $(node);
if ($orig.data('reloading')) {
if (options && options.force) {
clearTimeout($orig.data('timeout'));
$orig.data("copy").remove();
} else {
return;
}
}
if (!$orig.data('orig')) {
$orig.data('orig', node.href);
}
$orig.data('reloading', true);
const orig = $(node).data('orig');
let reloaded = $orig.clone(true);
if (hash) {
reloaded[0].href = orig + (orig.indexOf('?') >= 0 ? "&hash=" : "?hash=") + hash;
} else {
reloaded[0].href = newHref;
}
$orig.after(reloaded);
let timeout = setTimeout(()=>{
$orig.remove();
reloaded.data('reloading', false);
}, 2000);
$orig.data("timeout", timeout);
$orig.data("copy", reloaded);
}
// Use the message bus for live reloading of components for faster development.
export default {
name: "live-development",
initialize(container) {
const messageBus = container.lookup('message-bus:main');
// subscribe to any site customizations that are loaded
$('link.custom-css').each(function() {
const split = this.href.split("/"),
id = split[split.length - 1].split(".css")[0],
self = this;
return messageBus.subscribe("/file-change/" + id, function(data) {
if (!$(self).data('orig')) {
$(self).data('orig', self.href);
}
const orig = $(self).data('orig');
self.href = orig.replace(/v=.*/, "v=" + data);
});
});
// Custom header changes
$('header.custom').each(function() {
const header = $(this);
return messageBus.subscribe("/header-change/" + $(this).data('key'), function(data) {
return header.html(data);
});
});
// Useful to export this for debugging purposes
if (Discourse.Environment === 'development' && !Ember.testing) {
window.DiscourseURL = DiscourseURL;
}
// Observe file changes
messageBus.subscribe("/file-change", function(data) {
if (Handlebars.compile && !Ember.TEMPLATES.empty) {
// hbs notifications only happen in dev
Ember.TEMPLATES.empty = Handlebars.compile("<div></div>");
}
_.each(data,function(me) {
if (me === "refresh") {
// Refresh if necessary
document.location.reload(true);
} else {
$('link').each(function() {
if (this.href.match(me.name) && (me.hash || me.new_href)) {
refreshCSS(this, me.hash, me.new_href);
}
});
}
});
});
}
};