diff --git a/cookbook/static/vue/manifest.json b/cookbook/static/vue/manifest.json new file mode 100644 index 000000000..53e6f136b --- /dev/null +++ b/cookbook/static/vue/manifest.json @@ -0,0 +1 @@ +{"name":"Recipes","short_name":"Recipes","theme_color":"#4DBA87","icons":[{"src":"./img/icons/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"./img/icons/android-chrome-512x512.png","sizes":"512x512","type":"image/png"},{"src":"./img/icons/android-chrome-maskable-192x192.png","sizes":"192x192","type":"image/png","purpose":"maskable"},{"src":"./img/icons/android-chrome-maskable-512x512.png","sizes":"512x512","type":"image/png","purpose":"maskable"}],"start_url":".","display":"standalone","background_color":"#000000"} \ No newline at end of file diff --git a/cookbook/static/vue/recipe_view.html b/cookbook/static/vue/recipe_view.html new file mode 100644 index 000000000..6a477fdd5 --- /dev/null +++ b/cookbook/static/vue/recipe_view.html @@ -0,0 +1 @@ +Vue App
\ No newline at end of file diff --git a/cookbook/templates/sw.js b/cookbook/templates/sw.js new file mode 100644 index 000000000..3332d7b58 --- /dev/null +++ b/cookbook/templates/sw.js @@ -0,0 +1 @@ +(function(e){var t={};function n(r){if(t[r])return t[r].exports;var s=t[r]={i:r,l:!1,exports:{}};return e[r].call(s.exports,s,s.exports,n),s.l=!0,s.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var s in e)n.d(r,s,function(t){return e[t]}.bind(null,s));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s="249e")})({"06cf":function(e,t,n){var r=n("83ab"),s=n("d1e7"),o=n("5c6c"),a=n("fc6a"),i=n("c04e"),c=n("5135"),u=n("0cfb"),l=Object.getOwnPropertyDescriptor;t.f=r?l:function(e,t){if(e=a(e),t=i(t,!0),u)try{return l(e,t)}catch(n){}if(c(e,t))return o(!s.f.call(e,t),e[t])}},"0cfb":function(e,t,n){var r=n("83ab"),s=n("d039"),o=n("cc12");e.exports=!r&&!s((function(){return 7!=Object.defineProperty(o("div"),"a",{get:function(){return 7}}).a}))},"1d80":function(e,t){e.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},"23cb":function(e,t,n){var r=n("a691"),s=Math.max,o=Math.min;e.exports=function(e,t){var n=r(e);return n<0?s(n+t,0):o(n,t)}},"23e7":function(e,t,n){var r=n("da84"),s=n("06cf").f,o=n("9112"),a=n("6eeb"),i=n("ce4e"),c=n("e893"),u=n("94ca");e.exports=function(e,t){var n,l,f,h,p,d,g=e.target,y=e.global,w=e.stat;if(l=y?r:w?r[g]||i(g,{}):(r[g]||{}).prototype,l)for(f in t){if(p=t[f],e.noTargetGet?(d=s(l,f),h=d&&d.value):h=l[f],n=u(y?f:g+(w?".":"#")+f,e.forced),!n&&void 0!==h){if(typeof p===typeof h)continue;c(p,h)}(e.sham||h&&h.sham)&&o(p,"sham",!0),a(l,f,p,e)}}},"241c":function(e,t,n){var r=n("ca84"),s=n("7839"),o=s.concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return r(e,o)}},"249e":function(e,t,n){"use strict";n.r(t);n("4d63"),n("ac1f"),n("25f0"),n("40b9");const r=(e,...t)=>{let n=e;return t.length>0&&(n+=" :: "+JSON.stringify(t)),n},s=r;class o extends Error{constructor(e,t){const n=s(e,t);super(n),this.name=e,this.details=t}}const a={googleAnalytics:"googleAnalytics",precache:"precache-v2",prefix:"workbox",runtime:"runtime",suffix:"undefined"!==typeof registration?registration.scope:""},i=e=>[a.prefix,e,a.suffix].filter(e=>e&&e.length>0).join("-"),c=e=>{for(const t of Object.keys(a))e(t)},u={updateDetails:e=>{c(t=>{"string"===typeof e[t]&&(a[t]=e[t])})},getGoogleAnalyticsName:e=>e||i(a.googleAnalytics),getPrecacheName:e=>e||i(a.precache),getPrefix:()=>a.prefix,getRuntimeName:e=>e||i(a.runtime),getSuffix:()=>a.suffix};function l(e,t){const n=t();return e.waitUntil(n),n}n("c700");const f="__WB_REVISION__";function h(e){if(!e)throw new o("add-to-cache-list-unexpected-type",{entry:e});if("string"===typeof e){const t=new URL(e,location.href);return{cacheKey:t.href,url:t.href}}const{revision:t,url:n}=e;if(!n)throw new o("add-to-cache-list-unexpected-type",{entry:e});if(!t){const e=new URL(n,location.href);return{cacheKey:e.href,url:e.href}}const r=new URL(n,location.href),s=new URL(n,location.href);return r.searchParams.set(f,t),{cacheKey:r.href,url:s.href}}class p{constructor(){this.updatedURLs=[],this.notUpdatedURLs=[],this.handlerWillStart=async({request:e,state:t})=>{t&&(t.originalRequest=e)},this.cachedResponseWillBeUsed=async({event:e,state:t,cachedResponse:n})=>{if("install"===e.type){const e=t.originalRequest.url;n?this.notUpdatedURLs.push(e):this.updatedURLs.push(e)}return n}}}class d{constructor({precacheController:e}){this.cacheKeyWillBeUsed=async({request:e,params:t})=>{const n=t&&t.cacheKey||this._precacheController.getCacheKeyForURL(e.url);return n?new Request(n):e},this._precacheController=e}}let g;function y(){if(void 0===g){const t=new Response("");if("body"in t)try{new Response(t.body),g=!0}catch(e){g=!1}g=!1}return g}async function w(e,t){let n=null;if(e.url){const t=new URL(e.url);n=t.origin}if(n!==self.location.origin)throw new o("cross-origin-copy-response",{origin:n});const r=e.clone(),s={headers:new Headers(r.headers),status:r.status,statusText:r.statusText},a=t?t(s):s,i=y()?r.body:await r.blob();return new Response(i,a)}n("741b");const m={googleAnalytics:"googleAnalytics",precache:"precache-v2",prefix:"workbox",runtime:"runtime",suffix:"undefined"!==typeof registration?registration.scope:""},v=e=>[m.prefix,e,m.suffix].filter(e=>e&&e.length>0).join("-"),b=e=>{for(const t of Object.keys(m))e(t)},x={updateDetails:e=>{b(t=>{"string"===typeof e[t]&&(m[t]=e[t])})},getGoogleAnalyticsName:e=>e||v(m.googleAnalytics),getPrecacheName:e=>e||v(m.precache),getPrefix:()=>m.prefix,getRuntimeName:e=>e||v(m.runtime),getSuffix:()=>m.suffix},_=(e,...t)=>{let n=e;return t.length>0&&(n+=" :: "+JSON.stringify(t)),n},R=_;class C extends Error{constructor(e,t){const n=R(e,t);super(n),this.name=e,this.details=t}}const S=e=>{const t=new URL(String(e),location.href);return t.href.replace(new RegExp("^"+location.origin),"")};function O(e,t){const n=new URL(e);for(const r of t)n.searchParams.delete(r);return n.href}async function T(e,t,n,r){const s=O(t.url,n);if(t.url===s)return e.match(t,r);const o={...r,ignoreSearch:!0},a=await e.keys(t,o);for(const i of a){const t=O(i.url,n);if(s===t)return e.match(i,r)}}class U{constructor(){this.promise=new Promise((e,t)=>{this.resolve=e,this.reject=t})}}const k=new Set;async function P(){for(const e of k)await e()}function L(e){return new Promise(t=>setTimeout(t,e))}n("6aa8");function q(e){return"string"===typeof e?new Request(e):e}class E{constructor(e,t){this._cacheKeys={},Object.assign(this,t),this.event=t.event,this._strategy=e,this._handlerDeferred=new U,this._extendLifetimePromises=[],this._plugins=[...e.plugins],this._pluginStateMap=new Map;for(const n of this._plugins)this._pluginStateMap.set(n,{});this.event.waitUntil(this._handlerDeferred.promise)}fetch(e){return this.waitUntil((async()=>{const{event:t}=this;let n=q(e);if("navigate"===n.mode&&t instanceof FetchEvent&&t.preloadResponse){const e=await t.preloadResponse;if(e)return e}const r=this.hasCallback("fetchDidFail")?n.clone():null;try{for(const e of this.iterateCallbacks("requestWillFetch"))n=await e({request:n.clone(),event:t})}catch(o){throw new C("plugin-error-request-will-fetch",{thrownError:o})}const s=n.clone();try{let e;e=await fetch(n,"navigate"===n.mode?void 0:this._strategy.fetchOptions);for(const n of this.iterateCallbacks("fetchDidSucceed"))e=await n({event:t,request:s,response:e});return e}catch(a){throw r&&await this.runCallbacks("fetchDidFail",{error:a,event:t,originalRequest:r.clone(),request:s.clone()}),a}})())}async fetchAndCachePut(e){const t=await this.fetch(e),n=t.clone();return this.waitUntil(this.cachePut(e,n)),t}cacheMatch(e){return this.waitUntil((async()=>{const t=q(e);let n;const{cacheName:r,matchOptions:s}=this._strategy,o=await this.getCacheKey(t,"read"),a={...s,cacheName:r};n=await caches.match(o,a);for(const e of this.iterateCallbacks("cachedResponseWillBeUsed"))n=await e({cacheName:r,matchOptions:s,cachedResponse:n,request:o,event:this.event})||void 0;return n})())}async cachePut(e,t){const n=q(e);await L(0);const r=await this.getCacheKey(n,"write");if(!t)throw new C("cache-put-with-no-response",{url:S(r.url)});const s=await this._ensureResponseSafeToCache(t);if(!s)return void 0;const{cacheName:o,matchOptions:a}=this._strategy,i=await self.caches.open(o),c=this.hasCallback("cacheDidUpdate"),u=c?await T(i,r.clone(),["__WB_REVISION__"],a):null;try{await i.put(r,c?s.clone():s)}catch(l){throw"QuotaExceededError"===l.name&&await P(),l}for(const f of this.iterateCallbacks("cacheDidUpdate"))await f({cacheName:o,oldResponse:u,newResponse:s.clone(),request:r,event:this.event})}async getCacheKey(e,t){if(!this._cacheKeys[t]){let n=e;for(const e of this.iterateCallbacks("cacheKeyWillBeUsed"))n=q(await e({mode:t,request:n,event:this.event,params:this.params}));this._cacheKeys[t]=n}return this._cacheKeys[t]}hasCallback(e){for(const t of this._strategy.plugins)if(e in t)return!0;return!1}async runCallbacks(e,t){for(const n of this.iterateCallbacks(e))await n(t)}*iterateCallbacks(e){for(const t of this._strategy.plugins)if("function"===typeof t[e]){const n=this._pluginStateMap.get(t),r=r=>{const s={...r,state:n};return t[e](s)};yield r}}waitUntil(e){return this._extendLifetimePromises.push(e),e}async doneWaiting(){let e;while(e=this._extendLifetimePromises.shift())await e}destroy(){this._handlerDeferred.resolve()}async _ensureResponseSafeToCache(e){let t=e,n=!1;for(const r of this.iterateCallbacks("cacheWillUpdate"))if(t=await r({request:this.request,response:t,event:this.event})||void 0,n=!0,!t)break;return n||t&&200!==t.status&&(t=void 0),t}}class N{constructor(e={}){this.cacheName=x.getRuntimeName(e.cacheName),this.plugins=e.plugins||[],this.fetchOptions=e.fetchOptions,this.matchOptions=e.matchOptions}handle(e){const[t]=this.handleAll(e);return t}handleAll(e){e instanceof FetchEvent&&(e={event:e,request:e.request});const t=e.event,n="string"===typeof e.request?new Request(e.request):e.request,r="params"in e?e.params:void 0,s=new E(this,{event:t,request:n,params:r}),o=this._getResponse(s,n,t),a=this._awaitComplete(o,s,n,t);return[o,a]}async _getResponse(e,t,n){await e.runCallbacks("handlerWillStart",{event:n,request:t});let r=void 0;try{if(r=await this._handle(t,e),!r||"error"===r.type)throw new C("no-response",{url:t.url})}catch(s){for(const o of e.iterateCallbacks("handlerDidError"))if(r=await o({error:s,event:n,request:t}),r)break;if(!r)throw s}for(const o of e.iterateCallbacks("handlerWillRespond"))r=await o({event:n,request:t,response:r});return r}async _awaitComplete(e,t,n,r){let s,o;try{s=await e}catch(o){}try{await t.runCallbacks("handlerDidRespond",{event:r,request:n,response:s}),await t.doneWaiting()}catch(a){o=a}if(await t.runCallbacks("handlerDidComplete",{event:r,request:n,response:s,error:o}),t.destroy(),o)throw o}}const j={async cacheWillUpdate({response:e}){return e.redirected?await w(e):e}};class M extends N{constructor(e={}){e.cacheName=u.getPrecacheName(e.cacheName),super(e),this._fallbackToNetwork=!1!==e.fallbackToNetwork,this.plugins.push(j)}async _handle(e,t){const n=await t.cacheMatch(e);return n||(t.event&&"install"===t.event.type?await this._handleInstall(e,t):await this._handleFetch(e,t))}async _handleFetch(e,t){let n;if(!this._fallbackToNetwork)throw new o("missing-precache-entry",{cacheName:this.cacheName,url:e.url});return n=await t.fetch(e),n}async _handleInstall(e,t){const n=await t.fetchAndCachePut(e);let r=Boolean(n);if(n&&n.status>=400&&!this._usesCustomCacheableResponseLogic()&&(r=!1),!r)throw new o("bad-precaching-response",{url:e.url,status:n.status});return n}_usesCustomCacheableResponseLogic(){return this.plugins.some(e=>e.cacheWillUpdate&&e!==j)}}class K{constructor({cacheName:e,plugins:t=[],fallbackToNetwork:n=!0}={}){this._urlsToCacheKeys=new Map,this._urlsToCacheModes=new Map,this._cacheKeysToIntegrities=new Map,this._strategy=new M({cacheName:u.getPrecacheName(e),plugins:[...t,new d({precacheController:this})],fallbackToNetwork:n}),this.install=this.install.bind(this),this.activate=this.activate.bind(this)}get strategy(){return this._strategy}precache(e){this.addToCacheList(e),this._installAndActiveListenersAdded||(self.addEventListener("install",this.install),self.addEventListener("activate",this.activate),this._installAndActiveListenersAdded=!0)}addToCacheList(e){const t=[];for(const n of e){"string"===typeof n?t.push(n):n&&void 0===n.revision&&t.push(n.url);const{cacheKey:e,url:r}=h(n),s="string"!==typeof n&&n.revision?"reload":"default";if(this._urlsToCacheKeys.has(r)&&this._urlsToCacheKeys.get(r)!==e)throw new o("add-to-cache-list-conflicting-entries",{firstEntry:this._urlsToCacheKeys.get(r),secondEntry:e});if("string"!==typeof n&&n.integrity){if(this._cacheKeysToIntegrities.has(e)&&this._cacheKeysToIntegrities.get(e)!==n.integrity)throw new o("add-to-cache-list-conflicting-integrities",{url:r});this._cacheKeysToIntegrities.set(e,n.integrity)}if(this._urlsToCacheKeys.set(r,e),this._urlsToCacheModes.set(r,s),t.length>0){const e=`Workbox is precaching URLs without revision info: ${t.join(", ")}\nThis is generally NOT safe. Learn more at https://bit.ly/wb-precache`;console.warn(e)}}}install(e){return l(e,async()=>{const t=new p;this.strategy.plugins.push(t);for(const[s,o]of this._urlsToCacheKeys){const t=this._cacheKeysToIntegrities.get(o),n=this._urlsToCacheModes.get(s),r=new Request(s,{integrity:t,cache:n,credentials:"same-origin"});await Promise.all(this.strategy.handleAll({params:{cacheKey:o},request:r,event:e}))}const{updatedURLs:n,notUpdatedURLs:r}=t;return{updatedURLs:n,notUpdatedURLs:r}})}activate(e){return l(e,async()=>{const e=await self.caches.open(this.strategy.cacheName),t=await e.keys(),n=new Set(this._urlsToCacheKeys.values()),r=[];for(const s of t)n.has(s.url)||(await e.delete(s),r.push(s.url));return{deletedURLs:r}})}getURLsToCacheKeys(){return this._urlsToCacheKeys}getCachedURLs(){return[...this._urlsToCacheKeys.keys()]}getCacheKeyForURL(e){const t=new URL(e,location.href);return this._urlsToCacheKeys.get(t.href)}async matchPrecache(e){const t=e instanceof Request?e.url:e,n=this.getCacheKeyForURL(t);if(n){const e=await self.caches.open(this.strategy.cacheName);return e.match(n)}}createHandlerBoundToURL(e){const t=this.getCacheKeyForURL(e);if(!t)throw new o("non-precached-url",{url:e});return n=>(n.request=new Request(e),n.params={cacheKey:t,...n.params},this.strategy.handle(n))}}let I;const A=()=>(I||(I=new K),I);n("95a8");const W=(e,...t)=>{let n=e;return t.length>0&&(n+=" :: "+JSON.stringify(t)),n},D=W;class F extends Error{constructor(e,t){const n=D(e,t);super(n),this.name=e,this.details=t}}n("e6d2");const H="GET",B=e=>e&&"object"===typeof e?e:{handle:e};class G{constructor(e,t,n=H){this.handler=B(t),this.match=e,this.method=n}}class Y extends G{constructor(e,t,n){const r=({url:t})=>{const n=e.exec(t.href);if(n&&(t.origin===location.origin||0===n.index))return n.slice(1)};super(r,t,n)}}class z{constructor(){this._routes=new Map,this._defaultHandlerMap=new Map}get routes(){return this._routes}addFetchListener(){self.addEventListener("fetch",e=>{const{request:t}=e,n=this.handleRequest({request:t,event:e});n&&e.respondWith(n)})}addCacheListener(){self.addEventListener("message",e=>{if(e.data&&"CACHE_URLS"===e.data.type){const{payload:t}=e.data;0;const n=Promise.all(t.urlsToCache.map(t=>{"string"===typeof t&&(t=[t]);const n=new Request(...t);return this.handleRequest({request:n,event:e})}));e.waitUntil(n),e.ports&&e.ports[0]&&n.then(()=>e.ports[0].postMessage(!0))}})}handleRequest({request:e,event:t}){const n=new URL(e.url,location.href);if(!n.protocol.startsWith("http"))return void 0;const r=n.origin===location.origin,{params:s,route:o}=this.findMatchingRoute({event:t,request:e,sameOrigin:r,url:n});let a=o&&o.handler;const i=e.method;if(!a&&this._defaultHandlerMap.has(i)&&(a=this._defaultHandlerMap.get(i)),!a)return void 0;let c;try{c=a.handle({url:n,request:e,event:t,params:s})}catch(u){c=Promise.reject(u)}return c instanceof Promise&&this._catchHandler&&(c=c.catch(r=>this._catchHandler.handle({url:n,request:e,event:t}))),c}findMatchingRoute({url:e,sameOrigin:t,request:n,event:r}){const s=this._routes.get(n.method)||[];for(const o of s){let s;const a=o.match({url:e,sameOrigin:t,request:n,event:r});if(a)return s=a,(Array.isArray(a)&&0===a.length||a.constructor===Object&&0===Object.keys(a).length||"boolean"===typeof a)&&(s=void 0),{route:o,params:s}}return{}}setDefaultHandler(e,t=H){this._defaultHandlerMap.set(t,B(e))}setCatchHandler(e){this._catchHandler=B(e)}registerRoute(e){this._routes.has(e.method)||this._routes.set(e.method,[]),this._routes.get(e.method).push(e)}unregisterRoute(e){if(!this._routes.has(e.method))throw new F("unregister-route-but-not-found-with-method",{method:e.method});const t=this._routes.get(e.method).indexOf(e);if(!(t>-1))throw new F("unregister-route-route-not-registered");this._routes.get(e.method).splice(t,1)}}let J;const V=()=>(J||(J=new z,J.addFetchListener(),J.addCacheListener()),J);function $(e,t,n){let r;if("string"===typeof e){const s=new URL(e,location.href);0;const o=({url:e})=>e.href===s.href;r=new G(o,t,n)}else if(e instanceof RegExp)r=new Y(e,t,n);else if("function"===typeof e)r=new G(e,t,n);else{if(!(e instanceof G))throw new F("unsupported-route-type",{moduleName:"workbox-routing",funcName:"registerRoute",paramName:"capture"});r=e}const s=V();return s.registerRoute(r),r}function Q(e,t=[]){for(const n of[...e.searchParams.keys()])t.some(e=>e.test(n))&&e.searchParams.delete(n);return e}function*X(e,{ignoreURLParametersMatching:t=[/^utm_/,/^fbclid$/],directoryIndex:n="index.html",cleanURLs:r=!0,urlManipulation:s}={}){const o=new URL(e,location.href);o.hash="",yield o.href;const a=Q(o,t);if(yield a.href,n&&a.pathname.endsWith("/")){const e=new URL(a.href);e.pathname+=n,yield e.href}if(r){const e=new URL(a.href);e.pathname+=".html",yield e.href}if(s){const e=s({url:o});for(const t of e)yield t.href}}class Z extends G{constructor(e,t){const n=({request:n})=>{const r=e.getURLsToCacheKeys();for(const e of X(n.url,t)){const t=r.get(e);if(t)return{cacheKey:t}}};super(n,e.strategy)}}function ee(e){const t=A(),n=new Z(t,e);$(n)}function te(e){const t=A();t.precache(e)}function ne(e,t){te(e),ee(t)}class re extends N{async _handle(e,t){let n,r=await t.cacheMatch(e);if(r)0;else{0;try{r=await t.fetchAndCachePut(e)}catch(s){n=s}0}if(!r)throw new C("no-response",{url:e.url,error:n});return r}}const se={cacheWillUpdate:async({response:e})=>200===e.status||0===e.status?e:null};class oe extends N{constructor(e={}){super(e),this.plugins.some(e=>"cacheWillUpdate"in e)||this.plugins.unshift(se),this._networkTimeoutSeconds=e.networkTimeoutSeconds||0}async _handle(e,t){const n=[];const r=[];let s;if(this._networkTimeoutSeconds){const{id:o,promise:a}=this._getTimeoutPromise({request:e,logs:n,handler:t});s=o,r.push(a)}const o=this._getNetworkPromise({timeoutId:s,request:e,logs:n,handler:t});r.push(o);for(const i of r)t.waitUntil(i);let a=await Promise.race(r);if(a||(a=await o),!a)throw new C("no-response",{url:e.url});return a}_getTimeoutPromise({request:e,logs:t,handler:n}){let r;const s=new Promise(t=>{const s=async()=>{t(await n.cacheMatch(e))};r=setTimeout(s,1e3*this._networkTimeoutSeconds)});return{promise:s,id:r}}async _getNetworkPromise({timeoutId:e,request:t,logs:n,handler:r}){let s,o;try{o=await r.fetchAndCachePut(t)}catch(a){s=a}return e&&clearTimeout(e),!s&&o||(o=await r.cacheMatch(t)),o}}class ae extends N{constructor(e){super(e),this.plugins.some(e=>"cacheWillUpdate"in e)||this.plugins.unshift(se)}async _handle(e,t){const n=t.fetchAndCachePut(e).catch(()=>{});let r,s=await t.cacheMatch(e);if(s)0;else{0;try{s=await n}catch(o){r=o}}if(!s)throw new C("no-response",{url:e.url,error:r});return s}}ne([{'revision':'66c42acf5ec4142fa7fc226ed186ee50','url':'css/chunk-vendors.css'},{'revision':'b3c0d991ef9940863d1bafbcbe40ee57','url':'js/chunk-vendors.js'},{'revision':'0b4f0af04ae814f20490aab76e1b4ace','url':'js/recipe_view.js'},{'revision':'7ffb0d32c26b065a8bac007813308e6e','url':'manifest.json'},{'revision':'1606d2f696ffd86964c971c88467194a','url':'recipe_view.html'}]),$((function(e){var t=e.request;return"image"===t.destination}),new re({cacheName:"images"})),$((function(e){var t=e.request;return"script"===t.destination||"style"===t.destination}),new ae({cacheName:"assets"})),$(new RegExp("jsi18n/"),new ae({cacheName:"assets"})),$(new RegExp("api/*"),new oe({cacheName:"api"})),$((function(e){var t=e.request;return"document"===t.destination}),new oe({cacheName:"html"}))},"25f0":function(e,t,n){"use strict";var r=n("6eeb"),s=n("825a"),o=n("d039"),a=n("ad6d"),i="toString",c=RegExp.prototype,u=c[i],l=o((function(){return"/a/b"!=u.call({source:"a",flags:"b"})})),f=u.name!=i;(l||f)&&r(RegExp.prototype,i,(function(){var e=s(this),t=String(e.source),n=e.flags,r=String(void 0===n&&e instanceof RegExp&&!("flags"in c)?a.call(e):n);return"/"+t+"/"+r}),{unsafe:!0})},2626:function(e,t,n){"use strict";var r=n("d066"),s=n("9bf2"),o=n("b622"),a=n("83ab"),i=o("species");e.exports=function(e){var t=r(e),n=s.f;a&&t&&!t[i]&&n(t,i,{configurable:!0,get:function(){return this}})}},"3bbe":function(e,t,n){var r=n("861d");e.exports=function(e){if(!r(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype");return e}},"40b9":function(e,t,n){"use strict";try{self["workbox:core:6.0.2"]&&_()}catch(r){}},"428f":function(e,t,n){var r=n("da84");e.exports=r},"44ad":function(e,t,n){var r=n("d039"),s=n("c6b6"),o="".split;e.exports=r((function(){return!Object("z").propertyIsEnumerable(0)}))?function(e){return"String"==s(e)?o.call(e,""):Object(e)}:Object},"44e7":function(e,t,n){var r=n("861d"),s=n("c6b6"),o=n("b622"),a=o("match");e.exports=function(e){var t;return r(e)&&(void 0!==(t=e[a])?!!t:"RegExp"==s(e))}},4930:function(e,t,n){var r=n("d039");e.exports=!!Object.getOwnPropertySymbols&&!r((function(){return!String(Symbol())}))},"4d63":function(e,t,n){var r=n("83ab"),s=n("da84"),o=n("94ca"),a=n("7156"),i=n("9bf2").f,c=n("241c").f,u=n("44e7"),l=n("ad6d"),f=n("9f7f"),h=n("6eeb"),p=n("d039"),d=n("69f3").set,g=n("2626"),y=n("b622"),w=y("match"),m=s.RegExp,v=m.prototype,b=/a/g,x=/a/g,_=new m(b)!==b,R=f.UNSUPPORTED_Y,C=r&&o("RegExp",!_||R||p((function(){return x[w]=!1,m(b)!=b||m(x)==x||"/a/i"!=m(b,"i")})));if(C){var S=function(e,t){var n,r=this instanceof S,s=u(e),o=void 0===t;if(!r&&s&&e.constructor===S&&o)return e;_?s&&!o&&(e=e.source):e instanceof S&&(o&&(t=l.call(e)),e=e.source),R&&(n=!!t&&t.indexOf("y")>-1,n&&(t=t.replace(/y/g,"")));var i=a(_?new m(e,t):m(e,t),r?this:v,S);return R&&n&&d(i,{sticky:n}),i},O=function(e){e in S||i(S,e,{configurable:!0,get:function(){return m[e]},set:function(t){m[e]=t}})},T=c(m),U=0;while(T.length>U)O(T[U++]);v.constructor=S,S.prototype=v,h(s,"RegExp",S)}g("RegExp")},"4d64":function(e,t,n){var r=n("fc6a"),s=n("50c4"),o=n("23cb"),a=function(e){return function(t,n,a){var i,c=r(t),u=s(c.length),l=o(a,u);if(e&&n!=n){while(u>l)if(i=c[l++],i!=i)return!0}else for(;u>l;l++)if((e||l in c)&&c[l]===n)return e||l||0;return!e&&-1}};e.exports={includes:a(!0),indexOf:a(!1)}},"50c4":function(e,t,n){var r=n("a691"),s=Math.min;e.exports=function(e){return e>0?s(r(e),9007199254740991):0}},5135:function(e,t){var n={}.hasOwnProperty;e.exports=function(e,t){return n.call(e,t)}},5692:function(e,t,n){var r=n("c430"),s=n("c6cd");(e.exports=function(e,t){return s[e]||(s[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.8.2",mode:r?"pure":"global",copyright:"© 2021 Denis Pushkarev (zloirock.ru)"})},"56ef":function(e,t,n){var r=n("d066"),s=n("241c"),o=n("7418"),a=n("825a");e.exports=r("Reflect","ownKeys")||function(e){var t=s.f(a(e)),n=o.f;return n?t.concat(n(e)):t}},"5c6c":function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},"69f3":function(e,t,n){var r,s,o,a=n("7f9a"),i=n("da84"),c=n("861d"),u=n("9112"),l=n("5135"),f=n("c6cd"),h=n("f772"),p=n("d012"),d=i.WeakMap,g=function(e){return o(e)?s(e):r(e,{})},y=function(e){return function(t){var n;if(!c(t)||(n=s(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}};if(a){var w=f.state||(f.state=new d),m=w.get,v=w.has,b=w.set;r=function(e,t){return t.facade=e,b.call(w,e,t),t},s=function(e){return m.call(w,e)||{}},o=function(e){return v.call(w,e)}}else{var x=h("state");p[x]=!0,r=function(e,t){return t.facade=e,u(e,x,t),t},s=function(e){return l(e,x)?e[x]:{}},o=function(e){return l(e,x)}}e.exports={set:r,get:s,has:o,enforce:g,getterFor:y}},"6aa8":function(e,t,n){"use strict";try{self["workbox:strategies:6.0.2"]&&_()}catch(r){}},"6eeb":function(e,t,n){var r=n("da84"),s=n("9112"),o=n("5135"),a=n("ce4e"),i=n("8925"),c=n("69f3"),u=c.get,l=c.enforce,f=String(String).split("String");(e.exports=function(e,t,n,i){var c,u=!!i&&!!i.unsafe,h=!!i&&!!i.enumerable,p=!!i&&!!i.noTargetGet;"function"==typeof n&&("string"!=typeof t||o(n,"name")||s(n,"name",t),c=l(n),c.source||(c.source=f.join("string"==typeof t?t:""))),e!==r?(u?!p&&e[t]&&(h=!0):delete e[t],h?e[t]=n:s(e,t,n)):h?e[t]=n:a(t,n)})(Function.prototype,"toString",(function(){return"function"==typeof this&&u(this).source||i(this)}))},7156:function(e,t,n){var r=n("861d"),s=n("d2bb");e.exports=function(e,t,n){var o,a;return s&&"function"==typeof(o=t.constructor)&&o!==n&&r(a=o.prototype)&&a!==n.prototype&&s(e,a),e}},7418:function(e,t){t.f=Object.getOwnPropertySymbols},"741b":function(e,t,n){"use strict";try{self["workbox:core:6.0.2"]&&_()}catch(r){}},7839:function(e,t){e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},"7f9a":function(e,t,n){var r=n("da84"),s=n("8925"),o=r.WeakMap;e.exports="function"===typeof o&&/native code/.test(s(o))},"825a":function(e,t,n){var r=n("861d");e.exports=function(e){if(!r(e))throw TypeError(String(e)+" is not an object");return e}},"83ab":function(e,t,n){var r=n("d039");e.exports=!r((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},"861d":function(e,t){e.exports=function(e){return"object"===typeof e?null!==e:"function"===typeof e}},8925:function(e,t,n){var r=n("c6cd"),s=Function.toString;"function"!=typeof r.inspectSource&&(r.inspectSource=function(e){return s.call(e)}),e.exports=r.inspectSource},"90e3":function(e,t){var n=0,r=Math.random();e.exports=function(e){return"Symbol("+String(void 0===e?"":e)+")_"+(++n+r).toString(36)}},9112:function(e,t,n){var r=n("83ab"),s=n("9bf2"),o=n("5c6c");e.exports=r?function(e,t,n){return s.f(e,t,o(1,n))}:function(e,t,n){return e[t]=n,e}},9263:function(e,t,n){"use strict";var r=n("ad6d"),s=n("9f7f"),o=RegExp.prototype.exec,a=String.prototype.replace,i=o,c=function(){var e=/a/,t=/b*/g;return o.call(e,"a"),o.call(t,"a"),0!==e.lastIndex||0!==t.lastIndex}(),u=s.UNSUPPORTED_Y||s.BROKEN_CARET,l=void 0!==/()??/.exec("")[1],f=c||l||u;f&&(i=function(e){var t,n,s,i,f=this,h=u&&f.sticky,p=r.call(f),d=f.source,g=0,y=e;return h&&(p=p.replace("y",""),-1===p.indexOf("g")&&(p+="g"),y=String(e).slice(f.lastIndex),f.lastIndex>0&&(!f.multiline||f.multiline&&"\n"!==e[f.lastIndex-1])&&(d="(?: "+d+")",y=" "+y,g++),n=new RegExp("^(?:"+d+")",p)),l&&(n=new RegExp("^"+d+"$(?!\\s)",p)),c&&(t=f.lastIndex),s=o.call(h?n:f,y),h?s?(s.input=s.input.slice(g),s[0]=s[0].slice(g),s.index=f.lastIndex,f.lastIndex+=s[0].length):f.lastIndex=0:c&&s&&(f.lastIndex=f.global?s.index+s[0].length:t),l&&s&&s.length>1&&a.call(s[0],n,(function(){for(i=1;i0?r:n)(e)}},ac1f:function(e,t,n){"use strict";var r=n("23e7"),s=n("9263");r({target:"RegExp",proto:!0,forced:/./.exec!==s},{exec:s})},ad6d:function(e,t,n){"use strict";var r=n("825a");e.exports=function(){var e=r(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.dotAll&&(t+="s"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t}},b622:function(e,t,n){var r=n("da84"),s=n("5692"),o=n("5135"),a=n("90e3"),i=n("4930"),c=n("fdbf"),u=s("wks"),l=r.Symbol,f=c?l:l&&l.withoutSetter||a;e.exports=function(e){return o(u,e)||(i&&o(l,e)?u[e]=l[e]:u[e]=f("Symbol."+e)),u[e]}},c04e:function(e,t,n){var r=n("861d");e.exports=function(e,t){if(!r(e))return e;var n,s;if(t&&"function"==typeof(n=e.toString)&&!r(s=n.call(e)))return s;if("function"==typeof(n=e.valueOf)&&!r(s=n.call(e)))return s;if(!t&&"function"==typeof(n=e.toString)&&!r(s=n.call(e)))return s;throw TypeError("Can't convert object to primitive value")}},c430:function(e,t){e.exports=!1},c6b6:function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},c6cd:function(e,t,n){var r=n("da84"),s=n("ce4e"),o="__core-js_shared__",a=r[o]||s(o,{});e.exports=a},c700:function(e,t,n){"use strict";try{self["workbox:precaching:6.0.2"]&&_()}catch(r){}},c8ba:function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(r){"object"===typeof window&&(n=window)}e.exports=n},ca84:function(e,t,n){var r=n("5135"),s=n("fc6a"),o=n("4d64").indexOf,a=n("d012");e.exports=function(e,t){var n,i=s(e),c=0,u=[];for(n in i)!r(a,n)&&r(i,n)&&u.push(n);while(t.length>c)r(i,n=t[c++])&&(~o(u,n)||u.push(n));return u}},cc12:function(e,t,n){var r=n("da84"),s=n("861d"),o=r.document,a=s(o)&&s(o.createElement);e.exports=function(e){return a?o.createElement(e):{}}},ce4e:function(e,t,n){var r=n("da84"),s=n("9112");e.exports=function(e,t){try{s(r,e,t)}catch(n){r[e]=t}return t}},d012:function(e,t){e.exports={}},d039:function(e,t){e.exports=function(e){try{return!!e()}catch(t){return!0}}},d066:function(e,t,n){var r=n("428f"),s=n("da84"),o=function(e){return"function"==typeof e?e:void 0};e.exports=function(e,t){return arguments.length<2?o(r[e])||o(s[e]):r[e]&&r[e][t]||s[e]&&s[e][t]}},d1e7:function(e,t,n){"use strict";var r={}.propertyIsEnumerable,s=Object.getOwnPropertyDescriptor,o=s&&!r.call({1:2},1);t.f=o?function(e){var t=s(this,e);return!!t&&t.enumerable}:r},d2bb:function(e,t,n){var r=n("825a"),s=n("3bbe");e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{e=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set,e.call(n,[]),t=n instanceof Array}catch(o){}return function(n,o){return r(n),s(o),t?e.call(n,o):n.__proto__=o,n}}():void 0)},da84:function(e,t,n){(function(t){var n=function(e){return e&&e.Math==Math&&e};e.exports=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof t&&t)||function(){return this}()||Function("return this")()}).call(this,n("c8ba"))},e6d2:function(e,t,n){"use strict";try{self["workbox:routing:6.0.2"]&&_()}catch(r){}},e893:function(e,t,n){var r=n("5135"),s=n("56ef"),o=n("06cf"),a=n("9bf2");e.exports=function(e,t){for(var n=s(t),i=a.f,c=o.f,u=0;u 1%", "last 2 versions", "not dead" - ] + ], + "resolutions": { + "@vue/cli-plugin-pwa/workbox-webpack-plugin": "^5.1.3" + } } diff --git a/vue/src/registerServiceWorker.js b/vue/src/registerServiceWorker.js new file mode 100644 index 000000000..76cede074 --- /dev/null +++ b/vue/src/registerServiceWorker.js @@ -0,0 +1,32 @@ +/* eslint-disable no-console */ + +import { register } from 'register-service-worker' + +if (process.env.NODE_ENV === 'production') { + register(`${process.env.BASE_URL}service-worker.js`, { + ready () { + console.log( + 'App is being served from cache by a service worker.\n' + + 'For more details, visit https://goo.gl/AFskqB' + ) + }, + registered () { + console.log('Service worker has been registered.') + }, + cached () { + console.log('Content has been cached for offline use.') + }, + updatefound () { + console.log('New content is downloading.') + }, + updated () { + console.log('New content is available; please refresh.') + }, + offline () { + console.log('No internet connection found. App is running in offline mode.') + }, + error (error) { + console.error('Error during service worker registration:', error) + } + }) +} diff --git a/vue/src/sw.js b/vue/src/sw.js new file mode 100644 index 000000000..2e98eb95c --- /dev/null +++ b/vue/src/sw.js @@ -0,0 +1,39 @@ +// These JavaScript module imports need to be bundled: +import {precacheAndRoute} from 'workbox-precaching'; +import {registerRoute} from 'workbox-routing'; +import {CacheFirst, NetworkFirst, StaleWhileRevalidate} from 'workbox-strategies'; + +precacheAndRoute(self.__WB_MANIFEST); + +registerRoute( + ({request}) => request.destination === 'image', + new CacheFirst({cacheName: 'images'}), +); + +registerRoute( + ({request}) => request.destination === 'script' || request.destination === 'style', + new StaleWhileRevalidate({ + cacheName: 'assets' + }) +) + +registerRoute( + new RegExp('jsi18n/'), + new StaleWhileRevalidate({ + cacheName: 'assets' + }) +) + +registerRoute( + new RegExp('api/*'), + new NetworkFirst({ + cacheName: 'api' + }) +) + +registerRoute( + ({request}) => request.destination === 'document', + new NetworkFirst({ + cacheName: 'html' + }) +) \ No newline at end of file diff --git a/vue/vue.config.js b/vue/vue.config.js index 575906b13..ec8bb0daa 100644 --- a/vue/vue.config.js +++ b/vue/vue.config.js @@ -16,6 +16,20 @@ module.exports = { : 'http://localhost:8080/', outputDir: '../cookbook/static/vue/', runtimeCompiler: true, + pwa: { + name: 'Recipes', + themeColor: '#4DBA87', + msTileColor: '#000000', + appleMobileWebAppCapable: 'yes', + appleMobileWebAppStatusBarStyle: 'black', + + + workboxPluginMode: 'InjectManifest', + workboxOptions: { + swSrc: './src/sw.js', + swDest: '../../templates/sw.js', + } + }, chainWebpack: config => { config.optimization.splitChunks({ @@ -29,11 +43,13 @@ module.exports = { }, }); + /* Object.keys(pages).forEach(page => { config.plugins.delete(`html-${page}`); config.plugins.delete(`preload-${page}`); config.plugins.delete(`prefetch-${page}`); }) + */ config .plugin('BundleTracker') diff --git a/vue/yarn.lock b/vue/yarn.lock index 81e72d92b..7a8fe8c9f 100644 --- a/vue/yarn.lock +++ b/vue/yarn.lock @@ -1302,6 +1302,15 @@ webpack "^4.0.0" yorkie "^2.0.0" +"@vue/cli-plugin-pwa@~4.5.0": + version "4.5.10" + resolved "https://registry.npm.taobao.org/@vue/cli-plugin-pwa/download/@vue/cli-plugin-pwa-4.5.10.tgz#e415a1ae339bf697b0656e3774dfad031c9564ed" + integrity sha1-5BWhrjOb9pewZW43dN+tAxyVZO0= + dependencies: + "@vue/cli-shared-utils" "^4.5.10" + webpack "^4.0.0" + workbox-webpack-plugin "^4.3.1" + "@vue/cli-plugin-router@^4.5.10": version "4.5.10" resolved "https://registry.npm.taobao.org/@vue/cli-plugin-router/download/@vue/cli-plugin-router-4.5.10.tgz?cache=0&sync_timestamp=1609924480510&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fcli-plugin-router%2Fdownload%2F%40vue%2Fcli-plugin-router-4.5.10.tgz#546eaf6295bb125ce2365fb6db83548979776b0d" @@ -8839,13 +8848,6 @@ workbox-cacheable-response@^5.1.4: dependencies: workbox-core "^5.1.4" -workbox-cacheable-response@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-6.0.2.tgz#00b1133c4c846a2874f32ae14206c0636bacfd87" - integrity sha512-OrgFiYWkmFXDIbNRYSu+fchcfoZqyJ4yZbdc8WKUjr9v/MghKHfR9u7UI077xBkjno5J3YNpbwx73/no3HkrzA== - dependencies: - workbox-core "^6.0.2" - workbox-core@^5.1.4: version "5.1.4" resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-5.1.4.tgz#8bbfb2362ecdff30e25d123c82c79ac65d9264f4" @@ -8863,13 +8865,6 @@ workbox-expiration@^5.1.4: dependencies: workbox-core "^5.1.4" -workbox-expiration@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-6.0.2.tgz#ac01e8d17f48daa31dc0872c09ee6f4d2cf28ccb" - integrity sha512-6+nbR18cklAdI3BPT675ytftXPwnVbXGR8mPWNWTJtl5y2urRYv56ZOJLD7FBFVkZ8EjWiRhNP/A0fkxgdKtWQ== - dependencies: - workbox-core "^6.0.2" - workbox-google-analytics@^5.1.4: version "5.1.4" resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-5.1.4.tgz#b3376806b1ac7d7df8418304d379707195fa8517" @@ -8894,6 +8889,15 @@ workbox-precaching@^5.1.4: dependencies: workbox-core "^5.1.4" +workbox-precaching@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-6.0.2.tgz#cb45f290b0604bef1d9fc96bf42df82385d54e54" + integrity sha512-sqKWL2emzmGnfJpna+9RjUkUiqQO++AKfwljCbgkHg8wBbVLy/rnui3eelKgAI7D8R31LJFfiZkY/kXmwkjtlQ== + dependencies: + workbox-core "^6.0.2" + workbox-routing "^6.0.2" + workbox-strategies "^6.0.2" + workbox-range-requests@^5.1.4: version "5.1.4" resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-5.1.4.tgz#7066a12c121df65bf76fdf2b0868016aa2bab859" @@ -8943,7 +8947,7 @@ workbox-sw@^5.1.4: resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-5.1.4.tgz#2bb34c9f7381f90d84cef644816d45150011d3db" integrity sha512-9xKnKw95aXwSNc8kk8gki4HU0g0W6KXu+xks7wFuC7h0sembFnTrKtckqZxbSod41TDaGh+gWUA5IRXrL0ECRA== -workbox-webpack-plugin@^5.1.3: +workbox-webpack-plugin@^4.3.1, workbox-webpack-plugin@^5.1.3: version "5.1.4" resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-5.1.4.tgz#7bfe8c16e40fe9ed8937080ac7ae9c8bde01e79c" integrity sha512-PZafF4HpugZndqISi3rZ4ZK4A4DxO8rAqt2FwRptgsDx7NF8TVKP86/huHquUsRjMGQllsNdn4FNl8CD/UvKmQ==