Webpack
This commit is contained in:
parent
6466680a8e
commit
fb87bd3a58
@ -1,9 +1,8 @@
|
|||||||
# built by tools
|
# built by tools
|
||||||
client/js/libs.min.js
|
client/js/bundle.js
|
||||||
client/js/lounge.templates.js
|
client/js/bundle.vendor.js
|
||||||
|
|
||||||
# third party
|
# third party
|
||||||
client/js/libs/jquery/*.js
|
client/js/libs/jquery/*.js
|
||||||
client/js/libs/*.js
|
|
||||||
|
|
||||||
coverage/
|
coverage/
|
||||||
|
@ -44,10 +44,5 @@ rules:
|
|||||||
|
|
||||||
globals:
|
globals:
|
||||||
log: false
|
log: false
|
||||||
$: false
|
|
||||||
Favico: false
|
|
||||||
Handlebars: false
|
|
||||||
io: false
|
|
||||||
Mousetrap: false
|
|
||||||
|
|
||||||
extends: eslint:recommended
|
extends: eslint:recommended
|
||||||
|
7
.gitignore
vendored
7
.gitignore
vendored
@ -6,6 +6,7 @@ coverage/
|
|||||||
# Built assets created at npm install/prepublish time
|
# Built assets created at npm install/prepublish time
|
||||||
# See https://docs.npmjs.com/misc/scripts
|
# See https://docs.npmjs.com/misc/scripts
|
||||||
client/fonts/
|
client/fonts/
|
||||||
client/js/libs.min.js.map
|
client/js/bundle.js
|
||||||
client/js/libs.min.js
|
client/js/bundle.js.map
|
||||||
client/js/lounge.templates.js
|
client/js/bundle.vendor.js
|
||||||
|
client/js/bundle.vendor.js.map
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
instrumentation:
|
instrumentation:
|
||||||
include-all-sources: true
|
include-all-sources: true
|
||||||
excludes:
|
excludes:
|
||||||
- Gruntfile.js
|
- client/js/bundle.js
|
||||||
- client/js/libs/*.js
|
- client/js/bundle.vendor.js
|
||||||
- client/js/libs/jquery/*.js
|
|
||||||
- client/js/libs.min.js
|
|
||||||
- client/js/lounge.js
|
- client/js/lounge.js
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
# npm-debug.log and node_modules/ are ignored by default.
|
# npm-debug.log and node_modules/ are ignored by default.
|
||||||
# See https://docs.npmjs.com/misc/developers#keeping-files-out-of-your-package
|
# See https://docs.npmjs.com/misc/developers#keeping-files-out-of-your-package
|
||||||
|
|
||||||
|
client/js/bundle.vendor.js.map
|
||||||
client/views/
|
client/views/
|
||||||
coverage/
|
coverage/
|
||||||
scripts/
|
scripts/
|
||||||
@ -16,4 +17,3 @@ test/
|
|||||||
.stylelintrc
|
.stylelintrc
|
||||||
.travis.yml
|
.travis.yml
|
||||||
appveyor.yml
|
appveyor.yml
|
||||||
Gruntfile.js
|
|
||||||
|
3
client/.eslintrc.yml
Normal file
3
client/.eslintrc.yml
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
---
|
||||||
|
parserOptions:
|
||||||
|
sourceType: module
|
@ -386,10 +386,8 @@
|
|||||||
<ul id="context-menu"></ul>
|
<ul id="context-menu"></ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script src="socket.io/socket.io.js"></script>
|
<script src="js/bundle.vendor.js"></script>
|
||||||
<script src="js/libs.min.js"></script>
|
<script src="js/bundle.js"></script>
|
||||||
<script src="js/lounge.templates.js"></script>
|
|
||||||
<script src="js/lounge.js"></script>
|
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -1,13 +1,9 @@
|
|||||||
"use strict";
|
|
||||||
|
|
||||||
Handlebars.registerHelper(
|
|
||||||
// Generates a string from "color-1" to "color-32" based on an input string
|
// Generates a string from "color-1" to "color-32" based on an input string
|
||||||
"colorClass", function(str) {
|
module.exports = function(str) {
|
||||||
var hash = 0;
|
var hash = 0;
|
||||||
for (var i = 0; i < str.length; i++) {
|
for (var i = 0; i < str.length; i++) {
|
||||||
hash += str.charCodeAt(i);
|
hash += str.charCodeAt(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
return "color-" + (1 + hash % 32);
|
return "color-" + (1 + hash % 32);
|
||||||
}
|
};
|
||||||
);
|
|
||||||
|
@ -1,14 +1,10 @@
|
|||||||
"use strict";
|
|
||||||
|
|
||||||
var diff;
|
var diff;
|
||||||
|
|
||||||
Handlebars.registerHelper(
|
module.exports = function(a, opt) {
|
||||||
"diff", function(a, opt) {
|
|
||||||
if (a !== diff) {
|
if (a !== diff) {
|
||||||
diff = a;
|
diff = a;
|
||||||
return opt.fn(this);
|
return opt.fn(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
return opt.inverse(this);
|
return opt.inverse(this);
|
||||||
}
|
};
|
||||||
);
|
|
||||||
|
@ -1,7 +1,4 @@
|
|||||||
"use strict";
|
module.exports = function(a, b, opt) {
|
||||||
|
|
||||||
Handlebars.registerHelper(
|
|
||||||
"equal", function(a, b, opt) {
|
|
||||||
a = a.toString();
|
a = a.toString();
|
||||||
b = b.toString();
|
b = b.toString();
|
||||||
if (a === b) {
|
if (a === b) {
|
||||||
@ -9,5 +6,4 @@ Handlebars.registerHelper(
|
|||||||
}
|
}
|
||||||
|
|
||||||
return opt.inverse(this);
|
return opt.inverse(this);
|
||||||
}
|
};
|
||||||
);
|
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
"use strict";
|
module.exports = function(time) {
|
||||||
|
|
||||||
Handlebars.registerHelper("localedate", function(time) {
|
|
||||||
return new Date(time).toLocaleDateString();
|
return new Date(time).toLocaleDateString();
|
||||||
});
|
};
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
"use strict";
|
module.exports = function(time) {
|
||||||
|
|
||||||
Handlebars.registerHelper("localetime", function(time) {
|
|
||||||
return new Date(time).toLocaleString();
|
return new Date(time).toLocaleString();
|
||||||
});
|
};
|
||||||
|
@ -1,7 +1,4 @@
|
|||||||
"use strict";
|
module.exports = function(mode) {
|
||||||
|
|
||||||
Handlebars.registerHelper(
|
|
||||||
"modes", function(mode) {
|
|
||||||
var modes = {
|
var modes = {
|
||||||
"~": "owner",
|
"~": "owner",
|
||||||
"&": "admin",
|
"&": "admin",
|
||||||
@ -12,5 +9,4 @@ Handlebars.registerHelper(
|
|||||||
"": "normal"
|
"": "normal"
|
||||||
};
|
};
|
||||||
return modes[mode];
|
return modes[mode];
|
||||||
}
|
};
|
||||||
);
|
|
||||||
|
@ -1,17 +1,16 @@
|
|||||||
"use strict";
|
import Handlebars from "handlebars/runtime";
|
||||||
|
import URI from "urijs";
|
||||||
|
|
||||||
Handlebars.registerHelper(
|
module.exports = function(text) {
|
||||||
"parse", function(text) {
|
|
||||||
text = Handlebars.Utils.escapeExpression(text);
|
text = Handlebars.Utils.escapeExpression(text);
|
||||||
text = colors(text);
|
text = colors(text);
|
||||||
text = channels(text);
|
text = channels(text);
|
||||||
text = uri(text);
|
text = uri(text);
|
||||||
return text;
|
return text;
|
||||||
}
|
};
|
||||||
);
|
|
||||||
|
|
||||||
function uri(text) {
|
function uri(text) {
|
||||||
return window.URI.withinString(text, function(url) {
|
return URI.withinString(text, function(url) {
|
||||||
if (url.indexOf("javascript:") === 0) {
|
if (url.indexOf("javascript:") === 0) {
|
||||||
return url;
|
return url;
|
||||||
}
|
}
|
||||||
|
@ -1,11 +1,7 @@
|
|||||||
"use strict";
|
module.exports = function(count) {
|
||||||
|
|
||||||
Handlebars.registerHelper(
|
|
||||||
"roundBadgeNumber", function(count) {
|
|
||||||
if (count < 1000) {
|
if (count < 1000) {
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (count / 1000).toFixed(2).slice(0, -1) + "k";
|
return (count / 1000).toFixed(2).slice(0, -1) + "k";
|
||||||
}
|
};
|
||||||
);
|
|
||||||
|
@ -1,7 +1,3 @@
|
|||||||
"use strict";
|
module.exports = function(context) {
|
||||||
|
return window.JSON.stringify(context);
|
||||||
Handlebars.registerHelper(
|
};
|
||||||
"toJSON", function(context) {
|
|
||||||
return JSON.stringify(context);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
@ -1,7 +1,4 @@
|
|||||||
"use strict";
|
module.exports = function(time) {
|
||||||
|
|
||||||
Handlebars.registerHelper(
|
|
||||||
"tz", function(time) {
|
|
||||||
time = new Date(time);
|
time = new Date(time);
|
||||||
var h = time.getHours();
|
var h = time.getHours();
|
||||||
var m = time.getMinutes();
|
var m = time.getMinutes();
|
||||||
@ -15,5 +12,4 @@ Handlebars.registerHelper(
|
|||||||
}
|
}
|
||||||
|
|
||||||
return h + ":" + m;
|
return h + ":" + m;
|
||||||
}
|
};
|
||||||
);
|
|
||||||
|
@ -1,7 +1,3 @@
|
|||||||
"use strict";
|
module.exports = function(count) {
|
||||||
|
|
||||||
Handlebars.registerHelper(
|
|
||||||
"users", function(count) {
|
|
||||||
return count + " " + (count === 1 ? "user" : "users");
|
return count + " " + (count === 1 ? "user" : "users");
|
||||||
}
|
};
|
||||||
);
|
|
||||||
|
2
client/js/libs/jquery/inputhistory.js
vendored
2
client/js/libs/jquery/inputhistory.js
vendored
@ -1,3 +1,5 @@
|
|||||||
|
import jQuery from "jquery";
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* inputhistory
|
* inputhistory
|
||||||
* https://github.com/erming/inputhistory
|
* https://github.com/erming/inputhistory
|
||||||
|
2
client/js/libs/jquery/stickyscroll.js
vendored
2
client/js/libs/jquery/stickyscroll.js
vendored
@ -1,3 +1,5 @@
|
|||||||
|
import jQuery from "jquery";
|
||||||
|
|
||||||
(function($) {
|
(function($) {
|
||||||
$.fn.unsticky = function() {
|
$.fn.unsticky = function() {
|
||||||
return this.trigger("unstick.sticky").unbind(".sticky");
|
return this.trigger("unstick.sticky").unbind(".sticky");
|
||||||
|
2
client/js/libs/jquery/tabcomplete.js
vendored
2
client/js/libs/jquery/tabcomplete.js
vendored
@ -1,3 +1,5 @@
|
|||||||
|
import jQuery from "jquery";
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* tabcomplete
|
* tabcomplete
|
||||||
* http://github.com/erming/tabcomplete
|
* http://github.com/erming/tabcomplete
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* Simple slideout menu implementation.
|
* Simple slideout menu implementation.
|
||||||
*/
|
*/
|
||||||
function slideoutMenu(viewport, menu) {
|
export default function slideoutMenu(viewport, menu) {
|
||||||
var touchStartPos = null;
|
var touchStartPos = null;
|
||||||
var touchCurPos = null;
|
var touchCurPos = null;
|
||||||
var touchStartTime = 0;
|
var touchStartTime = 0;
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
/* eslint strict: 0 */
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1,4 +1,18 @@
|
|||||||
"use strict";
|
// vendor libraries
|
||||||
|
import "jquery-ui/ui/widgets/sortable";
|
||||||
|
import $ from "jquery";
|
||||||
|
import io from "socket.io-client";
|
||||||
|
import Mousetrap from "mousetrap";
|
||||||
|
import URI from "urijs";
|
||||||
|
|
||||||
|
// our libraries
|
||||||
|
import "./libs/jquery/inputhistory";
|
||||||
|
import "./libs/jquery/stickyscroll";
|
||||||
|
import "./libs/jquery/tabcomplete";
|
||||||
|
import helpers_parse from "./libs/handlebars/parse";
|
||||||
|
import helpers_roundBadgeNumber from "./libs/handlebars/roundBadgeNumber";
|
||||||
|
import slideoutMenu from "./libs/slideout";
|
||||||
|
import templates from "../views";
|
||||||
|
|
||||||
$(function() {
|
$(function() {
|
||||||
var path = window.location.pathname + "socket.io/";
|
var path = window.location.pathname + "socket.io/";
|
||||||
@ -59,10 +73,6 @@ $(function() {
|
|||||||
|
|
||||||
var favicon = $("#favicon");
|
var favicon = $("#favicon");
|
||||||
|
|
||||||
function render(name, data) {
|
|
||||||
return Handlebars.templates[name](data);
|
|
||||||
}
|
|
||||||
|
|
||||||
function setLocalStorageItem(key, value) {
|
function setLocalStorageItem(key, value) {
|
||||||
try {
|
try {
|
||||||
window.localStorage.setItem(key, value);
|
window.localStorage.setItem(key, value);
|
||||||
@ -73,12 +83,6 @@ $(function() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Handlebars.registerHelper(
|
|
||||||
"partial", function(id) {
|
|
||||||
return new Handlebars.SafeString(render(id, this));
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
[
|
[
|
||||||
"connect_error",
|
"connect_error",
|
||||||
"connect_failed",
|
"connect_failed",
|
||||||
@ -229,12 +233,12 @@ $(function() {
|
|||||||
var id = data.network;
|
var id = data.network;
|
||||||
var network = sidebar.find("#network-" + id);
|
var network = sidebar.find("#network-" + id);
|
||||||
network.append(
|
network.append(
|
||||||
render("chan", {
|
templates.chan({
|
||||||
channels: [data.chan]
|
channels: [data.chan]
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
chat.append(
|
chat.append(
|
||||||
render("chat", {
|
templates.chat({
|
||||||
channels: [data.chan]
|
channels: [data.chan]
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
@ -284,15 +288,18 @@ $(function() {
|
|||||||
"ctcp",
|
"ctcp",
|
||||||
"channel_list",
|
"channel_list",
|
||||||
].indexOf(type) !== -1) {
|
].indexOf(type) !== -1) {
|
||||||
data.msg.template = "actions/" + type;
|
|
||||||
template = "msg_action";
|
template = "msg_action";
|
||||||
} else if (type === "unhandled") {
|
} else if (type === "unhandled") {
|
||||||
template = "msg_unhandled";
|
template = "msg_unhandled";
|
||||||
}
|
}
|
||||||
|
|
||||||
var msg = $(render(template, data.msg));
|
var msg = $(templates[template](data.msg));
|
||||||
|
|
||||||
var text = msg.find(".text");
|
var text = msg.find(".text");
|
||||||
|
|
||||||
|
if (template === "msg_action") {
|
||||||
|
text.html(templates.actions[type](data.msg));
|
||||||
|
}
|
||||||
|
|
||||||
if (text.find("i").size() === 1) {
|
if (text.find("i").size() === 1) {
|
||||||
text = text.find("i");
|
text = text.find("i");
|
||||||
}
|
}
|
||||||
@ -334,12 +341,12 @@ $(function() {
|
|||||||
|
|
||||||
// TODO: If the message is far off in the history, we still need to append the marker into DOM
|
// TODO: If the message is far off in the history, we still need to append the marker into DOM
|
||||||
if (!first.length) {
|
if (!first.length) {
|
||||||
channel.prepend(render("unread_marker"));
|
channel.prepend(templates.unread_marker());
|
||||||
} else {
|
} else {
|
||||||
first.before(render("unread_marker"));
|
first.before(templates.unread_marker());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
channel.append(render("unread_marker"));
|
channel.append(templates.unread_marker());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data.type !== "lobby") {
|
if (data.type !== "lobby") {
|
||||||
@ -351,11 +358,11 @@ $(function() {
|
|||||||
// Top-most message in a channel
|
// Top-most message in a channel
|
||||||
if (!lastDate) {
|
if (!lastDate) {
|
||||||
lastDate = msgDate;
|
lastDate = msgDate;
|
||||||
msg.before(render("date-marker", {msgDate: msgDate}));
|
msg.before(templates.date_marker({msgDate: msgDate}));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lastDate.toDateString() !== msgDate.toDateString()) {
|
if (lastDate.toDateString() !== msgDate.toDateString()) {
|
||||||
msg.before(render("date-marker", {msgDate: msgDate}));
|
msg.before(templates.date_marker({msgDate: msgDate}));
|
||||||
}
|
}
|
||||||
|
|
||||||
lastDate = msgDate;
|
lastDate = msgDate;
|
||||||
@ -383,13 +390,13 @@ $(function() {
|
|||||||
return (oldSortOrder[a] || Number.MAX_VALUE) - (oldSortOrder[b] || Number.MAX_VALUE);
|
return (oldSortOrder[a] || Number.MAX_VALUE) - (oldSortOrder[b] || Number.MAX_VALUE);
|
||||||
});
|
});
|
||||||
|
|
||||||
users.html(render("user", data)).data("nicks", nicks);
|
users.html(templates.user(data)).data("nicks", nicks);
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderNetworks(data) {
|
function renderNetworks(data) {
|
||||||
sidebar.find(".empty").hide();
|
sidebar.find(".empty").hide();
|
||||||
sidebar.find(".networks").append(
|
sidebar.find(".networks").append(
|
||||||
render("network", {
|
templates.network({
|
||||||
networks: data.networks
|
networks: data.networks
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
@ -398,7 +405,7 @@ $(function() {
|
|||||||
return n.channels;
|
return n.channels;
|
||||||
});
|
});
|
||||||
chat.append(
|
chat.append(
|
||||||
render("chat", {
|
templates.chat({
|
||||||
channels: channels
|
channels: channels
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
@ -424,11 +431,11 @@ $(function() {
|
|||||||
|
|
||||||
// It's the first message in a channel/query
|
// It's the first message in a channel/query
|
||||||
if (prevMsg.length === 0) {
|
if (prevMsg.length === 0) {
|
||||||
container.append(render("date-marker", {msgDate: msgTime}));
|
container.append(templates.date_marker({msgDate: msgTime}));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (prevMsgTime.toDateString() !== msgTime.toDateString()) {
|
if (prevMsgTime.toDateString() !== msgTime.toDateString()) {
|
||||||
prevMsg.append(render("date-marker", {msgDate: msgTime}));
|
prevMsg.append(templates.date_marker({msgDate: msgTime}));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add message to the container
|
// Add message to the container
|
||||||
@ -486,11 +493,11 @@ $(function() {
|
|||||||
// Top-most message in a channel
|
// Top-most message in a channel
|
||||||
if (!lastDate) {
|
if (!lastDate) {
|
||||||
lastDate = msgDate;
|
lastDate = msgDate;
|
||||||
msg.before(render("date-marker", {msgDate: msgDate}));
|
msg.before(templates.date_marker({msgDate: msgDate}));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lastDate.toDateString() !== msgDate.toDateString()) {
|
if (lastDate.toDateString() !== msgDate.toDateString()) {
|
||||||
msg.before(render("date-marker", {msgDate: msgDate}));
|
msg.before(templates.date_marker({msgDate: msgDate}));
|
||||||
}
|
}
|
||||||
|
|
||||||
lastDate = msgDate;
|
lastDate = msgDate;
|
||||||
@ -551,7 +558,7 @@ $(function() {
|
|||||||
|
|
||||||
socket.on("toggle", function(data) {
|
socket.on("toggle", function(data) {
|
||||||
var toggle = $("#toggle-" + data.id);
|
var toggle = $("#toggle-" + data.id);
|
||||||
toggle.parent().after(render("toggle", {toggle: data}));
|
toggle.parent().after(templates.toggle({toggle: data}));
|
||||||
switch (data.type) {
|
switch (data.type) {
|
||||||
case "link":
|
case "link":
|
||||||
if (options.links) {
|
if (options.links) {
|
||||||
@ -569,7 +576,7 @@ $(function() {
|
|||||||
|
|
||||||
socket.on("topic", function(data) {
|
socket.on("topic", function(data) {
|
||||||
var topic = $("#chan-" + data.chan).find(".header .topic");
|
var topic = $("#chan-" + data.chan).find(".header .topic");
|
||||||
topic.html(Handlebars.helpers.parse(data.topic));
|
topic.html(helpers_parse(data.topic));
|
||||||
// .attr() is safe escape-wise but consider the capabilities of the attribute
|
// .attr() is safe escape-wise but consider the capabilities of the attribute
|
||||||
topic.attr("title", data.topic);
|
topic.attr("title", data.topic);
|
||||||
});
|
});
|
||||||
@ -710,7 +717,7 @@ $(function() {
|
|||||||
}());
|
}());
|
||||||
|
|
||||||
var viewport = $("#viewport");
|
var viewport = $("#viewport");
|
||||||
var sidebarSlide = window.slideoutMenu(viewport[0], sidebar[0]);
|
var sidebarSlide = slideoutMenu(viewport[0], sidebar[0]);
|
||||||
var contextMenuContainer = $("#context-menu-container");
|
var contextMenuContainer = $("#context-menu-container");
|
||||||
var contextMenu = $("#context-menu");
|
var contextMenu = $("#context-menu");
|
||||||
|
|
||||||
@ -758,19 +765,19 @@ $(function() {
|
|||||||
var output = "";
|
var output = "";
|
||||||
|
|
||||||
if (target.hasClass("user")) {
|
if (target.hasClass("user")) {
|
||||||
output = render("contextmenu_item", {
|
output = templates.contextmenu_item({
|
||||||
class: "user",
|
class: "user",
|
||||||
text: target.text(),
|
text: target.text(),
|
||||||
data: target.data("name")
|
data: target.data("name")
|
||||||
});
|
});
|
||||||
} else if (target.hasClass("chan")) {
|
} else if (target.hasClass("chan")) {
|
||||||
output = render("contextmenu_item", {
|
output = templates.contextmenu_item({
|
||||||
class: "chan",
|
class: "chan",
|
||||||
text: target.data("title"),
|
text: target.data("title"),
|
||||||
data: target.data("target")
|
data: target.data("target")
|
||||||
});
|
});
|
||||||
output += render("contextmenu_divider");
|
output += templates.contextmenu_divider();
|
||||||
output += render("contextmenu_item", {
|
output += templates.contextmenu_item({
|
||||||
class: "close",
|
class: "close",
|
||||||
text: target.hasClass("lobby") ? "Disconnect" : target.hasClass("channel") ? "Leave" : "Close",
|
text: target.hasClass("lobby") ? "Disconnect" : target.hasClass("channel") ? "Leave" : "Close",
|
||||||
data: target.data("target")
|
data: target.data("target")
|
||||||
@ -1178,7 +1185,7 @@ $(function() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var badge = button.find(".badge").html(Handlebars.helpers.roundBadgeNumber(unread));
|
var badge = button.find(".badge").html(helpers_roundBadgeNumber(unread));
|
||||||
|
|
||||||
if (msg.highlight) {
|
if (msg.highlight) {
|
||||||
badge.addClass("highlight");
|
badge.addClass("highlight");
|
||||||
@ -1226,7 +1233,7 @@ $(function() {
|
|||||||
});
|
});
|
||||||
if ($("body").hasClass("public")) {
|
if ($("body").hasClass("public")) {
|
||||||
$("#connect").one("show", function() {
|
$("#connect").one("show", function() {
|
||||||
var params = window.URI(document.location.search);
|
var params = URI(document.location.search);
|
||||||
params = params.search(true);
|
params = params.search(true);
|
||||||
// Possible parameters: name, host, port, password, tls, nick, username, realname, join
|
// Possible parameters: name, host, port, password, tls, nick, username, realname, join
|
||||||
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in#Iterating_over_own_properties_only
|
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in#Iterating_over_own_properties_only
|
||||||
|
30
client/views/index.js
Normal file
30
client/views/index.js
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
module.exports = {
|
||||||
|
actions: {
|
||||||
|
action: require("./actions/action.tpl"),
|
||||||
|
channel_list: require("./actions/channel_list.tpl"),
|
||||||
|
ctcp: require("./actions/ctcp.tpl"),
|
||||||
|
invite: require("./actions/invite.tpl"),
|
||||||
|
join: require("./actions/join.tpl"),
|
||||||
|
kick: require("./actions/kick.tpl"),
|
||||||
|
mode: require("./actions/mode.tpl"),
|
||||||
|
nick: require("./actions/nick.tpl"),
|
||||||
|
part: require("./actions/part.tpl"),
|
||||||
|
quit: require("./actions/quit.tpl"),
|
||||||
|
topic: require("./actions/topic.tpl"),
|
||||||
|
topic_set_by: require("./actions/topic_set_by.tpl"),
|
||||||
|
whois: require("./actions/whois.tpl"),
|
||||||
|
},
|
||||||
|
|
||||||
|
chan: require("./chan.tpl"),
|
||||||
|
chat: require("./chat.tpl"),
|
||||||
|
contextmenu_divider: require("./contextmenu_divider.tpl"),
|
||||||
|
contextmenu_item: require("./contextmenu_item.tpl"),
|
||||||
|
date_marker: require("./date-marker.tpl"),
|
||||||
|
msg: require("./msg.tpl"),
|
||||||
|
msg_action: require("./msg_action.tpl"),
|
||||||
|
msg_unhandled: require("./msg_unhandled.tpl"),
|
||||||
|
network: require("./network.tpl"),
|
||||||
|
toggle: require("./toggle.tpl"),
|
||||||
|
unread_marker: require("./unread_marker.tpl"),
|
||||||
|
user: require("./user.tpl"),
|
||||||
|
};
|
@ -13,7 +13,7 @@
|
|||||||
<button id="toggle-{{id}}" class="toggle-button" aria-label="Toggle prefetched media">···</button>
|
<button id="toggle-{{id}}" class="toggle-button" aria-label="Toggle prefetched media">···</button>
|
||||||
</div>
|
</div>
|
||||||
{{#if toggle}}
|
{{#if toggle}}
|
||||||
{{partial "toggle"}}
|
{{> toggle}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</span>
|
</span>
|
||||||
{{else}}
|
{{else}}
|
||||||
|
@ -3,7 +3,5 @@
|
|||||||
{{tz time}}
|
{{tz time}}
|
||||||
</span>
|
</span>
|
||||||
<span class="from"></span>
|
<span class="from"></span>
|
||||||
<span class="text">
|
<span class="text"></span>
|
||||||
{{partial template}}
|
|
||||||
</span>
|
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
{{#each networks}}
|
{{#each networks}}
|
||||||
<section id="network-{{id}}" class="network" data-id="{{id}}" data-nick="{{nick}}" data-options="{{toJSON serverOptions}}">
|
<section id="network-{{id}}" class="network" data-id="{{id}}" data-nick="{{nick}}" data-options="{{tojson serverOptions}}">
|
||||||
{{partial "chan"}}
|
{{> chan}}
|
||||||
</section>
|
</section>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
|
24
package.json
24
package.json
@ -14,16 +14,15 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"coverage": "istanbul cover node_modules/mocha/bin/_mocha",
|
"coverage": "istanbul cover node_modules/mocha/bin/_mocha",
|
||||||
"start": "node index",
|
"start": "node index",
|
||||||
|
"start-dev": "npm-run-all --parallel watch start",
|
||||||
"build": "npm-run-all build:*",
|
"build": "npm-run-all build:*",
|
||||||
"build:font-awesome": "node scripts/build-fontawesome.js",
|
"build:font-awesome": "node scripts/build-fontawesome.js",
|
||||||
"build:libs": "uglifyjs client/js/libs/*.js client/js/libs/jquery/*.js client/js/libs/handlebars/*.js -o client/js/libs.min.js --source-map client/js/libs.min.js.map --source-map-url libs.min.js.map -p relative",
|
"build:webpack": "webpack",
|
||||||
"build:handlebars": "handlebars client/views/ -e tpl -f client/js/lounge.templates.js",
|
"watch": "webpack -w",
|
||||||
"test": "npm-run-all -c test:mocha lint",
|
"test": "npm-run-all -c test:* lint",
|
||||||
"test:mocha": "mocha",
|
"test:mocha": "mocha",
|
||||||
"lint": "npm-run-all -c lint:js lint:css",
|
"lint": "npm-run-all -c lint:*",
|
||||||
"lint:js": "npm-run-all -c lint:js:es5 lint:js:es6",
|
"lint:js": "eslint .",
|
||||||
"lint:js:es5": "eslint --parser-options=\"ecmaVersion:5\" client/",
|
|
||||||
"lint:js:es6": "eslint --ignore-pattern client/ .",
|
|
||||||
"lint:css": "stylelint \"**/*.css\"",
|
"lint:css": "stylelint \"**/*.css\"",
|
||||||
"prepublish": "npm run build"
|
"prepublish": "npm run build"
|
||||||
},
|
},
|
||||||
@ -59,14 +58,23 @@
|
|||||||
"ldapjs": "1.0.1"
|
"ldapjs": "1.0.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"babel-core": "6.21.0",
|
||||||
|
"babel-loader": "6.2.10",
|
||||||
|
"babel-preset-es2015": "6.18.0",
|
||||||
"chai": "3.5.0",
|
"chai": "3.5.0",
|
||||||
"eslint": "3.12.2",
|
"eslint": "3.12.2",
|
||||||
"font-awesome": "4.7.0",
|
"font-awesome": "4.7.0",
|
||||||
"handlebars": "4.0.6",
|
"handlebars": "4.0.6",
|
||||||
|
"handlebars-loader": "1.4.0",
|
||||||
"istanbul": "0.4.5",
|
"istanbul": "0.4.5",
|
||||||
|
"jquery": "2.1.1",
|
||||||
|
"jquery-ui": "1.12.1",
|
||||||
"mocha": "3.2.0",
|
"mocha": "3.2.0",
|
||||||
|
"mousetrap": "1.4.6",
|
||||||
"npm-run-all": "3.1.2",
|
"npm-run-all": "3.1.2",
|
||||||
|
"socket.io-client": "1.7.2",
|
||||||
"stylelint": "7.7.0",
|
"stylelint": "7.7.0",
|
||||||
"uglify-js": "2.7.5"
|
"urijs": "1.16.1",
|
||||||
|
"webpack": "1.14.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -64,6 +64,7 @@ module.exports = function() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var sockets = io(server, {
|
var sockets = io(server, {
|
||||||
|
serveClient: false,
|
||||||
transports: config.transports
|
transports: config.transports
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -1,15 +1,11 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
const Handlebars = global.Handlebars = require("handlebars");
|
|
||||||
const expect = require("chai").expect;
|
const expect = require("chai").expect;
|
||||||
|
const localetime = require("../../../../../client/js/libs/handlebars/localetime");
|
||||||
require("../../../../../client/js/libs/handlebars/localetime");
|
|
||||||
|
|
||||||
describe("localetime Handlebars helper", () => {
|
describe("localetime Handlebars helper", () => {
|
||||||
|
|
||||||
it("should render a human-readable date", () => {
|
it("should render a human-readable date", () => {
|
||||||
const template = Handlebars.compile("{{localetime time}}");
|
|
||||||
|
|
||||||
// 12PM in UTC time
|
// 12PM in UTC time
|
||||||
const date = new Date("2014-05-22T12:00:00");
|
const date = new Date("2014-05-22T12:00:00");
|
||||||
|
|
||||||
@ -19,7 +15,7 @@ describe("localetime Handlebars helper", () => {
|
|||||||
// Pretend local timezone is UTC by moving the clock of that offset
|
// Pretend local timezone is UTC by moving the clock of that offset
|
||||||
const time = date.getTime() + offset;
|
const time = date.getTime() + offset;
|
||||||
|
|
||||||
expect(template({time: time})).to.equal("5/22/2014, 12:00:00 PM");
|
expect(localetime(time)).to.equal("5/22/2014, 12:00:00 PM");
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
66
webpack.config.js
Normal file
66
webpack.config.js
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
const webpack = require("webpack");
|
||||||
|
const path = require("path");
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
entry: {
|
||||||
|
app: path.resolve(__dirname, "client/js/lounge.js"),
|
||||||
|
vendor: [
|
||||||
|
"handlebars/runtime",
|
||||||
|
"jquery",
|
||||||
|
"jquery-ui/ui/widgets/sortable",
|
||||||
|
"mousetrap",
|
||||||
|
"socket.io-client",
|
||||||
|
"urijs",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
devtool: "source-map",
|
||||||
|
output: {
|
||||||
|
path: path.resolve(__dirname, "client/js"),
|
||||||
|
filename: "bundle.js",
|
||||||
|
publicPath: "/"
|
||||||
|
},
|
||||||
|
module: {
|
||||||
|
loaders: [
|
||||||
|
{
|
||||||
|
test: /\.js$/,
|
||||||
|
include: [
|
||||||
|
path.resolve(__dirname, "client"),
|
||||||
|
],
|
||||||
|
loader: "babel",
|
||||||
|
query: {
|
||||||
|
presets: [
|
||||||
|
"es2015"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.tpl$/,
|
||||||
|
include: [
|
||||||
|
path.resolve(__dirname, "client/views"),
|
||||||
|
],
|
||||||
|
loader: "handlebars-loader",
|
||||||
|
query: {
|
||||||
|
helperDirs: [
|
||||||
|
path.resolve(__dirname, "client/js/libs/handlebars")
|
||||||
|
],
|
||||||
|
extensions: [
|
||||||
|
".tpl"
|
||||||
|
],
|
||||||
|
}
|
||||||
|
},
|
||||||
|
]
|
||||||
|
},
|
||||||
|
plugins: [
|
||||||
|
new webpack.optimize.CommonsChunkPlugin(
|
||||||
|
"vendor", // chunkName
|
||||||
|
"bundle.vendor.js" // filename
|
||||||
|
),
|
||||||
|
new webpack.optimize.UglifyJsPlugin({
|
||||||
|
compress: {
|
||||||
|
warnings: false
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
]
|
||||||
|
};
|
Loading…
Reference in New Issue
Block a user