{"id":41496,"date":"2008-09-16T13:26:56","date_gmt":"2008-09-16T20:26:56","guid":{"rendered":"https:\/\/redfindevelop.wpengine.com\/blog\/devblog\/2008\/09\/lightweight_headless_test_for_trailing_commas_in_javascript.html"},"modified":"2020-10-05T13:12:45","modified_gmt":"2020-10-05T20:12:45","slug":"lightweight_headless_test_for_trailing_commas_in_javascript","status":"publish","type":"post","link":"https:\/\/www.redfin.com\/news\/lightweight_headless_test_for_trailing_commas_in_javascript\/","title":{"rendered":"Lightweight Headless Test for Trailing Commas in JavaScript"},"content":{"rendered":"<p>Yesterday one of my co-workers spent hours reproducing and tracking down a bug that turned out to be a stray comma.<\/p>\n<p>Unfortunately, Microsoft Internet Explorer doesn&#8217;t support trailing commas in JavaScript arrays and object literals.\u00a0 Code like this won&#8217;t parse:<\/p>\n<pre class=\"js\">    var chord = [\"do\", \"mi\", \"so\",];\n    var json = { truth:\"beauty\", beauty:true, };<\/pre>\n<p>Those final commas will cause syntax errors in IE.<\/p>\n<p>&#8220;How many thousands of developer hours have been lost to random IE bugs like this?&#8221; I asked myself.  I decided that there had to be a good way to detect this problem in an automated way, without firing up a copy of IE and running a full test suite. <\/p>\n<p>It turns out that these and other syntax errors can be detected automatically from the Windows command line, using the Windows Scripting Host (WSH).\u00a0 On Windows XP and higher, the command-line tool &#8220;cscript.exe&#8221; can be used to run JavaScript (ahem, <em>JScript<\/em>) headlessly (outside of any browser).<\/p>\n<p>Just create a file called &#8220;wsh-parser.js&#8221; like this:<\/p>\n<pre class=\"js\">var fso = new ActiveXObject( \"Scripting.FileSystemObject\" );\n\nfunction parse(fname) {\n    var file = fso.OpenTextFile( fname, 1 );\n    ret = file.ReadAll();\n    file.Close();\n    try {\n        eval(\"(function(){n\"+ret+\"n});\");\n    } catch (e) {\n        WScript.Echo(\"Syntax error parsing \" + fname);\n        WScript.Echo(\"  \" + e.message);\n    }\n}\n\nfunction findJavaScript(folder) {\n    for (var fc = new Enumerator(folder.files); !fc.atEnd(); fc.moveNext()) {\n        var file=fc.item();\n        if (\/.js$\/.test(file.Name)) {\n            parse(file);\n        }\n    }\n    for (var fc = new Enumerator(folder.subfolders); !fc.atEnd(); fc.moveNext()) {\n        var subfolder = fc.item();\n        if (subfolder.Name == \".svn\") continue; \/\/ ignore .svn folders\n        findJavaScript(subfolder);\n    }\n}\n\nvar rootPath = \"src\/main\/javascript\";\nvar rootFolder = fso.GetFolder(rootPath);\n\nfindJavaScript(rootFolder);<\/pre>\n<p>Then run it like this:<\/p>\n<pre>    cscript \/\/E:javascript \/\/nologo wsh-parser.js<\/pre>\n<p>The script will automatically examine every JavaScript file in the specified rootPath, reporting errors in any file that won&#8217;t parse correctly.<\/p>\n<p>There&#8217;s a bit of magic going on here in the &#8220;parse&#8221; function to guarantee that we&#8217;re only verifying the syntax of our JavaScript, without actually running it.\u00a0 The magic line is:<\/p>\n<pre class=\"js\">    eval(\"(function(){n\"+ret+\"n});\");<\/pre>\n<p>The &#8220;eval&#8221; command would normally execute the provided string, but here we wrap the code in an anonymous function declaration.\u00a0 We improve the performance and the maintainability of our test by declaring the function without actually using it.<\/p>\n<p>Note that you can also use <a href=\"http:\/\/www.jslint.com\/\">JsLint<\/a> to detect trailing commas, but it will probably report a bunch of other problems with your code that you may or may not care about.<\/p>\n<p>Automated validators like these should be used together with headless unit tests as well as live browser tests.\u00a0 (I would recommend <a href=\"http:\/\/selenium.openqa.org\">Selenium<\/a> for automated browser tests.\u00a0 There are a ton of excellent headless JavaScript unit test tools, including <a href=\"http:\/\/jsunit.berlios.de\/\">Schaible&#8217;s JsUnit<\/a>, <a href=\"http:\/\/code.google.com\/p\/rhinounit\/\">RhinoUnit<\/a>, and <a href=\"http:\/\/dojotoolkit.org\/book\/dojo-book-0-9\/part-4-meta-dojo\/d-o-h-unit-testing\">DOH<\/a>.\u00a0 Note that <a href=\"http:\/\/www.jsunit.net\/\">Hieatt&#8217;s JsUnit<\/a> is not headless.)<\/p>\n<p>But I recommend running automated validators first, because they&#8217;re fast and the errors they report are easy to debug\/fix.\u00a0 Once the automated validators are happy, run your unit tests.\u00a0 When your unit tests pass, run your live browser tests.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Yesterday one of my co-workers spent hours reproducing and tracking down a bug that turned out to be a stray comma. Unfortunately, Microsoft Internet Explorer doesn&#8217;t support trailing commas in JavaScript arrays and object literals.\u00a0 Code like this won&#8217;t parse: var chord = [&#8220;do&#8221;, &#8220;mi&#8221;, &#8220;so&#8221;,]; var json = { truth:&#8221;beauty&#8221;, beauty:true, }; Those final [&hellip;]<\/p>\n","protected":false},"author":13152,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[57],"tags":[],"dashboard":[],"coauthors":[],"class_list":["post-41496","post","type-post","status-publish","format-standard","hentry","category-company-news"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.7 (Yoast SEO v27.5) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Lightweight Headless Test for Trailing Commas in JavaScript - Redfin Real Estate News<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.redfin.com\/news\/lightweight_headless_test_for_trailing_commas_in_javascript\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Lightweight Headless Test for Trailing Commas in JavaScript\" \/>\n<meta property=\"og:description\" content=\"Yesterday one of my co-workers spent hours reproducing and tracking down a bug that turned out to be a stray comma. Unfortunately, Microsoft Internet Explorer doesn&#8217;t support trailing commas in JavaScript arrays and object literals.\u00a0 Code like this won&#8217;t parse: var chord = [&quot;do&quot;, &quot;mi&quot;, &quot;so&quot;,]; var json = { truth:&quot;beauty&quot;, beauty:true, }; Those final [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.redfin.com\/news\/lightweight_headless_test_for_trailing_commas_in_javascript\/\" \/>\n<meta property=\"og:site_name\" content=\"Redfin Real Estate News\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/redfin\" \/>\n<meta property=\"article:published_time\" content=\"2008-09-16T20:26:56+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-10-05T20:12:45+00:00\" \/>\n<meta name=\"author\" content=\"Dan Fabulich\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@redfin\" \/>\n<meta name=\"twitter:site\" content=\"@redfin\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Dan Fabulich\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.redfin.com/news\\\/lightweight_headless_test_for_trailing_commas_in_javascript\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.redfin.com/news\\\/lightweight_headless_test_for_trailing_commas_in_javascript\\\/\"},\"author\":{\"name\":\"Dan Fabulich\",\"@id\":\"https:\\\/\\\/www.redfin.com/news\\\/#\\\/schema\\\/person\\\/6d6535d7d227b820f449877e0081154f\"},\"headline\":\"Lightweight Headless Test for Trailing Commas in JavaScript\",\"datePublished\":\"2008-09-16T20:26:56+00:00\",\"dateModified\":\"2020-10-05T20:12:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.redfin.com/news\\\/lightweight_headless_test_for_trailing_commas_in_javascript\\\/\"},\"wordCount\":387,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.redfin.com/news\\\/#organization\"},\"articleSection\":[\"Company News\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.redfin.com/news\\\/lightweight_headless_test_for_trailing_commas_in_javascript\\\/#respond\"]}],\"copyrightYear\":\"2008\",\"copyrightHolder\":{\"@id\":\"https:\\\/\\\/www.redfin.com/news\\\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.redfin.com/news\\\/lightweight_headless_test_for_trailing_commas_in_javascript\\\/\",\"url\":\"https:\\\/\\\/www.redfin.com/news\\\/lightweight_headless_test_for_trailing_commas_in_javascript\\\/\",\"name\":\"Lightweight Headless Test for Trailing Commas in JavaScript - Redfin Real Estate News\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.redfin.com/news\\\/#website\"},\"datePublished\":\"2008-09-16T20:26:56+00:00\",\"dateModified\":\"2020-10-05T20:12:45+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.redfin.com/news\\\/lightweight_headless_test_for_trailing_commas_in_javascript\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.redfin.com/news\\\/lightweight_headless_test_for_trailing_commas_in_javascript\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.redfin.com/news\\\/lightweight_headless_test_for_trailing_commas_in_javascript\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.redfin.com/news\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Lightweight Headless Test for Trailing Commas in JavaScript\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.redfin.com/news\\\/#website\",\"url\":\"https:\\\/\\\/www.redfin.com/news\\\/\",\"name\":\"Redfin Real Estate News\",\"description\":\"The latest real estate news and research from technology-powered residential real estate company, Redfin.\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.redfin.com/news\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.redfin.com/news\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.redfin.com/news\\\/#organization\",\"name\":\"Redfin\",\"url\":\"https:\\\/\\\/www.redfin.com/news\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.redfin.com/news\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.redfin.com\\\/news\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/Redfin-News-Logo.png\",\"contentUrl\":\"https:\\\/\\\/www.redfin.com\\\/news\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/Redfin-News-Logo.png\",\"width\":1100,\"height\":235,\"caption\":\"Redfin\"},\"image\":{\"@id\":\"https:\\\/\\\/www.redfin.com/news\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/redfin\",\"https:\\\/\\\/x.com\\\/redfin\",\"https:\\\/\\\/www.instagram.com\\\/redfinrealestate\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/redfin\",\"https:\\\/\\\/www.pinterest.com\\\/redfin\\\/\",\"https:\\\/\\\/en.wikipedia.org\\\/wiki\\\/Redfin\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.redfin.com/news\\\/#\\\/schema\\\/person\\\/6d6535d7d227b820f449877e0081154f\",\"name\":\"Dan Fabulich\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/75c9d9830e7679a354962b0e5a761bd7d542e3ef7b9398657b38ba265a6a1903?s=96&d=wp_user_avatar&r=g54c6285ff27705cd6a598da01a9516ab\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/75c9d9830e7679a354962b0e5a761bd7d542e3ef7b9398657b38ba265a6a1903?s=96&d=wp_user_avatar&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/75c9d9830e7679a354962b0e5a761bd7d542e3ef7b9398657b38ba265a6a1903?s=96&d=wp_user_avatar&r=g\",\"caption\":\"Dan Fabulich\"},\"url\":\"https:\\\/\\\/www.redfin.com/news\\\/author\\\/dan-fabulichredfin-com\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Lightweight Headless Test for Trailing Commas in JavaScript - Redfin Real Estate News","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.redfin.com\/news\/lightweight_headless_test_for_trailing_commas_in_javascript\/","og_locale":"en_US","og_type":"article","og_title":"Lightweight Headless Test for Trailing Commas in JavaScript","og_description":"Yesterday one of my co-workers spent hours reproducing and tracking down a bug that turned out to be a stray comma. Unfortunately, Microsoft Internet Explorer doesn&#8217;t support trailing commas in JavaScript arrays and object literals.\u00a0 Code like this won&#8217;t parse: var chord = [\"do\", \"mi\", \"so\",]; var json = { truth:\"beauty\", beauty:true, }; Those final [&hellip;]","og_url":"https:\/\/www.redfin.com\/news\/lightweight_headless_test_for_trailing_commas_in_javascript\/","og_site_name":"Redfin Real Estate News","article_publisher":"https:\/\/www.facebook.com\/redfin","article_published_time":"2008-09-16T20:26:56+00:00","article_modified_time":"2020-10-05T20:12:45+00:00","author":"Dan Fabulich","twitter_card":"summary_large_image","twitter_creator":"@redfin","twitter_site":"@redfin","twitter_misc":{"Written by":"Dan Fabulich","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.redfin.com\/news\/lightweight_headless_test_for_trailing_commas_in_javascript\/#article","isPartOf":{"@id":"https:\/\/www.redfin.com\/news\/lightweight_headless_test_for_trailing_commas_in_javascript\/"},"author":{"name":"Dan Fabulich","@id":"https:\/\/www.redfin.com\/news\/#\/schema\/person\/6d6535d7d227b820f449877e0081154f"},"headline":"Lightweight Headless Test for Trailing Commas in JavaScript","datePublished":"2008-09-16T20:26:56+00:00","dateModified":"2020-10-05T20:12:45+00:00","mainEntityOfPage":{"@id":"https:\/\/www.redfin.com\/news\/lightweight_headless_test_for_trailing_commas_in_javascript\/"},"wordCount":387,"commentCount":0,"publisher":{"@id":"https:\/\/www.redfin.com\/news\/#organization"},"articleSection":["Company News"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.redfin.com\/news\/lightweight_headless_test_for_trailing_commas_in_javascript\/#respond"]}],"copyrightYear":"2008","copyrightHolder":{"@id":"https:\/\/www.redfin.com\/news\/#organization"}},{"@type":"WebPage","@id":"https:\/\/www.redfin.com\/news\/lightweight_headless_test_for_trailing_commas_in_javascript\/","url":"https:\/\/www.redfin.com\/news\/lightweight_headless_test_for_trailing_commas_in_javascript\/","name":"Lightweight Headless Test for Trailing Commas in JavaScript - Redfin Real Estate News","isPartOf":{"@id":"https:\/\/www.redfin.com\/news\/#website"},"datePublished":"2008-09-16T20:26:56+00:00","dateModified":"2020-10-05T20:12:45+00:00","breadcrumb":{"@id":"https:\/\/www.redfin.com\/news\/lightweight_headless_test_for_trailing_commas_in_javascript\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.redfin.com\/news\/lightweight_headless_test_for_trailing_commas_in_javascript\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.redfin.com\/news\/lightweight_headless_test_for_trailing_commas_in_javascript\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.redfin.com\/news\/"},{"@type":"ListItem","position":2,"name":"Lightweight Headless Test for Trailing Commas in JavaScript"}]},{"@type":"WebSite","@id":"https:\/\/www.redfin.com\/news\/#website","url":"https:\/\/www.redfin.com\/news\/","name":"Redfin Real Estate News","description":"The latest real estate news and research from technology-powered residential real estate company, Redfin.","publisher":{"@id":"https:\/\/www.redfin.com\/news\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.redfin.com\/news\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.redfin.com\/news\/#organization","name":"Redfin","url":"https:\/\/www.redfin.com\/news\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.redfin.com\/news\/#\/schema\/logo\/image\/","url":"https:\/\/www.redfin.com\/news\/wp-content\/uploads\/2020\/10\/Redfin-News-Logo.png","contentUrl":"https:\/\/www.redfin.com\/news\/wp-content\/uploads\/2020\/10\/Redfin-News-Logo.png","width":1100,"height":235,"caption":"Redfin"},"image":{"@id":"https:\/\/www.redfin.com\/news\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/redfin","https:\/\/x.com\/redfin","https:\/\/www.instagram.com\/redfinrealestate\/","https:\/\/www.linkedin.com\/company\/redfin","https:\/\/www.pinterest.com\/redfin\/","https:\/\/en.wikipedia.org\/wiki\/Redfin"]},{"@type":"Person","@id":"https:\/\/www.redfin.com\/news\/#\/schema\/person\/6d6535d7d227b820f449877e0081154f","name":"Dan Fabulich","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/75c9d9830e7679a354962b0e5a761bd7d542e3ef7b9398657b38ba265a6a1903?s=96&d=wp_user_avatar&r=g54c6285ff27705cd6a598da01a9516ab","url":"https:\/\/secure.gravatar.com\/avatar\/75c9d9830e7679a354962b0e5a761bd7d542e3ef7b9398657b38ba265a6a1903?s=96&d=wp_user_avatar&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/75c9d9830e7679a354962b0e5a761bd7d542e3ef7b9398657b38ba265a6a1903?s=96&d=wp_user_avatar&r=g","caption":"Dan Fabulich"},"url":"https:\/\/www.redfin.com\/news\/author\/dan-fabulichredfin-com\/"}]}},"_links":{"self":[{"href":"https:\/\/www.redfin.com\/news\/wp-json\/wp\/v2\/posts\/41496","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.redfin.com\/news\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.redfin.com\/news\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.redfin.com\/news\/wp-json\/wp\/v2\/users\/13152"}],"replies":[{"embeddable":true,"href":"https:\/\/www.redfin.com\/news\/wp-json\/wp\/v2\/comments?post=41496"}],"version-history":[{"count":0,"href":"https:\/\/www.redfin.com\/news\/wp-json\/wp\/v2\/posts\/41496\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.redfin.com\/news\/wp-json\/wp\/v2\/media?parent=41496"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.redfin.com\/news\/wp-json\/wp\/v2\/categories?post=41496"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.redfin.com\/news\/wp-json\/wp\/v2\/tags?post=41496"},{"taxonomy":"dashboard","embeddable":true,"href":"https:\/\/www.redfin.com\/news\/wp-json\/wp\/v2\/dashboard?post=41496"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.redfin.com\/news\/wp-json\/wp\/v2\/coauthors?post=41496"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}