From 3a74299ece469ac40f640f04ccce097ba38682a6 Mon Sep 17 00:00:00 2001 From: Integral Team Date: Wed, 11 Sep 2019 16:53:47 +0700 Subject: [PATCH] added pwa cacher --- .gitignore | 1 + config/frontend.example.js | 2 + config/pwa.example.js | 22 +++ package-lock.json | 340 +++++++++++++++++++++++++++++++++++++ package.json | 1 + src/sprites/app.png | Bin 0 -> 33321 bytes src/sprites/app.svg | 65 +++++++ webpack.config.js | 35 ++-- 8 files changed, 448 insertions(+), 18 deletions(-) create mode 100644 config/pwa.example.js create mode 100644 src/sprites/app.png create mode 100644 src/sprites/app.svg diff --git a/.gitignore b/.gitignore index 02f12a6..e1e09d8 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,7 @@ yarn-error.log /config/frontend.js /config/backend.js +/config/pwa.js # Bundle *.js.map diff --git a/config/frontend.example.js b/config/frontend.example.js index ca59f89..4661dd9 100644 --- a/config/frontend.example.js +++ b/config/frontend.example.js @@ -1,6 +1,7 @@ import { DEFAULT_PROVIDER, PROVIDERS } from '$constants/providers'; import { LatLngLiteral } from 'leaflet'; +const PUBLIC_PATH = ''; const API_ADDR = 'https://HOSTNAME.org:3000'; const OSRM_URL = 'https://HOSTNAME.org:5001/route/v1'; const OSRM_PROFILE = 'bike'; @@ -14,6 +15,7 @@ export const CLIENT = { OSRM_TEST_URL, OSRM_PROFILE, STROKE_WIDTH: 5, + PUBLIC_PATH, }; export const COLORS = { diff --git a/config/pwa.example.js b/config/pwa.example.js new file mode 100644 index 0000000..6e99f4f --- /dev/null +++ b/config/pwa.example.js @@ -0,0 +1,22 @@ +const path = require('path'); + +module.exports = { + MANIFEST: (src) => ({ + name: 'Редактор маршрутов', + short_name: 'Маршруты', + description: 'Велосипедные маршруты в новосибирске', + background_color: '#333333', + theme_color: '#01579b', + display: 'fullscreen', + 'theme-color': '#01579b', + start_url: '/', + icons: [ + { + src, // : path.resolve('./src/sprites/app.png') + sizes: [96, 128, 192, 256, 384, 512], + destination: path.join('assets', 'icons') + } + ] + }), + PUBLIC_PATH: 'https://alpha-map.vault48.org/', +}; diff --git a/package-lock.json b/package-lock.json index 169493a..5deaf3f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1244,6 +1244,12 @@ "integrity": "sha1-bI4obRHtdoMn+OYuzuhzU8o+eLg=", "dev": true }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -3113,6 +3119,24 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + } + } + }, "caniuse-api": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", @@ -4571,6 +4595,15 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.2.tgz", "integrity": "sha512-Rl7PvTae0pflc1YtxtKbiSqq20Ts6vpIYOD5WBafl4y123DyHUeLrRdQP66sQW8/6gmX8jrYJLXwNeMqYVJcow==" }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, "cyclist": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", @@ -4893,6 +4926,15 @@ } } }, + "dom-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/dom-urls/-/dom-urls-1.1.0.tgz", + "integrity": "sha1-AB3fgWKM0ecGElxxdvU8zsVdkY4=", + "dev": true, + "requires": { + "urijs": "^1.16.1" + } + }, "dom-walk": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", @@ -6634,6 +6676,12 @@ "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", "dev": true }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -7365,6 +7413,15 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, "indexes-of": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", @@ -7789,6 +7846,12 @@ "unc-path-regex": "^0.1.0" } }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -8420,12 +8483,24 @@ "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, "lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", "dev": true }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", + "dev": true + }, "lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", @@ -8461,6 +8536,25 @@ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -8504,6 +8598,16 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, "lower-case": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", @@ -8556,6 +8660,12 @@ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", @@ -8619,6 +8729,111 @@ "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", "optional": true }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -10713,6 +10928,12 @@ "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", "dev": true }, + "pretty-bytes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", + "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=", + "dev": true + }, "pretty-error": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", @@ -11440,6 +11661,16 @@ "readable-stream": "^2.0.2" } }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, "reduce-css-calc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", @@ -12091,6 +12322,12 @@ "send": "0.16.2" } }, + "serviceworker-cache-polyfill": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serviceworker-cache-polyfill/-/serviceworker-cache-polyfill-4.0.0.tgz", + "integrity": "sha1-3hnuc77yGrPAdAo3sz22JGS6ves=", + "dev": true + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -12721,6 +12958,15 @@ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -12814,6 +13060,88 @@ } } }, + "sw-precache": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/sw-precache/-/sw-precache-5.2.1.tgz", + "integrity": "sha512-8FAy+BP/FXE+ILfiVTt+GQJ6UEf4CVHD9OfhzH0JX+3zoy2uFk7Vn9EfXASOtVmmIVbL3jE/W8Z66VgPSZcMhw==", + "dev": true, + "requires": { + "dom-urls": "^1.1.0", + "es6-promise": "^4.0.5", + "glob": "^7.1.1", + "lodash.defaults": "^4.2.0", + "lodash.template": "^4.4.0", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "pretty-bytes": "^4.0.2", + "sw-toolbox": "^3.4.0", + "update-notifier": "^2.3.0" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + } + } + }, + "sw-precache-webpack-plugin": { + "version": "0.11.5", + "resolved": "https://registry.npmjs.org/sw-precache-webpack-plugin/-/sw-precache-webpack-plugin-0.11.5.tgz", + "integrity": "sha512-K6E52DbYyzGNXGyv2LhI2Duomr3t/2FFMmnGdHZ1Ruk3ulFHDMASJtg3WpA3CXlWODZx189tTaOIO5mWkSKyVg==", + "dev": true, + "requires": { + "del": "^3.0.0", + "sw-precache": "^5.2.1", + "uglify-es": "^3.3.9" + }, + "dependencies": { + "commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", + "dev": true + }, + "uglify-es": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "dev": true, + "requires": { + "commander": "~2.13.0", + "source-map": "~0.6.1" + } + } + } + }, + "sw-toolbox": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/sw-toolbox/-/sw-toolbox-3.6.0.tgz", + "integrity": "sha1-Jt8dHHA0hljk3qKIQxkUm3sxg7U=", + "dev": true, + "requires": { + "path-to-regexp": "^1.0.1", + "serviceworker-cache-polyfill": "^4.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "path-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "dev": true, + "requires": { + "isarray": "0.0.1" + } + } + } + }, "symbol-observable": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", @@ -13213,6 +13541,12 @@ } } }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", @@ -13556,6 +13890,12 @@ "punycode": "^2.1.0" } }, + "urijs": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.1.tgz", + "integrity": "sha512-xVrGVi94ueCJNrBSTjWqjvtgvl3cyOTThp2zaMaFNGp3F542TR6sM3f2o8RqZl+AwteClSVmoCyt0ka4RjQOQg==", + "dev": true + }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", diff --git a/package.json b/package.json index 77d93de..e9fef76 100644 --- a/package.json +++ b/package.json @@ -46,6 +46,7 @@ "mini-css-extract-plugin": "^0.5.0", "nodemon": "^1.19.2", "style-loader": "^0.21.0", + "sw-precache-webpack-plugin": "^0.11.5", "ts-node": "^8.0.1", "typescript": "^3.2.4", "uglifyjs-webpack-plugin": "^1.3.0", diff --git a/src/sprites/app.png b/src/sprites/app.png new file mode 100644 index 0000000000000000000000000000000000000000..2819b7bd79dbdbdc63b3d4c7958eff1990c2ff47 GIT binary patch literal 33321 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%0A^dZBcL7VJbkJ!EGybR;yCO`*8 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 + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/webpack.config.js b/webpack.config.js index 93e1232..d05fc22 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,5 +1,6 @@ -// import webpack from 'webpack'; +// import { CLIENT } from './config/frontend'; const webpack = require('webpack'); + const HtmlWebPackPlugin = require('html-webpack-plugin'); // const FlowWebpackPlugin = require('flow-webpack-plugin'); // const { version } = require('./package.json'); @@ -9,10 +10,14 @@ const UglifyJsPlugin = require('uglifyjs-webpack-plugin'); const path = require('path'); const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin'); const WebpackPwaManifest = require('webpack-pwa-manifest'); +const SWPrecacheWebpackPlugin = require('sw-precache-webpack-plugin'); +// import webpack from 'webpack'; +const PWA_CONFIG = require('./config/pwa'); // const ManifestPlugin = require('webpack-manifest-plugin'); /* Plugins */ // const concatPlugin = new webpack.optimize.ModuleConcatenationPlugin(); + const htmlPlugin = new HtmlWebPackPlugin({ template: './src/index.html', filename: './index.html', @@ -64,23 +69,17 @@ module.exports = () => { new webpack.IgnorePlugin(/^osrm-text-instructions$/, /leaflet-routing-machine$/), miniCssExractPlugin, new webpack.HashedModuleIdsPlugin(), - new WebpackPwaManifest({ - name: 'Редактор маршрутов', - short_name: 'Маршруты', - description: 'Велосипедные маршруты в новосибирске', - background_color: '#01579b', - theme_color: '#01579b', - display: 'fullscreen', - 'theme-color': '#01579b', - start_url: '/', - icons: [ - { - src: path.resolve('src/sprites/favicon.png'), - sizes: [96, 128, 192, 256, 384, 512], - destination: path.join('assets', 'icons') - } - ] - }) + new WebpackPwaManifest(PWA_CONFIG.MANIFEST(path.resolve('./src/sprites/app.png'))), + new SWPrecacheWebpackPlugin( + { + cacheId: 'my-domain-cache-id', + dontCacheBustUrlsMatching: /\.\w{8}\./, + filename: 'service-worker.js', + minify: true, + navigateFallback: `${PWA_CONFIG.PUBLIC_PATH}index.html`, + staticFileGlobsIgnorePatterns: [/\.map$/, /manifest\.json$/] + } + ), ]; return {