common-generate-schema.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. "use strict";
  2. /*
  3. Copyright 2018 Google LLC
  4. Use of this source code is governed by an MIT-style
  5. license that can be found in the LICENSE file or at
  6. https://opensource.org/licenses/MIT.
  7. */
  8. const joi = require('@hapi/joi');
  9. const baseSchema = require('./base-schema');
  10. const defaults = require('./defaults');
  11. const regExpObject = require('./reg-exp-object'); // Add some constraints that apply to both generateSW and generateSWString.
  12. module.exports = baseSchema.keys({
  13. cacheId: joi.string(),
  14. cleanupOutdatedCaches: joi.boolean().default(defaults.cleanupOutdatedCaches),
  15. clientsClaim: joi.boolean().default(defaults.clientsClaim),
  16. directoryIndex: joi.string(),
  17. ignoreURLParametersMatching: joi.array().items(regExpObject),
  18. navigateFallback: joi.string().default(defaults.navigateFallback),
  19. navigateFallbackBlacklist: joi.array().items(regExpObject),
  20. navigateFallbackWhitelist: joi.array().items(regExpObject),
  21. navigationPreload: joi.boolean().default(defaults.navigationPreload),
  22. offlineGoogleAnalytics: joi.alternatives().try(joi.boolean(), joi.object()).default(defaults.offlineGoogleAnalytics),
  23. runtimeCaching: joi.array().items(joi.object().keys({
  24. method: joi.string().valid('DELETE', 'GET', 'HEAD', 'PATCH', 'POST', 'PUT'),
  25. urlPattern: [regExpObject, joi.string(), joi.func()],
  26. handler: [joi.func(), joi.string().valid('CacheFirst', 'CacheOnly', 'NetworkFirst', 'NetworkOnly', 'StaleWhileRevalidate')],
  27. options: joi.object().keys({
  28. backgroundSync: joi.object().keys({
  29. name: joi.string().required(),
  30. options: joi.object()
  31. }),
  32. broadcastUpdate: joi.object().keys({
  33. channelName: joi.string().required(),
  34. options: joi.object()
  35. }),
  36. cacheableResponse: joi.object().keys({
  37. statuses: joi.array().items(joi.number().min(0).max(599)),
  38. headers: joi.object()
  39. }).or('statuses', 'headers'),
  40. cacheName: joi.string(),
  41. expiration: joi.object().keys({
  42. maxEntries: joi.number().min(1),
  43. maxAgeSeconds: joi.number().min(1),
  44. purgeOnQuotaError: joi.boolean().default(defaults.purgeOnQuotaError)
  45. }).or('maxEntries', 'maxAgeSeconds'),
  46. networkTimeoutSeconds: joi.number().min(1),
  47. plugins: joi.array().items(joi.object()),
  48. fetchOptions: joi.object(),
  49. matchOptions: joi.object()
  50. }).with('expiration', 'cacheName')
  51. }).requiredKeys('urlPattern', 'handler')).when('navigationPreload', {
  52. is: true,
  53. then: joi.required()
  54. }),
  55. skipWaiting: joi.boolean().default(defaults.skipWaiting)
  56. }).rename('ignoreUrlParametersMatching', 'ignoreURLParametersMatching', {
  57. ignoreUndefined: true,
  58. override: true
  59. });