configure.js 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. /**
  2. * @import {Options, State} from './types.js'
  3. */
  4. const own = {}.hasOwnProperty
  5. /**
  6. * @param {State} base
  7. * @param {Options} extension
  8. * @returns {State}
  9. */
  10. export function configure(base, extension) {
  11. let index = -1
  12. /** @type {keyof Options} */
  13. let key
  14. // First do subextensions.
  15. if (extension.extensions) {
  16. while (++index < extension.extensions.length) {
  17. configure(base, extension.extensions[index])
  18. }
  19. }
  20. for (key in extension) {
  21. if (own.call(extension, key)) {
  22. switch (key) {
  23. case 'extensions': {
  24. // Empty.
  25. break
  26. }
  27. /* c8 ignore next 4 */
  28. case 'unsafe': {
  29. list(base[key], extension[key])
  30. break
  31. }
  32. case 'join': {
  33. list(base[key], extension[key])
  34. break
  35. }
  36. case 'handlers': {
  37. map(base[key], extension[key])
  38. break
  39. }
  40. default: {
  41. // @ts-expect-error: matches.
  42. base.options[key] = extension[key]
  43. }
  44. }
  45. }
  46. }
  47. return base
  48. }
  49. /**
  50. * @template T
  51. * @param {Array<T>} left
  52. * @param {Array<T> | null | undefined} right
  53. */
  54. function list(left, right) {
  55. if (right) {
  56. left.push(...right)
  57. }
  58. }
  59. /**
  60. * @template T
  61. * @param {Record<string, T>} left
  62. * @param {Record<string, T> | null | undefined} right
  63. */
  64. function map(left, right) {
  65. if (right) {
  66. Object.assign(left, right)
  67. }
  68. }