diff --git a/README.md b/README.md index e347c418..ebca900c 100644 --- a/README.md +++ b/README.md @@ -19,34 +19,39 @@ This is still in ⍺lpha territory. You probably shouldn't put this into produc ### Implemented Phoenix Bindings (See [Phoenix Bindings Docs](https://hexdocs.pm/phoenix_live_view/bindings.html) for more details) -| Binding | Attribute | Implemented | +| Binding | Attribute | Supported | |-----------------|----------------------|-------------| -| Params | `phx-value-*` | [x] | -| Click Events | `phx-click` | [x] | -| Click Events | `phx-click-away` | [x] | -| Form Events | `phx-change` | [x] | -| Form Events | `phx-submit` | [x] | -| Form Events | `phx-feedback-for` | [ ] | -| Form Events | `phx-disable-with` | [x] | -| Form Events | `phx-trigger-action` | [ ] | -| Form Events | `phx-auto-recover` | [ ] | -| Focus Events | `phx-blur` | [x] | -| Focus Events | `phx-focus` | [x] | -| Focus Events | `phx-window-blur` | [x] | -| Focus Events | `phx-window-focus` | [x] | -| Key Events | `phx-keydown` | [x] | -| Key Events | `phx-keyup` | [x] | -| Key Events | `phx-window-keydown` | [x] | -| Key Events | `phx-window-keyup` | [x] | -| Key Events | `phx-key` | [x] | -| DOM Patching | `phx-update` | [ ] | -| DOM Patching | `phx-remove` | [ ] | -| JS Interop | `phx-hook` | [ ] | -| Rate Limiting | `phx-debounce` | [x] | -| Rate Limiting | `phx-throttle` | [x] | -| Static Tracking | `phx-track-static` | [ ] | - - +| Params | `phx-value-*` | ✅ | +| Click Events | `phx-click` | ✅ | +| Click Events | `phx-click-away` | ✅ | +| Form Events | `phx-change` | ✅ | +| Form Events | `phx-submit` | ✅ | +| Form Events | `phx-feedback-for` | ✅ | +| Form Events | `phx-disable-with` | ✅ | +| Form Events | `phx-trigger-action` | ﹖ | +| Form Events | `phx-auto-recover` | ﹖ | +| Focus Events | `phx-blur` | ✅ | +| Focus Events | `phx-focus` | ✅ | +| Focus Events | `phx-window-blur` | ✅ | +| Focus Events | `phx-window-focus` | ✅ | +| Key Events | `phx-keydown` | ✅ | +| Key Events | `phx-keyup` | ✅ | +| Key Events | `phx-window-keydown` | ✅ | +| Key Events | `phx-window-keyup` | ✅ | +| Key Events | `phx-key` | ✅ | +| DOM Patching | `phx-update` | ✅ | +| DOM Patching | `phx-remove` | ﹖ | +| JS Interop | `phx-hook` | ✅ | +| Rate Limiting | `phx-debounce` | ✅ | +| Rate Limiting | `phx-throttle` | ✅ | +| Static Tracking | `phx-track-static` | ⊖ | + +Other features: +* [Updating HTML Document Title](https://hexdocs.pm/phoenix_live_view/live-layouts.html#updating-the-html-document-title) - Not yet +* [View Helpers](https://hexdocs.pm/phoenix_live_view/Phoenix.LiveView.Helpers.html) - Some... +* [LiveView Helpers](https://hexdocs.pm/phoenix_live_view/0.10.0/Phoenix.LiveView.Helpers.html) - Not yet +* [Temporary Assigns](https://hexdocs.pm/phoenix_live_view/dom-patching.html#temporary-assigns) - Not yet +* [Build in Flash Message Support](https://hexdocs.pm/phoenix_live_view/0.17.6/Phoenix.LiveView.html#put_flash/3) - Not yet ### Show me some code! ⌨️ diff --git a/coverage/clover.xml b/coverage/clover.xml index 45c66d5b..e824eb34 100644 --- a/coverage/clover.xml +++ b/coverage/clover.xml @@ -1,84 +1,21 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + diff --git a/coverage/coverage-final.json b/coverage/coverage-final.json index d1704ffb..bb1855ff 100644 --- a/coverage/coverage-final.json +++ b/coverage/coverage-final.json @@ -1,6 +1,2 @@ -{"/Users/donnie/src/github.com/floodfx/liveviewjs/src/examples/autocomplete/data.ts": {"path":"/Users/donnie/src/github.com/floodfx/liveviewjs/src/examples/autocomplete/data.ts","statementMap":{"0":{"start":{"line":4,"column":4},"end":{"line":6,"column":null}},"1":{"start":{"line":5,"column":6},"end":{"line":5,"column":null}},"2":{"start":{"line":7,"column":4},"end":{"line":7,"column":90}},"3":{"start":{"line":7,"column":37},"end":{"line":7,"column":88}},"4":{"start":{"line":3,"column":2},"end":{"line":3,"column":18}},"5":{"start":{"line":10,"column":15},"end":{"line":1012,"column":null}}},"fnMap":{"0":{"name":"suggest","decl":{"start":{"line":3,"column":18},"end":{"line":3,"column":25}},"loc":{"start":{"line":3,"column":40},"end":{"line":8,"column":3}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":7,"column":29},"end":{"line":7,"column":33}},"loc":{"start":{"line":7,"column":37},"end":{"line":7,"column":88}}}},"branchMap":{"0":{"loc":{"start":{"line":4,"column":4},"end":{"line":6,"column":null}},"type":"if","locations":[{"start":{"line":4,"column":4},"end":{"line":6,"column":null}}]}},"s":{"0":1,"1":0,"2":1,"3":1001,"4":1,"5":1},"f":{"0":1,"1":1001},"b":{"0":[0]}} -,"/Users/donnie/src/github.com/floodfx/liveviewjs/src/examples/live-search/data.ts": {"path":"/Users/donnie/src/github.com/floodfx/liveviewjs/src/examples/live-search/data.ts","statementMap":{"0":{"start":{"line":13,"column":2},"end":{"line":13,"column":51}},"1":{"start":{"line":13,"column":32},"end":{"line":13,"column":49}},"2":{"start":{"line":12,"column":0},"end":{"line":12,"column":16}},"3":{"start":{"line":17,"column":2},"end":{"line":17,"column":53}},"4":{"start":{"line":17,"column":32},"end":{"line":17,"column":51}},"5":{"start":{"line":16,"column":0},"end":{"line":16,"column":16}},"6":{"start":{"line":21,"column":2},"end":{"line":21,"column":16}},"7":{"start":{"line":20,"column":0},"end":{"line":20,"column":16}},"8":{"start":{"line":24,"column":24},"end":{"line":88,"column":null}}},"fnMap":{"0":{"name":"searchByZip","decl":{"start":{"line":12,"column":16},"end":{"line":12,"column":27}},"loc":{"start":{"line":12,"column":39},"end":{"line":14,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":13,"column":23},"end":{"line":13,"column":28}},"loc":{"start":{"line":13,"column":32},"end":{"line":13,"column":49}}},"2":{"name":"searchByCity","decl":{"start":{"line":16,"column":16},"end":{"line":16,"column":28}},"loc":{"start":{"line":16,"column":41},"end":{"line":18,"column":1}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":17,"column":23},"end":{"line":17,"column":28}},"loc":{"start":{"line":17,"column":32},"end":{"line":17,"column":51}}},"4":{"name":"listStores","decl":{"start":{"line":20,"column":16},"end":{"line":20,"column":26}},"loc":{"start":{"line":20,"column":26},"end":{"line":22,"column":1}}}},"branchMap":{},"s":{"0":1,"1":7,"2":1,"3":1,"4":7,"5":1,"6":1,"7":1,"8":1},"f":{"0":1,"1":7,"2":1,"3":7,"4":1},"b":{}} -,"/Users/donnie/src/github.com/floodfx/liveviewjs/src/misc/erlang/Erlang.js": {"path":"/Users/donnie/src/github.com/floodfx/liveviewjs/src/misc/erlang/Erlang.js","statementMap":{},"fnMap":{},"branchMap":{},"s":{},"f":{},"b":{},"inputSourceMap":null,"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"dbb880bf342e286315c677dfe08eabf8ef057b3c"} -,"/Users/donnie/src/github.com/floodfx/liveviewjs/src/misc/erlang/index.ts": {"path":"/Users/donnie/src/github.com/floodfx/liveviewjs/src/misc/erlang/index.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":34}},"1":{"start":{"line":4,"column":35},"end":{"line":8,"column":1}},"2":{"start":{"line":5,"column":18},"end":{"line":5,"column":48}},"3":{"start":{"line":7,"column":2},"end":{"line":7,"column":43}},"4":{"start":{"line":4,"column":13},"end":{"line":4,"column":35}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":35},"end":{"line":4,"column":36}},"loc":{"start":{"line":4,"column":101},"end":{"line":8,"column":1}}}},"branchMap":{},"s":{"0":1,"1":1,"2":2,"3":2,"4":1},"f":{"0":2},"b":{}} -,"/Users/donnie/src/github.com/floodfx/liveviewjs/src/server/templates/index.ts": {"path":"/Users/donnie/src/github.com/floodfx/liveviewjs/src/server/templates/index.ts","statementMap":{"0":{"start":{"line":8,"column":4},"end":{"line":17,"column":null}},"1":{"start":{"line":19,"column":16},"end":{"line":19,"column":56}},"2":{"start":{"line":21,"column":18},"end":{"line":21,"column":66}},"3":{"start":{"line":24,"column":2},"end":{"line":26,"column":null}},"4":{"start":{"line":25,"column":4},"end":{"line":25,"column":null}},"5":{"start":{"line":28,"column":2},"end":{"line":28,"column":null}},"6":{"start":{"line":23,"column":0},"end":{"line":23,"column":16}},"7":{"start":{"line":32,"column":2},"end":{"line":34,"column":null}},"8":{"start":{"line":33,"column":4},"end":{"line":33,"column":null}},"9":{"start":{"line":35,"column":2},"end":{"line":37,"column":null}},"10":{"start":{"line":36,"column":4},"end":{"line":36,"column":null}},"11":{"start":{"line":38,"column":2},"end":{"line":38,"column":null}},"12":{"start":{"line":38,"column":53},"end":{"line":38,"column":67}},"13":{"start":{"line":47,"column":4},"end":{"line":47,"column":null}},"14":{"start":{"line":48,"column":4},"end":{"line":48,"column":null}},"15":{"start":{"line":53,"column":4},"end":{"line":57,"column":null}},"16":{"start":{"line":54,"column":6},"end":{"line":56,"column":null}},"17":{"start":{"line":59,"column":18},"end":{"line":90,"column":40}},"18":{"start":{"line":60,"column":6},"end":{"line":89,"column":null}},"19":{"start":{"line":61,"column":8},"end":{"line":64,"column":null}},"20":{"start":{"line":65,"column":13},"end":{"line":89,"column":null}},"21":{"start":{"line":67,"column":8},"end":{"line":83,"column":null}},"22":{"start":{"line":68,"column":10},"end":{"line":71,"column":null}},"23":{"start":{"line":75,"column":20},"end":{"line":75,"column":67}},"24":{"start":{"line":75,"column":33},"end":{"line":75,"column":66}},"25":{"start":{"line":78,"column":20},"end":{"line":78,"column":46}},"26":{"start":{"line":78,"column":33},"end":{"line":78,"column":42}},"27":{"start":{"line":79,"column":10},"end":{"line":82,"column":null}},"28":{"start":{"line":85,"column":8},"end":{"line":88,"column":null}},"29":{"start":{"line":92,"column":4},"end":{"line":94,"column":null}},"30":{"start":{"line":93,"column":6},"end":{"line":93,"column":32}},"31":{"start":{"line":95,"column":4},"end":{"line":95,"column":null}},"32":{"start":{"line":99,"column":4},"end":{"line":102,"column":null}},"33":{"start":{"line":100,"column":16},"end":{"line":100,"column":37}},"34":{"start":{"line":101,"column":6},"end":{"line":101,"column":null}},"35":{"start":{"line":41,"column":0},"end":{"line":41,"column":13}},"36":{"start":{"line":108,"column":2},"end":{"line":108,"column":null}},"37":{"start":{"line":107,"column":0},"end":{"line":107,"column":24}}},"fnMap":{"0":{"name":"join","decl":{"start":{"line":23,"column":16},"end":{"line":23,"column":20}},"loc":{"start":{"line":23,"column":96},"end":{"line":29,"column":1}}},"1":{"name":"escapehtml","decl":{"start":{"line":31,"column":9},"end":{"line":31,"column":19}},"loc":{"start":{"line":31,"column":35},"end":{"line":39,"column":1}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":38,"column":43},"end":{"line":38,"column":44}},"loc":{"start":{"line":38,"column":53},"end":{"line":38,"column":67}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":46,"column":2},"end":{"line":46,"column":14}},"loc":{"start":{"line":46,"column":70},"end":{"line":49,"column":3}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":51,"column":2},"end":{"line":51,"column":11}},"loc":{"start":{"line":51,"column":42},"end":{"line":96,"column":3}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":59,"column":40},"end":{"line":59,"column":41}},"loc":{"start":{"line":59,"column":105},"end":{"line":90,"column":5}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":75,"column":28},"end":{"line":75,"column":29}},"loc":{"start":{"line":75,"column":33},"end":{"line":75,"column":66}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":78,"column":28},"end":{"line":78,"column":29}},"loc":{"start":{"line":78,"column":33},"end":{"line":78,"column":42}}},"8":{"name":"(anonymous_8)","decl":{"start":{"line":98,"column":2},"end":{"line":98,"column":10}},"loc":{"start":{"line":98,"column":10},"end":{"line":103,"column":3}}},"9":{"name":"(anonymous_9)","decl":{"start":{"line":99,"column":31},"end":{"line":99,"column":32}},"loc":{"start":{"line":99,"column":48},"end":{"line":102,"column":5}}},"10":{"name":"html","decl":{"start":{"line":107,"column":24},"end":{"line":107,"column":28}},"loc":{"start":{"line":107,"column":82},"end":{"line":109,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":23,"column":57},"end":{"line":23,"column":96}},"type":"default-arg","locations":[{"start":{"line":23,"column":94},"end":{"line":23,"column":96}}]},"1":{"loc":{"start":{"line":24,"column":2},"end":{"line":26,"column":null}},"type":"if","locations":[{"start":{"line":24,"column":2},"end":{"line":26,"column":null}}]},"2":{"loc":{"start":{"line":32,"column":2},"end":{"line":34,"column":null}},"type":"if","locations":[{"start":{"line":32,"column":2},"end":{"line":34,"column":null}}]},"3":{"loc":{"start":{"line":35,"column":2},"end":{"line":37,"column":null}},"type":"if","locations":[{"start":{"line":35,"column":2},"end":{"line":37,"column":null}}]},"4":{"loc":{"start":{"line":51,"column":12},"end":{"line":51,"column":42}},"type":"default-arg","locations":[{"start":{"line":51,"column":38},"end":{"line":51,"column":42}}]},"5":{"loc":{"start":{"line":53,"column":4},"end":{"line":57,"column":null}},"type":"if","locations":[{"start":{"line":53,"column":4},"end":{"line":57,"column":null}}]},"6":{"loc":{"start":{"line":60,"column":6},"end":{"line":89,"column":null}},"type":"if","locations":[{"start":{"line":60,"column":6},"end":{"line":89,"column":null}},{"start":{"line":65,"column":13},"end":{"line":89,"column":null}}]},"7":{"loc":{"start":{"line":65,"column":13},"end":{"line":89,"column":null}},"type":"if","locations":[{"start":{"line":65,"column":13},"end":{"line":89,"column":null}},{"start":{"line":84,"column":13},"end":{"line":89,"column":null}}]},"8":{"loc":{"start":{"line":67,"column":8},"end":{"line":83,"column":null}},"type":"if","locations":[{"start":{"line":67,"column":8},"end":{"line":83,"column":null}},{"start":{"line":73,"column":13},"end":{"line":83,"column":null}}]},"9":{"loc":{"start":{"line":92,"column":4},"end":{"line":94,"column":null}},"type":"if","locations":[{"start":{"line":92,"column":4},"end":{"line":94,"column":null}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":0,"5":1,"6":1,"7":14,"8":1,"9":13,"10":1,"11":12,"12":0,"13":32,"14":32,"15":25,"16":10,"17":15,"18":53,"19":10,"20":43,"21":4,"22":2,"23":2,"24":8,"25":2,"26":8,"27":2,"28":39,"29":15,"30":7,"31":15,"32":9,"33":14,"34":14,"35":1,"36":30,"37":1},"f":{"0":1,"1":14,"2":0,"3":32,"4":25,"5":53,"6":8,"7":8,"8":9,"9":14,"10":30},"b":{"0":[0],"1":[0],"2":[1],"3":[1],"4":[17],"5":[10],"6":[10,43],"7":[4,39],"8":[2,2],"9":[7]}} +{"/Users/donnie/src/github.com/floodfx/liveviewjs/src/examples/volunteers/data.ts": {"path":"/Users/donnie/src/github.com/floodfx/liveviewjs/src/examples/volunteers/data.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":24}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":32}},"2":{"start":{"line":4,"column":19},"end":{"line":4,"column":52}},"3":{"start":{"line":6,"column":13},"end":{"line":11,"column":null}},"4":{"start":{"line":15,"column":13},"end":{"line":15,"column":null}},"5":{"start":{"line":17,"column":25},"end":{"line":19,"column":1}},"6":{"start":{"line":18,"column":2},"end":{"line":18,"column":null}},"7":{"start":{"line":17,"column":13},"end":{"line":17,"column":25}},"8":{"start":{"line":21,"column":32},"end":{"line":28,"column":1}},"9":{"start":{"line":22,"column":17},"end":{"line":22,"column":49}},"10":{"start":{"line":23,"column":2},"end":{"line":27,"column":null}},"11":{"start":{"line":24,"column":4},"end":{"line":24,"column":23}},"12":{"start":{"line":26,"column":4},"end":{"line":26,"column":null}},"13":{"start":{"line":26,"column":71},"end":{"line":26,"column":80}},"14":{"start":{"line":21,"column":13},"end":{"line":21,"column":32}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":17,"column":25},"end":{"line":17,"column":26}},"loc":{"start":{"line":17,"column":101},"end":{"line":19,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":21,"column":32},"end":{"line":21,"column":33}},"loc":{"start":{"line":21,"column":73},"end":{"line":28,"column":1}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":26,"column":66},"end":{"line":26,"column":67}},"loc":{"start":{"line":26,"column":71},"end":{"line":26,"column":80}}}},"branchMap":{"0":{"loc":{"start":{"line":23,"column":2},"end":{"line":27,"column":null}},"type":"if","locations":[{"start":{"line":23,"column":2},"end":{"line":27,"column":null}},{"start":{"line":25,"column":9},"end":{"line":27,"column":null}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":0,"7":1,"8":1,"9":0,"10":0,"11":0,"12":0,"13":0,"14":1},"f":{"0":0,"1":0,"2":0},"b":{"0":[0,0]}} } diff --git a/coverage/lcov-report/data.ts.html b/coverage/lcov-report/data.ts.html index af9ebad6..3dbb53d6 100644 --- a/coverage/lcov-report/data.ts.html +++ b/coverage/lcov-report/data.ts.html @@ -23,30 +23,30 @@

All files data.ts

- 83.33% + 60% Statements - 5/6 + 9/15
0% Branches - 0/1 + 0/2
- 100% + 0% Functions - 2/2 + 0/3
- 80% + 58.33% Lines - 4/5 + 7/12
@@ -92,1000 +92,12 @@

All files data.ts

27 28 29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312 -313 -314 -315 -316 -317 -318 -319 -320 -321 -322 -323 -324 -325 -326 -327 -328 -329 -330 -331 -332 -333 -334 -335 -336 -337 -338 -339 -340 -341 -342 -343 -344 -345 -346 -347 -348 -349 -350 -351 -352 -353 -354 -355 -356 -357 -358 -359 -360 -361 -362 -363 -364 -365 -366 -367 -368 -369 -370 -371 -372 -373 -374 -375 -376 -377 -378 -379 -380 -381 -382 -383 -384 -385 -386 -387 -388 -389 -390 -391 -392 -393 -394 -395 -396 -397 -398 -399 -400 -401 -402 -403 -404 -405 -406 -407 -408 -409 -410 -411 -412 -413 -414 -415 -416 -417 -418 -419 -420 -421 -422 -423 -424 -425 -426 -427 -428 -429 -430 -431 -432 -433 -434 -435 -436 -437 -438 -439 -440 -441 -442 -443 -444 -445 -446 -447 -448 -449 -450 -451 -452 -453 -454 -455 -456 -457 -458 -459 -460 -461 -462 -463 -464 -465 -466 -467 -468 -469 -470 -471 -472 -473 -474 -475 -476 -477 -478 -479 -480 -481 -482 -483 -484 -485 -486 -487 -488 -489 -490 -491 -492 -493 -494 -495 -496 -497 -498 -499 -500 -501 -502 -503 -504 -505 -506 -507 -508 -509 -510 -511 -512 -513 -514 -515 -516 -517 -518 -519 -520 -521 -522 -523 -524 -525 -526 -527 -528 -529 -530 -531 -532 -533 -534 -535 -536 -537 -538 -539 -540 -541 -542 -543 -544 -545 -546 -547 -548 -549 -550 -551 -552 -553 -554 -555 -556 -557 -558 -559 -560 -561 -562 -563 -564 -565 -566 -567 -568 -569 -570 -571 -572 -573 -574 -575 -576 -577 -578 -579 -580 -581 -582 -583 -584 -585 -586 -587 -588 -589 -590 -591 -592 -593 -594 -595 -596 -597 -598 -599 -600 -601 -602 -603 -604 -605 -606 -607 -608 -609 -610 -611 -612 -613 -614 -615 -616 -617 -618 -619 -620 -621 -622 -623 -624 -625 -626 -627 -628 -629 -630 -631 -632 -633 -634 -635 -636 -637 -638 -639 -640 -641 -642 -643 -644 -645 -646 -647 -648 -649 -650 -651 -652 -653 -654 -655 -656 -657 -658 -659 -660 -661 -662 -663 -664 -665 -666 -667 -668 -669 -670 -671 -672 -673 -674 -675 -676 -677 -678 -679 -680 -681 -682 -683 -684 -685 -686 -687 -688 -689 -690 -691 -692 -693 -694 -695 -696 -697 -698 -699 -700 -701 -702 -703 -704 -705 -706 -707 -708 -709 -710 -711 -712 -713 -714 -715 -716 -717 -718 -719 -720 -721 -722 -723 -724 -725 -726 -727 -728 -729 -730 -731 -732 -733 -734 -735 -736 -737 -738 -739 -740 -741 -742 -743 -744 -745 -746 -747 -748 -749 -750 -751 -752 -753 -754 -755 -756 -757 -758 -759 -760 -761 -762 -763 -764 -765 -766 -767 -768 -769 -770 -771 -772 -773 -774 -775 -776 -777 -778 -779 -780 -781 -782 -783 -784 -785 -786 -787 -788 -789 -790 -791 -792 -793 -794 -795 -796 -797 -798 -799 -800 -801 -802 -803 -804 -805 -806 -807 -808 -809 -810 -811 -812 -813 -814 -815 -816 -817 -818 -819 -820 -821 -822 -823 -824 -825 -826 -827 -828 -829 -830 -831 -832 -833 -834 -835 -836 -837 -838 -839 -840 -841 -842 -843 -844 -845 -846 -847 -848 -849 -850 -851 -852 -853 -854 -855 -856 -857 -858 -859 -860 -861 -862 -863 -864 -865 -866 -867 -868 -869 -870 -871 -872 -873 -874 -875 -876 -877 -878 -879 -880 -881 -882 -883 -884 -885 -886 -887 -888 -889 -890 -891 -892 -893 -894 -895 -896 -897 -898 -899 -900 -901 -902 -903 -904 -905 -906 -907 -908 -909 -910 -911 -912 -913 -914 -915 -916 -917 -918 -919 -920 -921 -922 -923 -924 -925 -926 -927 -928 -929 -930 -931 -932 -933 -934 -935 -936 -937 -938 -939 -940 -941 -942 -943 -944 -945 -946 -947 -948 -949 -950 -951 -952 -953 -954 -955 -956 -957 -958 -959 -960 -961 -962 -963 -964 -965 -966 -967 -968 -969 -970 -971 -972 -973 -974 -975 -976 -977 -978 -979 -980 -981 -982 -983 -984 -985 -986 -987 -988 -989 -990 -991 -992 -993 -994 -995 -996 -997 -998 -999 -1000 -1001 -1002 -1003 -1004 -1005 -1006 -1007 -1008 -1009 -1010 -1011 -1012 -1013  -  +301x 1x -1x -  -  -1001x -    1x   +1x       @@ -1094,2011 +106,50 @@

All files data.ts

      +1x   +1x +      +1x +  +  +    +        -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
 
+ 
import { z } from 'zod';
+import { nanoid } from 'nanoid';
+ 
+const phoneRegex = /^\d{3}[\s-.]?\d{3}[\s-.]?\d{4}$/
+ 
+export const VolunteerSchema = z.object({
+  id: z.string().default(nanoid()),
+  name: z.string().min(2).max(100),
+  phone: z.string().regex(phoneRegex, 'Should be a valid phone number'),
+  checked_out: z.boolean().default(false),
+})
+ 
+export type Volunteer = z.infer<typeof VolunteerSchema>
+ 
+export const volunteers: Volunteer[] = []
+ 
+export const changeset = (attrs: Partial<Volunteer>): ReturnType<typeof VolunteerSchema.safeParse> => {
+  return VolunteerSchema.safeParse(attrs)
+}
  
-  export function suggest(prefix: string) {
-    Iif(prefix === "") {
-      return []
-    }
-    return listCities.filter(city => city.toLowerCase().startsWith(prefix.toLowerCase()));
+export const create_volunteer = (attrs: Partial<Volunteer>): Volunteer => {
+  const result = VolunteerSchema.safeParse(attrs);
+  if (result.success) {
+    return result.data;
+  } else {
+    throw new Error(`Invalid volunteer: ${result.error.issues.map(i => i.message).join(', ')}`)
   }
+}
  
-  export const listCities: string[] = [
-      "Abilene, TX",
-      "Addison, IL",
-      "Akron, OH",
-      "Alameda, CA",
-      "Albany, OR",
-      "Albany, NY",
-      "Albany, GA",
-      "Albuquerque, NM",
-      "Alexandria, LA",
-      "Alexandria, VA",
-      "Alhambra, CA",
-      "Aliso Viejo, CA",
-      "Allen, TX",
-      "Allentown, PA",
-      "Alpharetta, GA",
-      "Altamonte Springs, FL",
-      "Altoona, PA",
-      "Amarillo, TX",
-      "Ames, IA",
-      "Anaheim, CA",
-      "Anchorage, AK",
-      "Anderson, IN",
-      "Ankeny, IA",
-      "Ann Arbor, MI",
-      "Annapolis, MD",
-      "Antioch, CA",
-      "Apache Junction, AZ",
-      "Apex, NC",
-      "Apopka, FL",
-      "Apple Valley, MN",
-      "Apple Valley, CA",
-      "Appleton, WI",
-      "Arcadia, CA",
-      "Arlington, TX",
-      "Arlington Heights, IL",
-      "Arvada, CO",
-      "Asheville, NC",
-      "Athens-Clarke County, GA",
-      "Atlanta, GA",
-      "Atlantic City, NJ",
-      "Attleboro, MA",
-      "Auburn, AL",
-      "Auburn, WA",
-      "Augusta-Richmond County, GA",
-      "Aurora, CO",
-      "Aurora, IL",
-      "Austin, TX",
-      "Aventura, FL",
-      "Avondale, AZ",
-      "Azusa, CA",
-      "Bakersfield, CA",
-      "Baldwin Park, CA",
-      "Baltimore, MD",
-      "Barnstable Town, MA",
-      "Bartlett, IL",
-      "Bartlett, TN",
-      "Baton Rouge, LA",
-      "Battle Creek, MI",
-      "Bayonne, NJ",
-      "Baytown, TX",
-      "Beaumont, CA",
-      "Beaumont, TX",
-      "Beavercreek, OH",
-      "Beaverton, OR",
-      "Bedford, TX",
-      "Bell Gardens, CA",
-      "Belleville, IL",
-      "Bellevue, WA",
-      "Bellevue, NE",
-      "Bellflower, CA",
-      "Bellingham, WA",
-      "Beloit, WI",
-      "Bend, OR",
-      "Bentonville, AR",
-      "Berkeley, CA",
-      "Berwyn, IL",
-      "Bethlehem, PA",
-      "Beverly, MA",
-      "Billings, MT",
-      "Biloxi, MS",
-      "Binghamton, NY",
-      "Birmingham, AL",
-      "Bismarck, ND",
-      "Blacksburg, VA",
-      "Blaine, MN",
-      "Bloomington, IN",
-      "Bloomington, MN",
-      "Bloomington, IL",
-      "Blue Springs, MO",
-      "Boca Raton, FL",
-      "Boise City, ID",
-      "Bolingbrook, IL",
-      "Bonita Springs, FL",
-      "Bossier City, LA",
-      "Boston, MA",
-      "Boulder, CO",
-      "Bountiful, UT",
-      "Bowie, MD",
-      "Bowling Green, KY",
-      "Boynton Beach, FL",
-      "Bozeman, MT",
-      "Bradenton, FL",
-      "Brea, CA",
-      "Bremerton, WA",
-      "Brentwood, CA",
-      "Brentwood, TN",
-      "Bridgeport, CT",
-      "Bristol, CT",
-      "Brockton, MA",
-      "Broken Arrow, OK",
-      "Brookfield, WI",
-      "Brookhaven, GA",
-      "Brooklyn Park, MN",
-      "Broomfield, CO",
-      "Brownsville, TX",
-      "Bryan, TX",
-      "Buckeye, AZ",
-      "Buena Park, CA",
-      "Buffalo, NY",
-      "Buffalo Grove, IL",
-      "Bullhead City, AZ",
-      "Burbank, CA",
-      "Burien, WA",
-      "Burleson, TX",
-      "Burlington, NC",
-      "Burlington, VT",
-      "Burnsville, MN",
-      "Caldwell, ID",
-      "Calexico, CA",
-      "Calumet City, IL",
-      "Camarillo, CA",
-      "Cambridge, MA",
-      "Camden, NJ",
-      "Campbell, CA",
-      "Canton, OH",
-      "Cape Coral, FL",
-      "Cape Girardeau, MO",
-      "Carlsbad, CA",
-      "Carmel, IN",
-      "Carol Stream, IL",
-      "Carpentersville, IL",
-      "Carrollton, TX",
-      "Carson, CA",
-      "Carson City, NV",
-      "Cary, NC",
-      "Casa Grande, AZ",
-      "Casper, WY",
-      "Castle Rock, CO",
-      "Cathedral City, CA",
-      "Cedar Falls, IA",
-      "Cedar Hill, TX",
-      "Cedar Park, TX",
-      "Cedar Rapids, IA",
-      "Centennial, CO",
-      "Ceres, CA",
-      "Cerritos, CA",
-      "Champaign, IL",
-      "Chandler, AZ",
-      "Chapel Hill, NC",
-      "Charleston, SC",
-      "Charleston, WV",
-      "Charlotte, NC",
-      "Charlottesville, VA",
-      "Chattanooga, TN",
-      "Chelsea, MA",
-      "Chesapeake, VA",
-      "Chesterfield, MO",
-      "Cheyenne, WY",
-      "Chicago, IL",
-      "Chico, CA",
-      "Chicopee, MA",
-      "Chino, CA",
-      "Chino Hills, CA",
-      "Chula Vista, CA",
-      "Cicero, IL",
-      "Cincinnati, OH",
-      "Citrus Heights, CA",
-      "Clarksville, TN",
-      "Clearwater, FL",
-      "Cleveland, TN",
-      "Cleveland, OH",
-      "Cleveland Heights, OH",
-      "Clifton, NJ",
-      "Clovis, CA",
-      "Clovis, NM",
-      "Coachella, CA",
-      "Coconut Creek, FL",
-      "Coeur d'Alene, ID",
-      "College Station, TX",
-      "Collierville, TN",
-      "Colorado Springs, CO",
-      "Colton, CA",
-      "Columbia, MO",
-      "Columbia, SC",
-      "Columbus, IN",
-      "Columbus, OH",
-      "Columbus, GA",
-      "Commerce City, CO",
-      "Compton, CA",
-      "Concord, NH",
-      "Concord, NC",
-      "Concord, CA",
-      "Conroe, TX",
-      "Conway, AR",
-      "Coon Rapids, MN",
-      "Coppell, TX",
-      "Coral Gables, FL",
-      "Coral Springs, FL",
-      "Corona, CA",
-      "Corpus Christi, TX",
-      "Corvallis, OR",
-      "Costa Mesa, CA",
-      "Council Bluffs, IA",
-      "Covina, CA",
-      "Covington, KY",
-      "Cranston, RI",
-      "Crystal Lake, IL",
-      "Culver City, CA",
-      "Cupertino, CA",
-      "Cutler Bay, FL",
-      "Cuyahoga Falls, OH",
-      "Cypress, CA",
-      "Dallas, TX",
-      "Daly City, CA",
-      "Danbury, CT",
-      "Danville, VA",
-      "Danville, CA",
-      "Davenport, IA",
-      "Davie, FL",
-      "Davis, CA",
-      "Dayton, OH",
-      "Daytona Beach, FL",
-      "DeKalb, IL",
-      "DeSoto, TX",
-      "Dearborn, MI",
-      "Dearborn Heights, MI",
-      "Decatur, AL",
-      "Decatur, IL",
-      "Deerfield Beach, FL",
-      "Delano, CA",
-      "Delray Beach, FL",
-      "Deltona, FL",
-      "Denton, TX",
-      "Denver, CO",
-      "Des Moines, IA",
-      "Des Plaines, IL",
-      "Detroit, MI",
-      "Diamond Bar, CA",
-      "Doral, FL",
-      "Dothan, AL",
-      "Dover, DE",
-      "Downers Grove, IL",
-      "Downey, CA",
-      "Draper, UT",
-      "Dublin, CA",
-      "Dublin, OH",
-      "Dubuque, IA",
-      "Duluth, MN",
-      "Duncanville, TX",
-      "Dunwoody, GA",
-      "Durham, NC",
-      "Eagan, MN",
-      "East Lansing, MI",
-      "East Orange, NJ",
-      "East Providence, RI",
-      "Eastvale, CA",
-      "Eau Claire, WI",
-      "Eden Prairie, MN",
-      "Edina, MN",
-      "Edinburg, TX",
-      "Edmond, OK",
-      "Edmonds, WA",
-      "El Cajon, CA",
-      "El Centro, CA",
-      "El Monte, CA",
-      "El Paso, TX",
-      "Elgin, IL",
-      "Elizabeth, NJ",
-      "Elk Grove, CA",
-      "Elkhart, IN",
-      "Elmhurst, IL",
-      "Elyria, OH",
-      "Encinitas, CA",
-      "Enid, OK",
-      "Erie, PA",
-      "Escondido, CA",
-      "Euclid, OH",
-      "Eugene, OR",
-      "Euless, TX",
-      "Evanston, IL",
-      "Evansville, IN",
-      "Everett, MA",
-      "Everett, WA",
-      "Fairfield, CA",
-      "Fairfield, OH",
-      "Fall River, MA",
-      "Fargo, ND",
-      "Farmington, NM",
-      "Farmington Hills, MI",
-      "Fayetteville, NC",
-      "Fayetteville, AR",
-      "Federal Way, WA",
-      "Findlay, OH",
-      "Fishers, IN",
-      "Fitchburg, MA",
-      "Flagstaff, AZ",
-      "Flint, MI",
-      "Florence, AL",
-      "Florence, SC",
-      "Florissant, MO",
-      "Flower Mound, TX",
-      "Folsom, CA",
-      "Fond du Lac, WI",
-      "Fontana, CA",
-      "Fort Collins, CO",
-      "Fort Lauderdale, FL",
-      "Fort Myers, FL",
-      "Fort Pierce, FL",
-      "Fort Smith, AR",
-      "Fort Wayne, IN",
-      "Fort Worth, TX",
-      "Fountain Valley, CA",
-      "Franklin, TN",
-      "Frederick, MD",
-      "Freeport, NY",
-      "Fremont, CA",
-      "Fresno, CA",
-      "Friendswood, TX",
-      "Frisco, TX",
-      "Fullerton, CA",
-      "Gainesville, FL",
-      "Gaithersburg, MD",
-      "Galveston, TX",
-      "Garden Grove, CA",
-      "Gardena, CA",
-      "Garland, TX",
-      "Gary, IN",
-      "Gastonia, NC",
-      "Georgetown, TX",
-      "Germantown, TN",
-      "Gilbert, AZ",
-      "Gilroy, CA",
-      "Glendale, CA",
-      "Glendale, AZ",
-      "Glendora, CA",
-      "Glenview, IL",
-      "Goodyear, AZ",
-      "Goose Creek, SC",
-      "Grand Forks, ND",
-      "Grand Island, NE",
-      "Grand Junction, CO",
-      "Grand Prairie, TX",
-      "Grand Rapids, MI",
-      "Grapevine, TX",
-      "Great Falls, MT",
-      "Greeley, CO",
-      "Green Bay, WI",
-      "Greenacres, FL",
-      "Greenfield, WI",
-      "Greensboro, NC",
-      "Greenville, SC",
-      "Greenville, NC",
-      "Greenwood, IN",
-      "Gresham, OR",
-      "Grove City, OH",
-      "Gulfport, MS",
-      "Hackensack, NJ",
-      "Hagerstown, MD",
-      "Hallandale Beach, FL",
-      "Haltom City, TX",
-      "Hamilton, OH",
-      "Hammond, IN",
-      "Hampton, VA",
-      "Hanford, CA",
-      "Hanover Park, IL",
-      "Harlingen, TX",
-      "Harrisburg, PA",
-      "Harrisonburg, VA",
-      "Hartford, CT",
-      "Hattiesburg, MS",
-      "Haverhill, MA",
-      "Hawthorne, CA",
-      "Hayward, CA",
-      "Helena, MT",
-      "Hemet, CA",
-      "Hempstead, NY",
-      "Henderson, NV",
-      "Hendersonville, TN",
-      "Hesperia, CA",
-      "Hialeah, FL",
-      "Hickory, NC",
-      "High Point, NC",
-      "Highland, CA",
-      "Hillsboro, OR",
-      "Hilton Head Island, SC",
-      "Hoboken, NJ",
-      "Hoffman Estates, IL",
-      "Hollywood, FL",
-      "Holyoke, MA",
-      "Homestead, FL",
-      "Honolulu, HI",
-      "Hoover, AL",
-      "Houston, TX",
-      "Huber Heights, OH",
-      "Huntersville, NC",
-      "Huntington, WV",
-      "Huntington Beach, CA",
-      "Huntington Park, CA",
-      "Huntsville, TX",
-      "Huntsville, AL",
-      "Hurst, TX",
-      "Hutchinson, KS",
-      "Idaho Falls, ID",
-      "Independence, MO",
-      "Indianapolis, IN",
-      "Indio, CA",
-      "Inglewood, CA",
-      "Iowa City, IA",
-      "Irvine, CA",
-      "Irving, TX",
-      "Jackson, TN",
-      "Jackson, MS",
-      "Jacksonville, FL",
-      "Jacksonville, NC",
-      "Janesville, WI",
-      "Jefferson City, MO",
-      "Jeffersonville, IN",
-      "Jersey City, NJ",
-      "Johns Creek, GA",
-      "Johnson City, TN",
-      "Joliet, IL",
-      "Jonesboro, AR",
-      "Joplin, MO",
-      "Jupiter, FL",
-      "Jurupa Valley, CA",
-      "Kalamazoo, MI",
-      "Kannapolis, NC",
-      "Kansas City, MO",
-      "Kansas City, KS",
-      "Kearny, NJ",
-      "Keizer, OR",
-      "Keller, TX",
-      "Kenner, LA",
-      "Kennewick, WA",
-      "Kenosha, WI",
-      "Kent, WA",
-      "Kentwood, MI",
-      "Kettering, OH",
-      "Killeen, TX",
-      "Kingsport, TN",
-      "Kirkland, WA",
-      "Kissimmee, FL",
-      "Knoxville, TN",
-      "Kokomo, IN",
-      "La Crosse, WI",
-      "La Habra, CA",
-      "La Mesa, CA",
-      "La Mirada, CA",
-      "La Puente, CA",
-      "La Quinta, CA",
-      "Lacey, WA",
-      "Lafayette, LA",
-      "Lafayette, IN",
-      "Laguna Niguel, CA",
-      "Lake Charles, LA",
-      "Lake Elsinore, CA",
-      "Lake Forest, CA",
-      "Lake Havasu City, AZ",
-      "Lake Oswego, OR",
-      "Lakeland, FL",
-      "Lakeville, MN",
-      "Lakewood, OH",
-      "Lakewood, CO",
-      "Lakewood, WA",
-      "Lakewood, CA",
-      "Lancaster, CA",
-      "Lancaster, PA",
-      "Lancaster, TX",
-      "Lancaster, OH",
-      "Lansing, MI",
-      "Laredo, TX",
-      "Largo, FL",
-      "Las Cruces, NM",
-      "Las Vegas, NV",
-      "Lauderhill, FL",
-      "Lawrence, KS",
-      "Lawrence, IN",
-      "Lawrence, MA",
-      "Lawton, OK",
-      "Layton, UT",
-      "League City, TX",
-      "Lee's Summit, MO",
-      "Leesburg, VA",
-      "Lehi, UT",
-      "Lenexa, KS",
-      "Leominster, MA",
-      "Lewisville, TX",
-      "Lexington-Fayette, KY",
-      "Lima, OH",
-      "Lincoln, CA",
-      "Lincoln, NE",
-      "Lincoln Park, MI",
-      "Linden, NJ",
-      "Little Rock, AR",
-      "Littleton, CO",
-      "Livermore, CA",
-      "Livonia, MI",
-      "Lodi, CA",
-      "Logan, UT",
-      "Lombard, IL",
-      "Lompoc, CA",
-      "Long Beach, CA",
-      "Longmont, CO",
-      "Longview, TX",
-      "Lorain, OH",
-      "Los Angeles, CA",
-      "Louisville/Jefferson County, KY",
-      "Loveland, CO",
-      "Lowell, MA",
-      "Lubbock, TX",
-      "Lynchburg, VA",
-      "Lynn, MA",
-      "Lynwood, CA",
-      "Macon, GA",
-      "Madera, CA",
-      "Madison, AL",
-      "Madison, WI",
-      "Malden, MA",
-      "Manassas, VA",
-      "Manchester, NH",
-      "Manhattan, KS",
-      "Mankato, MN",
-      "Mansfield, TX",
-      "Mansfield, OH",
-      "Manteca, CA",
-      "Maple Grove, MN",
-      "Maplewood, MN",
-      "Marana, AZ",
-      "Margate, FL",
-      "Maricopa, AZ",
-      "Marietta, GA",
-      "Marlborough, MA",
-      "Martinez, CA",
-      "Marysville, WA",
-      "McAllen, TX",
-      "McKinney, TX",
-      "Medford, OR",
-      "Medford, MA",
-      "Melbourne, FL",
-      "Memphis, TN",
-      "Menifee, CA",
-      "Mentor, OH",
-      "Merced, CA",
-      "Meriden, CT",
-      "Meridian, MS",
-      "Meridian, ID",
-      "Mesa, AZ",
-      "Mesquite, TX",
-      "Methuen, MA",
-      "Miami, FL",
-      "Miami Beach, FL",
-      "Miami Gardens, FL",
-      "Middletown, OH",
-      "Middletown, CT",
-      "Midland, MI",
-      "Midland, TX",
-      "Midwest City, OK",
-      "Milford, CT",
-      "Milpitas, CA",
-      "Milwaukee, WI",
-      "Minneapolis, MN",
-      "Minnetonka, MN",
-      "Minot, ND",
-      "Miramar, FL",
-      "Mishawaka, IN",
-      "Mission, TX",
-      "Mission Viejo, CA",
-      "Missoula, MT",
-      "Missouri City, TX",
-      "Mobile, AL",
-      "Modesto, CA",
-      "Moline, IL",
-      "Monroe, LA",
-      "Monrovia, CA",
-      "Montclair, CA",
-      "Montebello, CA",
-      "Monterey Park, CA",
-      "Montgomery, AL",
-      "Moore, OK",
-      "Moorhead, MN",
-      "Moreno Valley, CA",
-      "Morgan Hill, CA",
-      "Mount Pleasant, SC",
-      "Mount Prospect, IL",
-      "Mount Vernon, NY",
-      "Mountain View, CA",
-      "Muncie, IN",
-      "Murfreesboro, TN",
-      "Murray, UT",
-      "Murrieta, CA",
-      "Muskegon, MI",
-      "Muskogee, OK",
-      "Nampa, ID",
-      "Napa, CA",
-      "Naperville, IL",
-      "Nashua, NH",
-      "Nashville-Davidson, TN",
-      "National City, CA",
-      "New Bedford, MA",
-      "New Berlin, WI",
-      "New Braunfels, TX",
-      "New Britain, CT",
-      "New Brunswick, NJ",
-      "New Haven, CT",
-      "New Orleans, LA",
-      "New Rochelle, NY",
-      "New York, NY",
-      "Newark, CA",
-      "Newark, NJ",
-      "Newark, OH",
-      "Newport Beach, CA",
-      "Newport News, VA",
-      "Newton, MA",
-      "Niagara Falls, NY",
-      "Noblesville, IN",
-      "Norfolk, VA",
-      "Normal, IL",
-      "Norman, OK",
-      "North Charleston, SC",
-      "North Las Vegas, NV",
-      "North Lauderdale, FL",
-      "North Little Rock, AR",
-      "North Miami, FL",
-      "North Miami Beach, FL",
-      "North Port, FL",
-      "North Richland Hills, TX",
-      "Northglenn, CO",
-      "Norwalk, CA",
-      "Norwalk, CT",
-      "Norwich, CT",
-      "Novato, CA",
-      "Novi, MI",
-      "O'Fallon, MO",
-      "Oak Lawn, IL",
-      "Oak Park, IL",
-      "Oakland, CA",
-      "Oakland Park, FL",
-      "Oakley, CA",
-      "Ocala, FL",
-      "Oceanside, CA",
-      "Ocoee, FL",
-      "Odessa, TX",
-      "Ogden, UT",
-      "Oklahoma City, OK",
-      "Olathe, KS",
-      "Olympia, WA",
-      "Omaha, NE",
-      "Ontario, CA",
-      "Orange, CA",
-      "Orem, UT",
-      "Orland Park, IL",
-      "Orlando, FL",
-      "Ormond Beach, FL",
-      "Oro Valley, AZ",
-      "Oshkosh, WI",
-      "Overland Park, KS",
-      "Owensboro, KY",
-      "Oxnard, CA",
-      "Pacifica, CA",
-      "Palatine, IL",
-      "Palm Bay, FL",
-      "Palm Beach Gardens, FL",
-      "Palm Coast, FL",
-      "Palm Desert, CA",
-      "Palm Springs, CA",
-      "Palmdale, CA",
-      "Palo Alto, CA",
-      "Panama City, FL",
-      "Paramount, CA",
-      "Park Ridge, IL",
-      "Parker, CO",
-      "Parma, OH",
-      "Pasadena, CA",
-      "Pasadena, TX",
-      "Pasco, WA",
-      "Passaic, NJ",
-      "Paterson, NJ",
-      "Pawtucket, RI",
-      "Peabody, MA",
-      "Peachtree Corners, GA",
-      "Pearland, TX",
-      "Pembroke Pines, FL",
-      "Pensacola, FL",
-      "Peoria, AZ",
-      "Peoria, IL",
-      "Perris, CA",
-      "Perth Amboy, NJ",
-      "Petaluma, CA",
-      "Pflugerville, TX",
-      "Pharr, TX",
-      "Phenix City, AL",
-      "Philadelphia, PA",
-      "Phoenix, AZ",
-      "Pico Rivera, CA",
-      "Pine Bluff, AR",
-      "Pinellas Park, FL",
-      "Pittsburg, CA",
-      "Pittsburgh, PA",
-      "Pittsfield, MA",
-      "Placentia, CA",
-      "Plainfield, IL",
-      "Plainfield, NJ",
-      "Plano, TX",
-      "Plantation, FL",
-      "Pleasanton, CA",
-      "Plymouth, MN",
-      "Pocatello, ID",
-      "Pomona, CA",
-      "Pompano Beach, FL",
-      "Pontiac, MI",
-      "Port Arthur, TX",
-      "Port Orange, FL",
-      "Port St. Lucie, FL",
-      "Portage, MI",
-      "Porterville, CA",
-      "Portland, OR",
-      "Portland, ME",
-      "Portsmouth, VA",
-      "Poway, CA",
-      "Prescott, AZ",
-      "Prescott Valley, AZ",
-      "Providence, RI",
-      "Provo, UT",
-      "Pueblo, CO",
-      "Puyallup, WA",
-      "Quincy, IL",
-      "Quincy, MA",
-      "Racine, WI",
-      "Raleigh, NC",
-      "Rancho Cordova, CA",
-      "Rancho Cucamonga, CA",
-      "Rancho Palos Verdes, CA",
-      "Rancho Santa Margarita, CA",
-      "Rapid City, SD",
-      "Reading, PA",
-      "Redding, CA",
-      "Redlands, CA",
-      "Redmond, WA",
-      "Redondo Beach, CA",
-      "Redwood City, CA",
-      "Reno, NV",
-      "Renton, WA",
-      "Revere, MA",
-      "Rialto, CA",
-      "Richardson, TX",
-      "Richland, WA",
-      "Richmond, CA",
-      "Richmond, VA",
-      "Rio Rancho, NM",
-      "Riverside, CA",
-      "Riverton, UT",
-      "Roanoke, VA",
-      "Rochester, MN",
-      "Rochester, NY",
-      "Rochester Hills, MI",
-      "Rock Hill, SC",
-      "Rock Island, IL",
-      "Rockford, IL",
-      "Rocklin, CA",
-      "Rockville, MD",
-      "Rockwall, TX",
-      "Rocky Mount, NC",
-      "Rogers, AR",
-      "Rohnert Park, CA",
-      "Romeoville, IL",
-      "Rosemead, CA",
-      "Roseville, CA",
-      "Roseville, MI",
-      "Roswell, NM",
-      "Roswell, GA",
-      "Round Rock, TX",
-      "Rowlett, TX",
-      "Roy, UT",
-      "Royal Oak, MI",
-      "Sacramento, CA",
-      "Saginaw, MI",
-      "Salem, OR",
-      "Salem, MA",
-      "Salina, KS",
-      "Salinas, CA",
-      "Salt Lake City, UT",
-      "Sammamish, WA",
-      "San Angelo, TX",
-      "San Antonio, TX",
-      "San Bernardino, CA",
-      "San Bruno, CA",
-      "San Buenaventura (Ventura), CA",
-      "San Clemente, CA",
-      "San Diego, CA",
-      "San Francisco, CA",
-      "San Gabriel, CA",
-      "San Jacinto, CA",
-      "San Jose, CA",
-      "San Leandro, CA",
-      "San Luis Obispo, CA",
-      "San Marcos, CA",
-      "San Marcos, TX",
-      "San Mateo, CA",
-      "San Rafael, CA",
-      "San Ramon, CA",
-      "Sandy, UT",
-      "Sandy Springs, GA",
-      "Sanford, FL",
-      "Santa Ana, CA",
-      "Santa Barbara, CA",
-      "Santa Clara, CA",
-      "Santa Clarita, CA",
-      "Santa Cruz, CA",
-      "Santa Fe, NM",
-      "Santa Maria, CA",
-      "Santa Monica, CA",
-      "Santa Rosa, CA",
-      "Santee, CA",
-      "Sarasota, FL",
-      "Savannah, GA",
-      "Sayreville, NJ",
-      "Schaumburg, IL",
-      "Schenectady, NY",
-      "Scottsdale, AZ",
-      "Scranton, PA",
-      "Seattle, WA",
-      "Shakopee, MN",
-      "Shawnee, KS",
-      "Sheboygan, WI",
-      "Shelton, CT",
-      "Sherman, TX",
-      "Shoreline, WA",
-      "Shreveport, LA",
-      "Sierra Vista, AZ",
-      "Simi Valley, CA",
-      "Sioux City, IA",
-      "Sioux Falls, SD",
-      "Skokie, IL",
-      "Smyrna, TN",
-      "Smyrna, GA",
-      "Somerville, MA",
-      "South Bend, IN",
-      "South Gate, CA",
-      "South Jordan, UT",
-      "South San Francisco, CA",
-      "Southaven, MS",
-      "Southfield, MI",
-      "Spanish Fork, UT",
-      "Sparks, NV",
-      "Spartanburg, SC",
-      "Spokane, WA",
-      "Spokane Valley, WA",
-      "Springdale, AR",
-      "Springfield, OH",
-      "Springfield, OR",
-      "Springfield, IL",
-      "Springfield, MA",
-      "Springfield, MO",
-      "St. Charles, MO",
-      "St. Clair Shores, MI",
-      "St. Cloud, FL",
-      "St. Cloud, MN",
-      "St. George, UT",
-      "St. Joseph, MO",
-      "St. Louis, MO",
-      "St. Louis Park, MN",
-      "St. Paul, MN",
-      "St. Peters, MO",
-      "St. Petersburg, FL",
-      "Stamford, CT",
-      "Stanton, CA",
-      "State College, PA",
-      "Sterling Heights, MI",
-      "Stillwater, OK",
-      "Stockton, CA",
-      "Streamwood, IL",
-      "Strongsville, OH",
-      "Suffolk, VA",
-      "Sugar Land, TX",
-      "Summerville, SC",
-      "Sumter, SC",
-      "Sunnyvale, CA",
-      "Sunrise, FL",
-      "Surprise, AZ",
-      "Syracuse, NY",
-      "Tacoma, WA",
-      "Tallahassee, FL",
-      "Tamarac, FL",
-      "Tampa, FL",
-      "Taunton, MA",
-      "Taylor, MI",
-      "Taylorsville, UT",
-      "Temecula, CA",
-      "Tempe, AZ",
-      "Temple, TX",
-      "Terre Haute, IN",
-      "Texarkana, TX",
-      "Texas City, TX",
-      "The Colony, TX",
-      "Thornton, CO",
-      "Thousand Oaks, CA",
-      "Tigard, OR",
-      "Tinley Park, IL",
-      "Titusville, FL",
-      "Toledo, OH",
-      "Topeka, KS",
-      "Torrance, CA",
-      "Tracy, CA",
-      "Trenton, NJ",
-      "Troy, NY",
-      "Troy, MI",
-      "Tucson, AZ",
-      "Tulare, CA",
-      "Tulsa, OK",
-      "Turlock, CA",
-      "Tuscaloosa, AL",
-      "Tustin, CA",
-      "Twin Falls, ID",
-      "Tyler, TX",
-      "Union City, CA",
-      "Union City, NJ",
-      "Upland, CA",
-      "Urbana, IL",
-      "Urbandale, IA",
-      "Utica, NY",
-      "Vacaville, CA",
-      "Valdosta, GA",
-      "Vallejo, CA",
-      "Valley Stream, NY",
-      "Vancouver, WA",
-      "Victoria, TX",
-      "Victorville, CA",
-      "Vineland, NJ",
-      "Virginia Beach, VA",
-      "Visalia, CA",
-      "Vista, CA",
-      "Waco, TX",
-      "Walnut Creek, CA",
-      "Waltham, MA",
-      "Warner Robins, GA",
-      "Warren, OH",
-      "Warren, MI",
-      "Warwick, RI",
-      "Washington, DC",
-      "Waterbury, CT",
-      "Waterloo, IA",
-      "Watsonville, CA",
-      "Waukegan, IL",
-      "Waukesha, WI",
-      "Wausau, WI",
-      "Wauwatosa, WI",
-      "Wellington, FL",
-      "Weslaco, TX",
-      "West Allis, WI",
-      "West Covina, CA",
-      "West Des Moines, IA",
-      "West Haven, CT",
-      "West Jordan, UT",
-      "West New York, NJ",
-      "West Palm Beach, FL",
-      "West Sacramento, CA",
-      "West Valley City, UT",
-      "Westerville, OH",
-      "Westfield, MA",
-      "Westland, MI",
-      "Westminster, CO",
-      "Westminster, CA",
-      "Weston, FL",
-      "Weymouth Town, MA",
-      "Wheaton, IL",
-      "Wheeling, IL",
-      "White Plains, NY",
-      "Whittier, CA",
-      "Wichita, KS",
-      "Wichita Falls, TX",
-      "Wilkes-Barre, PA",
-      "Wilmington, DE",
-      "Wilmington, NC",
-      "Wilson, NC",
-      "Winston-Salem, NC",
-      "Winter Garden, FL",
-      "Woburn, MA",
-      "Woodbury, MN",
-      "Woodland, CA",
-      "Woonsocket, RI",
-      "Worcester, MA",
-      "Wylie, TX",
-      "Wyoming, MI",
-      "Yakima, WA",
-      "Yonkers, NY",
-      "Yorba Linda, CA",
-      "York, PA",
-      "Youngstown, OH",
-      "Yuba City, CA",
-      "Yucaipa, CA",
-      "Yuma, AZ"
-    ]
  
@@ -3106,7 +157,7 @@

All files data.ts