Home Manual Reference Source Test Repository

lib/config/config-schema.js

  1. import Joi from 'joi';
  2.  
  3. const middlewareOrLifecycleSchema = Joi.alternatives()
  4. .try(Joi.string(), Joi.func(), Joi.array().items(Joi.string(), Joi.func()))
  5. .default([]);
  6.  
  7. const regExpSchema = Joi.object().type(RegExp);
  8.  
  9. export default Joi.object({
  10. site: Joi.object().default(),
  11. path: Joi.object({
  12. source: Joi.string().default('./'),
  13. destination: Joi.string().default('./_site'),
  14. templates: Joi.string().default('./_templates'),
  15. data: Joi.string().default('./_data'),
  16. }).default(),
  17. file: Joi.object({
  18. urlKey: Joi.string().default('url'),
  19. dateFormat: Joi.string().default('YYYY-M-D'),
  20. defaults: Joi.array()
  21. .items(
  22. Joi.object({
  23. scope: Joi.object({
  24. path: Joi.string().allow(''),
  25. metadata: Joi.object(),
  26. }),
  27. values: Joi.object(),
  28. })
  29. )
  30. .default([]),
  31. filters: Joi.object({
  32. metadata: Joi.object(),
  33. futureDate: Joi.object({
  34. key: Joi.string().default('date'),
  35. }),
  36. }).default({}),
  37. }).default(),
  38. collections: Joi.object().pattern(
  39. /\w/,
  40. Joi.object({
  41. path: Joi.string(),
  42. metadata: Joi.string(),
  43. template: Joi.string().default('index'),
  44. pageSize: Joi.number().default(6),
  45. sort: Joi.object({
  46. key: Joi.string().default('date'),
  47. order: Joi.string().default('descending'),
  48. }),
  49. permalink: Joi.object({
  50. index: Joi.string().default('/'),
  51. page: Joi.string().default('/page/:page/'),
  52. }),
  53. }).without('path', 'metadata')
  54. ),
  55. assets: Joi.array()
  56. .items(
  57. Joi.object({
  58. test: Joi.alternatives().try(Joi.string(), Joi.func(), regExpSchema),
  59. use: Joi.alternatives().try(
  60. Joi.string(),
  61. Joi.object({
  62. calculateDestination: Joi.func().required(),
  63. render: Joi.func().required(),
  64. })
  65. ),
  66. })
  67. )
  68. .default([
  69. { test: /\.less$/, use: 'less' },
  70. { test: /\.js$/, use: 'browserify' },
  71. { test: /\.s[ac]ss$/, use: 'sass' },
  72. ]),
  73. cleanDestination: Joi.boolean().default(false),
  74. slug: Joi.object({
  75. lower: Joi.boolean().default(true),
  76. }).default(),
  77. markdown: Joi.object({
  78. extensions: Joi.array().default([
  79. 'markdown',
  80. 'mkdown',
  81. 'mkdn',
  82. 'mkd',
  83. 'md',
  84. ]),
  85. options: Joi.object({
  86. preset: Joi.string().default('commonmark'),
  87. highlight: Joi.any()
  88. .valid('prism', 'highlightjs', true, false)
  89. .default(true),
  90. })
  91. .unknown(true)
  92. .default(),
  93. }).default(),
  94. server: Joi.object({
  95. port: Joi.number().default(8080),
  96. host: Joi.string().default('127.0.0.1'),
  97. baseurl: Joi.string()
  98. .allow('')
  99. .default(''),
  100. }).default(),
  101. ignore: Joi.array()
  102. .items(Joi.string(), Joi.func(), regExpSchema)
  103. .default([]),
  104. incremental: Joi.boolean().default(true),
  105. newFilePermalink: Joi.string().default(
  106. '/_posts/:date|YYYY-:date|MM-:date|D-:title.md'
  107. ),
  108. middlewares: middlewareOrLifecycleSchema,
  109. lifecycle: Joi.object({
  110. willUpdate: middlewareOrLifecycleSchema,
  111. didUpdate: middlewareOrLifecycleSchema,
  112. willBuild: middlewareOrLifecycleSchema,
  113. didBuild: middlewareOrLifecycleSchema,
  114. }).default(),
  115. }).default();