2020-05-09 14:45:23 +00:00
|
|
|
const buildUtils = require("./buildutils");
|
|
|
|
const fs = require("fs");
|
|
|
|
const path = require("path");
|
|
|
|
const crypto = require("crypto");
|
|
|
|
|
|
|
|
function computeIntegrityHash(fullPath, algorithm = "sha256") {
|
|
|
|
const file = fs.readFileSync(fullPath);
|
|
|
|
const hash = crypto.createHash(algorithm).update(file).digest("base64");
|
|
|
|
return algorithm + "-" + hash;
|
|
|
|
}
|
|
|
|
|
|
|
|
function gulptasksHTML($, gulp, buildFolder, browserSync) {
|
|
|
|
const commitHash = buildUtils.getRevision();
|
|
|
|
async function buildHtml(
|
|
|
|
apiUrl,
|
2020-05-12 18:06:50 +00:00
|
|
|
{ analytics = false, standalone = false, app = false, integrity = true, enableCachebust = true }
|
2020-05-09 14:45:23 +00:00
|
|
|
) {
|
|
|
|
function cachebust(url) {
|
|
|
|
if (enableCachebust) {
|
|
|
|
return buildUtils.cachebust(url, commitHash);
|
|
|
|
}
|
|
|
|
return url;
|
|
|
|
}
|
|
|
|
|
|
|
|
const hasLocalFiles = standalone || app;
|
|
|
|
|
|
|
|
return gulp
|
|
|
|
.src("../src/html/" + (standalone ? "index.standalone.html" : "index.html"))
|
|
|
|
.pipe(
|
|
|
|
$.dom(function () {
|
|
|
|
// @ts-ignore
|
|
|
|
const document = /** @type {Document} */ (this);
|
|
|
|
|
|
|
|
// Preconnect to api
|
|
|
|
const prefetchLink = document.createElement("link");
|
|
|
|
prefetchLink.rel = "preconnect";
|
|
|
|
prefetchLink.href = apiUrl;
|
|
|
|
prefetchLink.setAttribute("crossorigin", "anonymous");
|
|
|
|
document.head.appendChild(prefetchLink);
|
|
|
|
|
|
|
|
// // Append css preload
|
|
|
|
// const cssPreload = document.createElement("link");
|
|
|
|
// cssPreload.rel = "preload";
|
|
|
|
// cssPreload.href = cachebust("main.css");
|
|
|
|
// cssPreload.setAttribute("as", "style");
|
|
|
|
// document.head.appendChild(cssPreload);
|
|
|
|
// document.head.appendChild(prefetchLink);
|
|
|
|
|
|
|
|
// // Append js preload
|
|
|
|
// const jsPreload = document.createElement("link");
|
|
|
|
// jsPreload.rel = "preload";
|
|
|
|
// jsPreload.href = cachebust("bundle.js");
|
|
|
|
// jsPreload.setAttribute("as", "script");
|
|
|
|
// document.head.appendChild(jsPreload);
|
|
|
|
|
|
|
|
// Append css
|
|
|
|
const css = document.createElement("link");
|
|
|
|
css.rel = "stylesheet";
|
|
|
|
css.type = "text/css";
|
|
|
|
css.media = "none";
|
|
|
|
css.setAttribute("onload", "this.media='all'");
|
|
|
|
css.href = cachebust("main.css");
|
|
|
|
if (integrity) {
|
|
|
|
css.setAttribute(
|
|
|
|
"integrity",
|
|
|
|
computeIntegrityHash(path.join(buildFolder, "main.css"))
|
|
|
|
);
|
|
|
|
}
|
|
|
|
document.head.appendChild(css);
|
|
|
|
|
|
|
|
if (analytics) {
|
|
|
|
// Logrocket
|
|
|
|
// const logrocketScript = document.createElement("script");
|
|
|
|
// logrocketScript.src = "https://cdn.lr-ingest.io/LogRocket.min.js";
|
|
|
|
// logrocketScript.setAttribute("crossorigin", "anonymous");
|
|
|
|
// document.head.appendChild(logrocketScript);
|
|
|
|
// const logrocketInit = document.createElement("script");
|
|
|
|
// logrocketInit.textContent = "window.LogRocket && window.LogRocket.init('TODO: GET LOGROCKET ID');";
|
|
|
|
// document.head.appendChild(logrocketInit);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (app) {
|
|
|
|
// Append cordova link
|
|
|
|
const cdv = document.createElement("script");
|
|
|
|
cdv.src = "cordova.js";
|
|
|
|
cdv.type = "text/javascript";
|
|
|
|
document.head.appendChild(cdv);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Google analytics
|
|
|
|
if (analytics) {
|
|
|
|
const tagManagerScript = document.createElement("script");
|
|
|
|
tagManagerScript.src = "https://www.googletagmanager.com/gtag/js?id=UA-165342524-1";
|
|
|
|
tagManagerScript.setAttribute("async", "");
|
|
|
|
document.head.appendChild(tagManagerScript);
|
|
|
|
|
|
|
|
const initScript = document.createElement("script");
|
|
|
|
initScript.textContent = `
|
2020-06-01 18:18:50 +00:00
|
|
|
window.dataLayer = window.dataLayer || [];
|
|
|
|
function gtag(){dataLayer.push(arguments);}
|
|
|
|
gtag('js', new Date());
|
|
|
|
gtag('config', 'UA-165342524-1', { anonymize_ip: true });
|
2020-05-09 14:45:23 +00:00
|
|
|
`;
|
|
|
|
document.head.appendChild(initScript);
|
2020-06-01 18:18:50 +00:00
|
|
|
|
|
|
|
const abTestingScript = document.createElement("script");
|
|
|
|
abTestingScript.setAttribute(
|
|
|
|
"src",
|
|
|
|
"https://www.googleoptimize.com/optimize.js?id=OPT-M5NHCV7"
|
|
|
|
);
|
|
|
|
abTestingScript.setAttribute("async", "");
|
|
|
|
document.head.appendChild(abTestingScript);
|
2020-05-09 14:45:23 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Do not need to preload in app or standalone
|
|
|
|
if (!hasLocalFiles) {
|
|
|
|
// Preload images
|
|
|
|
const images = buildUtils.getAllResourceImages();
|
|
|
|
|
|
|
|
// Preload essentials
|
2020-05-11 11:11:07 +00:00
|
|
|
const preloads = ["fonts/GameFont.woff2"];
|
2020-05-09 14:45:23 +00:00
|
|
|
|
|
|
|
// for (let i = 0; i < images.length; ++i) {
|
|
|
|
// if (preloads.indexOf(images[i]) < 0) {
|
|
|
|
// preloads.push(images[i]);
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
|
|
|
|
preloads.forEach(src => {
|
|
|
|
const preloadLink = document.createElement("link");
|
|
|
|
preloadLink.rel = "preload";
|
|
|
|
preloadLink.href = cachebust("res/" + src);
|
|
|
|
if (src.endsWith(".woff2")) {
|
|
|
|
preloadLink.setAttribute("crossorigin", "anonymous");
|
|
|
|
preloadLink.setAttribute("as", "font");
|
|
|
|
} else {
|
|
|
|
preloadLink.setAttribute("as", "image");
|
|
|
|
}
|
|
|
|
document.head.appendChild(preloadLink);
|
|
|
|
});
|
|
|
|
|
|
|
|
// Sound preloads
|
|
|
|
// const sounds = buildUtils.getAllSounds();
|
|
|
|
// sounds.forEach((src) => {
|
|
|
|
|
|
|
|
// if (src.indexOf("sounds/music/") >= 0) {
|
|
|
|
// // skip music
|
|
|
|
// return;
|
|
|
|
// }
|
|
|
|
|
|
|
|
// const preloadLink = document.createElement("link");
|
|
|
|
// preloadLink.rel = "preload";
|
|
|
|
// preloadLink.href = cachebust(src);
|
|
|
|
// // preloadLink.setAttribute("crossorigin", "anonymous");
|
|
|
|
// preloadLink.setAttribute("as", "fetch");
|
|
|
|
// document.head.appendChild(preloadLink);
|
|
|
|
// });
|
|
|
|
}
|
|
|
|
|
|
|
|
const loadingSvg = `background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46YXV0bztiYWNrZ3JvdW5kOjAgMCIgd2lkdGg9IjIwMCIgaGVpZ2h0PSIyMDAiIHZpZXdCb3g9IjAgMCAxMDAgMTAwIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCIgZGlzcGxheT0iYmxvY2siPjxjaXJjbGUgY3g9IjUwIiBjeT0iNTAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzM5Mzc0NyIgc3Ryb2tlLXdpZHRoPSIzIiByPSI0MiIgc3Ryb2tlLWRhc2hhcnJheT0iMTk3LjkyMDMzNzE3NjE1Njk4IDY3Ljk3MzQ0NTcyNTM4NTY2IiB0cmFuc2Zvcm09InJvdGF0ZSg0OC4yNjUgNTAgNTApIj48YW5pbWF0ZVRyYW5zZm9ybSBhdHRyaWJ1dGVOYW1lPSJ0cmFuc2Zvcm0iIHR5cGU9InJvdGF0ZSIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiIGR1cj0iNS41NTU1NTU1NTU1NTU1NTVzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIi8+PC9jaXJjbGU+PC9zdmc+")`;
|
|
|
|
|
|
|
|
const loadingCss = `
|
|
|
|
@font-face {
|
|
|
|
font-family: 'GameFont';
|
|
|
|
font-style: normal;
|
|
|
|
font-weight: normal;
|
|
|
|
font-display: swap;
|
2020-05-11 11:11:07 +00:00
|
|
|
src: url('${cachebust("res/fonts/GameFont.woff2")}') format('woff2');
|
2020-05-09 14:45:23 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#ll_fp {
|
|
|
|
font-family: GameFont;
|
|
|
|
font-size: 14px;
|
|
|
|
position: fixed;
|
|
|
|
z-index: -1;
|
|
|
|
top: 0;
|
|
|
|
left: 0;
|
|
|
|
opacity: 0.05;
|
|
|
|
}
|
|
|
|
|
|
|
|
#ll_p {
|
|
|
|
display: flex;
|
|
|
|
position: fixed;
|
|
|
|
z-index: 99999;
|
|
|
|
top: 0;
|
|
|
|
left: 0;
|
|
|
|
right: 0;
|
|
|
|
bottom: 0;
|
|
|
|
justify-content:
|
|
|
|
center;
|
|
|
|
align-items: center;
|
|
|
|
}
|
|
|
|
|
|
|
|
#ll_p > div {
|
|
|
|
position: absolute;
|
|
|
|
text-align: center;
|
|
|
|
bottom: 40px;
|
|
|
|
left: 20px;
|
|
|
|
right: 20px;
|
|
|
|
color: #393747;
|
|
|
|
font-family: 'GameFont', sans-serif;
|
|
|
|
font-size: 20px;
|
|
|
|
}
|
|
|
|
|
|
|
|
#ll_p > span {
|
|
|
|
width: 60px;
|
|
|
|
height: 60px;
|
|
|
|
display: inline-flex;
|
|
|
|
background: center center / contain no-repeat;
|
|
|
|
${loadingSvg};
|
|
|
|
}
|
|
|
|
`;
|
|
|
|
|
|
|
|
const style = document.createElement("style");
|
|
|
|
style.setAttribute("type", "text/css");
|
|
|
|
style.textContent = loadingCss;
|
|
|
|
document.head.appendChild(style);
|
|
|
|
|
|
|
|
// Append loader, but not in standalone (directly include bundle there)
|
|
|
|
if (standalone) {
|
|
|
|
const bundleScript = document.createElement("script");
|
|
|
|
bundleScript.type = "text/javascript";
|
|
|
|
bundleScript.src = "bundle.js";
|
|
|
|
if (integrity) {
|
|
|
|
bundleScript.setAttribute(
|
|
|
|
"integrity",
|
|
|
|
computeIntegrityHash(path.join(buildFolder, "bundle.js"))
|
|
|
|
);
|
|
|
|
}
|
|
|
|
document.head.appendChild(bundleScript);
|
|
|
|
} else {
|
|
|
|
const loadJs = document.createElement("script");
|
|
|
|
loadJs.type = "text/javascript";
|
|
|
|
let scriptContent = "";
|
|
|
|
scriptContent += `var bundleSrc = '${cachebust("bundle.js")}';\n`;
|
|
|
|
scriptContent += `var bundleSrcTranspiled = '${cachebust(
|
|
|
|
"bundle-transpiled.js"
|
|
|
|
)}';\n`;
|
|
|
|
|
|
|
|
if (integrity) {
|
|
|
|
scriptContent +=
|
|
|
|
"var bundleIntegrity = '" +
|
|
|
|
computeIntegrityHash(path.join(buildFolder, "bundle.js")) +
|
|
|
|
"';\n";
|
|
|
|
scriptContent +=
|
|
|
|
"var bundleIntegrityTranspiled = '" +
|
|
|
|
computeIntegrityHash(path.join(buildFolder, "bundle-transpiled.js")) +
|
|
|
|
"';\n";
|
|
|
|
} else {
|
|
|
|
scriptContent += "var bundleIntegrity = null;\n";
|
|
|
|
scriptContent += "var bundleIntegrityTranspiled = null;\n";
|
|
|
|
}
|
|
|
|
|
|
|
|
scriptContent += fs.readFileSync("./bundle-loader.js").toString();
|
|
|
|
loadJs.textContent = scriptContent;
|
|
|
|
document.head.appendChild(loadJs);
|
|
|
|
}
|
|
|
|
|
|
|
|
const bodyContent = `
|
|
|
|
<div id="ll_fp">_</div>
|
|
|
|
<div id="ll_p">
|
|
|
|
<span></span>
|
|
|
|
<div>${hasLocalFiles ? "Loading" : "Downloading"} Game Files</div >
|
|
|
|
</div >
|
|
|
|
`;
|
|
|
|
|
|
|
|
document.body.innerHTML = bodyContent;
|
|
|
|
})
|
|
|
|
)
|
|
|
|
.pipe(
|
|
|
|
$.htmlmin({
|
|
|
|
caseSensitive: true,
|
|
|
|
collapseBooleanAttributes: true,
|
|
|
|
collapseInlineTagWhitespace: true,
|
|
|
|
collapseWhitespace: true,
|
|
|
|
preserveLineBreaks: true,
|
|
|
|
minifyJS: true,
|
|
|
|
minifyCSS: true,
|
|
|
|
quoteCharacter: '"',
|
|
|
|
useShortDoctype: true,
|
|
|
|
})
|
|
|
|
)
|
|
|
|
.pipe($.htmlBeautify())
|
|
|
|
.pipe($.rename("index.html"))
|
|
|
|
.pipe(gulp.dest(buildFolder));
|
|
|
|
}
|
|
|
|
|
|
|
|
gulp.task("html.dev", () => {
|
|
|
|
return buildHtml("http://localhost:5005", {
|
|
|
|
analytics: false,
|
|
|
|
integrity: false,
|
|
|
|
enableCachebust: false,
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
gulp.task("html.staging", () => {
|
|
|
|
return buildHtml("https://api-staging.shapez.io", {
|
|
|
|
analytics: true,
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
gulp.task("html.prod", () => {
|
2020-05-28 12:53:11 +00:00
|
|
|
return buildHtml("https://analytics.shapez.io", {
|
2020-05-09 14:45:23 +00:00
|
|
|
analytics: true,
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
gulp.task("html.standalone-dev", () => {
|
|
|
|
return buildHtml("https://localhost:5005", {
|
|
|
|
analytics: false,
|
|
|
|
standalone: true,
|
|
|
|
integrity: false,
|
|
|
|
enableCachebust: false,
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
gulp.task("html.standalone-beta", () => {
|
|
|
|
return buildHtml("https://api-staging.shapez.io", {
|
2020-05-21 11:55:45 +00:00
|
|
|
analytics: false,
|
2020-05-09 14:45:23 +00:00
|
|
|
standalone: true,
|
|
|
|
enableCachebust: false,
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
gulp.task("html.standalone-prod", () => {
|
2020-05-28 12:53:11 +00:00
|
|
|
return buildHtml("https://analytics.shapez.io", {
|
2020-05-21 11:55:45 +00:00
|
|
|
analytics: false,
|
2020-05-09 14:45:23 +00:00
|
|
|
standalone: true,
|
|
|
|
enableCachebust: false,
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = {
|
|
|
|
gulptasksHTML,
|
|
|
|
};
|