33 * @typedef {import('./types.js').State } State
44 */
55
6+ const own = { } . hasOwnProperty
7+
68/**
79 * @param {State } base
810 * @param {Options } extension
@@ -21,19 +23,58 @@ export function configure(base, extension) {
2123 }
2224
2325 for ( key in extension ) {
24- if ( key === 'extensions' ) {
25- // Empty.
26- } else if ( key === 'unsafe' || key === 'join' ) {
27- /* c8 ignore next 2 */
28- // @ts -expect-error: hush.
29- base [ key ] = [ ...( base [ key ] || [ ] ) , ...( extension [ key ] || [ ] ) ]
30- } else if ( key === 'handlers' ) {
31- base [ key ] = Object . assign ( base [ key ] , extension [ key ] || { } )
32- } else {
33- // @ts -expect-error: hush.
34- base . options [ key ] = extension [ key ]
26+ if ( own . call ( extension , key ) ) {
27+ switch ( key ) {
28+ case 'extensions' : {
29+ // Empty.
30+ break
31+ }
32+
33+ /* c8 ignore next 4 */
34+ case 'unsafe' : {
35+ list ( base [ key ] , extension [ key ] )
36+ break
37+ }
38+
39+ case 'join' : {
40+ list ( base [ key ] , extension [ key ] )
41+ break
42+ }
43+
44+ case 'handlers' : {
45+ map ( base [ key ] , extension [ key ] )
46+ break
47+ }
48+
49+ default : {
50+ // @ts -expect-error: matches.
51+ base . options [ key ] = extension [ key ]
52+ }
53+ }
3554 }
3655 }
3756
3857 return base
3958}
59+
60+ /**
61+ * @template T
62+ * @param {Array<T> } left
63+ * @param {Array<T> | null | undefined } right
64+ */
65+ function list ( left , right ) {
66+ if ( right ) {
67+ left . push ( ...right )
68+ }
69+ }
70+
71+ /**
72+ * @template T
73+ * @param {Record<string, T> } left
74+ * @param {Record<string, T> | null | undefined } right
75+ */
76+ function map ( left , right ) {
77+ if ( right ) {
78+ Object . assign ( left , right )
79+ }
80+ }
0 commit comments