@@ -14,14 +14,22 @@ import {stringify as spaces} from 'space-separated-tokens'
1414import { zwitch } from 'zwitch'
1515
1616const handle = zwitch ( 'operator' , {
17+ // @ts -expect-error: hush.
1718 unknown : unknownOperator ,
19+ // @ts -expect-error: hush.
1820 invalid : exists ,
1921 handlers : {
22+ // @ts -expect-error: hush.
2023 '=' : exact ,
24+ // @ts -expect-error: hush.
2125 '~=' : spaceSeparatedList ,
26+ // @ts -expect-error: hush.
2227 '|=' : exactOrPrefix ,
28+ // @ts -expect-error: hush.
2329 '^=' : begins ,
30+ // @ts -expect-error: hush.
2431 '$=' : ends ,
32+ // @ts -expect-error: hush.
2533 '*=' : contains
2634 }
2735} )
@@ -37,7 +45,9 @@ export function attribute(query, element, schema) {
3745 let index = - 1
3846
3947 while ( ++ index < attrs . length ) {
40- if ( ! handle ( attrs [ index ] , element , find ( schema , attrs [ index ] . name ) ) ) return
48+ if ( ! handle ( attrs [ index ] , element , find ( schema , attrs [ index ] . name ) ) ) {
49+ return false
50+ }
4151 }
4252
4353 return true
@@ -64,9 +74,10 @@ function exists(_, element, info) {
6474 * @returns {boolean }
6575 */
6676function exact ( query , element , info ) {
67- return (
77+ return Boolean (
6878 hasProperty ( element , info . property ) &&
69- normalizeValue ( element . properties [ info . property ] , info ) === query . value
79+ element . properties &&
80+ normalizeValue ( element . properties [ info . property ] , info ) === query . value
7081 )
7182}
7283
@@ -79,14 +90,15 @@ function exact(query, element, info) {
7990 * @returns {boolean }
8091 */
8192function spaceSeparatedList ( query , element , info ) {
82- const value = element . properties [ info . property ]
93+ const value = element . properties && element . properties [ info . property ]
8394
8495 return (
8596 // If this is a comma-separated list, and the query is contained in it, return
8697 // true.
8798 ( ! info . commaSeparated &&
8899 value &&
89100 typeof value === 'object' &&
101+ query . value &&
90102 value . includes ( query . value ) ) ||
91103 // For all other values (including comma-separated lists), return whether this
92104 // is an exact match.
@@ -104,13 +116,17 @@ function spaceSeparatedList(query, element, info) {
104116 * @returns {boolean }
105117 */
106118function exactOrPrefix ( query , element , info ) {
107- const value = normalizeValue ( element . properties [ info . property ] , info )
119+ const value = normalizeValue (
120+ element . properties && element . properties [ info . property ] ,
121+ info
122+ )
108123
109- return (
124+ return Boolean (
110125 hasProperty ( element , info . property ) &&
111- ( value === query . value ||
112- ( value . slice ( 0 , query . value . length ) === query . value &&
113- value . charAt ( query . value . length ) === '-' ) )
126+ query . value &&
127+ ( value === query . value ||
128+ ( value . slice ( 0 , query . value . length ) === query . value &&
129+ value . charAt ( query . value . length ) === '-' ) )
114130 )
115131}
116132
@@ -123,12 +139,14 @@ function exactOrPrefix(query, element, info) {
123139 * @returns {boolean }
124140 */
125141function begins ( query , element , info ) {
126- return (
142+ return Boolean (
127143 hasProperty ( element , info . property ) &&
128- normalizeValue ( element . properties [ info . property ] , info ) . slice (
129- 0 ,
130- query . value . length
131- ) === query . value
144+ element . properties &&
145+ query . value &&
146+ normalizeValue ( element . properties [ info . property ] , info ) . slice (
147+ 0 ,
148+ query . value . length
149+ ) === query . value
132150 )
133151}
134152
@@ -141,11 +159,13 @@ function begins(query, element, info) {
141159 * @returns {boolean }
142160 */
143161function ends ( query , element , info ) {
144- return (
162+ return Boolean (
145163 hasProperty ( element , info . property ) &&
146- normalizeValue ( element . properties [ info . property ] , info ) . slice (
147- - query . value . length
148- ) === query . value
164+ element . properties &&
165+ query . value &&
166+ normalizeValue ( element . properties [ info . property ] , info ) . slice (
167+ - query . value . length
168+ ) === query . value
149169 )
150170}
151171
@@ -158,11 +178,13 @@ function ends(query, element, info) {
158178 * @returns {boolean }
159179 */
160180function contains ( query , element , info ) {
161- return (
181+ return Boolean (
162182 hasProperty ( element , info . property ) &&
163- normalizeValue ( element . properties [ info . property ] , info ) . includes (
164- query . value
165- )
183+ element . properties &&
184+ query . value &&
185+ normalizeValue ( element . properties [ info . property ] , info ) . includes (
186+ query . value
187+ )
166188 )
167189}
168190
0 commit comments