diff --git a/.docker/.dockerignore b/.docker/.dockerignore deleted file mode 100644 index 93f13619..00000000 --- a/.docker/.dockerignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules -npm-debug.log diff --git a/.docker/nginx.conf b/.docker/nginx.conf deleted file mode 100644 index 17639330..00000000 --- a/.docker/nginx.conf +++ /dev/null @@ -1,45 +0,0 @@ -worker_processes 1; -user nobody nobody; -error_log /tmp/error.log; -pid /tmp/nginx.pid; - -events { - - worker_connections 1024; -} - -http { - - include /etc/nginx/mime.types; - default_type application/octet-stream; - sendfile on; - client_body_temp_path /tmp/client_body; - fastcgi_temp_path /tmp/fastcgi_temp; - proxy_temp_path /tmp/proxy_temp; - scgi_temp_path /tmp/scgi_temp; - uwsgi_temp_path /tmp/uwsgi_temp; - access_log /tmp/access.log; - error_log /tmp/error.log; - - keepalive_timeout 3000; - server { - listen 80; - listen [::]:80; - index index.html; - server_name localhost; - root /usr/share/nginx/html; - autoindex on; - - location ~* \.(?:manifest|appcache|html?|xml|json|css|js|map|jpg|jpeg|gif|png|ico|svg|eot|ttf|woff|woff2)$ { - expires -1; - add_header Access-Control-Allow-Origin *; - add_header Access-Control-Allow-Credentials true; - add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS'; - add_header Access-Control-Allow-Headers 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; - access_log off; - } - location / { - try_files $uri $uri/ /index.html =404; - } - } -} diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..c43179e2 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,77 @@ +node_modules +npm-debug.log +### Node template +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# next.js build output +.next + +# nuxt.js build output +.nuxt + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless + diff --git a/.esdoc.json b/.esdoc.json index 4d236594..99f1efa6 100644 --- a/.esdoc.json +++ b/.esdoc.json @@ -35,7 +35,7 @@ "title": "Coriolis", "description": "Coriolis Shipyard for Elite Dangerous", "repository": "https://github.com/EDCD/coriolis", - "site": "https://coriolis.edcd.io", + "site": "https://coriolis.io", "author": "https://github.com/edcd", "image": "./src/images/logo/192x192.png" } @@ -81,7 +81,7 @@ "title": "Coriolis", "description": "Coriolis Shipyard for Elite Dangerous", "repository": "https://github.com/EDCD/coriolis", - "site": "https://coriolis.edcd.io", + "site": "https://coriolis.io", "author": "https://github.com/edcd", "image": "./src/images/logo/192x192.png" } @@ -100,4 +100,4 @@ } } ] -} \ No newline at end of file +} diff --git a/.docker/Dockerfile b/Dockerfile similarity index 71% rename from .docker/Dockerfile rename to Dockerfile index 7c6523c0..3c44bd3f 100644 --- a/.docker/Dockerfile +++ b/Dockerfile @@ -6,29 +6,28 @@ WORKDIR /src/app RUN mkdir -p /src/app/coriolis RUN mkdir -p /src/app/coriolis-data -COPY ./coriolis/ /src/app/coriolis -COPY ./coriolis-data/ /src/app/coriolis-data +RUN apk add --update git -RUN apk update -RUN apk add git +COPY . /src/app/coriolis RUN npm i -g npm # Set up coriolis-data WORKDIR /src/app/coriolis-data -RUN git fetch --all +RUN git clone https://github.com/EDCD/coriolis-data.git . +RUN git checkout ${BRANCH} RUN npm install --no-package-lock RUN npm start +# Set up coriolis WORKDIR /src/app/coriolis -RUN git fetch --all RUN npm install --no-package-lock RUN npm run build ### STAGE 2: Production Environment ### -FROM nginx:1.13.12-alpine as web -COPY coriolis/.docker/nginx.conf /etc/nginx/nginx.conf +FROM fholzer/nginx-brotli as web +COPY nginx.conf /etc/nginx/nginx.conf COPY --from=builder /src/app/coriolis/build /usr/share/nginx/html WORKDIR /usr/share/nginx/html EXPOSE 80 diff --git a/.docker/docker-compose.yml b/docker-compose.yml similarity index 100% rename from .docker/docker-compose.yml rename to docker-compose.yml diff --git a/nginx.conf b/nginx.conf index a9938f1e..874aefa0 100644 --- a/nginx.conf +++ b/nginx.conf @@ -1,61 +1,96 @@ -worker_processes 2; -error_log ./nginx.error.log; -worker_rlimit_nofile 8192; -pid nginx.pid; +worker_processes 1; +user nobody nobody; +error_log /tmp/error.log; +pid /tmp/nginx.pid; events { - worker_connections 1024; - multi_accept on; + + worker_connections 1024; } http { - access_log off; - charset UTF-8; + include /etc/nginx/mime.types; + default_type application/octet-stream; + sendfile on; + client_body_temp_path /tmp/client_body; + fastcgi_temp_path /tmp/fastcgi_temp; + proxy_temp_path /tmp/proxy_temp; + scgi_temp_path /tmp/scgi_temp; + uwsgi_temp_path /tmp/uwsgi_temp; + access_log /tmp/access.log; + error_log /tmp/error.log; - types { - text/html html htm shtml; - text/css css; - text/xml xml rss; - image/gif gif; - image/jpeg jpeg jpg; - application/x-javascript js; - text/plain txt; - image/png png; - image/svg+xml svg; - image/x-icon ico; - application/pdf pdf; - text/cache-manifest appcache; - } + # https://nginx.org/en/docs/http/ngx_http_gzip_module.html + # Enable gzip compression. + # Default: off + gzip off; - gzip on; - gzip_vary on; - gzip_proxied any; - gzip_comp_level 6; - gzip_buffers 16 8k; - gzip_http_version 1.1; - gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; + # Compression level (1-9). + # 5 is a perfect compromise between size and CPU usage, offering about + # 75% reduction for most ASCII files (almost identical to level 9). + # Default: 1 + gzip_comp_level 5; - server { - listen 3301; - server_name localhost; - root ./build/; - index index.html; + # Don't compress anything that's already small and unlikely to shrink much + # if at all (the default is 20 bytes, which is bad as that usually leads to + # larger files after gzipping). + # Default: 20 + gzip_min_length 256; - location ~* \.(?:manifest|appcache|html?|xml|json|css|js|map|jpg|jpeg|gif|png|ico|svg|eot|ttf|woff|woff2)$ { - expires -1; - add_header Access-Control-Allow-Origin *; + # Compress data even for clients that are connecting to us via proxies, + # identified by the "Via" header (required for CloudFront). + # Default: off + gzip_proxied any; + + # Tell proxies to cache both the gzipped and regular version of a resource + # whenever the client's Accept-Encoding capabilities header varies; + # Avoids the issue where a non-gzip capable client (which is extremely rare + # today) would display gibberish if their proxy gave them the gzipped version. + # Default: off + gzip_vary on; + + # Compress all output labeled with one of the following MIME-types. + # text/html is always compressed by gzip module. + # Default: text/html + gzip_types *; + brotli on; + # brotli_static on; + brotli_types *; + # This should be turned on if you are going to have pre-compressed copies (.gz) of + # static files available. If not it should be left off as it will cause extra I/O + # for the check. It is best if you enable this in a location{} block for + # a specific directory, or on an individual server{} level. + # gzip_static on; + keepalive_timeout 3000; + server { + listen 80; + listen [::]:80; + index index.html; + server_name localhost; + root /usr/share/nginx/html; + autoindex on; + + location ~* \.(?:manifest|appcache|html?|xml|json|css|js|map|jpg|jpeg|gif|png|ico|svg|eot|ttf|woff|woff2)$ { + add_header Access-Control-Allow-Origin *; + add_header Access-Control-Allow-Credentials true; + add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS'; + add_header Access-Control-Allow-Headers 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; + access_log off; + } + location /service-worker.js { + expires -1; + add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Credentials true; add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS'; add_header Access-Control-Allow-Headers 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; - access_log off; - } - - location / { - try_files $uri $uri/ /index.html =404; - } - location /iframe.html { - try_files $uri $uri/ /iframe.html =404; - } - } + access_log off; + } + location / { + try_files $uri $uri/ /index.html =404; + } + location /iframe.html { + try_files $uri $uri/ /iframe.html =404; + } + } } diff --git a/package.json b/package.json index 28dbe455..f937daee 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "type": "git", "url": "https://github.com/EDCD/coriolis" }, - "homepage": "https://coriolis.edcd.io", + "homepage": "https://coriolis.io", "bugs": "https://github.com/EDCD/coriolis/issues", "private": true, "engine": "node >= 4.8.1", @@ -120,6 +120,7 @@ "webpack-notifier": "^1.6.0", "workbox-webpack-plugin": "^3.6.1" }, + "sideEffects": false, "dependencies": { "@babel/polyfill": "^7.0.0", "browserify-zlib-next": "^1.0.1", diff --git a/src/app/Coriolis.jsx b/src/app/Coriolis.jsx index 0595b41c..8b544b1f 100644 --- a/src/app/Coriolis.jsx +++ b/src/app/Coriolis.jsx @@ -1,7 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import Router from './Router'; -import { register } from 'register-service-worker' +import { register } from 'register-service-worker'; import { EventEmitter } from 'fbemitter'; import { getLanguage } from './i18n/Language'; import Persist from './stores/Persist'; @@ -72,7 +72,7 @@ export default class Coriolis extends React.Component { route: {}, sizeRatio: Persist.getSizeRatio() }; - this._getAnnouncements() + this._getAnnouncements(); Router('', (r) => this._setPage(ShipyardPage, r)); Router('/import?', (r) => this._importBuild(r)); Router('/import/:data', (r) => this._importBuild(r)); @@ -105,18 +105,20 @@ export default class Coriolis extends React.Component { } r.params.ship = ship.id; r.params.code = ship.toString(); - this._setPage(OutfittingPage, r); + this._setPage(OutfittingPage, r) } catch (err) { this._onError('Failed to import ship', r.path, 0, 0, err); } } - _getAnnouncements() { - return request.get('https://orbis.zone/api/announcement') - .query({showInCoriolis: true}) - .then(announces => { - this.setState({ announcements: announces.body }) - }) + async _getAnnouncements() { + try { + const announces = await request.get('https://orbis.zone/api/announcement') + .query({ showInCoriolis: true }); + this.setState({ announcements: announces.body }); + } catch (err) { + console.error(err) + } } /** @@ -351,27 +353,27 @@ export default class Coriolis extends React.Component { const self = this; if (process.env.NODE_ENV === 'production') { register('/service-worker.js', { - ready (registration) { - console.log('Service worker is active.') + ready(registration) { + console.log('Service worker is active.'); }, - registered (registration) { - console.log('Service worker has been registered.') + registered(registration) { + console.log('Service worker has been registered.'); }, - cached (registration) { - console.log('Content has been cached for offline use.') + cached(registration) { + console.log('Content has been cached for offline use.'); }, - updatefound (registration) { - console.log('New content is downloading.') + updatefound(registration) { + console.log('New content is downloading.'); }, - updated (registration) { + updated(registration) { self.setState({ appCacheUpdate: true }); - console.log('New content is available; please refresh.') + console.log('New content is available; please refresh.'); }, - offline () { - console.log('No internet connection found. App is running in offline mode.') + offline() { + console.log('No internet connection found. App is running in offline mode.'); }, - error (error) { - console.error('Error during service worker registration:', error) + error(error) { + console.error('Error during service worker registration:', error); } }); } @@ -394,21 +396,24 @@ export default class Coriolis extends React.Component { let currentMenu = this.state.currentMenu; return
-
-
{this.state.announcements.map(a => )}
+ className={this.state.noTouch ? 'no-touch' : null}> +
+
{this.state.announcements.map(a => )}
{this.state.error ? this.state.error : this.state.page ? React.createElement(this.state.page, { currentMenu }) : - } + } {this.state.modal} {this.state.tooltip} diff --git a/src/app/components/AvailableModulesMenu.jsx b/src/app/components/AvailableModulesMenu.jsx index abc7b4c7..f712c938 100644 --- a/src/app/components/AvailableModulesMenu.jsx +++ b/src/app/components/AvailableModulesMenu.jsx @@ -73,7 +73,12 @@ const GRPCAT = { 'gfsb': 'guardian', 'gmrp': 'guardian', 'gsc': 'guardian', - 'ghrp': 'guardian' + 'ghrp': 'guardian', + + // Mining + 'scl': 'mining', + 'pwa': 'mining', + 'sdm': 'mining' }; // Order here is the order in which items will be shown in the modules menu const CATEGORIES = { @@ -90,7 +95,7 @@ const CATEGORIES = { 'structural reinforcement': ['hr', 'mrp'], 'dc': ['dc'], // Hardpoints - 'lasers': ['pl', 'ul', 'bl', 'ml'], + 'lasers': ['pl', 'ul', 'bl'], 'projectiles': ['mc', 'c', 'fc', 'pa', 'rg'], 'ordnance': ['mr', 'tp', 'nl'], // Utilities @@ -102,7 +107,9 @@ const CATEGORIES = { 'experimental': ['axmc', 'axmr', 'rfl', 'tbrfl', 'tbsc', 'tbem', 'xs', 'sfn', 'rcpl', 'dtl', 'rsl', 'mahr',], // Guardian - 'guardian': ['gpp', 'gpd', 'gpc', 'ggc', 'gsrp', 'gfsb', 'ghrp', 'gmrp', 'gsc'] + 'guardian': ['gpp', 'gpd', 'gpc', 'ggc', 'gsrp', 'gfsb', 'ghrp', 'gmrp', 'gsc'], + + 'mining': ['ml', 'scl', 'pwa', 'sdm', 'abl'], }; /** @@ -221,7 +228,16 @@ export default class AvailableModulesMenu extends TranslatedComponent { } list.push(buildGroup(grp, modules[grp])); for (const i of modules[grp]) { - fuzzy.push({ grp, m: i, name: `${i.class}${i.rating} ${translate(grp)} ${i.mount ? i.mount : ''}` }); + let mount = ''; + if (i.mount === 'F') { + mount = 'Fixed'; + } else if (i.mount === 'G') { + mount = 'Gimballed'; + } else if (i.mount === 'T') { + mount = 'Turreted'; + } + const fuzz = { grp, m: i, name: `${i.class}${i.rating}${mount ? ' ' + mount : ''} ${translate(grp)}` }; + fuzzy.push(fuzz); } } } @@ -363,10 +379,14 @@ export default class AvailableModulesMenu extends TranslatedComponent { * mounted module and the hovered modules */ _showSearch() { + if (this.props.modules instanceof Array) { + return; + } return ( {translate('shotspeed')}: {formats.int(m.getShotSpeed())}{u.mps}
: null} {m.getPiercing() ?
{translate('piercing')}: {formats.int(m.getPiercing())}
: null} {m.getJitter() ?
{translate('jitter')}: {formats.f2(m.getJitter())}°
: null} + {m.getScanAngle() ?
{translate('scan angle')}: {formats.f2(m.getScanAngle())}°
: null} + {m.getScanRange() ?
{translate('scan range')}: {formats.int(m.getScanRange())}{u.m}
: null} + {m.getMaxAngle() ?
{translate('max angle')}: {formats.f2(m.getMaxAngle())}°
: null} {showModuleResistances && m.getExplosiveResistance() ?
{translate('explres')}: {formats.pct(m.getExplosiveResistance())}
: null} {showModuleResistances && m.getKineticResistance() ?
, which will be used to keep Coriolis up to date and the servers - running. I also run ads, which are also used for development and hosting. + running.

6) { + sys = eng = wep = 2; + } boost = control[3] == 1 ? true : false; fuel = parseFloat(control[4]) || fuel; cargo = parseInt(control[5]) || cargo; diff --git a/src/app/pages/Page.jsx b/src/app/pages/Page.jsx index 57f17ae2..37174da9 100644 --- a/src/app/pages/Page.jsx +++ b/src/app/pages/Page.jsx @@ -70,6 +70,13 @@ export default class Page extends React.Component { document.title = this.state.title || 'Coriolis'; } + /** + * Update the window title upon mount + */ + componentDidMount() { + document.title = this.state.title || 'Coriolis'; + } + /** * Updates the title upon change * @param {Object} newProps Incoming properties diff --git a/src/app/pages/ShipyardPage.jsx b/src/app/pages/ShipyardPage.jsx index 7ead18ae..fe4dea73 100644 --- a/src/app/pages/ShipyardPage.jsx +++ b/src/app/pages/ShipyardPage.jsx @@ -169,10 +169,9 @@ export default class ShipyardPage extends Page { * @param {Object} u Localized unit map * @param {Function} fInt Localized integer formatter * @param {Function} fRound Localized round formatter - * @param {Boolean} highlight Should this row be highlighted * @return {React.Component} Table Row */ - _shipRowElement(s, translate, u, fInt, fRound, highlight) { + _shipRowElement(s, translate, u, fInt, fRound) { let noTouch = this.context.noTouch; return ( @@ -181,7 +180,6 @@ export default class ShipyardPage extends Page { style={{ height: '1.5em' }} className={cn({ highlighted: noTouch && this.state.shipId === s.id, - alt: highlight })} onMouseEnter={noTouch && this._highlightShip.bind(this, s.id)} > @@ -286,27 +284,13 @@ export default class ShipyardPage extends Page { let shipRows = new Array(shipSummaries.length); let detailRows = new Array(shipSummaries.length); - let lastShipSortValue = null; - let backgroundHighlight = false; - for (let s of shipSummaries) { - let shipSortValue = s[shipPredicate]; - if (shipPredicateIndex != undefined) { - shipSortValue = shipSortValue[shipPredicateIndex]; - } - - if (shipSortValue != lastShipSortValue) { - backgroundHighlight = !backgroundHighlight; - lastShipSortValue = shipSortValue; - } - detailRows[i] = this._shipRowElement( s, translate, units, fInt, formats.f1, - backgroundHighlight ); shipRows[i] = ( diff --git a/src/app/shipyard/Constants.js b/src/app/shipyard/Constants.js index 71d8107f..60dd67d2 100755 --- a/src/app/shipyard/Constants.js +++ b/src/app/shipyard/Constants.js @@ -94,6 +94,10 @@ export const ModuleGroupToName = { gsc: 'Guardian Shard Cannon', tbem: 'Enzyme Missile Rack', tbrfl: 'Remote Release Flechette Launcher', + pwa: 'Pulse Wave Analyser', + abl: 'Abrasion Blaster', + scl: 'Seismic Charge Launcher', + sdm: 'Sub-Surface Displacement Missile', }; let GrpNameToCodeMap = {}; diff --git a/src/app/shipyard/Module.js b/src/app/shipyard/Module.js index 83d5de58..7b4e45e6 100755 --- a/src/app/shipyard/Module.js +++ b/src/app/shipyard/Module.js @@ -1073,4 +1073,31 @@ export default class Module { getHackTime(modified = true) { return this.get('hacktime', modified); } + + /** + * Get the scan range for this module + * @param {Boolean} [modified=true] Whether to take modifications into account + * @return {string} the time for this module + */ + getScanRange(modified = true) { + return this.get('scanrange', modified); + } + + /** + * Get the scan angle for this module + * @param {Boolean} [modified=true] Whether to take modifications into account + * @return {string} the time for this module + */ + getScanAngle(modified = true) { + return this.get('scanangle', modified); + } + + /** + * Get the max angle for this module + * @param {Boolean} [modified=true] Whether to take modifications into account + * @return {string} the time for this module + */ + getMaxAngle(modified = true) { + return this.get('maxangle', modified); + } } diff --git a/src/app/shipyard/Serializer.js b/src/app/shipyard/Serializer.js index 566d5c30..d7b7836f 100644 --- a/src/app/shipyard/Serializer.js +++ b/src/app/shipyard/Serializer.js @@ -85,12 +85,12 @@ export function toDetailedBuild(buildName, ship) { code = ship.toString(); let data = { - $schema: 'https://coriolis.edcd.io/schemas/ship-loadout/4.json#', + $schema: 'https://coriolis.io/schemas/ship-loadout/4.json#', name: buildName, ship: ship.name, references: [{ name: 'Coriolis.io', - url: 'https://coriolis.edcd.io' + outfitURL(ship.id, code, buildName), + url: 'https://coriolis.io' + outfitURL(ship.id, code, buildName), code, shipId: ship.id }], diff --git a/src/app/shipyard/StatsFormatting.js b/src/app/shipyard/StatsFormatting.js index 8effaa36..3cbb66fd 100644 --- a/src/app/shipyard/StatsFormatting.js +++ b/src/app/shipyard/StatsFormatting.js @@ -78,5 +78,6 @@ export const STATS_FORMATTING = { 'thermres': { 'format': 'pct' }, 'wepcap': { 'format': 'round1', 'unit': 'MJ' }, 'weprate': { 'format': 'round1', 'unit': 'MW' }, - 'jumpboost': { 'format': 'round1', 'unit': 'LY' } + 'jumpboost': { 'format': 'round1', 'unit': 'LY' }, + 'proberadius': { 'format': 'pct1', 'unit': 'pct' }, }; diff --git a/src/less/table.less b/src/less/table.less index 1cce0319..4b4c0071 100755 --- a/src/less/table.less +++ b/src/less/table.less @@ -55,7 +55,7 @@ tbody tr { background-color: @warning-bg; } - &.alt { + &:nth-child(odd){ background-color: @alt-primary-bg; } } diff --git a/src/schemas/ship-loadout/1.json b/src/schemas/ship-loadout/1.json index 375b233c..497e1f49 100644 --- a/src/schemas/ship-loadout/1.json +++ b/src/schemas/ship-loadout/1.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-04/schema#", - "id": "https://coriolis.edcd.io/schemas/ship-loadout/1.json#", + "id": "https://coriolis.io/schemas/ship-loadout/1.json#", "title": "Ship Loadout", "type": "object", "description": "The details for a specific ship build/loadout. DEPRECATED in favor of Version 3", diff --git a/src/schemas/ship-loadout/2.json b/src/schemas/ship-loadout/2.json index e24d1651..981ff460 100644 --- a/src/schemas/ship-loadout/2.json +++ b/src/schemas/ship-loadout/2.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-04/schema#", - "id": "https://coriolis.edcd.io/schemas/ship-loadout/2.json#", + "id": "https://coriolis.io/schemas/ship-loadout/2.json#", "title": "Ship Loadout", "type": "object", "description": "The details for a specific ship build/loadout. DEPRECATED in favor of Version 3", diff --git a/src/schemas/ship-loadout/3.json b/src/schemas/ship-loadout/3.json index 516d14db..15a919b8 100644 --- a/src/schemas/ship-loadout/3.json +++ b/src/schemas/ship-loadout/3.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-04/schema#", - "id": "https://coriolis.edcd.io/schemas/ship-loadout/3.json#", + "id": "https://coriolis.io/schemas/ship-loadout/3.json#", "title": "Ship Loadout", "type": "object", "description": "The details for a specific ship build/loadout", diff --git a/src/schemas/ship-loadout/4.json b/src/schemas/ship-loadout/4.json index 7dcc1987..6766d3ac 100644 --- a/src/schemas/ship-loadout/4.json +++ b/src/schemas/ship-loadout/4.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-04/schema#", - "id": "https://coriolis.edcd.io/schemas/ship-loadout/4.json#", + "id": "https://coriolis.io/schemas/ship-loadout/4.json#", "title": "Ship Loadout", "type": "object", "description": "The details for a specific ship build/loadout", diff --git a/src/sw.js b/src/sw.js index 5eb5d3e0..9a724691 100644 --- a/src/sw.js +++ b/src/sw.js @@ -8,7 +8,13 @@ if (workbox) { workbox.routing.registerRoute( new RegExp('/(.*?)'), - workbox.strategies.staleWhileRevalidate() + workbox.strategies.staleWhileRevalidate({ + plugins: [ + new workbox.cacheableResponse.Plugin({ + statuses: [0, 200] + }) + ] + }) ); workbox.routing.registerRoute( diff --git a/webpack.config.dev.js b/webpack.config.dev.js index ff4bc29b..44b8a02b 100644 --- a/webpack.config.dev.js +++ b/webpack.config.dev.js @@ -14,7 +14,7 @@ module.exports = { }, mode: 'development', entry: { - main: './src/app/index.js' + main: './src/app/index.js', }, resolve: { // When requiring, you don't need to add these extensions @@ -22,13 +22,11 @@ module.exports = { }, optimization: { minimize: false, - splitChunks: { - chunks: 'all' - } + usedExports: true }, output: { path: path.join(__dirname, 'build'), - filename: 'app.js', + chunkFilename: '[name].bundle.js', publicPath: '/' }, plugins: [ @@ -56,7 +54,10 @@ module.exports = { module: { rules: [ { test: /\.css$/, loader: ExtractTextPlugin.extract({ fallback: 'style-loader', use: 'css-loader' }) }, - { test: /\.less$/, loader: ExtractTextPlugin.extract({ fallback: 'style-loader', use: 'css-loader!less-loader' }) }, + { + test: /\.less$/, + loader: ExtractTextPlugin.extract({ fallback: 'style-loader', use: 'css-loader!less-loader' }) + }, { test: /\.(js|jsx)$/, loaders: ['babel-loader'], include: path.join(__dirname, 'src') }, { test: /\.woff(\?v=\d+\.\d+\.\d+)?$/, loader: 'url-loader?limit=10000&mimetype=application/font-woff' }, { test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/, loader: 'url-loader?limit=10000&mimetype=application/font-woff' }, diff --git a/webpack.config.prod.js b/webpack.config.prod.js index 55fb4b63..97b3b85c 100644 --- a/webpack.config.prod.js +++ b/webpack.config.prod.js @@ -11,26 +11,28 @@ const buildDate = new Date(); module.exports = { devtool: 'source-map', entry: { - main: ['./src/app/index.js'] + main: './src/app/index.js' }, resolve: { extensions: ['.js', '.jsx', '.json', '.less'] }, output: { path: path.join(__dirname, 'build'), - filename: '[name].[hash].js', + chunkFilename: '[name].bundle.js', publicPath: '/', globalObject: 'this' }, mode: 'production', optimization: { minimize: true, - splitChunks: { - chunks: 'all' - } + usedExports: true }, plugins: [ - new CopyWebpackPlugin(['src/.htaccess', { from: 'src/schemas', to: 'schemas' }, {from: 'src/images/logo/*', flatten: true, to: ''}, 'src/iframe.html', 'src/xdLocalStoragePostMessageApi.min.js']), + new CopyWebpackPlugin(['src/.htaccess', { from: 'src/schemas', to: 'schemas' }, { + from: 'src/images/logo/*', + flatten: true, + to: '' + }, 'src/iframe.html', 'src/xdLocalStoragePostMessageApi.min.js']), // new webpack.optimize.CommonsChunkPlugin({ // name: 'lib', // filename: 'lib.[chunkhash:6].js' @@ -48,15 +50,15 @@ module.exports = { disable: false, allChunks: true }), - new BugsnagBuildReporterPlugin({ - apiKey: 'ba9fae819372850fb660755341fa6ef5', - appVersion: `${pkgJson.version}-${buildDate.toISOString()}` - }, { /* opts */ }), - new BugsnagSourceMapUploaderPlugin({ - apiKey: 'ba9fae819372850fb660755341fa6ef5', - overwrite: true, - appVersion: `${pkgJson.version}-${buildDate.toISOString()}` - }), + // new BugsnagBuildReporterPlugin({ + // apiKey: 'ba9fae819372850fb660755341fa6ef5', + // appVersion: `${pkgJson.version}-${buildDate.toISOString()}` + // }, { /* opts */ }), + // new BugsnagSourceMapUploaderPlugin({ + // apiKey: 'ba9fae819372850fb660755341fa6ef5', + // overwrite: true, + // appVersion: `${pkgJson.version}-${buildDate.toISOString()}` + // }), new InjectManifest({ swSrc: './src/sw.js', importWorkboxFrom: 'cdn', @@ -66,7 +68,10 @@ module.exports = { module: { rules: [ { test: /\.css$/, loader: ExtractTextPlugin.extract({ fallback: 'style-loader', use: 'css-loader' }) }, - { test: /\.less$/, loader: ExtractTextPlugin.extract({ fallback: 'style-loader', use: 'css-loader!less-loader' }) }, + { + test: /\.less$/, + loader: ExtractTextPlugin.extract({ fallback: 'style-loader', use: 'css-loader!less-loader' }) + }, { test: /\.(js|jsx)$/, loader: 'babel-loader?cacheDirectory=true', include: path.join(__dirname, 'src') }, { test: /\.woff(\?v=\d+\.\d+\.\d+)?$/, loader: 'url-loader?limit=10000&mimetype=application/font-woff' }, { test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/, loader: 'url-loader?limit=10000&mimetype=application/font-woff' },