<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Brian Chavez - Entrepreneur &amp; Computer Engineer</title>
        <link>http://bchavez.bitarmory.com/Default.aspx</link>
        <description>Thoughts about .NET, C#, Security, and Gaming from a passionate developer</description>
        <language>en-US</language>
        <copyright>Brian Chavez</copyright>
        <generator>Subtext Version 2.5.0.3</generator>
        <image>
            <title>Brian Chavez - Entrepreneur &amp; Computer Engineer</title>
            <url>http://bchavez.bitarmory.com/images/RSS2Image.gif</url>
            <link>http://bchavez.bitarmory.com/Default.aspx</link>
            <width>77</width>
            <height>60</height>
        </image>
        <item>
            <title>List of Online Competitors Best Buy Price Matches</title>
            <link>http://bchavez.bitarmory.com/archive/2018/08/11/list-of-online-competitors-best-buy-price-matches.aspx</link>
            <description>&lt;h4&gt;As of 8/11/2018:&lt;/h4&gt;  &lt;p&gt;&lt;a href="https://www.amazon.com/"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.walmart.com/"&gt;Walmart&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.newegg.com/"&gt;Newegg.com&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.tigerdirect.com/"&gt;TigerDirect.com&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.frys.com/"&gt;Fry's&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.microcenter.com/"&gt;MicroCenter&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.gamestop.com/"&gt;Gamestop&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.officedepot.com/"&gt;Office Depot&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.staples.com/"&gt;Staples&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.sears.com/"&gt;Sears&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.target.com/"&gt;Target&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.radioshack.com/"&gt;RadioShack&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.costco.com/"&gt;Costco&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.samsclub.com/"&gt;Sam's Club&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.homedepot.com/"&gt;Home Depot&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.lowes.com/"&gt;Lowes&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.bedbathandbeyond.com/"&gt;Bed Bath &amp;amp; Beyond&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.kohls.com/"&gt;Kohl's&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.macys.com/"&gt;Macy's&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.jcpenney.com/"&gt;Jc Penney&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.guitarcenter.com/"&gt;Guitar Center&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.videoandaudiocenter.com/main/"&gt;Video and Audio Center&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.bhphotovideo.com/"&gt;Bhphotovideo.com&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.crutchfield.com"&gt;Crutchfield.com&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.dell.com"&gt;Dell.com&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://hp.com"&gt;HP.com&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.abcwarehouse.com/"&gt;ABC Warehouse&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.abt.com/"&gt;Abt&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.adorama.com/"&gt;Adorama&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.ajmadison.com/"&gt;AJ Madison&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.appliancesmart.com/"&gt;Appliance Smart&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.badcock.com/"&gt;Badcock&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.billsmith.com/"&gt;Bill Smith Electronics&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.bjorns.com/"&gt;Bjorn's&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.bjs.com/"&gt;BJ's&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.brandsmartusa.com/"&gt;BrandsMart USA&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.conns.com/"&gt;Conn's&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://cowboy-maloney.com"&gt;Cowboy Maloney's&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.herbergers.com"&gt;Herbergers&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://icuracao.com/"&gt;Curacao&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.electronicexpress.com/"&gt;Electronic Express&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.electronicsexpo.com/"&gt;Electronics Expo&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.fredmeyer.com/"&gt;Fred Meyer&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.goedekers.com/"&gt;Goedekers&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.hawthorneonline.com/"&gt;Hawthorne&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://hhgregg.com/"&gt;HHGregg&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://huppins.com/"&gt;Huppin's&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.kingsgreatbuys.com/"&gt;King's Great Buys Plus&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.listenup.com/"&gt;Listen Up, Inc&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.meijer.com/"&gt;Meijer&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.menards.com"&gt;Menards&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://modia.com/"&gt;Modia&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.nfm.com/"&gt;Nebraska Furniture Mart&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.newenglandappliance.com/"&gt;New England Appliance&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.pcrichard.com/"&gt;PC Richard &amp;amp; Son&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.plessers.com/"&gt;Plesser's&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.queencityonline.com/"&gt;Queen City&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.rcwilley.com/"&gt;RCWilley&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.shopko.com/"&gt;Shopko&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.thebigscreenstore.com/"&gt;The Big Screen Store&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.valueelectronics.com/#gsc.tab=0"&gt;Value Electronics&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://vanns.com/"&gt;Vann's&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.videoonly.com/"&gt;Video Only&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.walts.com/"&gt;Walt's TV&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.warnersstellian.com/"&gt;Warners Stellian&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.worldwidestereo.com/"&gt;World Wide Stereo&lt;/a&gt;&lt;/p&gt;&lt;img src="http://bchavez.bitarmory.com/aggbug/101.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Brian Chavez</dc:creator>
            <guid>http://bchavez.bitarmory.com/archive/2018/08/11/list-of-online-competitors-best-buy-price-matches.aspx</guid>
            <pubDate>Sat, 11 Aug 2018 18:22:18 GMT</pubDate>
            <comments>http://bchavez.bitarmory.com/archive/2018/08/11/list-of-online-competitors-best-buy-price-matches.aspx#feedback</comments>
            <wfw:commentRss>http://bchavez.bitarmory.com/comments/commentRss/101.aspx</wfw:commentRss>
        </item>
        <item>
            <title>JSPM &amp;amp; third party library shims</title>
            <link>http://bchavez.bitarmory.com/archive/2015/09/10/jspm-amp-third-party-library-shims.aspx</link>
            <description>&lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="1804632" border="0" alt="1804632" align="right" src="http://bchavez.bitarmory.com/images/bchavez_bitarmory_com/WindowsLiveWriter/JSPMthirdpartylibraryshims_ED0B/1804632_a2eb7328-9feb-4dfa-9462-156611ec2186.jpg" width="180" height="240" /&gt; I was hitting a LOT of friction trying to get unregistered third-party packages to work with &lt;a href="http://jspm.io/"&gt;JSPM&lt;/a&gt;. "Frictionless browser package management" is the tag line, but only if you remain in the "jspm universe".&lt;/p&gt;  &lt;p&gt;In other words, if you try using a package that is not in the jspm registry, you're going to eventually run into vague dependency related issues.&lt;/p&gt;  &lt;h4 /&gt;  &lt;h4&gt;The example&lt;/h4&gt;  &lt;p&gt;Let's suppose there's a JavaScript library you want to use that's not in the &lt;a href="https://github.com/jspm/registry"&gt;jspm registry&lt;/a&gt;. Let's take &lt;a title="https://github.com/corinis/jsForm" href="https://github.com/corinis/jsForm"&gt;https://github.com/corinis/jsForm&lt;/a&gt; for example. jsForm is a jQuery plugin that's dependent on jQuery, but not registered or part of the jspm universe. You can manually install jsForm from JSPM via "&lt;strong&gt;jspm install github:cornis/jsForm&lt;/strong&gt;" and jspm will be happy to do your bidding.&lt;/p&gt;  &lt;p&gt;Unfortunately, if you try importing jsForm in a ES6 module like this:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:f0834c9c-1ece-4c1b-8cde-a3d9a4221949" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Code Snippet&lt;/div&gt; &lt;div style="background: #fff; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;import&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;"corinis/jsForm"&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt; &lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;@&lt;/span&gt;&lt;span style="background:#ffffff;color:#008b8b"&gt;autoinject&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;export&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#00008b"&gt;Login&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000" /&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#800080"&gt;auth&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;:&lt;/span&gt;&lt;span style="background:#ffffff;color:#00008b"&gt;AuthManager&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000" /&gt;&lt;span style="background:#ffffff;color:#800080"&gt;router&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;:&lt;/span&gt;&lt;span style="background:#ffffff;color:#00008b"&gt;Router&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000" /&gt;&lt;span style="background:#ffffff;color:#800080"&gt;providers&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;: &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;any&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;[];&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt; &lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000" /&gt;&lt;span style="background:#ffffff;color:#800080"&gt;email&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;:&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;You might run the risk of having jsFrom loading in an incorrect order (where jsForm loads first, before jQuery is loaded). In order to overcome this problem you have two choices:&lt;/p&gt;  &lt;h4 /&gt;  &lt;h4&gt;1. Manual Import&lt;/h4&gt;  &lt;p&gt;This step means modifying your initial SystemJS import statement like this:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:6e5df1ec-3d86-49e6-aede-eb8a9e5b60cd" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Code Snippet&lt;/div&gt; &lt;div style="background: #fff; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000" /&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#800000"&gt;script&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#ff0000"&gt;type&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;="text/javascript"&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt; &lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000" /&gt;&lt;span style="background:#ffffff;color:#800080"&gt;System&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.&lt;/span&gt;&lt;span style="background:#ffffff;color:#008b8b"&gt;import&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;"jquery"&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;).&lt;/span&gt;&lt;span style="background:#ffffff;color:#008b8b"&gt;then&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;function&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;() {&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000" /&gt;&lt;span style="background:#ffffff;color:#800080"&gt;System&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.&lt;/span&gt;&lt;span style="background:#ffffff;color:#008b8b"&gt;import&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;"aurelia-bootstrapper"&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;});&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt; &lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000" /&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background:#ffffff;color:#800000"&gt;script&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;This ensures jQuery is loaded before everything else. This method feels like a hack and probably wont scale if we run into more dependency related issues. So looking for a better way .... we find&lt;/p&gt;  &lt;h4&gt;2. The 'proper' Shim Method&lt;/h4&gt;  &lt;p&gt;The proper way is to use a shim. Basically, what we have to do is write an override (aka shim) that "explicitly" defines the dependencies for our non-registered jsForm jspm package. We do that by writing something similar to:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:5e32bb81-4ca1-49d5-9250-a4aea9d821db" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Code Snippet&lt;/div&gt; &lt;div style="background: #fff; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;{&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;   &lt;span style="background:#ffffff;color:#000000" /&gt;&lt;span style="background:#ffffff;color:#2e75b6"&gt;registry&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;: 'jspm',&lt;/span&gt;&lt;/li&gt; &lt;li&gt;   &lt;span style="background:#ffffff;color:#000000" /&gt;&lt;span style="background:#ffffff;color:#2e75b6"&gt;main&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;: 'js/jquery.jsForm',&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;   &lt;span style="background:#ffffff;color:#000000" /&gt;&lt;span style="background:#ffffff;color:#2e75b6"&gt;shim&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;: { &lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000" /&gt;&lt;span style="background:#ffffff;color:#2e75b6"&gt;'js/jquery.jsForm'&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;: { &lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000" /&gt;&lt;span style="background:#ffffff;color:#2e75b6"&gt;deps&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;: ['jquery'] &lt;/span&gt;&lt;/li&gt; &lt;li&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;} &lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;   &lt;span style="background:#ffffff;color:#000000"&gt;},&lt;/span&gt;&lt;/li&gt; &lt;li&gt;   &lt;span style="background:#ffffff;color:#000000" /&gt;&lt;span style="background:#ffffff;color:#2e75b6"&gt;dependencies&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;: { &lt;/span&gt;&lt;span style="background:#ffffff;color:#2e75b6"&gt;jquery&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;: '*' }&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;And we'll need to smash all this into a single line like so:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;jspm install github:corinis/jsForm -o "{ registry: 'jspm', main: 'js/jquery.jsForm', shim: { 'js/jquery.jsForm': { deps: ['jquery'] } }, dependencies: { jquery: '*' } }"&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Ugh. Yes, ugly. This is the friction I'm talking about. It's not very friendly.&lt;/p&gt;  &lt;p&gt;A little bit about the override schema:&lt;/p&gt;  &lt;p&gt;&lt;u&gt;main&lt;/u&gt; - path to the main JS file in your library to load. In our case "jspm_pacakges\github\corinis\jsForm@1.3.1\&lt;strong&gt;js\jquery.jsForm&lt;/strong&gt;.js". Notice this is a relative path from the extracted package (in bold).&lt;/p&gt;  &lt;p&gt;&lt;u&gt;shim: { 'js/jquery.jsForm' : { deps:['jquery'] } }&lt;/u&gt; - our dependency, notice here we're using the aliased name to "jquery" as defined in our config.js file.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;dependencies:&lt;/u&gt; - any version of jquery will do.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;registry:&lt;/u&gt; - wont work without it.&lt;/p&gt;  &lt;p&gt;Now, if you execute the above JSPM command with the shim override, you'll see &lt;strong&gt;config.js&lt;/strong&gt; configuration changed and additional dependency listed for jsForm:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:ac57f5a3-743c-476f-888c-f0641e8cc436" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Code Snippet&lt;/div&gt; &lt;div style="background: #fff; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;"&lt;/span&gt;&lt;span style="background:#ffffff;color:#800080"&gt;github:corinis/jsForm@1.3.1&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;"&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;: {&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;      &lt;span style="background:#ffffff;color:#000000" /&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;"&lt;/span&gt;&lt;span style="background:#ffffff;color:#800080"&gt;jquery&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;"&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;: &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;"github:components/jquery@2.1.4"&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;},&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Happy days. :)&lt;/p&gt;  &lt;p&gt;HTH,   &lt;br /&gt;Brian Chavez&lt;/p&gt;&lt;img src="http://bchavez.bitarmory.com/aggbug/100.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Brian Chavez</dc:creator>
            <guid>http://bchavez.bitarmory.com/archive/2015/09/10/jspm-amp-third-party-library-shims.aspx</guid>
            <pubDate>Thu, 10 Sep 2015 23:51:15 GMT</pubDate>
            <comments>http://bchavez.bitarmory.com/archive/2015/09/10/jspm-amp-third-party-library-shims.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://bchavez.bitarmory.com/comments/commentRss/100.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Enabling Decorators Support in TypeScript 1.5, Visual Studio 2015</title>
            <category>ASP.NET</category>
            <link>http://bchavez.bitarmory.com/archive/2015/07/23/enabling-decorators-support-in-typescript-1-5-visual-studio-2015.aspx</link>
            <description>&lt;p&gt;Finally installed VS2015, I got the following error in my TypeScript project:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Error    TS1219    Experimental support for decorators is a feature that is subject to change in a future release. Specify '--experimentalDecorators' to remove this warning.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Ok. So, how exactly do you do this if you're not the one invoking the TSC compile action? Visual Studio TypeScript plugin is invoking the compiler option. &lt;strong&gt;Hmm. tsconfig.json&lt;/strong&gt; compiler config doens't seem to be picked up by the TypeScript plug-in.&lt;/p&gt;  &lt;p&gt;To enable decorator support, unload your TypeScript project. Right click, Edit Project .csproj. Find the TypeScript compiler option section and add the following (&lt;strong&gt;Line 14 and 15&lt;/strong&gt;):&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:1697b4a2-1a09-44e3-a448-889be7e3d847" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Code Snippet&lt;/div&gt; &lt;div style="background: #ddd; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;PropertyGroup&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#ff0000"&gt;Condition&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;=&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;"&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;'$(Configuration)' == 'Debug'&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;"&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;  &lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;TypeScriptModuleKind&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;amd&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;TypeScriptModuleKind&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;  &lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;TypeScriptCompileOnSaveEnabled&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;True&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;TypeScriptCompileOnSaveEnabled&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;  &lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;TypeScriptTarget&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;ES5&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;TypeScriptTarget&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;  &lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;TypeScriptNoImplicitAny&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;False&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;TypeScriptNoImplicitAny&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;  &lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;TypeScriptRemoveComments&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;False&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;TypeScriptRemoveComments&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;  &lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;TypeScriptOutFile&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;  &lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;TypeScriptOutDir&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;  &lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;TypeScriptGeneratesDeclarations&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;False&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;TypeScriptGeneratesDeclarations&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;  &lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;TypeScriptNoEmitOnError&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;True&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;TypeScriptNoEmitOnError&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;  &lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;TypeScriptSourceMap&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;True&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;TypeScriptSourceMap&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;  &lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;TypeScriptMapRoot&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;  &lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;TypeScriptSourceRoot&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;  &lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;TypeScriptEmitDecoratorMetadata&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;True&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;TypeScriptEmitDecoratorMetadata&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;  &lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;TypeScriptExperimentalDecorators&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;True&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;TypeScriptExperimentalDecorators&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;PropertyGroup&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Also, seems like the TypeScript 1.5 RTM plugin will respect the decorator compile options when you use SAVE-ON-COMPILE. :)&lt;/p&gt;  &lt;p&gt;Hope that helps,    &lt;br /&gt;Brian Chavez&lt;/p&gt;&lt;img src="http://bchavez.bitarmory.com/aggbug/99.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Brian Chavez</dc:creator>
            <guid>http://bchavez.bitarmory.com/archive/2015/07/23/enabling-decorators-support-in-typescript-1-5-visual-studio-2015.aspx</guid>
            <pubDate>Fri, 24 Jul 2015 01:36:02 GMT</pubDate>
            <comments>http://bchavez.bitarmory.com/archive/2015/07/23/enabling-decorators-support-in-typescript-1-5-visual-studio-2015.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://bchavez.bitarmory.com/comments/commentRss/99.aspx</wfw:commentRss>
        </item>
        <item>
            <title>ASP.NET Identity, OAuth 2 Social Login, Web API 2, and MVC 5 SPAs</title>
            <category>ASP.NET</category>
            <category>C#</category>
            <link>http://bchavez.bitarmory.com/archive/2015/07/19/asp-net-identity-oauth-2-social-login-web-api-2.aspx</link>
            <description>&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="image" border="0" alt="image" align="right" src="http://bchavez.bitarmory.com/images/bchavez_bitarmory_com/WindowsLiveWriter/OAu.NETIdentityWebAPI2andMVC5AureliaSPAs_122AA/image_649518b5-4ca3-49d9-a5f6-6b64cfb237ad.png" width="240" height="177" /&gt; Wow, that's a mouthful. I feel like that lady on the right sometimes.&lt;/p&gt;  &lt;p&gt;So, I spent a few days studying SPA applications and how to use external social logins like Facebook and Google with Web API 2.&lt;/p&gt;  &lt;p&gt;It's not for the faint of heart, especially when Microsoft's Web API template with VS 2013 is broken. Microsoft's template implementation is about 70% right.&lt;/p&gt;  &lt;p&gt;Pile on top, all the inconsistent Web API login routes to think about. See &lt;a href="http://www.nakov.com/blog/2014/12/22/webapi-owin-identity-custom-login-service/"&gt;this post&lt;/a&gt; for what's broken. I mostly agree to some extent. In addition, it seems like most "Web API" tutorials out there are outdated. Most of the tutorials have a user's browser parsing an obscure "auth_token" somewhere along the OAuth login flow. Surprise! In MVC5 + WebAPI2 + Social Login, there is no auth token homie! Now, it's all handled by the middleware. LoL. Eh, well, whatever, I didn't want to expose a scary sensitive auth token to the user's browser anyway. But I digress.&lt;/p&gt;  &lt;h3 /&gt;  &lt;h3&gt;Before we begin, some articles &amp;amp; references that will help you&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;IETF's RFC on OAuth 2 Spec: &lt;a title="http://tools.ietf.org/html/rfc6749#section-4.1" href="http://tools.ietf.org/html/rfc6749#section-4.1"&gt;http://tools.ietf.org/html/rfc6749#section-4.1&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Great Stack Overflow Question on why &lt;a href="http://stackoverflow.com/questions/3487991/why-does-oauth-v2-have-both-access-and-refresh-tokens"&gt;Auth Tokens &amp;amp; Refresh Tokens&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Using &lt;a href="http://bitoftech.net/2014/08/11/asp-net-web-api-2-external-logins-social-logins-facebook-google-angularjs-app/"&gt;Web API 2 external logins with Facebook &amp;amp; Google&lt;/a&gt;. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Distilled down to a single blog post, I present to you, ASP.NET Identity's OAuth2 Social Login flow with Web API 2:&lt;/p&gt;  &lt;h3&gt;So it begins, a new user arrives&lt;/h3&gt;  &lt;h2&gt;Figure A:&lt;/h2&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://bchavez.bitarmory.com/images/bchavez_bitarmory_com/WindowsLiveWriter/OAu.NETIdentityWebAPI2andMVC5AureliaSPAs_122AA/image_43509d6e-49db-484f-aca9-73175b053fd2.png" width="391" height="155" /&gt; &lt;/p&gt;  &lt;p&gt;Figure A, the user arrives and hits your MVC app. Your MVC app sends down your SPA. The user navigates to a login page and Figure B happens.&lt;/p&gt;  &lt;h2&gt;Figure B:&lt;/h2&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://bchavez.bitarmory.com/images/bchavez_bitarmory_com/WindowsLiveWriter/OAu.NETIdentityWebAPI2andMVC5AureliaSPAs_122AA/image_ea9f1075-30b3-4810-812c-f96739d6e2d0.png" width="563" height="444" /&gt; &lt;/p&gt;  &lt;p&gt;Your SPA app consumes the JSON from ExternalLogins call and renders some choices. In Figure B, Google and Facebook are configured on the server's OWIN middleware. Cool.&lt;/p&gt;  &lt;h2&gt;Figure C:&lt;/h2&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://bchavez.bitarmory.com/images/bchavez_bitarmory_com/WindowsLiveWriter/OAu.NETIdentityWebAPI2andMVC5AureliaSPAs_122AA/image_2d857fe7-36b3-46ca-b585-58c5e833fb43.png" width="484" height="374" /&gt; &lt;/p&gt;  &lt;p&gt;The user decides to login with "Facebook". In Figure C, it's a full-page navigation to the URL of &lt;strong&gt;/ExternalLogin?provider=Facebook&lt;/strong&gt;. &lt;em&gt;Not an AJAX call&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;AuthController.cs&lt;/strong&gt; (originally &lt;strong&gt;AccountController.cs&lt;/strong&gt; from the original template) sees this request, and processing goes up to a &lt;strong&gt;ChallengeResult&lt;/strong&gt;:&lt;/p&gt;  &lt;div style="border-bottom: #000080 1px solid; border-left: #000080 1px solid; font-family: courier new, consolas, 'Courier New', courier, monospace; color: #000; font-size: 10pt; border-top: #000080 1px solid; border-right: #000080 1px solid"&gt;   &lt;div style="padding-bottom: 2px; background-color: #000000; padding-left: 5px; padding-right: 5px; color: #dfdfc0; overflow: auto; padding-top: 2px"&gt;&lt;span style="color: #7a987a"&gt;// GET api/auth/ExternalLogin&lt;/span&gt;       &lt;br /&gt;[&lt;span style="color: #b8ced3"&gt;OverrideAuthentication&lt;/span&gt;]       &lt;br /&gt;[&lt;span style="color: #b8ced3"&gt;HostAuthentication&lt;/span&gt;(&lt;span style="color: #b8ced3"&gt;DefaultAuthenticationTypes&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #b9a6da"&gt;ExternalCookie&lt;/span&gt;)]       &lt;br /&gt;[&lt;span style="color: #b8ced3"&gt;AllowAnonymous&lt;/span&gt;]       &lt;br /&gt;[&lt;span style="color: #b8ced3"&gt;Route&lt;/span&gt;(&lt;span style="color: #d1d1d1"&gt;"ExternalLogin"&lt;/span&gt;, &lt;span style="color: #a9d19d"&gt;Name&lt;/span&gt; &lt;span style="color: #c9b68f"&gt;=&lt;/span&gt; &lt;span style="color: #d1d1d1"&gt;"ExternalLogin"&lt;/span&gt;)]       &lt;br /&gt;&lt;span style="color: #5b8a86"&gt;public&lt;/span&gt; &lt;span style="color: #5b8a86"&gt;async&lt;/span&gt; &lt;span style="color: #b8ced3"&gt;Task&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #d6a47a"&gt;IHttpActionResult&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #d7c0c0"&gt;GetExternalLogin&lt;/span&gt;(&lt;span style="color: #5b8a86"&gt;string&lt;/span&gt; &lt;span style="color: #dfdfc1"&gt;provider&lt;/span&gt;, &lt;span style="color: #5b8a86"&gt;string&lt;/span&gt; &lt;span style="color: #dfdfc1"&gt;error&lt;/span&gt; &lt;span style="color: #c9b68f"&gt;=&lt;/span&gt; &lt;span style="color: #5b8a86"&gt;null&lt;/span&gt;)       &lt;br /&gt;{       &lt;br /&gt;    &lt;span style="color: #5b8a86"&gt;if&lt;/span&gt;( &lt;span style="color: #dfdfc1"&gt;error&lt;/span&gt; &lt;span style="color: #c9b68f"&gt;!=&lt;/span&gt; &lt;span style="color: #5b8a86"&gt;null&lt;/span&gt; )       &lt;br /&gt;    {       &lt;br /&gt;        &lt;span style="color: #5b8a86"&gt;return&lt;/span&gt; &lt;span style="color: #d7c0c0"&gt;Redirect&lt;/span&gt;(&lt;span style="color: #a9d19d"&gt;Url&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #d7c0c0"&gt;Content&lt;/span&gt;(&lt;span style="color: #d1d1d1"&gt;"~/"&lt;/span&gt;) &lt;span style="color: #c9b68f"&gt;+&lt;/span&gt; &lt;span style="color: #d1d1d1"&gt;"#error="&lt;/span&gt; &lt;span style="color: #c9b68f"&gt;+&lt;/span&gt; &lt;span style="color: #b8ced3"&gt;Uri&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #d7c0c0"&gt;EscapeDataString&lt;/span&gt;(&lt;span style="color: #dfdfc1"&gt;error&lt;/span&gt;));       &lt;br /&gt;    }       &lt;br /&gt;      &lt;br /&gt;    &lt;span style="color: #7a987a"&gt;//ANONYMOUS will always get trapped here.&lt;/span&gt;       &lt;br /&gt;    &lt;span style="color: #5b8a86"&gt;if&lt;/span&gt;( &lt;span style="color: #c9b68f"&gt;!&lt;/span&gt;&lt;span style="color: #a9d19d"&gt;User&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #a9d19d"&gt;Identity&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #a9d19d"&gt;IsAuthenticated&lt;/span&gt; )       &lt;br /&gt;    {       &lt;br /&gt;        &lt;span style="color: #5b8a86"&gt;return&lt;/span&gt; &lt;span style="color: #5b8a86"&gt;new&lt;/span&gt; &lt;span style="color: #b8ced3"&gt;ChallengeResult&lt;/span&gt;(&lt;span style="color: #dfdfc1"&gt;provider&lt;/span&gt;, &lt;span style="color: #5b8a86"&gt;this&lt;/span&gt;);       &lt;br /&gt;    }&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;A &lt;strong&gt;ChallengeResult&lt;/strong&gt; is returned to the anonymous user. A &lt;strong&gt;ChallengeResult&lt;/strong&gt; looks like:&lt;/p&gt;  &lt;div style="border-bottom: #000080 1px solid; border-left: #000080 1px solid; font-family: courier new, consolas, 'Courier New', courier, monospace; color: #000; font-size: 10pt; border-top: #000080 1px solid; border-right: #000080 1px solid"&gt;   &lt;div style="padding-bottom: 2px; background-color: #000000; padding-left: 5px; padding-right: 5px; color: #dfdfc0; overflow: auto; padding-top: 2px"&gt;&lt;span style="color: #5b8a86"&gt;public&lt;/span&gt; &lt;span style="color: #5b8a86"&gt;class&lt;/span&gt; &lt;span style="color: #b8ced3"&gt;ChallengeResult&lt;/span&gt; : &lt;span style="color: #d6a47a"&gt;IHttpActionResult&lt;/span&gt;       &lt;br /&gt;{       &lt;br /&gt;    &lt;span style="color: #5b8a86"&gt;public&lt;/span&gt; &lt;span style="color: #b8ced3"&gt;ChallengeResult&lt;/span&gt;(&lt;span style="color: #5b8a86"&gt;string&lt;/span&gt; &lt;span style="color: #dfdfc1"&gt;loginProvider&lt;/span&gt;, &lt;span style="color: #b8ced3"&gt;ApiController&lt;/span&gt; &lt;span style="color: #dfdfc1"&gt;controller&lt;/span&gt;)       &lt;br /&gt;    {       &lt;br /&gt;        &lt;span style="color: #a9d19d"&gt;LoginProvider&lt;/span&gt; &lt;span style="color: #c9b68f"&gt;=&lt;/span&gt; &lt;span style="color: #dfdfc1"&gt;loginProvider&lt;/span&gt;;       &lt;br /&gt;        &lt;span style="color: #a9d19d"&gt;Request&lt;/span&gt; &lt;span style="color: #c9b68f"&gt;=&lt;/span&gt; &lt;span style="color: #dfdfc1"&gt;controller&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #a9d19d"&gt;Request&lt;/span&gt;;       &lt;br /&gt;    }       &lt;br /&gt;    &lt;span style="color: #5b8a86"&gt;public&lt;/span&gt; &lt;span style="color: #5b8a86"&gt;string&lt;/span&gt; &lt;span style="color: #a9d19d"&gt;LoginProvider&lt;/span&gt; { &lt;span style="color: #d7c0c0"&gt;get&lt;/span&gt;; &lt;span style="color: #d7c0c0"&gt;set&lt;/span&gt;; }       &lt;br /&gt;    &lt;span style="color: #5b8a86"&gt;public&lt;/span&gt; &lt;span style="color: #b8ced3"&gt;HttpRequestMessage&lt;/span&gt; &lt;span style="color: #a9d19d"&gt;Request&lt;/span&gt; { &lt;span style="color: #d7c0c0"&gt;get&lt;/span&gt;; &lt;span style="color: #d7c0c0"&gt;set&lt;/span&gt;; }       &lt;br /&gt;      &lt;br /&gt;    &lt;span style="color: #5b8a86"&gt;public&lt;/span&gt; &lt;span style="color: #b8ced3"&gt;Task&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #b8ced3"&gt;HttpResponseMessage&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #d7c0c0"&gt;ExecuteAsync&lt;/span&gt;(&lt;span style="color: #bad7d0"&gt;CancellationToken&lt;/span&gt; &lt;span style="color: #dfdfc1"&gt;cancellationToken&lt;/span&gt;)       &lt;br /&gt;    {       &lt;br /&gt;        &lt;span style="color: #a9d19d"&gt;Request&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #d79315"&gt;GetOwinContext&lt;/span&gt;()&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #a9d19d"&gt;Authentication&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #d7c0c0"&gt;Challenge&lt;/span&gt;(&lt;span style="color: #a9d19d"&gt;LoginProvider&lt;/span&gt;);       &lt;br /&gt;        &lt;span style="color: #5b8a86"&gt;var&lt;/span&gt; &lt;span style="color: #dfdfc1"&gt;response&lt;/span&gt; &lt;span style="color: #c9b68f"&gt;=&lt;/span&gt; &lt;span style="color: #5b8a86"&gt;new&lt;/span&gt; &lt;span style="color: #b8ced3"&gt;HttpResponseMessage&lt;/span&gt;(&lt;span style="color: #b8ced3"&gt;HttpStatusCode&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #b9a6da"&gt;Unauthorized&lt;/span&gt;)       &lt;br /&gt;        {       &lt;br /&gt;            &lt;span style="color: #a9d19d"&gt;RequestMessage&lt;/span&gt; &lt;span style="color: #c9b68f"&gt;=&lt;/span&gt; &lt;span style="color: #a9d19d"&gt;Request&lt;/span&gt;       &lt;br /&gt;        };       &lt;br /&gt;        &lt;span style="color: #5b8a86"&gt;return&lt;/span&gt; &lt;span style="color: #b8ced3"&gt;Task&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #d7c0c0"&gt;FromResult&lt;/span&gt;(&lt;span style="color: #dfdfc1"&gt;response&lt;/span&gt;);       &lt;br /&gt;    }       &lt;br /&gt;}&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;strong&gt;ChallengeResult&lt;/strong&gt; has an HTTP Status Code of &lt;strong&gt;Unauthorized&lt;/strong&gt;. When MVC is executing the &lt;strong&gt;ChallengeResult, &lt;/strong&gt;MVC notifies the OWIN middleware of an &lt;strong&gt;Authentication.Challenge("Facebook")&lt;/strong&gt;. The unauthorized status code triggers the OWIN middleware to wake up and process the pending &lt;strong&gt;Authorization.Challenge&lt;/strong&gt;, and transform the unauthorized status into a 302 redirect to an off-site login provider (Facebook in this case) for authorization as shown in &lt;strong&gt;Step 7 in Figure C&lt;/strong&gt; above. Take note, in particular, the 302 redirect to Facebook has "&lt;strong&gt;redirect_uri=http://webapp.com/signin-facebook&lt;/strong&gt;". This is a callback into the middleware that the user's browser will hit after they are finished authenticating and authorizing your web app on Facebook. In addition, &lt;em&gt;&lt;u&gt;take 2nd note&lt;/u&gt;&lt;/em&gt;, the middleware has instructed the browser to set a &lt;strong&gt;Correlation.Facebook&lt;/strong&gt; cookie in &lt;strong&gt;Step 7 in Figure C&lt;/strong&gt; above.&lt;/p&gt;  &lt;p&gt;The user's browser follows the redirect as shown in Figure D below:&lt;/p&gt;  &lt;h2&gt;Figure D:&lt;/h2&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://bchavez.bitarmory.com/images/bchavez_bitarmory_com/WindowsLiveWriter/OAu.NETIdentityWebAPI2andMVC5AureliaSPAs_122AA/image_63bc1d5e-a49d-4f94-a4e7-52938481de11.png" width="585" height="323" /&gt; &lt;/p&gt;  &lt;p&gt;In Figure D Step 8 above, the user authenticates with Facebook and authorizes WebApp.&lt;/p&gt;  &lt;p&gt;Then, Figure D Step 9, Facebook issues a 302 redirect to the user's browser back on the OWIN middleware endpoint &lt;strong&gt;/signin-facebook. &lt;/strong&gt;The browser follows the redirect shown in&lt;strong&gt; Figure E Step 10 below&lt;/strong&gt;:&lt;/p&gt;  &lt;h2&gt;Figure E:&lt;/h2&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://bchavez.bitarmory.com/images/bchavez_bitarmory_com/WindowsLiveWriter/OAu.NETIdentityWebAPI2andMVC5AureliaSPAs_122AA/image_1847001f-73a1-4c50-86cf-e89bb43c7cd8.png" width="545" height="467" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Side Note:&lt;/em&gt;&lt;/strong&gt; When the middleware receives the &lt;strong&gt;/signin-facebook&lt;/strong&gt; callback, the middleware needs to check if the current callback originated from the WebApp to prevent a CSRF attack. The Facebook middleware inspects &lt;strong&gt;Correlation.Facebook&lt;/strong&gt; cookie and matches the cookie with some encrypted state inside the callback that was part of the query string on the way out to Facebook and on the way back in from Facebook. Hewf. Stay with me now...&lt;/p&gt;  &lt;p&gt;Next, the OWIN middleware uses the &lt;strong&gt;code&lt;/strong&gt; query string to setup a backchannel with Facebook. The &lt;strong&gt;code=AQABC...&lt;/strong&gt; from &lt;strong&gt;Figure E, Step 10, &lt;/strong&gt;is a &lt;strong&gt;code&lt;/strong&gt; to get a &lt;strong&gt;&lt;em&gt;real&lt;/em&gt;&lt;/strong&gt; &lt;strong&gt;access_token.&lt;/strong&gt; The &lt;strong&gt;access token&lt;/strong&gt; is then used to query Facebook's Open Graph to get some claims about the user, like their Name, picture, email, etc ... &lt;strong&gt;Step 11 and Step 12 in Figure E&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;Finally, the OWIN middleware has enough information to create a &lt;strong&gt;ClaimsIdentity&lt;/strong&gt; of an e&lt;em&gt;xternal login&lt;/em&gt;, and does so by granting an &lt;strong&gt;AuthenticationTicket&lt;/strong&gt; associated with an &lt;strong&gt;ExternalCookie&lt;/strong&gt; authentication type. The Facebook middleware packs all the claims from the Facebook backchannel into this cookie called &lt;strong&gt;.AspNet.ExternalCookie&lt;/strong&gt; as shown in &lt;strong&gt;Step 13 in Figure E&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;Lastly, the OWIN middleware redirects the user's browser *back* into the MVC layer (remember our old URL that originally kicked off the process? &lt;strong&gt;/api/auth/ExternalLogin&lt;/strong&gt;). Yep. I know. But, this time, we're going to &lt;em&gt;&lt;u&gt;get past&lt;/u&gt;&lt;/em&gt; the original &lt;strong&gt;ChallengeResult&lt;/strong&gt; because were coming back as an externally authenticated user with the help of [&lt;strong&gt;OverrideAuthentication&lt;/strong&gt;]+ [&lt;strong&gt;HostAuthentication(&lt;/strong&gt;&lt;strong&gt;ExternalCookie)&lt;/strong&gt;], which sets up the &lt;strong&gt;User.Identity.IsAuthenticated&lt;/strong&gt; to return &lt;em&gt;&lt;u&gt;true&lt;/u&gt;&lt;/em&gt; skipping the challenge as shown below:&lt;/p&gt;  &lt;div style="border-bottom: #000080 1px solid; border-left: #000080 1px solid; font-family: courier new, consolas, 'Courier New', courier, monospace; color: #000; font-size: 10pt; border-top: #000080 1px solid; border-right: #000080 1px solid"&gt;   &lt;div style="padding-bottom: 2px; background-color: #000000; padding-left: 5px; padding-right: 5px; color: #dfdfc0; overflow: auto; padding-top: 2px"&gt;&lt;span style="color: #7a987a"&gt;// GET api/auth/ExternalLogin&lt;/span&gt;       &lt;br /&gt;[&lt;span style="color: #b8ced3"&gt;OverrideAuthentication&lt;/span&gt;]       &lt;br /&gt;[&lt;span style="color: #b8ced3"&gt;HostAuthentication&lt;/span&gt;(&lt;span style="color: #b8ced3"&gt;DefaultAuthenticationTypes&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #b9a6da"&gt;ExternalCookie&lt;/span&gt;)]       &lt;br /&gt;[&lt;span style="color: #b8ced3"&gt;AllowAnonymous&lt;/span&gt;]       &lt;br /&gt;[&lt;span style="color: #b8ced3"&gt;Route&lt;/span&gt;(&lt;span style="color: #d1d1d1"&gt;"ExternalLogin"&lt;/span&gt;, &lt;span style="color: #a9d19d"&gt;Name&lt;/span&gt; &lt;span style="color: #c9b68f"&gt;=&lt;/span&gt; &lt;span style="color: #d1d1d1"&gt;"ExternalLogin"&lt;/span&gt;)]       &lt;br /&gt;&lt;span style="color: #5b8a86"&gt;public&lt;/span&gt; &lt;span style="color: #5b8a86"&gt;async&lt;/span&gt; &lt;span style="color: #b8ced3"&gt;Task&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #d6a47a"&gt;IHttpActionResult&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #d7c0c0"&gt;GetExternalLogin&lt;/span&gt;(&lt;span style="color: #5b8a86"&gt;string&lt;/span&gt; &lt;span style="color: #dfdfc1"&gt;provider&lt;/span&gt;, &lt;span style="color: #5b8a86"&gt;string&lt;/span&gt; &lt;span style="color: #dfdfc1"&gt;error&lt;/span&gt; &lt;span style="color: #c9b68f"&gt;=&lt;/span&gt; &lt;span style="color: #5b8a86"&gt;null&lt;/span&gt;)       &lt;br /&gt;{       &lt;br /&gt;    &lt;span style="color: #5b8a86"&gt;if&lt;/span&gt;( &lt;span style="color: #dfdfc1"&gt;error&lt;/span&gt; &lt;span style="color: #c9b68f"&gt;!=&lt;/span&gt; &lt;span style="color: #5b8a86"&gt;null&lt;/span&gt; )       &lt;br /&gt;    {       &lt;br /&gt;        &lt;span style="color: #5b8a86"&gt;return&lt;/span&gt; &lt;span style="color: #d7c0c0"&gt;Redirect&lt;/span&gt;(&lt;span style="color: #a9d19d"&gt;Url&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #d7c0c0"&gt;Content&lt;/span&gt;(&lt;span style="color: #d1d1d1"&gt;"~/"&lt;/span&gt;) &lt;span style="color: #c9b68f"&gt;+&lt;/span&gt; &lt;span style="color: #d1d1d1"&gt;"#error="&lt;/span&gt; &lt;span style="color: #c9b68f"&gt;+&lt;/span&gt; &lt;span style="color: #b8ced3"&gt;Uri&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #d7c0c0"&gt;EscapeDataString&lt;/span&gt;(&lt;span style="color: #dfdfc1"&gt;error&lt;/span&gt;));       &lt;br /&gt;    }       &lt;br /&gt;      &lt;br /&gt;    &lt;span style="color: #7a987a"&gt;//ANONYMOUS will always get trapped here.&lt;/span&gt;       &lt;br /&gt;    &lt;span style="color: #5b8a86"&gt;if&lt;/span&gt;( &lt;span style="color: #c9b68f"&gt;!&lt;/span&gt;&lt;span style="color: #a9d19d"&gt;User&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #a9d19d"&gt;Identity&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #a9d19d"&gt;IsAuthenticated&lt;/span&gt; )       &lt;br /&gt;    {       &lt;br /&gt;        &lt;span style="color: #5b8a86"&gt;return&lt;/span&gt; &lt;span style="color: #5b8a86"&gt;new&lt;/span&gt; &lt;span style="color: #b8ced3"&gt;ChallengeResult&lt;/span&gt;(&lt;span style="color: #dfdfc1"&gt;provider&lt;/span&gt;, &lt;span style="color: #5b8a86"&gt;this&lt;/span&gt;);       &lt;br /&gt;    }       &lt;br /&gt;      &lt;br /&gt;    &lt;span style="color: #5b8a86"&gt;var&lt;/span&gt; &lt;span style="color: #dfdfc1"&gt;externalLogin&lt;/span&gt; &lt;span style="color: #c9b68f"&gt;=&lt;/span&gt; &lt;span style="color: #b8ced3"&gt;ExternalLoginData&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #d7c0c0"&gt;FromIdentity&lt;/span&gt;(&lt;span style="color: #a9d19d"&gt;User&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #a9d19d"&gt;Identity&lt;/span&gt; &lt;span style="color: #5b8a86"&gt;as&lt;/span&gt; &lt;span style="color: #b8ced3"&gt;ClaimsIdentity&lt;/span&gt;);       &lt;br /&gt;      &lt;br /&gt;    &lt;span style="color: #5b8a86"&gt;if&lt;/span&gt;( &lt;span style="color: #dfdfc1"&gt;externalLogin&lt;/span&gt; &lt;span style="color: #c9b68f"&gt;==&lt;/span&gt; &lt;span style="color: #5b8a86"&gt;null&lt;/span&gt; )       &lt;br /&gt;    {       &lt;br /&gt;        &lt;span style="color: #5b8a86"&gt;return&lt;/span&gt; &lt;span style="color: #d7c0c0"&gt;InternalServerError&lt;/span&gt;();       &lt;br /&gt;    }       &lt;br /&gt;      &lt;br /&gt;    &lt;span style="color: #5b8a86"&gt;if&lt;/span&gt;( &lt;span style="color: #dfdfc1"&gt;externalLogin&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #a9d19d"&gt;LoginProvider&lt;/span&gt; &lt;span style="color: #c9b68f"&gt;!=&lt;/span&gt; &lt;span style="color: #dfdfc1"&gt;provider&lt;/span&gt; )       &lt;br /&gt;    {       &lt;br /&gt;        &lt;span style="color: #a9d19d"&gt;Authentication&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #d7c0c0"&gt;SignOut&lt;/span&gt;(&lt;span style="color: #b8ced3"&gt;DefaultAuthenticationTypes&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #b9a6da"&gt;ExternalCookie&lt;/span&gt;);       &lt;br /&gt;        &lt;span style="color: #5b8a86"&gt;return&lt;/span&gt; &lt;span style="color: #5b8a86"&gt;new&lt;/span&gt; &lt;span style="color: #b8ced3"&gt;ChallengeResult&lt;/span&gt;(&lt;span style="color: #dfdfc1"&gt;provider&lt;/span&gt;, &lt;span style="color: #5b8a86"&gt;this&lt;/span&gt;);       &lt;br /&gt;    }       &lt;br /&gt;      &lt;br /&gt;    &lt;span style="color: #5b8a86"&gt;var&lt;/span&gt; &lt;span style="color: #dfdfc1"&gt;user&lt;/span&gt; &lt;span style="color: #c9b68f"&gt;=&lt;/span&gt; &lt;span style="color: #5b8a86"&gt;await&lt;/span&gt; &lt;span style="color: #f2f2f2"&gt;this.&lt;/span&gt;&lt;span style="color: #a9d19d"&gt;UserManager&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #d7c0c0"&gt;FindAsync&lt;/span&gt;(&lt;span style="color: #5b8a86"&gt;new&lt;/span&gt; &lt;span style="color: #b8ced3"&gt;UserLoginInfo&lt;/span&gt;(&lt;span style="color: #dfdfc1"&gt;externalLogin&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #a9d19d"&gt;LoginProvider&lt;/span&gt;, &lt;span style="color: #dfdfc1"&gt;externalLogin&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #a9d19d"&gt;ProviderKey&lt;/span&gt;));       &lt;br /&gt;      &lt;br /&gt;    &lt;span style="color: #5b8a86"&gt;var&lt;/span&gt; &lt;span style="color: #dfdfc1"&gt;hasRegistered&lt;/span&gt; &lt;span style="color: #c9b68f"&gt;=&lt;/span&gt; &lt;span style="color: #dfdfc1"&gt;user&lt;/span&gt; &lt;span style="color: #c9b68f"&gt;!=&lt;/span&gt; &lt;span style="color: #5b8a86"&gt;null&lt;/span&gt;;       &lt;br /&gt;      &lt;br /&gt;    &lt;span style="color: #5b8a86"&gt;if&lt;/span&gt;( &lt;span style="color: #dfdfc1"&gt;hasRegistered&lt;/span&gt; )       &lt;br /&gt;    {       &lt;br /&gt;        &lt;span style="color: #a9d19d"&gt;Authentication&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #d7c0c0"&gt;SignOut&lt;/span&gt;(&lt;span style="color: #b8ced3"&gt;DefaultAuthenticationTypes&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #b9a6da"&gt;ExternalCookie&lt;/span&gt;);       &lt;br /&gt;      &lt;br /&gt;        &lt;span style="color: #5b8a86"&gt;var&lt;/span&gt; &lt;span style="color: #dfdfc1"&gt;oAuthIdentity&lt;/span&gt; &lt;span style="color: #c9b68f"&gt;=&lt;/span&gt; &lt;span style="color: #5b8a86"&gt;await&lt;/span&gt; &lt;span style="color: #f2f2f2"&gt;this.&lt;/span&gt;&lt;span style="color: #a9d19d"&gt;UserManager&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #d7c0c0"&gt;GenerateUserIdentityAsync&lt;/span&gt;(&lt;span style="color: #dfdfc1"&gt;user&lt;/span&gt;, &lt;span style="color: #b8ced3"&gt;OAuthDefaults&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #b9a6da"&gt;AuthenticationType&lt;/span&gt;);       &lt;br /&gt;        &lt;span style="color: #5b8a86"&gt;var&lt;/span&gt; &lt;span style="color: #dfdfc1"&gt;cookieIdentity&lt;/span&gt; &lt;span style="color: #c9b68f"&gt;=&lt;/span&gt; &lt;span style="color: #5b8a86"&gt;await&lt;/span&gt; &lt;span style="color: #f2f2f2"&gt;this.&lt;/span&gt;&lt;span style="color: #a9d19d"&gt;UserManager&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #d7c0c0"&gt;GenerateUserIdentityAsync&lt;/span&gt;(&lt;span style="color: #dfdfc1"&gt;user&lt;/span&gt;, &lt;span style="color: #b8ced3"&gt;CookieAuthenticationDefaults&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #b9a6da"&gt;AuthenticationType&lt;/span&gt;);       &lt;br /&gt;      &lt;br /&gt;        &lt;span style="color: #5b8a86"&gt;var&lt;/span&gt; &lt;span style="color: #dfdfc1"&gt;properties&lt;/span&gt; &lt;span style="color: #c9b68f"&gt;=&lt;/span&gt; &lt;span style="color: #f2f2f2"&gt;this.&lt;/span&gt;&lt;span style="color: #a9d19d"&gt;UserManager&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #d7c0c0"&gt;CreateProperties&lt;/span&gt;(&lt;span style="color: #dfdfc1"&gt;user&lt;/span&gt;);       &lt;br /&gt;      &lt;br /&gt;        &lt;span style="color: #a9d19d"&gt;Authentication&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #d7c0c0"&gt;SignIn&lt;/span&gt;(&lt;span style="color: #dfdfc1"&gt;properties&lt;/span&gt;, &lt;span style="color: #dfdfc1"&gt;oAuthIdentity&lt;/span&gt;, &lt;span style="color: #dfdfc1"&gt;cookieIdentity&lt;/span&gt;);       &lt;br /&gt;        &lt;span style="color: #5b8a86"&gt;return&lt;/span&gt; &lt;span style="color: #d7c0c0"&gt;Redirect&lt;/span&gt;(&lt;span style="color: #a9d19d"&gt;Url&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #d7c0c0"&gt;Content&lt;/span&gt;(&lt;span style="color: #d1d1d1"&gt;"~/app#home"&lt;/span&gt;));       &lt;br /&gt;    }       &lt;br /&gt;      &lt;br /&gt;    &lt;span style="color: #7a987a"&gt;//so even if we get here, ANONYMOUS will never get this far.&lt;/span&gt;       &lt;br /&gt;    &lt;span style="color: #7a987a"&gt;//The browser has been authorized by an external provider.&lt;/span&gt;       &lt;br /&gt;    &lt;span style="color: #7a987a"&gt;//The next step is for the browser to call /RegisterExternal&lt;/span&gt;       &lt;br /&gt;    &lt;span style="color: #7a987a"&gt;//to register an account. We'll throw up an authorized splash to confirm.&lt;/span&gt;       &lt;br /&gt;      &lt;br /&gt;    &lt;span style="color: #5b8a86"&gt;return&lt;/span&gt; &lt;span style="color: #d7c0c0"&gt;Redirect&lt;/span&gt;(&lt;span style="color: #a9d19d"&gt;Url&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #d7c0c0"&gt;Content&lt;/span&gt;(&lt;span style="color: #d1d1d1"&gt;"~/app#/authorized"&lt;/span&gt;));       &lt;br /&gt;}&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;This time, we hit the bottom of the &lt;strong&gt;/api/ExternalLogin&lt;/strong&gt; call.  This is the part where you can customize the login process. The OWIN middleware has already done the hard work for you. In the case where the user has never registered on WebApp, you have a small window of time to use the &lt;strong&gt;ExternalCookie&lt;/strong&gt; login information for purposes of registration. We redirect the user's browser to &lt;strong&gt;~/app#/authorized, &lt;/strong&gt;where we throw up a screen and ask for a username. The user clicks "Register" which then calls our Web API endpoint &lt;strong&gt;/api/auth/RegisterExternal&lt;/strong&gt;.&lt;/p&gt;  &lt;div style="border-bottom: #000080 1px solid; border-left: #000080 1px solid; font-family: courier new, consolas, 'Courier New', courier, monospace; color: #000; font-size: 10pt; border-top: #000080 1px solid; border-right: #000080 1px solid"&gt;   &lt;div style="padding-bottom: 2px; background-color: #000000; padding-left: 5px; padding-right: 5px; color: #dfdfc0; overflow: auto; padding-top: 2px"&gt;&lt;span style="color: #7a987a"&gt;// POST api/auth/RegisterExternal&lt;/span&gt;       &lt;br /&gt;[&lt;span style="color: #b8ced3"&gt;OverrideAuthentication&lt;/span&gt;]       &lt;br /&gt;[&lt;span style="color: #b8ced3"&gt;HostAuthentication&lt;/span&gt;(&lt;span style="color: #b8ced3"&gt;DefaultAuthenticationTypes&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #b9a6da"&gt;ExternalCookie&lt;/span&gt;)]       &lt;br /&gt;[&lt;span style="color: #b8ced3"&gt;Route&lt;/span&gt;(&lt;span style="color: #d1d1d1"&gt;"RegisterExternal"&lt;/span&gt;)]       &lt;br /&gt;&lt;span style="color: #5b8a86"&gt;public&lt;/span&gt; &lt;span style="color: #5b8a86"&gt;async&lt;/span&gt; &lt;span style="color: #b8ced3"&gt;Task&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #d6a47a"&gt;IHttpActionResult&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #d7c0c0"&gt;RegisterExternal&lt;/span&gt;(&lt;span style="color: #b8ced3"&gt;RegisterExternalBindingModel&lt;/span&gt; &lt;span style="color: #dfdfc1"&gt;model&lt;/span&gt;)       &lt;br /&gt;{       &lt;br /&gt;    &lt;span style="color: #5b8a86"&gt;if&lt;/span&gt;( &lt;span style="color: #c9b68f"&gt;!&lt;/span&gt;&lt;span style="color: #a9d19d"&gt;ModelState&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #a9d19d"&gt;IsValid&lt;/span&gt; )       &lt;br /&gt;    {       &lt;br /&gt;        &lt;span style="color: #5b8a86"&gt;return&lt;/span&gt; &lt;span style="color: #d7c0c0"&gt;BadRequest&lt;/span&gt;(&lt;span style="color: #a9d19d"&gt;ModelState&lt;/span&gt;);       &lt;br /&gt;    }       &lt;br /&gt;      &lt;br /&gt;    &lt;span style="color: #5b8a86"&gt;var&lt;/span&gt; &lt;span style="color: #dfdfc1"&gt;info&lt;/span&gt; &lt;span style="color: #c9b68f"&gt;=&lt;/span&gt; &lt;span style="color: #5b8a86"&gt;await&lt;/span&gt; &lt;span style="color: #a9d19d"&gt;Authentication&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #d79315"&gt;GetExternalLoginInfoAsync&lt;/span&gt;();       &lt;br /&gt;    &lt;span style="color: #5b8a86"&gt;if&lt;/span&gt;( &lt;span style="color: #dfdfc1"&gt;info&lt;/span&gt; &lt;span style="color: #c9b68f"&gt;==&lt;/span&gt; &lt;span style="color: #5b8a86"&gt;null&lt;/span&gt; )       &lt;br /&gt;    {       &lt;br /&gt;        &lt;span style="color: #5b8a86"&gt;return&lt;/span&gt; &lt;span style="color: #d7c0c0"&gt;InternalServerError&lt;/span&gt;();       &lt;br /&gt;    }       &lt;br /&gt;      &lt;br /&gt;    &lt;span style="color: #5b8a86"&gt;var&lt;/span&gt; &lt;span style="color: #dfdfc1"&gt;user&lt;/span&gt; &lt;span style="color: #c9b68f"&gt;=&lt;/span&gt; &lt;span style="color: #5b8a86"&gt;await&lt;/span&gt; &lt;span style="color: #f2f2f2"&gt;this.&lt;/span&gt;&lt;span style="color: #a9d19d"&gt;UserManager&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #d7c0c0"&gt;FindAsync&lt;/span&gt;(&lt;span style="color: #dfdfc1"&gt;info&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #a9d19d"&gt;Login&lt;/span&gt;);       &lt;br /&gt;     &lt;br /&gt;    &lt;span style="color: #5b8a86"&gt;var&lt;/span&gt; &lt;span style="color: #dfdfc1"&gt;hasRegistered&lt;/span&gt; &lt;span style="color: #c9b68f"&gt;=&lt;/span&gt; &lt;span style="color: #dfdfc1"&gt;user&lt;/span&gt; &lt;span style="color: #c9b68f"&gt;!=&lt;/span&gt; &lt;span style="color: #5b8a86"&gt;null&lt;/span&gt;;       &lt;br /&gt;     &lt;br /&gt;    &lt;span style="color: #5b8a86"&gt;if&lt;/span&gt;( &lt;span style="color: #dfdfc1"&gt;hasRegistered&lt;/span&gt; )       &lt;br /&gt;    {       &lt;br /&gt;        &lt;span style="color: #5b8a86"&gt;return&lt;/span&gt; &lt;span style="color: #d7c0c0"&gt;BadRequest&lt;/span&gt;(&lt;span style="color: #d1d1d1"&gt;"External user already registered."&lt;/span&gt;);       &lt;br /&gt;    }       &lt;br /&gt;      &lt;br /&gt;    &lt;span style="color: #dfdfc1"&gt;user&lt;/span&gt; &lt;span style="color: #c9b68f"&gt;=&lt;/span&gt; &lt;span style="color: #5b8a86"&gt;new&lt;/span&gt; &lt;span style="color: #b8ced3"&gt;User&lt;/span&gt;&lt;span style="color: #f2f2f2"&gt;()&lt;/span&gt; { &lt;span style="color: #a9d19d"&gt;UserName&lt;/span&gt; &lt;span style="color: #c9b68f"&gt;=&lt;/span&gt; &lt;span style="color: #dfdfc1"&gt;model&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #a9d19d"&gt;Email&lt;/span&gt;, &lt;span style="color: #a9d19d"&gt;Email&lt;/span&gt; &lt;span style="color: #c9b68f"&gt;=&lt;/span&gt; &lt;span style="color: #dfdfc1"&gt;model&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #a9d19d"&gt;Email&lt;/span&gt; };       &lt;br /&gt;      &lt;br /&gt;    &lt;span style="color: #5b8a86"&gt;var&lt;/span&gt; &lt;span style="color: #dfdfc1"&gt;result&lt;/span&gt; &lt;span style="color: #c9b68f"&gt;=&lt;/span&gt; &lt;span style="color: #5b8a86"&gt;await&lt;/span&gt; &lt;span style="color: #f2f2f2"&gt;this.&lt;/span&gt;&lt;span style="color: #a9d19d"&gt;UserManager&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #d7c0c0"&gt;CreateAsync&lt;/span&gt;(&lt;span style="color: #dfdfc1"&gt;user&lt;/span&gt;);       &lt;br /&gt;    &lt;span style="color: #5b8a86"&gt;if&lt;/span&gt;( &lt;span style="color: #c9b68f"&gt;!&lt;/span&gt;&lt;span style="color: #dfdfc1"&gt;result&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #a9d19d"&gt;Succeeded&lt;/span&gt; )       &lt;br /&gt;    {       &lt;br /&gt;        &lt;span style="color: #5b8a86"&gt;return&lt;/span&gt; &lt;span style="color: #d7c0c0"&gt;GetErrorResult&lt;/span&gt;(&lt;span style="color: #dfdfc1"&gt;result&lt;/span&gt;);       &lt;br /&gt;    }       &lt;br /&gt;      &lt;br /&gt;    &lt;span style="color: #dfdfc1"&gt;result&lt;/span&gt; &lt;span style="color: #c9b68f"&gt;=&lt;/span&gt; &lt;span style="color: #5b8a86"&gt;await&lt;/span&gt; &lt;span style="color: #f2f2f2"&gt;this.&lt;/span&gt;&lt;span style="color: #a9d19d"&gt;UserManager&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #d7c0c0"&gt;AddLoginAsync&lt;/span&gt;(&lt;span style="color: #dfdfc1"&gt;user&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #a9d19d"&gt;Id&lt;/span&gt;, &lt;span style="color: #dfdfc1"&gt;info&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #a9d19d"&gt;Login&lt;/span&gt;);       &lt;br /&gt;    &lt;span style="color: #5b8a86"&gt;if&lt;/span&gt;( &lt;span style="color: #c9b68f"&gt;!&lt;/span&gt;&lt;span style="color: #dfdfc1"&gt;result&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #a9d19d"&gt;Succeeded&lt;/span&gt; )       &lt;br /&gt;    {       &lt;br /&gt;        &lt;span style="color: #5b8a86"&gt;return&lt;/span&gt; &lt;span style="color: #d7c0c0"&gt;GetErrorResult&lt;/span&gt;(&lt;span style="color: #dfdfc1"&gt;result&lt;/span&gt;);       &lt;br /&gt;    }       &lt;br /&gt;    &lt;span style="color: #5b8a86"&gt;return&lt;/span&gt; &lt;span style="color: #d7c0c0"&gt;Ok&lt;/span&gt;();       &lt;br /&gt;}&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;And our user now has a local account.&lt;/p&gt;  &lt;p&gt;Next blog post I'll will show how to transform the &lt;strong&gt;ExternalCookie&lt;/strong&gt; AuthenticationType into a &lt;em&gt;local&lt;/em&gt; usable &lt;strong&gt;access_token&lt;/strong&gt; for &lt;strong&gt;Token Barer Authentication&lt;/strong&gt; for Web API during the life time of the SPA application.&lt;/p&gt;  &lt;p /&gt;  &lt;p&gt;HTH,    &lt;br /&gt;Brian Chavez&lt;/p&gt;&lt;img src="http://bchavez.bitarmory.com/aggbug/98.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Brian Chavez</dc:creator>
            <guid>http://bchavez.bitarmory.com/archive/2015/07/19/asp-net-identity-oauth-2-social-login-web-api-2.aspx</guid>
            <pubDate>Mon, 20 Jul 2015 03:58:58 GMT</pubDate>
            <comments>http://bchavez.bitarmory.com/archive/2015/07/19/asp-net-identity-oauth-2-social-login-web-api-2.aspx#feedback</comments>
            <slash:comments>9</slash:comments>
            <wfw:commentRss>http://bchavez.bitarmory.com/comments/commentRss/98.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Newbies Guide to Aurelia and TypeScript</title>
            <category>ASP.NET</category>
            <category>Tips &amp; Tricks</category>
            <link>http://bchavez.bitarmory.com/archive/2015/07/02/newbies-guide-to-aurelia-and-typescript.aspx</link>
            <description>&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="npxbj[1]" border="0" alt="npxbj[1]" align="right" src="http://bchavez.bitarmory.com/images/bchavez_bitarmory_com/WindowsLiveWriter/NewbiesGuidetoAureliaandTypeScript_FD22/npxbj%5B1%5D_12536e9e-bb3b-4b22-8547-11e56c1497b2.jpg" width="240" height="240" /&gt; So, after about 24 hours trying to understand and establish a workflow for a new JS framework called &lt;a href="http://aurelia.io/"&gt;Aurelia&lt;/a&gt; and &lt;a href="http://www.typescriptlang.org/"&gt;TypeScript&lt;/a&gt;, I think I've finally forged a path to use both in harmony in Visual Studio 2013.&lt;/p&gt;  &lt;h3&gt;First, some important concepts&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://aurelia.io/"&gt;Aurelia&lt;/a&gt; is written in ES6/ES7. Aurelia is distributed through &lt;a href="http://jspm.io/"&gt;jspm&lt;/a&gt;. The Aurelia distribution through &lt;a href="http://kasperlewau.github.io/registry/#/"&gt;jspm&lt;/a&gt; is ES5 code. Aurelia ES5 via jspm is runnable inside your browser.&lt;/p&gt;  &lt;p&gt;If you plan on writing view models in TypeScrypt then all you need to be concerned about is transpiling your &lt;strong&gt;App.ts (*.ts)&lt;/strong&gt; &lt;strong&gt;View Models&lt;/strong&gt; into ES5 code.&lt;/p&gt;  &lt;h3&gt;Get the Tools&lt;/h3&gt;  &lt;p&gt;To get setup, you're going to need:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="https://nodejs.org/"&gt;NodeJS&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href="https://nodejs.org/"&gt;Git&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Be sure you can access &lt;strong&gt;git&lt;/strong&gt; and &lt;strong&gt;npm&lt;/strong&gt; from the command line before continuing.&lt;/p&gt;  &lt;h3&gt;Setup the Framework&lt;/h3&gt;  &lt;p&gt;Next, in a command prompt make sure you have the following installed:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;npm install jspm -g&lt;/p&gt;    &lt;p&gt;npm install tsd -g&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;At this point, you should go to your github account and create an &lt;strong&gt;access token&lt;/strong&gt; for jspm because jspm will hit a lot of github repos when resolving dependencies. This means you can run up against an anonymous rate limit rather quickly. I did! Also, ensure the token you generate also has "public_repo" permission with it; otherwise you'll run up against the same rate limit as an anonymous user and jspm requests will get 404s &amp;amp; projects not found. &lt;strong&gt;Do not skip this step&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;Use the following command to configure jspm and github:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;jspm registry config github&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Create a working folder for your project, and:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;tsd init&lt;/p&gt;    &lt;p&gt;jspm install aurelia-framework&lt;/p&gt;    &lt;p&gt;jspm install aurelia-bootstrapper&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Copy all the *.d.ts type definitions inside "jspm_packages\github\aurelia" into a new folder "\typings\aurelia".&lt;/p&gt;  &lt;p&gt;Then run in the root of your project folder:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;tsd rebundle&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;gt;&amp;gt; added:      &lt;br /&gt;    - aurelia/aurelia-binding.d.ts       &lt;br /&gt;    - aurelia/aurelia-dependency-injection.d.ts       &lt;br /&gt;    - aurelia/aurelia-event-aggregator.d.ts       &lt;br /&gt;    - aurelia/aurelia-framework.d.ts       &lt;br /&gt;    - aurelia/aurelia-history-browser.d.ts       &lt;br /&gt;    - aurelia/aurelia-history.d.ts       &lt;br /&gt;    - aurelia/aurelia-loader-default.d.ts       &lt;br /&gt;    - aurelia/aurelia-loader.d.ts       &lt;br /&gt;    - aurelia/aurelia-logging-console.d.ts       &lt;br /&gt;    - aurelia/aurelia-logging.d.ts       &lt;br /&gt;    - aurelia/aurelia-metadata.d.ts       &lt;br /&gt;    - aurelia/aurelia-path.d.ts       &lt;br /&gt;    - aurelia/aurelia-route-recognizer.d.ts       &lt;br /&gt;    - aurelia/aurelia-router.d.ts       &lt;br /&gt;    - aurelia/aurelia-task-queue.d.ts       &lt;br /&gt;    - aurelia/aurelia-templating-binding.d.ts       &lt;br /&gt;    - aurelia/aurelia-templating.d.ts&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Your "typings\tsd.d.ts" file should have all the necessary references now. (&lt;strong&gt;TIP&lt;/strong&gt;: Setup a gulp script to automate this process, You'll need to re-do this every time you update Aurelia).&lt;/p&gt;  &lt;p&gt;Almost there ...&lt;/p&gt;  &lt;p&gt;Get &lt;a href="https://github.com/cmichaelgraham/aurelia-typescript/tree/typescript-1-5-port/skel-nav-esri-gulp/typings"&gt;corejs.d.ts&lt;/a&gt; and &lt;a href="https://github.com/cmichaelgraham/aurelia-typescript/tree/typescript-1-5-port/skel-nav-esri-gulp/typings"&gt;es6.d.ts&lt;/a&gt; from &lt;a href="https://github.com/cmichaelgraham/aurelia-typescript/tree/typescript-1-5-port/skel-nav-esri-gulp/typings"&gt;this repo&lt;/a&gt; (or if using gulp/npm typescript: node_modules\typescript\bin\lib.es6.d.ts) and add both into "typings\". You will need to reference these in your &lt;strong&gt;*.ts&lt;/strong&gt; files.&lt;/p&gt;  &lt;p&gt;At this point, you can create an empty MVC project inside your working folder at root level. Configure your routes and add a simple view with (no layout). Your .csproj file should be in the same directory with your proejct.json and config.js file.&lt;/p&gt;  &lt;p&gt;If you're using Visual Studio, make sure your TypeScript compiler "Module system" is set to AMD. Project &amp;gt; Properties &amp;gt; TypeScript Build: Module system&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://bchavez.bitarmory.com/images/bchavez_bitarmory_com/WindowsLiveWriter/NewbiesGuidetoAureliaandTypeScript_FD22/image_1ec3edff-1ac0-43ee-8e2e-7f2130e02a56.png" width="303" height="180" /&gt; &lt;/p&gt;  &lt;p&gt;Create an &lt;strong&gt;app.ts&lt;/strong&gt; file in the root project folder:&lt;/p&gt;  &lt;div style="border-bottom: #000080 1px solid; border-left: #000080 1px solid; font-family: courier new, consolas, 'Courier New', courier, monospace; color: #000; font-size: 10pt; border-top: #000080 1px solid; border-right: #000080 1px solid"&gt;   &lt;div style="padding-bottom: 2px; background-color: #000000; padding-left: 5px; padding-right: 5px; color: #dfdfc0; overflow: auto; padding-top: 2px"&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #7a987a"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;reference path="typings/tsd.d.ts" /&amp;gt;&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #7a987a"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;reference path="typings/es6.d.ts" /&amp;gt;&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #7a987a"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;reference path="typings/core-js.d.ts" /&amp;gt;&lt;/span&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;span style="color: #5b8a86"&gt;import&lt;/span&gt; {&lt;span style="color: #ffffff"&gt;Router}&lt;/span&gt; &lt;span style="color: #5b8a86"&gt;from&lt;/span&gt; &lt;span style="color: #d1d1d1"&gt;'aurelia-router'&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;;&lt;/span&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;span style="color: #5b8a86"&gt;export&lt;/span&gt; &lt;span style="color: #5b8a86"&gt;class&lt;/span&gt; &lt;span style="color: #b8ced3"&gt;App&lt;/span&gt; {       &lt;br /&gt;    &lt;span style="color: #b8ced3"&gt;constructor&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;()&lt;/span&gt; {       &lt;br /&gt;        &lt;span style="color: #5b8a86"&gt;this&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #a9d19d"&gt;message&lt;/span&gt; &lt;span style="color: #c9b68f"&gt;=&lt;/span&gt; &lt;span style="color: #d1d1d1"&gt;"Hello World"&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;;&lt;/span&gt;       &lt;br /&gt;    }       &lt;br /&gt;      &lt;br /&gt;    &lt;span style="color: #a9d19d"&gt;message&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;:&lt;/span&gt;&lt;span style="color: #5b8a86"&gt;string&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;;&lt;/span&gt;       &lt;br /&gt;}       &lt;br /&gt;      &lt;br /&gt;&lt;span style="color: #a9d19d"&gt;console&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #d7c0c0"&gt;log&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;(&lt;/span&gt;&lt;span style="color: #d1d1d1"&gt;"THIS APP RAN!"&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;);&lt;/span&gt;&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;SAVE. Your &lt;strong&gt;app.ts -&amp;gt; app.js&lt;/strong&gt; should have AMD module layout.&lt;/p&gt;  &lt;p&gt;Create an &lt;strong&gt;app.html&lt;/strong&gt; view in the root project folder:&lt;/p&gt;  &lt;div style="border-bottom: #000080 1px solid; border-left: #000080 1px solid; font-family: courier new, consolas, 'Courier New', courier, monospace; color: #000; font-size: 10pt; border-top: #000080 1px solid; border-right: #000080 1px solid"&gt;   &lt;div style="padding-bottom: 2px; background-color: #000000; padding-left: 5px; padding-right: 5px; color: #dfdfc0; overflow: auto; padding-top: 2px"&gt;&amp;lt;&lt;span style="color: #e1795f"&gt;template&lt;/span&gt;&amp;gt;       &lt;br /&gt;     &lt;br /&gt;    &amp;lt;&lt;span style="color: #e1795f"&gt;h2&lt;/span&gt;&amp;gt;My App&amp;lt;/&lt;span style="color: #e1795f"&gt;h2&lt;/span&gt;&amp;gt;       &lt;br /&gt;     &lt;br /&gt;    &amp;lt;&lt;span style="color: #e1795f"&gt;span&lt;/span&gt;&amp;gt;${&lt;span style="color: #ff00ff"&gt;message}&lt;/span&gt;&amp;lt;/&lt;span style="color: #e1795f"&gt;span&lt;/span&gt;&amp;gt;       &lt;br /&gt;      &lt;br /&gt;&amp;lt;/&lt;span style="color: #e1795f"&gt;template&lt;/span&gt;&amp;gt;&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Save.&lt;/p&gt;  &lt;p&gt;Create an &lt;strong&gt;index.cshtml&lt;/strong&gt; file (Razor / No Shared Layout):&lt;/p&gt;  &lt;div style="border-bottom: #000080 1px solid; border-left: #000080 1px solid; font-family: courier new, consolas, 'Courier New', courier, monospace; color: #000; font-size: 10pt; border-top: #000080 1px solid; border-right: #000080 1px solid"&gt;   &lt;div style="padding-bottom: 2px; background-color: #000000; padding-left: 5px; padding-right: 5px; color: #dfdfc0; overflow: auto; padding-top: 2px"&gt;&amp;lt;&lt;span style="color: #e1795f"&gt;!DOCTYPE&lt;/span&gt; &lt;span style="color: #cccc37"&gt;html&lt;/span&gt;&amp;gt;       &lt;br /&gt;      &lt;br /&gt;&amp;lt;&lt;span style="color: #e1795f"&gt;html&lt;/span&gt;&amp;gt;       &lt;br /&gt;&amp;lt;&lt;span style="color: #e1795f"&gt;head&lt;/span&gt;&amp;gt;       &lt;br /&gt;    &amp;lt;&lt;span style="color: #e1795f"&gt;meta&lt;/span&gt; &lt;span style="color: #cccc37"&gt;name&lt;/span&gt;=&lt;span style="color: #c89191"&gt;"viewport"&lt;/span&gt; &lt;span style="color: #cccc37"&gt;content&lt;/span&gt;=&lt;span style="color: #c89191"&gt;"width=device-width"&lt;/span&gt; /&amp;gt;       &lt;br /&gt;    &amp;lt;&lt;span style="color: #e1795f"&gt;script&lt;/span&gt; &lt;span style="color: #cccc37"&gt;src&lt;/span&gt;=&lt;span style="color: #c89191"&gt;"~/jspm_packages/system.js"&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style="color: #e1795f"&gt;script&lt;/span&gt;&amp;gt;       &lt;br /&gt;    &amp;lt;&lt;span style="color: #e1795f"&gt;script&lt;/span&gt; &lt;span style="color: #cccc37"&gt;src&lt;/span&gt;=&lt;span style="color: #c89191"&gt;"~/config.js"&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style="color: #e1795f"&gt;script&lt;/span&gt;&amp;gt;       &lt;br /&gt;    &amp;lt;&lt;span style="color: #e1795f"&gt;title&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style="color: #e1795f"&gt;title&lt;/span&gt;&amp;gt;       &lt;br /&gt;&amp;lt;/&lt;span style="color: #e1795f"&gt;head&lt;/span&gt;&amp;gt;       &lt;br /&gt;&amp;lt;&lt;span style="color: #e1795f"&gt;body&lt;/span&gt; &lt;span style="color: #cccc37"&gt;aurelia-app&lt;/span&gt;&amp;gt;       &lt;br /&gt;     &lt;br /&gt;    &amp;lt;&lt;span style="color: #e1795f"&gt;script&lt;/span&gt;&amp;gt;       &lt;br /&gt;        &lt;span style="color: #dcd703"&gt;System&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #dcd703"&gt;import&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;(&lt;/span&gt;&lt;span style="color: #d1d1d1"&gt;"aurelia-bootstrapper"&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;);&lt;/span&gt;       &lt;br /&gt;    &amp;lt;/&lt;span style="color: #e1795f"&gt;script&lt;/span&gt;&amp;gt;       &lt;br /&gt;&amp;lt;/&lt;span style="color: #e1795f"&gt;body&lt;/span&gt;&amp;gt;       &lt;br /&gt;&amp;lt;/&lt;span style="color: #e1795f"&gt;html&lt;/span&gt;&amp;gt;&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;SAVE.&lt;/p&gt;  &lt;p&gt;Run the app, make a request for the application index and poof!&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://bchavez.bitarmory.com/images/bchavez_bitarmory_com/WindowsLiveWriter/NewbiesGuidetoAureliaandTypeScript_FD22/image_d3bf27b5-a5ea-4676-b9a9-17744c2935e5.png" width="125" height="114" /&gt; &lt;/p&gt;  &lt;p&gt;Much success. :)&lt;/p&gt;  &lt;h3&gt; &lt;/h3&gt;  &lt;h3&gt;PRO TIP: Going the extra mile to get decorators working with Dependency Injection&lt;/h3&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;SEE &lt;a href="http://bchavez.bitarmory.com/archive/2015/07/23/enabling-decorators-support-in-typescript-1-5-visual-studio-2015.aspx"&gt;UPDATE: Using TypeScript 1.5 RTM and VS2015&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;If you're using Gulp, this is really easy, use a &lt;strong&gt;tsconfig.json&lt;/strong&gt;  and enable &lt;strong&gt;emitDecoratorMetadata &lt;/strong&gt;CompilerOptions flag. If you're using &lt;strong&gt;gulp-typescript&lt;/strong&gt; pass a configure options object with &lt;strong&gt;emitDecoratorMetadata : true&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;If you're using Visual Studio 2013, unload your &lt;strong&gt;.csproj&lt;/strong&gt;, and edit the configuration. Locate the following MSBuild props and add &lt;strong&gt;TypeScriptAdditionalFlags&lt;/strong&gt;:&lt;/p&gt;  &lt;div style="border-bottom: #000080 1px solid; border-left: #000080 1px solid; font-family: courier new, consolas, 'Courier New', courier, monospace; color: #000; font-size: 10pt; border-top: #000080 1px solid; border-right: #000080 1px solid"&gt;   &lt;div style="padding-bottom: 2px; background-color: #000000; padding-left: 5px; padding-right: 5px; color: #dfdfc0; overflow: auto; padding-top: 2px"&gt;&amp;lt;&lt;span style="color: #e1795f"&gt;PropertyGroup&lt;/span&gt; &lt;span style="color: #cccc37"&gt;Condition&lt;/span&gt;=&lt;span style="color: #c89191"&gt;"'$(Configuration)' == 'Debug'"&lt;/span&gt;&amp;gt;       &lt;br /&gt;    &amp;lt;&lt;span style="color: #e1795f"&gt;TypeScriptModuleKind&lt;/span&gt;&amp;gt;&lt;span style="color: #dfdfbf"&gt;amd&lt;/span&gt;&amp;lt;/&lt;span style="color: #e1795f"&gt;TypeScriptModuleKind&lt;/span&gt;&amp;gt;       &lt;br /&gt;    &amp;lt;&lt;span style="color: #e1795f"&gt;TypeScriptAdditionalFlags&lt;/span&gt;&amp;gt;&lt;span style="color: #dfdfbf"&gt; $(TypeScriptAdditionalFlags) --emitDecoratorMetadata &lt;/span&gt;&amp;lt;/&lt;span style="color: #e1795f"&gt;TypeScriptAdditionalFlags&lt;/span&gt;&amp;gt;       &lt;br /&gt;&amp;lt;/&lt;span style="color: #e1795f"&gt;PropertyGroup&lt;/span&gt;&amp;gt;&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;SAVE. Reload the project. Restart Visual Studio to make sure these changes really take effect. Hit the "Rebuild" on your project and you should now see your decorators working. How? You should see &lt;strong&gt;__metadata&lt;/strong&gt; in the output:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://bchavez.bitarmory.com/images/bchavez_bitarmory_com/WindowsLiveWriter/NewbiesGuidetoAureliaandTypeScript_FD22/image_c45e706b-50e5-404a-b6f3-c54f614bdfb5.png" width="699" height="314" /&gt; &lt;/p&gt;  &lt;p /&gt;  &lt;p&gt;Unfortunately, modifying your .csproj will only work with "MSBuild" invocations like "Build/Rebuild". This will not work with compile-on-SAVE option inside VS. If you want a workflow of compile-on-SAVE, you'll ultimately need to use gulp. I really tried hunting for the compiler options VS uses for compiling-on-SAVE but I couldn't find the hook point. I suspect it's somewhere deep inside Microsoft's closed-source TypeScript plug-in for VS2013. &lt;span style="color: #e1795f"&gt;&lt;strong&gt;TypeScriptAdditionalFlags&lt;/strong&gt;&lt;/span&gt; is simply not picked up by the VS 2013 TypeScript plug-in. Hopefully, this changes in TypeScript 1.5 RTM.&lt;/p&gt;  &lt;p&gt;If you decide to use gulp for compile-on-SAVE ensure you DISABLE compile-on-save inside Visual Studio your project options:&lt;/p&gt;  &lt;p&gt; &lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://bchavez.bitarmory.com/images/bchavez_bitarmory_com/WindowsLiveWriter/NewbiesGuidetoAureliaandTypeScript_FD22/image_2a2e3bea-16bf-447f-90ca-08c0efe10ba2.png" width="415" height="240" /&gt; &lt;/p&gt;  &lt;p&gt;Otherwise, both gulp and VS will overwrite each other.&lt;/p&gt;  &lt;h3&gt;PRO TIP: Using jspm to use packages that are not "officially" in the global registry&lt;/h3&gt;  &lt;p&gt;Credits to &lt;a href="https://github.com/grofit"&gt;@grofit&lt;/a&gt; for the tip:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://kasperlewau.github.io/registry/#/"&gt;jspm&lt;/a&gt;'s global register is rather limited compared to something like &lt;a href="http://bower.io/"&gt;bower.io&lt;/a&gt;. For example, &lt;a href="https://github.com/CodeSeven/toastr"&gt;toastr&lt;/a&gt; isn't inside the jspm registry, but you could do this:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;jspm install github:CodeSeven/toastr&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;     Looking up github:CodeSeven/toastr      &lt;br /&gt;     Updating registry cache...       &lt;br /&gt;     Downloading github:CodeSeven/toastr@2.1.1       &lt;br /&gt;ok   Installed CodeSeven/toastr as github:CodeSeven/toastr@^2.1.1 (2.1.1)       &lt;br /&gt;ok   Install tree has no forks. &lt;/p&gt;    &lt;p&gt;ok   Install complete.&lt;/p&gt; &lt;/blockquote&gt;  &lt;h3&gt; &lt;/h3&gt;  &lt;h3&gt;PRO TIP: Understanding Aurelia Value Converters&lt;/h3&gt;  &lt;p&gt;See this: &lt;a title="http://jdanyow.github.io/aurelia-converters-sample/" href="http://jdanyow.github.io/aurelia-converters-sample/"&gt;http://jdanyow.github.io/aurelia-converters-sample/&lt;/a&gt;. Really good tutorial on value converters.&lt;/p&gt;  &lt;h3&gt;PRO TIP: Using jQuery Plugins with Aurelia&lt;/h3&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://bchavez.bitarmory.com/images/bchavez_bitarmory_com/WindowsLiveWriter/NewbiesGuidetoAureliaandTypeScript_FD22/image_4246bc16-3e13-499a-aa3b-d56c00c0bb01.png" width="754" height="816" /&gt; &lt;/p&gt;  &lt;h3&gt;PRO TIP: Don't use SystemJS to load CSS&lt;/h3&gt;  &lt;p&gt;Use SystemJS for importing JavaScript that is &lt;em&gt;&lt;strong&gt;compatible with jspm and bundled for jspm&lt;/strong&gt;.&lt;/em&gt;.. using SystemJS's CSS plug-in to load CSS will get you in a world of mess. Basically, don't use &lt;strong&gt;import "bootstrap.css!"&lt;/strong&gt; in your ES6 modules. The reason for this is the ES6/SystemJS loader standard was recently changed so CSS ordering is not guaranteed. If you need to load CSS resources in some specified order, use Aurelia's &lt;strong&gt;&amp;lt;require from="..."&amp;gt;&lt;/strong&gt; to load your CSS resources.&lt;/p&gt;  &lt;p&gt;If you installed JavaScript libraries manually using "&lt;strong&gt;jspm github:user/somerepo&lt;/strong&gt;" (that isn't part of jspm's universe nor jspm aware) there's a good chance that jspm wont setup dependencies (ie: jQuery) required by "&lt;strong&gt;user/somerepo&lt;/strong&gt;".  Your third-party library can be loaded out of order relative to its dependency (for the exact reason above) because JSPM doesn't know the package's dependencies by default if they are not specified. See this blog post for more info: &lt;a title="http://bchavez.bitarmory.com/archive/2015/09/10/jspm-amp-third-party-library-shims.aspx" href="http://bchavez.bitarmory.com/archive/2015/09/10/jspm-amp-third-party-library-shims.aspx"&gt;How to deal with dependencies with non-registry JSPM packages&lt;/a&gt;&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;h3&gt;PRO TIP: Careful of camelCase names in View Models&lt;/h3&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://bchavez.bitarmory.com/images/bchavez_bitarmory_com/WindowsLiveWriter/NewbiesGuidetoAureliaandTypeScript_FD22/image_7ad7fddd-f41b-4347-a7dc-afae941626f3.png" width="756" height="630" /&gt; &lt;/p&gt;  &lt;p&gt;Has to do with hyphenations and DOM elements:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://aurelia.io/docs.html#custom-attributes" href="http://aurelia.io/docs.html#custom-attributes"&gt;http://aurelia.io/docs.html#custom-attributes&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;* Since it's a dom attribute it's not valid html so Aurelia will automatically hyphenate and try match an attribute.&lt;/p&gt;  &lt;p&gt;* Simply put when you have a name that camel case you need to separate it with -&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Have fun :)&lt;/p&gt;  &lt;p&gt;Brian Chavez&lt;/p&gt;&lt;img src="http://bchavez.bitarmory.com/aggbug/96.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Brian Chavez</dc:creator>
            <guid>http://bchavez.bitarmory.com/archive/2015/07/02/newbies-guide-to-aurelia-and-typescript.aspx</guid>
            <pubDate>Fri, 03 Jul 2015 00:59:15 GMT</pubDate>
            <comments>http://bchavez.bitarmory.com/archive/2015/07/02/newbies-guide-to-aurelia-and-typescript.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://bchavez.bitarmory.com/comments/commentRss/96.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Date Recurrence Library for .NET/C#</title>
            <link>http://bchavez.bitarmory.com/archive/2015/05/24/date-recurrence-library-for-.netc.aspx</link>
            <description>&lt;p&gt; &lt;/p&gt;  &lt;p&gt;It's quite unfortunate stackoverflow is closing down questions like this: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a title="http://stackoverflow.com/questions/4517376/recurrence-library-for-date-calculations-for-net" href="http://stackoverflow.com/questions/4517376/recurrence-library-for-date-calculations-for-net"&gt;&lt;strong&gt;Recurrence Library for date calculations for .Net [closed]&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Actually, I wish they changed this policy since the field of "what's best" is constantly changing. Normally, I'd contribute to the question and others would vote on that suggestion. The best answer usually bubbles up to the top and *that* is useful. New libraries are created all the time.&lt;/p&gt;  &lt;p&gt;Anyway, for those of you looking for a date recurrence library, I'd like to recommend:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="https://github.com/EWSoftware/PDI"&gt;EWSoftware PDI Library&lt;/a&gt; and &lt;a href="https://www.nuget.org/packages/EWSoftware.PDI/"&gt;NuGet Here&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;There are others, but I've used this before and works really well. The main class you'll need to work with is the &lt;strong&gt;Recurrence&lt;/strong&gt;  in the &lt;strong&gt;EWSoftware.PDI &lt;/strong&gt;name space. For example:&lt;/p&gt;  &lt;div style="border-bottom: #000080 1px solid; border-left: #000080 1px solid; font-family: courier new, consolas, 'Courier New', courier, monospace; color: #000; font-size: 10pt; border-top: #000080 1px solid; border-right: #000080 1px solid"&gt;   &lt;div style="padding-bottom: 2px; background-color: #000000; padding-left: 5px; padding-right: 5px; color: #dfdfc0; overflow: auto; padding-top: 2px"&gt;[&lt;span style="color: #b8ced3"&gt;Test&lt;/span&gt;]      &lt;br /&gt;&lt;span style="color: #5b8a86"&gt;public&lt;/span&gt; &lt;span style="color: #5b8a86"&gt;void&lt;/span&gt; &lt;span style="color: #d7c0c0"&gt;test&lt;/span&gt;()      &lt;br /&gt;{      &lt;br /&gt;    &lt;span style="color: #5b8a86"&gt;var&lt;/span&gt; &lt;span style="color: #dfdfc1"&gt;r&lt;/span&gt; &lt;span style="color: #c9b68f"&gt;=&lt;/span&gt; &lt;span style="color: #5b8a86"&gt;new&lt;/span&gt; &lt;span style="color: #b8ced3"&gt;Recurrence&lt;/span&gt;();      &lt;br /&gt;    &lt;span style="color: #dfdfc1"&gt;r&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #d7c0c0"&gt;RecurDaily&lt;/span&gt;(&lt;span style="color: #8fced1"&gt;2&lt;/span&gt;);      &lt;br /&gt;      &lt;br /&gt;    &lt;span style="color: #5b8a86"&gt;var&lt;/span&gt; &lt;span style="color: #dfdfc1"&gt;starting&lt;/span&gt; &lt;span style="color: #c9b68f"&gt;=&lt;/span&gt; &lt;span style="color: #bad7d0"&gt;DateTime&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #a9d19d"&gt;Today&lt;/span&gt;;      &lt;br /&gt;    &lt;span style="color: #5b8a86"&gt;var&lt;/span&gt; &lt;span style="color: #dfdfc1"&gt;ending&lt;/span&gt; &lt;span style="color: #c9b68f"&gt;=&lt;/span&gt; &lt;span style="color: #bad7d0"&gt;DateTime&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #a9d19d"&gt;Today&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #d7c0c0"&gt;AddDays&lt;/span&gt;(&lt;span style="color: #8fced1"&gt;7&lt;/span&gt;);      &lt;br /&gt;      &lt;br /&gt;    &lt;span style="color: #5b8a86"&gt;var&lt;/span&gt; &lt;span style="color: #dfdfc1"&gt;dates&lt;/span&gt; &lt;span style="color: #c9b68f"&gt;=&lt;/span&gt; &lt;span style="color: #dfdfc1"&gt;r&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #d7c0c0"&gt;InstancesBetween&lt;/span&gt;(&lt;span style="color: #dfdfc1"&gt;starting&lt;/span&gt;, &lt;span style="color: #dfdfc1"&gt;ending&lt;/span&gt;);      &lt;br /&gt;    &lt;span style="color: #5b8a86"&gt;foreach&lt;/span&gt;( &lt;span style="color: #5b8a86"&gt;var&lt;/span&gt; &lt;span style="color: #dfdfc1"&gt;occurrence&lt;/span&gt; &lt;span style="color: #5b8a86"&gt;in&lt;/span&gt; &lt;span style="color: #dfdfc1"&gt;dates&lt;/span&gt; )      &lt;br /&gt;    {      &lt;br /&gt;        &lt;span style="color: #b8ced3"&gt;Console&lt;/span&gt;&lt;span style="color: #c9b68f"&gt;.&lt;/span&gt;&lt;span style="color: #d7c0c0"&gt;WriteLine&lt;/span&gt;(&lt;span style="color: #dfdfc1"&gt;occurrence&lt;/span&gt;);      &lt;br /&gt;    }      &lt;br /&gt;}&lt;/div&gt; &lt;/div&gt;  &lt;blockquote&gt;   &lt;p&gt;OUTPUT:&lt;/p&gt;    &lt;p&gt;5/25/2015 12:00:00 AM     &lt;br /&gt;5/27/2015 12:00:00 AM      &lt;br /&gt;5/29/2015 12:00:00 AM      &lt;br /&gt;5/31/2015 12:00:00 AM&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Also, if you find it useful, consider making a &lt;a href="https://github.com/EWSoftware/PDI/wiki#making-a-donation"&gt;donation&lt;/a&gt; to him. I actually bought a license to his PDI library way back when before he open-sourced it. He's also the author of the &lt;a href="https://visualstudiogallery.msdn.microsoft.com/a23de100-31a1-405c-b4b7-d6be40c3dfff"&gt;VS2013 spell checker plug-in&lt;/a&gt;. Legit. &lt;/p&gt;&lt;img src="http://bchavez.bitarmory.com/aggbug/95.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Brian Chavez</dc:creator>
            <guid>http://bchavez.bitarmory.com/archive/2015/05/24/date-recurrence-library-for-.netc.aspx</guid>
            <pubDate>Mon, 25 May 2015 01:40:41 GMT</pubDate>
            <comments>http://bchavez.bitarmory.com/archive/2015/05/24/date-recurrence-library-for-.netc.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://bchavez.bitarmory.com/comments/commentRss/95.aspx</wfw:commentRss>
        </item>
        <item>
            <title>RethinkDB Gems</title>
            <link>http://bchavez.bitarmory.com/archive/2014/07/16/rethinkdb-gems.aspx</link>
            <description>&lt;p&gt;After idling in the RethinkDB freenode IRC chat, I think I'm going to start a collection of very good Q/A that I see:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;dubcanada&amp;gt; One more question, is there an easy way to duplicate all the content in the DB      &lt;br /&gt;&amp;lt;dubcanada&amp;gt; I'm trying to fill it up with a ton of records for testing but it seems to be taking forever lol       &lt;br /&gt;&amp;lt;AtnNn&amp;gt; dubcanada: you can do something like r.table('foo').insert(r.table('foo').without('id'))&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Search for documents without field:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;nicklovescode&amp;gt; what's the best way to search for documents without a field? I tried .filter({ foo: undefined }) but that got an error      &lt;br /&gt;&amp;lt;srh_&amp;gt; nicklovescode: you can use .filter(r.row.hasFields('foo').not())&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;How to implement failover:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;20:20 &amp;lt;bg__&amp;gt; i also have a question regarding failovers      &lt;br /&gt;20:22 &amp;lt;bg__&amp;gt; until #223 is resolved, is there a suggestion regarding how I should handle failovers? Meaning, if i have services that are using my rethinkdb, and I have tables that have replicas, how can I ensure I'm not trafficing requests to an unresponsive node?       &lt;br /&gt;20:23 &amp;lt;neumino&amp;gt; You need to have a connection opened to the server       &lt;br /&gt;20:23 &amp;lt;neumino&amp;gt; If the connection is dropped       &lt;br /&gt;20:23 &amp;lt;neumino&amp;gt; You can try to connect to another server       &lt;br /&gt;20:23 &amp;lt;bg__&amp;gt; okay. so lets say i have web1 and web2 which are nodejs web servers       &lt;br /&gt;20:24 &amp;lt;bg__&amp;gt; and they handle requests that require them connecting to rethinkdb and reading from one table       &lt;br /&gt;20:24 &amp;lt;bg__&amp;gt; and because im afraid of one serving dying in the middle of the night, i have two rethinkdb servers, rethink1 and rethink2       &lt;br /&gt;20:25 &amp;lt;bg__&amp;gt; what connection string do I use to have web1 and web2 connect to rethink1 and rethink2 that protects me if rethink1 or rethink 2 goes down       &lt;br /&gt;20:25 &amp;lt;bg__&amp;gt; i only have web1 and rethink1 right now. web1 explicitly connects to rethink1       &lt;br /&gt;20:25 &amp;lt;bg__&amp;gt; but I'm reaching a point where that is not safe       &lt;br /&gt;20:26 &amp;lt;neumino&amp;gt; Hum       &lt;br /&gt;20:26 &amp;lt;bg__&amp;gt; did that make sense?       &lt;br /&gt;20:27 &amp;lt;neumino&amp;gt; bg__, if the master of your table fails, you won't be able to write until you declare the master dead       &lt;br /&gt;20:27 &amp;lt;neumino&amp;gt; We currently don't have a nice way to do it, but the coreos folks did it that way:       &lt;br /&gt;20:27 &amp;lt;neumino&amp;gt; They fetch `&lt;a href="http://server:8080/ajax`"&gt;http://server:8080/ajax`&lt;/a&gt;       &lt;br /&gt;20:27 &amp;lt;neumino&amp;gt; They fetch `&lt;a href="http://server:8080/ajax/issues`"&gt;http://server:8080/ajax/issues`&lt;/a&gt;       &lt;br /&gt;20:27 &amp;lt;neumino&amp;gt; If there is a dead machine       &lt;br /&gt;20:28 &amp;lt;neumino&amp;gt; They start a script that is going to kill it using `rethinkdb admin`       &lt;br /&gt;20:29 &amp;lt;bg__&amp;gt; ah ha.       &lt;br /&gt;20:29 &amp;lt;bg__&amp;gt; i did not know about those two end points       &lt;br /&gt;20:30 &amp;lt;bg__&amp;gt; i was going to have a script that polled the server       &lt;br /&gt;20:30 &amp;lt;bg__&amp;gt; i just wasnt sure what endpoint to use       &lt;br /&gt;20:30 &amp;lt;bg__&amp;gt; those seem to do the trick       &lt;br /&gt;20:31 &amp;lt;bg__&amp;gt; thanks@!       &lt;br /&gt;20:31 &amp;lt;bg__&amp;gt; is there any documentation about that?       &lt;br /&gt;20:32 &amp;lt;neumino&amp;gt; Hum not really :/       &lt;br /&gt;20:32 &amp;lt;neumino&amp;gt; If you start `rethinkdb admin`       &lt;br /&gt;20:32 &amp;lt;neumino&amp;gt; And then send `help`, you should get the docs for `rethinkdb admin`       &lt;br /&gt;20:32 &amp;lt;neumino&amp;gt; For `ajax/issues`, there is no doc for now       &lt;br /&gt;20:33 &amp;lt;neumino&amp;gt; Try to kill a server and you will see the error you get       &lt;br /&gt;20:33 &amp;lt;bg__&amp;gt; i meant /ajax and /ajax/issues       &lt;br /&gt;20:33 &amp;lt;neumino&amp;gt; It's something like "DEAD_MACHINE" I think       &lt;br /&gt;20:33 &amp;lt;neumino&amp;gt; Oh       &lt;br /&gt;20:33 &amp;lt;bg__&amp;gt; both seem very important to someone trying to use rethinkdb as a distributed system       &lt;br /&gt;20:33 &amp;lt;bg__&amp;gt; getting around this isn't difficult now that i know about those       &lt;br /&gt;20:42 &amp;lt;bg__&amp;gt; just out of curiousity, when you say 'the way the coreos folks did it' what do you mean?       &lt;br /&gt;20:45 &amp;lt;neumino&amp;gt; Oh, the engineers at coreos needed to set up a kind of failover with rethinkdb       &lt;br /&gt;20:45 &amp;lt;neumino&amp;gt; and that's what they did       &lt;br /&gt;20:45 &amp;lt;neumino&amp;gt; It's kind of the only solution now ^^       &lt;br /&gt;20:45 &amp;lt;neumino&amp;gt; (well you could skip `rethinkdb admin` and craft post request like the web interface do       &lt;br /&gt;20:46 &amp;lt;bg__&amp;gt; oh, got it.       &lt;br /&gt;20:46 &amp;lt;bg__&amp;gt; its a great solution for now. &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Performance filtering:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;thelinuxlich&amp;gt; something that is bugging me these days     &lt;br /&gt;&amp;lt;thelinuxlich&amp;gt; is it more performant to do a filter before or after a eqJoin ?      &lt;br /&gt;&amp;lt;AtnNn&amp;gt; if your filter only needs fields from the left table, it is better to filter before the join      &lt;br /&gt;&amp;lt;AtnNn&amp;gt; thelinuxlich: ^      &lt;br /&gt;&amp;lt;thelinuxlich&amp;gt; AtnNn: what if it uses a single field on the right side, should I filter before eqJoin on the left and after eqJoin on the right?      &lt;br /&gt;&amp;lt;AtnNn&amp;gt; yes, if you can independently filter from both tables      &lt;br /&gt;&amp;lt;thelinuxlich&amp;gt; this is a bit confusing&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://bchavez.bitarmory.com/aggbug/94.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Brian Chavez</dc:creator>
            <guid>http://bchavez.bitarmory.com/archive/2014/07/16/rethinkdb-gems.aspx</guid>
            <pubDate>Thu, 17 Jul 2014 01:14:22 GMT</pubDate>
            <comments>http://bchavez.bitarmory.com/archive/2014/07/16/rethinkdb-gems.aspx#feedback</comments>
            <wfw:commentRss>http://bchavez.bitarmory.com/comments/commentRss/94.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Convert Unix Endings to DOS/Windows using Cygwin/TCSH</title>
            <link>http://bchavez.bitarmory.com/archive/2014/07/11/convert-unix-endings-to-doswindows-using-cygwintcsh.aspx</link>
            <description>&lt;p&gt;Small note for me, which converts all *.cs files recursively in a directory:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;find ./**/*.cs -type f -exec unix2dos {} \;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Happy coding,   &lt;br /&gt;Brian Chavez&lt;/p&gt;&lt;img src="http://bchavez.bitarmory.com/aggbug/93.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Brian Chavez</dc:creator>
            <guid>http://bchavez.bitarmory.com/archive/2014/07/11/convert-unix-endings-to-doswindows-using-cygwintcsh.aspx</guid>
            <pubDate>Sat, 12 Jul 2014 03:11:54 GMT</pubDate>
            <comments>http://bchavez.bitarmory.com/archive/2014/07/11/convert-unix-endings-to-doswindows-using-cygwintcsh.aspx#feedback</comments>
            <wfw:commentRss>http://bchavez.bitarmory.com/comments/commentRss/93.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Visual Studio 2013 Loading Splash Screen Slow</title>
            <link>http://bchavez.bitarmory.com/archive/2014/07/02/visual-studio-2013-loading-splash-screen-slow.aspx</link>
            <description>&lt;div&gt;   &lt;p&gt;&lt;img style="display: inline; margin-left: 0px; margin-right: 0px" align="right" src="https://readytogo.microsoft.com/global/Asset/RTG%20Image%20Library/FY14%20-%20Visual%20Studio%202013/VS2013%20-%20Campaign%20Image_500.jpg" width="258" height="172" /&gt;&lt;/p&gt;    &lt;p&gt;I recently experienced Visual Studio 2013 loading very slowly at the splash screen. It was noticeable since I'm on a very fast dev box and accustomed to VS 2013 loading very fast (normally under 10 seconds).&lt;/p&gt;    &lt;p&gt;So, something defiantly changed.&lt;/p&gt;    &lt;p&gt;Problem turns out that I had recently opened a project under &lt;strong&gt;Git&lt;/strong&gt; source control &lt;strong&gt;located on a remote share&lt;/strong&gt;.&lt;/p&gt;    &lt;p&gt;The remote share was no longer available, yet, the Team Foundation Git Source Control provider was still probing the network share which took up a &lt;strong&gt;significant&lt;/strong&gt; part of the loading time. I suppose the Git provider was waiting for a network timeout.&lt;/p&gt;    &lt;p&gt;Anyway, to resolve the issue simply remove the offending network shares under Git source control located here:&lt;/p&gt;    &lt;blockquote&gt;     &lt;p&gt;HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\12.0\TeamFoundation\GitSourceControl\Repositories&lt;/p&gt;   &lt;/blockquote&gt;    &lt;p&gt;Under the &lt;strong&gt;Repositories&lt;/strong&gt; key, you'll find a stash of GUIDs for each project the Git provider keeps track of. Locate the offending GUID keys that contain the network shares you want to remove and remove the entire GUID entry (along with the contents) -- and all should be well.&lt;/p&gt;    &lt;p&gt;Happy coding,     &lt;br /&gt;Brian Chavez&lt;/p&gt; &lt;/div&gt;&lt;img src="http://bchavez.bitarmory.com/aggbug/92.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Brian Chavez</dc:creator>
            <guid>http://bchavez.bitarmory.com/archive/2014/07/02/visual-studio-2013-loading-splash-screen-slow.aspx</guid>
            <pubDate>Thu, 03 Jul 2014 03:11:18 GMT</pubDate>
            <comments>http://bchavez.bitarmory.com/archive/2014/07/02/visual-studio-2013-loading-splash-screen-slow.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://bchavez.bitarmory.com/comments/commentRss/92.aspx</wfw:commentRss>
        </item>
        <item>
            <title>@functions &amp;quot;This is not a valid location for a breakpoint&amp;quot; in Visual Studio 2013</title>
            <link>http://bchavez.bitarmory.com/archive/2013/11/08/functions-quotthis-is-not-a-valid-location-for-a-breakpointquot.aspx</link>
            <description>&lt;p&gt;Working with Visual Studio 2013 and I tried to set a breakpoint in "&lt;strong&gt;@fucntions&lt;/strong&gt;" bout got back an error message that read:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;This is not a valid location for a breakpoint.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://bchavez.bitarmory.com/images/bchavez_bitarmory_com/WindowsLiveWriter/functionsThisisnotavalidlocationforabrea_10003/image_21e92c29-3cba-407c-98d9-20e9e3143e3c.png" width="398" height="393" /&gt; &lt;/p&gt;  &lt;p&gt;That's funny, because it works in &lt;strong&gt;Visual Studio 2012&lt;/strong&gt;. See:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://bchavez.bitarmory.com/images/bchavez_bitarmory_com/WindowsLiveWriter/functionsThisisnotavalidlocationforabrea_10003/image_cf9fbbdc-3483-4eaa-a503-0aa41c07fb1b.png" width="355" height="410" /&gt; &lt;/p&gt;  &lt;p&gt;Oh well, as a work around, move the &lt;strong&gt;@functions&lt;/strong&gt; block up to the beginning of the &lt;strong&gt;cshtml&lt;/strong&gt; razor view, and you should be able to once again set breakpoints:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://bchavez.bitarmory.com/images/bchavez_bitarmory_com/WindowsLiveWriter/functionsThisisnotavalidlocationforabrea_10003/image_94dcac31-01f3-418e-aa08-c2f8e5b6a1fc.png" width="475" height="399" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Why? Who knows. :/&lt;/p&gt;  &lt;p&gt;-Brian&lt;/p&gt;&lt;img src="http://bchavez.bitarmory.com/aggbug/91.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Brian Chavez</dc:creator>
            <guid>http://bchavez.bitarmory.com/archive/2013/11/08/functions-quotthis-is-not-a-valid-location-for-a-breakpointquot.aspx</guid>
            <pubDate>Sat, 09 Nov 2013 02:12:23 GMT</pubDate>
            <comments>http://bchavez.bitarmory.com/archive/2013/11/08/functions-quotthis-is-not-a-valid-location-for-a-breakpointquot.aspx#feedback</comments>
            <wfw:commentRss>http://bchavez.bitarmory.com/comments/commentRss/91.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>