Webpack
This commit is contained in:
parent
6466680a8e
commit
fb87bd3a58
@ -1,9 +1,8 @@
|
||||
# built by tools
|
||||
client/js/libs.min.js
|
||||
client/js/lounge.templates.js
|
||||
client/js/bundle.js
|
||||
client/js/bundle.vendor.js
|
||||
|
||||
# third party
|
||||
client/js/libs/jquery/*.js
|
||||
client/js/libs/*.js
|
||||
|
||||
coverage/
|
||||
|
@ -44,10 +44,5 @@ rules:
|
||||
|
||||
globals:
|
||||
log: false
|
||||
$: false
|
||||
Favico: false
|
||||
Handlebars: false
|
||||
io: false
|
||||
Mousetrap: false
|
||||
|
||||
extends: eslint:recommended
|
||||
|
7
.gitignore
vendored
7
.gitignore
vendored
@ -6,6 +6,7 @@ coverage/
|
||||
# Built assets created at npm install/prepublish time
|
||||
# See https://docs.npmjs.com/misc/scripts
|
||||
client/fonts/
|
||||
client/js/libs.min.js.map
|
||||
client/js/libs.min.js
|
||||
client/js/lounge.templates.js
|
||||
client/js/bundle.js
|
||||
client/js/bundle.js.map
|
||||
client/js/bundle.vendor.js
|
||||
client/js/bundle.vendor.js.map
|
||||
|
@ -1,8 +1,6 @@
|
||||
instrumentation:
|
||||
include-all-sources: true
|
||||
excludes:
|
||||
- Gruntfile.js
|
||||
- client/js/libs/*.js
|
||||
- client/js/libs/jquery/*.js
|
||||
- client/js/libs.min.js
|
||||
- client/js/bundle.js
|
||||
- client/js/bundle.vendor.js
|
||||
- client/js/lounge.js
|
||||
|
@ -2,6 +2,7 @@
|
||||
# npm-debug.log and node_modules/ are ignored by default.
|
||||
# See https://docs.npmjs.com/misc/developers#keeping-files-out-of-your-package
|
||||
|
||||
client/js/bundle.vendor.js.map
|
||||
client/views/
|
||||
coverage/
|
||||
scripts/
|
||||
@ -16,4 +17,3 @@ test/
|
||||
.stylelintrc
|
||||
.travis.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>
|
||||
</div>
|
||||
|
||||
<script src="socket.io/socket.io.js"></script>
|
||||
<script src="js/libs.min.js"></script>
|
||||
<script src="js/lounge.templates.js"></script>
|
||||
<script src="js/lounge.js"></script>
|
||||
<script src="js/bundle.vendor.js"></script>
|
||||
<script src="js/bundle.js"></script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
@ -1,13 +1,9 @@
|
||||
"use strict";
|
||||
|
||||
Handlebars.registerHelper(
|
||||
// Generates a string from "color-1" to "color-32" based on an input string
|
||||
"colorClass", function(str) {
|
||||
module.exports = function(str) {
|
||||
var hash = 0;
|
||||
for (var i = 0; i < str.length; i++) {
|
||||
hash += str.charCodeAt(i);
|
||||
}
|
||||
|
||||
return "color-" + (1 + hash % 32);
|
||||
}
|
||||
);
|
||||
};
|
||||
|
@ -1,14 +1,10 @@
|
||||
"use strict";
|
||||
|
||||
var diff;
|
||||
|
||||
Handlebars.registerHelper(
|
||||
"diff", function(a, opt) {
|
||||
module.exports = function(a, opt) {
|
||||
if (a !== diff) {
|
||||
diff = a;
|
||||
return opt.fn(this);
|
||||
}
|
||||
|
||||
return opt.inverse(this);
|
||||
}
|
||||
);
|
||||
};
|
||||
|
@ -1,7 +1,4 @@
|
||||
"use strict";
|
||||
|
||||
Handlebars.registerHelper(
|
||||
"equal", function(a, b, opt) {
|
||||
module.exports = function(a, b, opt) {
|
||||
a = a.toString();
|
||||
b = b.toString();
|
||||
if (a === b) {
|
||||
@ -9,5 +6,4 @@ Handlebars.registerHelper(
|
||||
}
|
||||
|
||||
return opt.inverse(this);
|
||||
}
|
||||
);
|
||||
};
|
||||
|
@ -1,5 +1,3 @@
|
||||
"use strict";
|
||||
|
||||
Handlebars.registerHelper("localedate", function(time) {
|
||||
module.exports = function(time) {
|
||||
return new Date(time).toLocaleDateString();
|
||||
});
|
||||
};
|
||||
|
@ -1,5 +1,3 @@
|
||||
"use strict";
|
||||
|
||||
Handlebars.registerHelper("localetime", function(time) {
|
||||
module.exports = function(time) {
|
||||
return new Date(time).toLocaleString();
|
||||
});
|
||||
};
|
||||
|
@ -1,7 +1,4 @@
|
||||
"use strict";
|
||||
|
||||
Handlebars.registerHelper(
|
||||
"modes", function(mode) {
|
||||
module.exports = function(mode) {
|
||||
var modes = {
|
||||
"~": "owner",
|
||||
"&": "admin",
|
||||
@ -12,5 +9,4 @@ Handlebars.registerHelper(
|
||||
"": "normal"
|
||||
};
|
||||
return modes[mode];
|
||||
}
|
||||
);
|
||||
};
|
||||
|
@ -1,17 +1,16 @@
|
||||
"use strict";
|
||||
import Handlebars from "handlebars/runtime";
|
||||
import URI from "urijs";
|
||||
|
||||
Handlebars.registerHelper(
|
||||
"parse", function(text) {
|
||||
module.exports = function(text) {
|
||||
text = Handlebars.Utils.escapeExpression(text);
|
||||
text = colors(text);
|
||||
text = channels(text);
|
||||
text = uri(text);
|
||||
return text;
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
function uri(text) {
|
||||
return window.URI.withinString(text, function(url) {
|
||||
return URI.withinString(text, function(url) {
|
||||
if (url.indexOf("javascript:") === 0) {
|
||||
return url;
|
||||
}
|
||||
|
@ -1,11 +1,7 @@
|
||||
"use strict";
|
||||
|
||||
Handlebars.registerHelper(
|
||||
"roundBadgeNumber", function(count) {
|
||||
module.exports = function(count) {
|
||||
if (count < 1000) {
|
||||
return count;
|
||||
}
|
||||
|
||||
return (count / 1000).toFixed(2).slice(0, -1) + "k";
|
||||
}
|
||||
);
|
||||
};
|
||||
|
@ -1,7 +1,3 @@
|
||||
"use strict";
|
||||
|
||||
Handlebars.registerHelper(
|
||||
"toJSON", function(context) {
|
||||
return JSON.stringify(context);
|
||||
}
|
||||
);
|
||||
module.exports = function(context) {
|
||||
return window.JSON.stringify(context);
|
||||
};
|
||||
|
@ -1,7 +1,4 @@
|
||||
"use strict";
|
||||
|
||||
Handlebars.registerHelper(
|
||||
"tz", function(time) {
|
||||
module.exports = function(time) {
|
||||
time = new Date(time);
|
||||
var h = time.getHours();
|
||||
var m = time.getMinutes();
|
||||
@ -15,5 +12,4 @@ Handlebars.registerHelper(
|
||||
}
|
||||
|
||||
return h + ":" + m;
|
||||
}
|
||||
);
|
||||
};
|
||||
|
@ -1,7 +1,3 @@
|
||||
"use strict";
|
||||
|
||||
Handlebars.registerHelper(
|
||||
"users", function(count) {
|
||||
module.exports = function(count) {
|
||||
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
|
||||
* 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($) {
|
||||
$.fn.unsticky = function() {
|
||||
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
|
||||
* http://github.com/erming/tabcomplete
|
||||
|
@ -1,7 +1,7 @@
|
||||
/**
|
||||
* Simple slideout menu implementation.
|
||||
*/
|
||||
function slideoutMenu(viewport, menu) {
|
||||
export default function slideoutMenu(viewport, menu) {
|
||||
var touchStartPos = null;
|
||||
var touchCurPos = null;
|
||||
var touchStartTime = 0;
|
||||
|
@ -1,3 +1,4 @@
|
||||
/* eslint strict: 0 */
|
||||
"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() {
|
||||
var path = window.location.pathname + "socket.io/";
|
||||
@ -59,10 +73,6 @@ $(function() {
|
||||
|
||||
var favicon = $("#favicon");
|
||||
|
||||
function render(name, data) {
|
||||
return Handlebars.templates[name](data);
|
||||
}
|
||||
|
||||
function setLocalStorageItem(key, value) {
|
||||
try {
|
||||
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_failed",
|
||||
@ -229,12 +233,12 @@ $(function() {
|
||||
var id = data.network;
|
||||
var network = sidebar.find("#network-" + id);
|
||||
network.append(
|
||||
render("chan", {
|
||||
templates.chan({
|
||||
channels: [data.chan]
|
||||
})
|
||||
);
|
||||
chat.append(
|
||||
render("chat", {
|
||||
templates.chat({
|
||||
channels: [data.chan]
|
||||
})
|
||||
);
|
||||
@ -284,15 +288,18 @@ $(function() {
|
||||
"ctcp",
|
||||
"channel_list",
|
||||
].indexOf(type) !== -1) {
|
||||
data.msg.template = "actions/" + type;
|
||||
template = "msg_action";
|
||||
} else if (type === "unhandled") {
|
||||
template = "msg_unhandled";
|
||||
}
|
||||
|
||||
var msg = $(render(template, data.msg));
|
||||
|
||||
var msg = $(templates[template](data.msg));
|
||||
var text = msg.find(".text");
|
||||
|
||||
if (template === "msg_action") {
|
||||
text.html(templates.actions[type](data.msg));
|
||||
}
|
||||
|
||||
if (text.find("i").size() === 1) {
|
||||
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
|
||||
if (!first.length) {
|
||||
channel.prepend(render("unread_marker"));
|
||||
channel.prepend(templates.unread_marker());
|
||||
} else {
|
||||
first.before(render("unread_marker"));
|
||||
first.before(templates.unread_marker());
|
||||
}
|
||||
} else {
|
||||
channel.append(render("unread_marker"));
|
||||
channel.append(templates.unread_marker());
|
||||
}
|
||||
|
||||
if (data.type !== "lobby") {
|
||||
@ -351,11 +358,11 @@ $(function() {
|
||||
// Top-most message in a channel
|
||||
if (!lastDate) {
|
||||
lastDate = msgDate;
|
||||
msg.before(render("date-marker", {msgDate: msgDate}));
|
||||
msg.before(templates.date_marker({msgDate: msgDate}));
|
||||
}
|
||||
|
||||
if (lastDate.toDateString() !== msgDate.toDateString()) {
|
||||
msg.before(render("date-marker", {msgDate: msgDate}));
|
||||
msg.before(templates.date_marker({msgDate: msgDate}));
|
||||
}
|
||||
|
||||
lastDate = msgDate;
|
||||
@ -383,13 +390,13 @@ $(function() {
|
||||
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) {
|
||||
sidebar.find(".empty").hide();
|
||||
sidebar.find(".networks").append(
|
||||
render("network", {
|
||||
templates.network({
|
||||
networks: data.networks
|
||||
})
|
||||
);
|
||||
@ -398,7 +405,7 @@ $(function() {
|
||||
return n.channels;
|
||||
});
|
||||
chat.append(
|
||||
render("chat", {
|
||||
templates.chat({
|
||||
channels: channels
|
||||
})
|
||||
);
|
||||
@ -424,11 +431,11 @@ $(function() {
|
||||
|
||||
// It's the first message in a channel/query
|
||||
if (prevMsg.length === 0) {
|
||||
container.append(render("date-marker", {msgDate: msgTime}));
|
||||
container.append(templates.date_marker({msgDate: msgTime}));
|
||||
}
|
||||
|
||||
if (prevMsgTime.toDateString() !== msgTime.toDateString()) {
|
||||
prevMsg.append(render("date-marker", {msgDate: msgTime}));
|
||||
prevMsg.append(templates.date_marker({msgDate: msgTime}));
|
||||
}
|
||||
|
||||
// Add message to the container
|
||||
@ -486,11 +493,11 @@ $(function() {
|
||||
// Top-most message in a channel
|
||||
if (!lastDate) {
|
||||
lastDate = msgDate;
|
||||
msg.before(render("date-marker", {msgDate: msgDate}));
|
||||
msg.before(templates.date_marker({msgDate: msgDate}));
|
||||
}
|
||||
|
||||
if (lastDate.toDateString() !== msgDate.toDateString()) {
|
||||
msg.before(render("date-marker", {msgDate: msgDate}));
|
||||
msg.before(templates.date_marker({msgDate: msgDate}));
|
||||
}
|
||||
|
||||
lastDate = msgDate;
|
||||
@ -551,7 +558,7 @@ $(function() {
|
||||
|
||||
socket.on("toggle", function(data) {
|
||||
var toggle = $("#toggle-" + data.id);
|
||||
toggle.parent().after(render("toggle", {toggle: data}));
|
||||
toggle.parent().after(templates.toggle({toggle: data}));
|
||||
switch (data.type) {
|
||||
case "link":
|
||||
if (options.links) {
|
||||
@ -569,7 +576,7 @@ $(function() {
|
||||
|
||||
socket.on("topic", function(data) {
|
||||
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
|
||||
topic.attr("title", data.topic);
|
||||
});
|
||||
@ -710,7 +717,7 @@ $(function() {
|
||||
}());
|
||||
|
||||
var viewport = $("#viewport");
|
||||
var sidebarSlide = window.slideoutMenu(viewport[0], sidebar[0]);
|
||||
var sidebarSlide = slideoutMenu(viewport[0], sidebar[0]);
|
||||
var contextMenuContainer = $("#context-menu-container");
|
||||
var contextMenu = $("#context-menu");
|
||||
|
||||
@ -758,19 +765,19 @@ $(function() {
|
||||
var output = "";
|
||||
|
||||
if (target.hasClass("user")) {
|
||||
output = render("contextmenu_item", {
|
||||
output = templates.contextmenu_item({
|
||||
class: "user",
|
||||
text: target.text(),
|
||||
data: target.data("name")
|
||||
});
|
||||
} else if (target.hasClass("chan")) {
|
||||
output = render("contextmenu_item", {
|
||||
output = templates.contextmenu_item({
|
||||
class: "chan",
|
||||
text: target.data("title"),
|
||||
data: target.data("target")
|
||||
});
|
||||
output += render("contextmenu_divider");
|
||||
output += render("contextmenu_item", {
|
||||
output += templates.contextmenu_divider();
|
||||
output += templates.contextmenu_item({
|
||||
class: "close",
|
||||
text: target.hasClass("lobby") ? "Disconnect" : target.hasClass("channel") ? "Leave" : "Close",
|
||||
data: target.data("target")
|
||||
@ -1178,7 +1185,7 @@ $(function() {
|
||||
return;
|
||||
}
|
||||
|
||||
var badge = button.find(".badge").html(Handlebars.helpers.roundBadgeNumber(unread));
|
||||
var badge = button.find(".badge").html(helpers_roundBadgeNumber(unread));
|
||||
|
||||
if (msg.highlight) {
|
||||
badge.addClass("highlight");
|
||||
@ -1226,7 +1233,7 @@ $(function() {
|
||||
});
|
||||
if ($("body").hasClass("public")) {
|
||||
$("#connect").one("show", function() {
|
||||
var params = window.URI(document.location.search);
|
||||
var params = URI(document.location.search);
|
||||
params = params.search(true);
|
||||
// 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
|
||||
|
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>
|
||||
</div>
|
||||
{{#if toggle}}
|
||||
{{partial "toggle"}}
|
||||
{{> toggle}}
|
||||
{{/if}}
|
||||
</span>
|
||||
{{else}}
|
||||
|
@ -3,7 +3,5 @@
|
||||
{{tz time}}
|
||||
</span>
|
||||
<span class="from"></span>
|
||||
<span class="text">
|
||||
{{partial template}}
|
||||
</span>
|
||||
<span class="text"></span>
|
||||
</div>
|
||||
|
@ -1,5 +1,5 @@
|
||||
{{#each networks}}
|
||||
<section id="network-{{id}}" class="network" data-id="{{id}}" data-nick="{{nick}}" data-options="{{toJSON serverOptions}}">
|
||||
{{partial "chan"}}
|
||||
<section id="network-{{id}}" class="network" data-id="{{id}}" data-nick="{{nick}}" data-options="{{tojson serverOptions}}">
|
||||
{{> chan}}
|
||||
</section>
|
||||
{{/each}}
|
||||
|
24
package.json
24
package.json
@ -14,16 +14,15 @@
|
||||
"scripts": {
|
||||
"coverage": "istanbul cover node_modules/mocha/bin/_mocha",
|
||||
"start": "node index",
|
||||
"start-dev": "npm-run-all --parallel watch start",
|
||||
"build": "npm-run-all build:*",
|
||||
"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:handlebars": "handlebars client/views/ -e tpl -f client/js/lounge.templates.js",
|
||||
"test": "npm-run-all -c test:mocha lint",
|
||||
"build:webpack": "webpack",
|
||||
"watch": "webpack -w",
|
||||
"test": "npm-run-all -c test:* lint",
|
||||
"test:mocha": "mocha",
|
||||
"lint": "npm-run-all -c lint:js lint:css",
|
||||
"lint:js": "npm-run-all -c lint:js:es5 lint:js:es6",
|
||||
"lint:js:es5": "eslint --parser-options=\"ecmaVersion:5\" client/",
|
||||
"lint:js:es6": "eslint --ignore-pattern client/ .",
|
||||
"lint": "npm-run-all -c lint:*",
|
||||
"lint:js": "eslint .",
|
||||
"lint:css": "stylelint \"**/*.css\"",
|
||||
"prepublish": "npm run build"
|
||||
},
|
||||
@ -59,14 +58,23 @@
|
||||
"ldapjs": "1.0.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"babel-core": "6.21.0",
|
||||
"babel-loader": "6.2.10",
|
||||
"babel-preset-es2015": "6.18.0",
|
||||
"chai": "3.5.0",
|
||||
"eslint": "3.12.2",
|
||||
"font-awesome": "4.7.0",
|
||||
"handlebars": "4.0.6",
|
||||
"handlebars-loader": "1.4.0",
|
||||
"istanbul": "0.4.5",
|
||||
"jquery": "2.1.1",
|
||||
"jquery-ui": "1.12.1",
|
||||
"mocha": "3.2.0",
|
||||
"mousetrap": "1.4.6",
|
||||
"npm-run-all": "3.1.2",
|
||||
"socket.io-client": "1.7.2",
|
||||
"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, {
|
||||
serveClient: false,
|
||||
transports: config.transports
|
||||
});
|
||||
|
||||
|
@ -1,15 +1,11 @@
|
||||
"use strict";
|
||||
|
||||
const Handlebars = global.Handlebars = require("handlebars");
|
||||
const expect = require("chai").expect;
|
||||
|
||||
require("../../../../../client/js/libs/handlebars/localetime");
|
||||
const localetime = require("../../../../../client/js/libs/handlebars/localetime");
|
||||
|
||||
describe("localetime Handlebars helper", () => {
|
||||
|
||||
it("should render a human-readable date", () => {
|
||||
const template = Handlebars.compile("{{localetime time}}");
|
||||
|
||||
// 12PM in UTC time
|
||||
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
|
||||
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