[driver] Almost a proper compiler driver!

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/demhydraz/cafe.git/'


silliness

silliness

--- index.coffee
+++ index.coffee
@@ -104,12 +104,9 @@

 processCommand = (bot, message) ->

-  if bot.res
-    # Return 200 immediately for slash commands
-    bot.res.setHeader 'Content-Type', 'application/json'
-    bot.res.send JSON.stringify({response_type: "in_channel"})
-
+  sent = false
   replyPrivateIfPossible = (newMessage) ->
+    sent = true
     if bot.res
       bot.replyPrivate(message, newMessage)
     else
@@ -152,6 +149,12 @@
         replyPrivateIfPossible("_Your command wasn't recognized. No custom commands are configured._")
       refreshCommands()

+
+  if bot.res && !sent
+    # Return 200 immediately for slash commands
+    bot.res.setHeader 'Content-Type', 'application/json'
+    bot.res.send JSON.stringify({response_type: "in_channel"})
+
 runCLI = (bot, message) ->
   [txt, type, ignore, lookerName, query] = message.match


another little fix

another little fix

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/Mikuia/Mikuia.git/'


initial commit

initial commit

--- oriDomi.coffee
+++ oriDomi.coffee
@@ -0,0 +1,346 @@
+###
+* oriDomi
+* fold up the DOM
+*
+* Dan Motzenbecker
+* (c) 2012
+###
+
+
+root = window
+$ = root.$ or false
+silent = false
+testEl = document.createElement 'div'
+prefixList = ['webkit', 'Moz', 'O', 'ms', 'Khtml']
+transitionEnd = 'webkitTransitionEnd transitionend oTransitionEnd MSTransitionEnd KhtmlTransitionEnd'
+oriDomiSupport = true
+
+
+testProp = (prop) ->
+  return prop if testEl.style[prop]?
+  capProp = prop.charAt(0).toUpperCase() + prop.slice 1
+  for prefix in prefixList
+    if testEl.style[prefix + capProp]?
+      return prefix + capProp
+  false
+
+
+extendObj = (target, source) ->
+  if not target?
+    return source
+  for prop of source
+    if not target[prop]?
+      target[prop] = source[prop]
+
+  target
+
+
+transformProp = testProp 'transform'
+transformOriginProp = testProp 'transformOrigin'
+transformStyleProp = testProp 'transformStyle'
+transitionProp = testProp 'transition'
+perspectiveProp = testProp 'perspective'
+backfaceProp = testProp 'backfaceVisibility'
+gradientProp = testProp 'linearGradient'
+
+if !transformProp or !transitionProp or !perspectiveProp or
+  !backfaceProp or !transformOriginProp or !transformStyleProp
+    oriDomiSupport = false
+    console?.warn 'oriDomi: Browser does not support CSS 3D tranforms, disabling'
+
+
+defaults =
+  panels: 5
+  vPanels: 5
+  hPanels: 5
+  perspective: 1000
+  shading: true
+  speed: .6
+  oriDomiClass: 'oriDomi'
+  silent: false
+  smoothStart: true
+  shadingIntensity: 1
+  easingMethod: ''
+  newClass: null
+
+
+class root.OriDomi
+
+  constructor: (@el, @settings = {}) ->
+    if !(@ instanceof OriDomi)
+      return new oriDomi @el, @settings
+
+    silent = true if @settings.silent
+
+    if !@el? or @el.nodeType isnt 1
+      return !silent and console?.warn 'oriDomi: First argument must be a DOM element'
+
+    @$el = $ @el if $
+    elStyle = root.getComputedStyle @el
+    @width = parseInt(elStyle.width, 10) +
+             parseInt(elStyle.paddingLeft, 10) +
+             parseInt(elStyle.paddingRight, 10)
+
+    @height = parseInt(elStyle.height, 10) +
+              parseInt(elStyle.paddingTop, 10) +
+              parseInt(elStyle.paddingBottom, 10)
+
+    @panelWidth = Math.floor(@width / @settings.panels) or 1
+    @panels = []
+    @leftShaders = []
+    @rightShaders = []
+
+    mask = document.createElement 'div'
+    mask.className = 'oriDomi-mask'
+    mask.style.position = 'absolute'
+    mask.style.overflow = 'hidden'
+    mask.style.width = @panelWidth + 'px'
+
+    if @settings.shading
+      vShader = document.createElement 'div'
+      vShader.className = 'oriDomi-shader'
+      vShader.style[transitionProp] = "opacity #{@settings.speed}s"
+      vShader.style.position = 'absolute'
+      vShader.style.width = '100%'
+      vShader.style.height = '100%'
+      vShader.style.opacity = 0
+      vShader.style.top = 0
+      mask.appendChild vShader
+      mask.appendChild vShader.cloneNode()
+
+    holder = document.createElement 'div'
+    holder.className = @el.className += ' oriDomi-holder'
+    holder.style.margin = 0
+
+    panelProto = @el.cloneNode true
+    panelProto.removeAttribute 'id'
+    panelProto.style.width = @panelWidth + 'px'
+    panelProto.style.height = '100%'
+    panelProto.style.padding = '0'
+    panelProto.style[transformProp] = "translate3d(#{@panelWidth}px, 0, 0) rotate3d(0, 1, 0, 0deg)"
+    panelProto.style[transitionProp] = "all #{@settings.speed}s #{@settings.easingMethod}"
+    panelProto.style[transformOriginProp] = '0'
+    panelProto.style[transformStyleProp] = 'preserve-3d'
+    panelProto.style[backfaceProp] = 'hidden'
+
+    contents = panelProto.innerHTML
+    holder.innerHTML = contents
+    mask.innerHTML += holder.outerHTML
+    panelProto.innerHTML = mask.outerHTML
+
+    for i in [1..@settings.panels]
+      panel = panelProto.cloneNode true
+      panel.classList.add 'oriDomi-panel' + i
+      panelHolder = panel.getElementsByClassName('oriDomi-holder')[0]
+      panelHolder.style.marginLeft = parseInt((i - 1) * @panelWidth * -1, 10) + 'px'
+
+      if @settings.shading
+        shaders = panel.getElementsByClassName 'oriDomi-shader'
+        leftShader = shaders[0]
+        rightShader = shaders[1]
+        leftShader.style.background =
+          '-webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(255, 255, 255, .35) 100%)'
+        rightShader.style.background =
+          '-webkit-linear-gradient(right, rgba(0, 0, 0, .5) 0%, rgba(255, 255, 255, .35) 100%)'
+
+        @leftShaders.push leftShader
+        @rightShaders.push rightShader
+
+      @panels.push panel
+
+      unless i is 1
+        @panels[i - 2].appendChild panel
+      else
+        panel.style[transformProp] = 'translate3d(0, 0, 0)'
+
+    #if @settings.smoothStart
+      #@accordion 0
+      #@settings.speed = originalSpeed
+
+    if @settings.newClass?
+      @el.className = newClass
+
+    @el.classList.add @settings.oriDomiClass
+    @el.style.padding = '0'
+    @el.style.width = @width + 'px'
+    @el.style.height = @height + 'px'
+    @el.style.backgroundColor = 'transparent'
+    @el.style[transitionProp] = "all #{@settings.speed}s #{@settings.easingMethod}"
+    @el.style[perspectiveProp] = @settings.perspective
+    @el.innerHTML = ''
+    @el.appendChild @panels[0]
+
+    @_callback @settings
+
+
+  _callback: (options) ->
+    if typeof options.callback is 'function'
+      @panels[0].addEventListener transitionEnd, =>
+        @panels[0].removeEventListener transitionEnd, true
+        options.callback()
+      , true
+
+
+  _normalizeAngle: (percent) ->
+    percent = parseFloat percent, 10
+    if isNaN percent
+      0
+    else if percent > 90
+      !silent and console?.warn 'oriDomi: Maximum value is 90'
+      90
+    else if percent < -90
+      !silent and console?.warn 'oriDomi: Minimum value is -90'
+      -90
+    else
+      percent
+
+
+  _accordionDefaults:
+    anchor: true
+    stairs: false
+    fracture: false
+    twist: false
+
+
+  accordion: (angle, options) ->
+    options = extendObj options, @_accordionDefaults
+    angle = @_normalizeAngle angle
+    left = @panelWidth - 1
+
+    for panel, i in @panels
+      if i % 2 isnt 0 and !options.twist
+        deg = -angle
+      else
+        deg = angle
+
+      if i is 0
+        x = 0
+      else
+        x = left
+        ++x if angle is 90
+
+      if options.anchor
+        if i is 0
+          deg = 0
+        else if i > 1 or options.stairs
+          deg = deg * 2
+      else if i isnt 0
+        deg = deg * 2
+
+
+      if options.fracture
+        rotation = "rotate3d(1, 1, 1, #{deg}deg)"
+      else
+        rotation = "rotate3d(0, 1, 0, #{deg}deg)"
+
+
+      panel.style[transformProp] = "translate3d(#{x}px, 0, 0) #{rotation}"
+
+      if @settings.shading and !(i is 0 and options.anchor)
+        opacity = Math.abs(angle) / 90 * @settings.shadingIntensity * .4
+
+        if deg < 0
+          @rightShaders[i].style.opacity = 0
+          @leftShaders[i].style.opacity = opacity
+        else
+          @leftShaders[i].style.opacity = 0
+          @rightShaders[i].style.opacity = opacity
+
+    @_callback options
+
+
+  reset: ->
+    @accordion 0
+
+
+  collapse: ->
+    @accordion -90, anchor: false
+
+
+  collapseAlt: ->
+    @accordion 90, anchor: false
+
+
+  reveal: (angle, options = {}) ->
+    options.anchor = true
+    @accordion angle, options
+
+
+  stairs: (angle, options = {}) ->
+    options.stairs = true
+    options.anchor = true
+    @accordion angle, options
+
+
+  fracture: (angle, options = {}) ->
+    options.fracture = true
+    @accordion angle, options
+
+
+  twist: (angle, options = {}) ->
+    options.fracture = true
+    options.twist = true
+    @accordion angle / 10, options
+
+
+  curl: (angle, options = {}) ->
+    angle = @_normalizeAngle(angle) / @panelWidth * 10
+
+    for panel, i in @panels
+      x = if i is 0 then 0 else @panelWidth - 1
+      panel.style[transformProp] = "translate3d(#{x}px, 0, 0) rotate3d(0, 1, 0, #{angle}deg)"
+
+    @_callback options
+
+
+  setAngles: (angles, options = {}) ->
+    if !Array.isArray angles
+      return !silent and console?.warn 'oriDomi: Argument must be an array of angles'
+
+    for panel, i in @panels
+      x = if i is 0 then 0 else @panelWidth - 1
+      angle = @_normalizeAngle(angles[i])
+
+      unless i is 0
+        angle *= 2
+
+      panel.style[transformProp] = "translate3d(#{x}px, 0, 0) rotate3d(0, 1, 0, #{angle}deg)"
+
+    @_callback options
+
+
+# $ BRIDGE
+
+if $
+  $.fn.oriDomi = (options) ->
+    return @ if !oriDomiSupport
+
+    if typeof options is 'string'
+
+      if typeof OriDomi::[options] isnt 'function'
+        return !silent and console?.warn "oriDomi: No such method '#{options}'"
+
+      for el in @
+        instance = $.data el, 'oriDomi'
+
+        if not instance?
+          return !silent and console?.warn "oriDomi: Can't call #{options}, oriDomi hasn't been initialized on this element"
+
+        args = Array::slice.call arguments
+        args.shift()
+        instance[options].apply instance, args
+
+      @
+
+    else
+      settings = extendObj options, defaults
+
+      for el in @
+        instance = $.data el, 'oriDomi'
+        if instance
+          return instance
+        else
+          $.data el, 'oriDomi', new OriDomi el, settings
+
+      @
+


Add atom config

Add atom config

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/atamanroman/dotfiles.git/'


Atom files

Atom files

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/jdcrensh/dotfiles.git/'


register *.transit as ruby source files

register *.transit as ruby source files

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/AlexKVal/dotfiles.git/'


updated

updated

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/talvdav/dotfiles.git/'


adds failing test

adds failing test

error: pathspec 'desktop/apps/artwork/components/auction_artworks/test/index.coffee' did not match any file(s) known to git

--- desktop/apps/artwork/components/auction_artworks/test/index.coffee
+++ desktop/apps/artwork/components/auction_artworks/test/index.coffee
@@ -0,0 +1,43 @@
+_ = require 'underscore'
+cheerio = require 'cheerio'
+path = require 'path'
+fs = require 'fs'
+jade = require 'jade'
+moment = require 'moment'
+helpers = require '../helpers'
+sinon = require 'sinon'
+
+render = ->
+  filename = path.resolve __dirname, "../index.jade"
+  jade.compile(
+    fs.readFileSync(filename),
+    { filename: filename }
+  )
+
+describe 'Auction artworks module', ->
+  describe 'when a live sale is in preview', ->
+    it 'should show a sale is opening label', ->
+      artwork = {
+        auction: {
+          is_closed: false,
+          is_live_open: false,
+          is_preview: true,
+          name: 'Phillips Prints'
+          live_start_at: "2017-08-10T16:00:00+00:00",
+          start_at: "2017-08-08T16:00:00+00:00",
+          artworks: [{ title: 'My title' }]
+        }
+      }
+      html = render()(
+        artwork: artwork
+        helpers: {
+          auction_artworks: {
+            upcomingLabel: helpers.upcomingLabel,
+            masonry: () => { columns: [] }
+          }
+        }
+        asset: (->)
+      )
+
+      $ = cheerio.load(html)
+      $('.artwork-auction-artworks__auction-name').html().should.containEql('Phillips Prints Auction opens ')


Add labeled event to do lotto

Add labeled event to do lotto

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/nunulk/robo-blanca.git/'


Run coffeelint before compile

Run coffeelint before compile

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/Hiroto-K/HkApps.git/'


file.origialImageInfo file.dimensions is deprecated and return file.origialImageInfo

--- app/assets/javascripts/uploadcare/files/base.js.coffee
+++ app/assets/javascripts/uploadcare/files/base.js.coffee
@@ -42,7 +42,9 @@
       @fileName = data.original_filename
       @fileSize = data.size
       @isImage = data.is_image
-      @isStored = data.is_stored or data.is_public
+      @imageInfo = data.image_info
+      @isStored = data.is_stored
+      @isReady = data.is_ready
       @__buildPreviewUrl()

       if @settings.imagesOnly && !@isImage
@@ -70,33 +72,21 @@
       incompleteFileInfo: @__fileInfo()

     __fileInfo: =>
-      uuid: @fileId
-      name: @fileName
-      size: @fileSize
-      isStored: @isStored
-      isImage: @isImage
-      cdnUrl: "#{@settings.cdnBase}/#{@fileId}/#{@cdnUrlModifiers or ''}"
-      cdnUrlModifiers: @cdnUrlModifiers
-      previewUrl: @previewUrl
-      preview: @apiPromise.preview
-      dimensions: if @isImage then @dimensions else null
-
-    dimensions: =>
-      url = @previewUrl
-
-      $.Deferred(->
-        img = new Image()
-
-        img.onload = =>
-          @resolve
-            width: img.width
-            height: img.height
-
-        img.onerror = =>
-          @reject()
-
-        img.src = url
-      ).promise()
+      r =
+        uuid: @fileId
+        name: @fileName
+        size: @fileSize
+        isStored: @isStored
+        isImage: @isImage
+        originalImageInfo: @imageInfo
+        cdnUrl: "#{@settings.cdnBase}/#{@fileId}/#{@cdnUrlModifiers or ''}"
+        cdnUrlModifiers: @cdnUrlModifiers
+        previewUrl: @previewUrl
+        preview: @apiPromise.preview
+      if @isImage
+        r.dimensions = =>
+          $.Deferred().resolve(@imageInfo).promise()
+      r

     __cancel: =>
       @__uploadDf.reject('user', this)


Added SetPortalColor component.

Added SetPortalColor component.

Parses an array of arrays containing rgb values and set them on the dummy html.

error: pathspec 'components/SetPortalColor.coffee' did not match any file(s) known to git

--- components/SetPortalColor.coffee
+++ components/SetPortalColor.coffee
@@ -0,0 +1,24 @@
+noflo = require "noflo"
+
+class SetPortalColor extends noflo.Component
+  icon: 'lightbulb-o'
+
+  constructor: () ->
+
+    @inPorts = new noflo.InPorts
+      in:
+        datatype: 'array'
+        description: 'array of arrays pf rgb values [[r, g, b], [r, g, b], [r, g, b], ... ]'
+
+    @inPorts.in.on 'data', (data) ->
+      # Read DOM
+      portals = document.getElementsByClassName 'led'
+
+      for color, idx in data
+        portal = portals[idx]
+
+        continue unless (portal and color)
+
+        portal.style.backgroundColor = "rgb(#{color.join(',')})"
+
+exports.getComponent = -> new SetPortalColor


Auto-copy username to user.profile.name. Fixes #15

error: pathspec 'server/autoProfileName.coffee' did not match any file(s) known to git

--- server/autoProfileName.coffee
+++ server/autoProfileName.coffee
@@ -0,0 +1,6 @@
+Accounts.onCreateUser (options, user) ->
+    # Keep profile copy
+    if options.profile then user.profile = options.profile
+    # Add a default profile.name if necessary
+    if not user.profile.name then user.profile.name = user.username
+    return user


Add bootstrap slider react component

Add bootstrap slider react component

error: pathspec 'assets/javascripts/react_nodes/bootstrap_slider.coffee' did not match any file(s) known to git

--- assets/javascripts/react_nodes/bootstrap_slider.coffee
+++ assets/javascripts/react_nodes/bootstrap_slider.coffee
@@ -0,0 +1,36 @@
+Slider = React.createClass(
+  getDefaultProps: ->
+    {
+      min: 0
+      max: 100
+      step: 1
+      value: 50
+      toolTip: false
+      onSlide: ->
+    }
+
+  handleSlide: (event) ->
+    @props.onSlide event.value
+
+  componentWillUpdate: (nextProps, nextState) ->
+    nextState.slider.val nextProps.value
+
+  componentWillUnmount: ->
+    @state.slider.off 'slide', @handleSlide
+
+  componentDidMount: ->
+    toolTip = if @props.toolTip then 'show' else 'hide'
+    slider = $(@getDOMNode()).slider
+      id: @props.id
+      min: @props.min
+      max: @props.max
+      step: @props.step
+      value: @props.value
+      tooltip: toolTip
+    slider.on 'slide', @handleSlide
+    @setState slider: slider
+  render: ->
+    <div style={@props.style}/>
+)
+
+Visualizer.ReactNodes.Slider = Slider


dashboard: changes about sytle is added

dashboard: changes about sytle is added

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/andrewjcasal/koding.git/'


Fetch apps from FS for the first time if never fetched from FS before.


fix custom url installation

fix custom url installation

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/clochix/cozy-home.git/'


Fix GET /db/level/:handle/session for sessionless requests

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/VilkkuV/codecombat.git/'


btw that was a bad idea

btw that was a bad idea


Add test cases for code module

Add test cases for code module

error: pathspec 'test/code.coffee' did not match any file(s) known to git

--- test/code.coffee
+++ test/code.coffee
@@ -0,0 +1,167 @@
+# Copyright (C) 2013 Yusuke Suzuki <utatane.tea@gmail.com>
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+#   * Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+#   * Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in the
+#     documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+'use strict'
+
+expect = require('chai').expect
+esutils = require '../'
+
+describe 'code', ->
+    describe 'isDecimalDigit', ->
+        it 'returns true if provided code is decimal digit', ->
+            for ch in [0..9]
+                expect(esutils.code.isDecimalDigit((ch + '').charCodeAt(0))).to.be.true
+
+        it 'returns false if provided code is not decimal digit', ->
+            for code in ['a'.charCodeAt(0)..'z'.charCodeAt(0)]
+                expect(esutils.code.isDecimalDigit(code)).to.be.false
+
+            for code in ['A'.charCodeAt(0)..'Z'.charCodeAt(0)]
+                expect(esutils.code.isDecimalDigit(code)).to.be.false
+
+    describe 'isHexDigit', ->
+        it 'returns true if provided code is hexadecimal digit', ->
+            for ch in [0..9]
+                expect(esutils.code.isHexDigit((ch + '').charCodeAt(0))).to.be.true
+
+            for code in ['a'.charCodeAt(0)..'f'.charCodeAt(0)]
+                expect(esutils.code.isHexDigit(code)).to.be.true
+
+            for code in ['A'.charCodeAt(0)..'F'.charCodeAt(0)]
+                expect(esutils.code.isHexDigit(code)).to.be.true
+
+        it 'returns false if provided code is not hexadecimal digit', ->
+            for code in ['g'.charCodeAt(0)..'z'.charCodeAt(0)]
+                expect(esutils.code.isHexDigit(code)).to.be.false
+
+            for code in ['G'.charCodeAt(0)..'Z'.charCodeAt(0)]
+                expect(esutils.code.isHexDigit(code)).to.be.false
+
+    describe 'isOctalDigit', ->
+        it 'returns true if provided code is octal digit', ->
+            for ch in [0..7]
+                expect(esutils.code.isOctalDigit((ch + '').charCodeAt(0))).to.be.true
+
+        it 'returns false if provided code is not octal digit', ->
+            for ch in [8..9]
+                expect(esutils.code.isOctalDigit((ch + '').charCodeAt(0))).to.be.false
+
+            for code in ['a'.charCodeAt(0)..'z'.charCodeAt(0)]
+                expect(esutils.code.isOctalDigit(code)).to.be.false
+
+            for code in ['A'.charCodeAt(0)..'Z'.charCodeAt(0)]
+                expect(esutils.code.isOctalDigit(code)).to.be.false
+
+    describe 'isWhiteSpace', ->
+        it 'returns true if provided code is white space', ->
+            codes = [
+                0x0009  # TAB
+                0x000B  # VT
+                0x000C  # FF
+                0x0020  # SP
+                0x00A0  # NBSP
+                0xFEFF  # BOM
+
+                # Zs
+                0x1680
+                0x180E
+                0x2000
+                0x2001
+                0x2002
+                0x2003
+                0x2004
+                0x2005
+                0x2006
+                0x2007
+                0x2008
+                0x2009
+                0x200A
+                0x202F
+                0x205F
+                0x3000
+            ]
+            for code in codes
+                expect(esutils.code.isWhiteSpace(code)).to.be.true
+
+        it 'returns false if provided code is not white space', ->
+            for ch in [0..9]
+                expect(esutils.code.isWhiteSpace((ch + '').charCodeAt(0))).to.be.false
+
+            for code in ['a'.charCodeAt(0)..'z'.charCodeAt(0)]
+                expect(esutils.code.isWhiteSpace(code)).to.be.false
+
+            for code in ['A'.charCodeAt(0)..'Z'.charCodeAt(0)]
+                expect(esutils.code.isWhiteSpace(code)).to.be.false
+
+    describe 'isLineTerminator', ->
+        it 'returns true if provided code is line terminator', ->
+            codes = [
+                0x000A
+                0x000D
+                0x2028
+                0x2029
+            ]
+            for code in codes
+                expect(esutils.code.isLineTerminator(code)).to.be.true
+
+        it 'returns false if provided code is not line terminator', ->
+            for ch in [0..9]
+                expect(esutils.code.isLineTerminator((ch + '').charCodeAt(0))).to.be.false
+
+            for code in ['a'.charCodeAt(0)..'z'.charCodeAt(0)]
+                expect(esutils.code.isLineTerminator(code)).to.be.false
+
+            for code in ['A'.charCodeAt(0)..'Z'.charCodeAt(0)]
+                expect(esutils.code.isLineTerminator(code)).to.be.false
+
+    describe 'isIdentifierStart', ->
+        it 'returns true if provided code can be a start of Identifier', ->
+            characters = [
+                'a'
+                '$'
+                '_'
+                'ゆ'
+            ]
+            for code in characters.map((ch) -> ch.charCodeAt(0))
+                expect(esutils.code.isIdentifierStart(code)).to.be.true
+
+        it 'returns false if provided code cannot be a start of Identifier', ->
+            for ch in [0..9]
+                expect(esutils.code.isIdentifierStart((ch + '').charCodeAt(0))).to.be.false
+
+    describe 'isIdentifierPart', ->
+        it 'returns true if provided code can be a part of Identifier', ->
+            characters = [
+                'a'
+                '_'
+                '$'
+                'ゆ'
+            ]
+            for code in characters.map((ch) -> ch.charCodeAt(0))
+                expect(esutils.code.isIdentifierPart(code)).to.be.true
+
+            for ch in [0..9]
+                expect(esutils.code.isIdentifierPart((ch + '').charCodeAt(0))).to.be.true
+
+        it 'returns false if provided code cannot be a part of Identifier', ->
+            expect(esutils.code.isIdentifierPart('+'.charCodeAt(0))).to.be.false
+            expect(esutils.code.isIdentifierPart('-'.charCodeAt(0))).to.be.false


Re-rendered report when collection changes. Prevented issues with not being able to render any reports if they are missing.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/urbanetic/bismuth-reports.git/'


Don’t need the pane in workspace.open

Don’t need the pane in workspace.open

--- spec/workspace-spec.coffee
+++ spec/workspace-spec.coffee
@@ -278,7 +278,7 @@

         it "creates a notification", ->
           waitsForPromise ->
-            workspace.open('file1', workspace.getActivePane())
+            workspace.open('file1')

           runs ->
             expect(notificationSpy).toHaveBeenCalled()
@@ -289,7 +289,7 @@
       describe "when a file does not exist", ->
         it "creates a notification", ->
           waitsForPromise ->
-            workspace.open('not-a-file.md', workspace.getActivePane())
+            workspace.open('not-a-file.md')

           runs ->
             expect(notificationSpy).toHaveBeenCalled()
@@ -308,7 +308,7 @@

         it "creates a notification", ->
           waitsForPromise ->
-            workspace.open('file1', workspace.getActivePane())
+            workspace.open('file1')

           runs ->
             expect(notificationSpy).toHaveBeenCalled()


Unfiled program that submits key to dlv.isc.org.

error: pathspec 'request_.coffee' did not match any file(s) known to git

--- request_.coffee
+++ request_.coffee
@@ -0,0 +1,62 @@
+request = require("request")
+qs = require("querystring")
+
+[ domain ] = process.argv.slice 2
+
+input = (callback) ->
+  data = []
+  process.stdin.resume()
+  process.stdin.setEncoding('utf8')
+  process.stdin.on "data", (chunk) -> data.push chunk
+  process.stdin.on "end", -> callback(null, data.join(""))
+  process.stdin.on "error", (error) -> callback(error)
+
+checkError = (response, message) ->
+  switch Math.floor(response.statusCode / 100)
+    when 4, 5
+      throw new Error message
+
+dlv = (_) ->
+  [ password, key ] = input(_).split /\n/
+  response = request "https://dlv.isc.org/session/new", _
+  match = /window._auth_token = "([^"]+)"/.exec response.body
+  if not match
+    throw new Error "Cannot find authenticity token."
+  authenticity_token = match[1]
+  options =
+    url: "https://dlv.isc.org/session"
+    method: "POST"
+    followRedirects: true
+    maxRedirects: 11
+    body: qs.stringify
+      authenticity_token: authenticity_token
+      "session[login]": "alan"
+      "session[password]": password
+
+  response = request options, _
+  checkError response, "Unable to login."
+  response = request "https://dlv.isc.org/", _
+  match = /Manage Zones<\/a>/.exec response.body
+  if not match
+    throw new Error "Cannot determine user."
+  user = match[1]
+  response = request "https://dlv.isc.org/users/#{user}/zones", _
+  for line in response.body.split /\n/
+    if match = /<a href="\/zones\/(\d+)".*wish to delete ([^?]+)\?/.exec line
+      if match[2] is domain
+        zone = match[1]
+  options =
+    url: "https://dlv.isc.org/zones/#{zone}/dnskeys"
+    method: "POST"
+    body: qs.stringify
+      authenticity_token: authenticity_token
+      "dnskey[record]": key
+  response = request options, _
+  checkError response, "Unable to post key."
+  response = request "https://dlv.isc.org/zones/#{zone}", _
+  match = /0 IN TXT "(.*?)"/.exec response.body
+  if not match
+    throw Error "Cannot find TXT record."
+  process.stdout.write "#{match[1]}\n"
+
+dlv (error) -> throw error if error


Add easings.coffee

Add easings.coffee

error: pathspec 'src/plugins/easings.coffee' did not match any file(s) known to git

--- src/plugins/easings.coffee
+++ src/plugins/easings.coffee
@@ -0,0 +1,117 @@
+module.exports = {
+
+  'linear': (t) ->
+    return t
+
+  'inQuad': (t) ->
+    return t * t
+
+  'outQuad': (t) ->
+    return t * (2 - t)
+
+  'inOutQuad': (t) ->
+    return if t < .5 then 2 * t * t else -1 + (4 - 2 * t) * t
+
+  'inCubic': (t) ->
+    return t * t * t
+
+  'outCubic': (t) ->
+    return (--t) * t * t + 1
+
+  'inOutCubic': (t) ->
+    return if t < .5 then 4 * t * t * t else (t - 1) * (2 * t - 2) * (2 * t - 2) + 1
+
+  'inQuart': (t) ->
+    return t * t * t * t
+
+  'outQuart': (t) ->
+    return 1 - (--t) * t * t * t
+
+  'inOutQuart': (t) ->
+    return if t < .5 then 8 * t * t * t * t else 1 - 8 * (--t) * t * t * t
+
+  'inQuint': (t) ->
+    return t * t * t * t * t
+
+  'outQuint': (t) ->
+    return 1 + (--t) * t * t * t * t
+
+  'inOutQuint': (t) ->
+    return if t < .5 then 16 * t * t * t * t * t else 1 + 16 * (--t) * t * t * t * t
+
+  'inSine': (t) ->
+    return -1 * Math.cos(t / 1 * (Math.PI * 0.5)) + 1;
+
+  'outSine': (t) ->
+    return Math.sin(t / 1 * (Math.PI * 0.5))
+
+  'inOutSine': (t) ->
+    return -1 / 2 * (Math.cos(Math.PI * t) - 1)
+
+  'inExpo': (t) ->
+    return if t is 0 then 0 else Math.pow(2, 10 * (t - 1))
+
+  'outExpo': (t) ->
+    return if t is 1 then 1 else (-Math.pow(2, -10 * t) + 1)
+
+  'inOutExpo': (t) ->
+    return t if (t is 0 or t is 1)
+    return 0.5 * Math.pow(2, 10 * (t - 1)) if ((t /= 0.5) < 1)
+    return 0.5 * (-Math.pow(2, -10 * --t) + 2)
+
+  'inCirc': (t) ->
+    return -1 * (Math.sqrt(1 - t * t) - 1)
+
+  'outCirc':(t) ->
+    return Math.sqrt(1 - (t = t - 1) * t)
+
+  'inOutCirc':(t) ->
+    if ((t /= 1 / 2) < 1)
+      return -1 / 2 * (Math.sqrt(1 - t * t) - 1)
+    return 1 / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1)
+
+  'inElastic': (t) ->
+    s = 1.70158
+    p = 0
+    a = 1
+    if (t is 0 or t is 1)
+      return t
+    if (!p)
+      p = 0.3
+    if (a < 1)
+      a = 1
+      s = p / 4
+    else
+      s = p / (2 * Math.PI) * Math.asin(1 / a)
+    return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p))
+
+  'outElastic': (t) ->
+    s = 1.70158
+    p = 0
+    a = 1
+    return 0 if (t is 0)
+    return 1 if (t is 1)
+    p = 0.3  if (!p)
+    if (a < 1)
+      a = 1
+      s = p / 4
+    else
+      s = p / (2 * Math.PI) * Math.asin(1 / a)
+    return a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p) + 1
+
+  'inOutElastic': (t) ->
+    s = 1.70158
+    p = 0
+    a = 1
+    return 0 if (t is 0)
+    return 1 if ((t /= 1 / 2) is 2)
+    p = (0.3 * 1.5) if (!p)
+    if a < 1
+      a = 1
+      s = p / 4
+    else
+      s = p / (2 * Math.PI) * Math.asin(1 / a)
+    if (t < 1)
+      return -.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p));
+    return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p) * 0.5 + 1;
+}


Fix for js namespace

Fix for js namespace

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/corewebdesign/snappy.git/'


logging for deletion

logging for deletion

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/bubblegroup/bubblebot.git/'


Component runner - handle async tasks

Component runner - handle async tasks

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/keboola/kbc-ui-wrapper.git/'


Make header large by default

Make header large by default

References #7

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/PatrickLerner/escrit.git/'


passthrough for totaling methods on Graph directive

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/UM-USElab/gradecraft-development.git/'


Added next button to remember screen on learning task

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/UCSFMemoryAndAging/tabcat.git/'


Remove console log.

Remove console log.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/lonelyplanet/rizzo.git/'


Add publisher script for Nu.nl

Add publisher script for Nu.nl

This can be compiled locally using  coffee -c <filename>. No need to compile this in Grunt, since the script will only be installed locally into Chrome.

error: pathspec 'app/js/publisher_poc/publisher_plugin.user.coffee' did not match any file(s) known to git

--- app/js/publisher_poc/publisher_plugin.user.coffee
+++ app/js/publisher_poc/publisher_plugin.user.coffee
@@ -0,0 +1,70 @@
+###
+// ==UserScript==
+// @name  Factlink Publisher Pluging for Nu.nl
+// @description Enable Factlink on Nu.nl
+// @include http*://*.nu.nl/*
+// @version 0.0.1
+// @grant unsafeWindow
+// ==/UserScript==
+###
+
+# Compile this file using: coffee -c <filename>
+# Drag the compiled file (<name>.user.js) to chrome://extensions to use it.
+
+localConfig =
+  api: "http://localhost:3000"
+  lib: "http://localhost:8000/lib/dist"
+  srcPath: "/factlink.core.js"
+  url: window.location.href
+  minified: ''
+
+# testserverConfig =
+#   api: "https://factlink-testserver.inverselink.com:443"
+#   lib: "https://factlink-static-testserver.inverselink.com:443/lib/dist"
+#   srcPath: "/factlink.core.min.js"
+#   url: window.location.href
+#   minified: 'min.'
+
+# stagingConfig =
+#   api: "https://factlink-testserver.inverselink.com:443"
+#   lib: "https://factlink-static-testserver.inverselink.com:443/lib/dist"
+#   srcPath: "/factlink.core.min.js"
+#   url: window.location.href
+#   minified: 'min.'
+
+# remoteConfig =
+#   api: "https://factlink.com:443"
+#   lib: "https://static.factlink.com:443/lib/dist"
+#   srcPath: "/factlink.core.min.js"
+#   url: window.location.href
+#   minified: 'min.'
+
+# Define the config to use here:
+factlinkConfig = localConfig
+
+# Add FactlinkConfig
+ascript = document.createElement('script')
+ascript.textContent = """
+(function() {
+  window.FactlinkConfig = #{JSON.stringify(factlinkConfig)};
+})();
+"""
+document.body.appendChild(ascript)
+document.body.removeChild(ascript)
+
+# Inject custom publisher stylesheet
+css_url = "#{factlinkConfig.lib}/css/publisher_poc/nu.nl.css"
+head = document.getElementsByTagName('head').item(0)
+style = document.createElement("link")
+style.setAttribute('href', css_url)
+style.setAttribute('rel', 'stylesheet')
+style.type = "text/css"
+head.appendChild(style)
+
+# Inject custom publisher functionality
+url = "#{factlinkConfig.lib}/nu.js"
+body = document.getElementsByTagName('body').item(0)
+script = document.createElement("script")
+script.setAttribute('src', url)
+script.type = "text/javascript"
+body.appendChild(script)


Kill remaining serialization code

Kill remaining serialization code

--- src/packages/editor-stats/src/editor-stats-view.coffee
+++ src/packages/editor-stats/src/editor-stats-view.coffee
@@ -24,18 +24,15 @@
       "#{d.getHours()}:#{mins}"

   @activate: (rootView, state) ->
-    @instance = new EditorStatsView(rootView, state?.eventLog)
+    @instance = new EditorStatsView(rootView)

   @content: (rootView) ->
     @div class: 'editor-stats-wrapper', tabindex: -1, =>
       @div class: 'editor-stats', outlet: 'editorStats'

-  @serialize: ->
-    @instance.serialize()
-
   eventLog: []

-  initialize: (@rootView, @eventLog = {}) ->
+  initialize: (@rootView) ->
     super

     @command 'core:cancel', @detach


hot topics

hot topics

error: pathspec 'scripts/hot-topics.coffee' did not match any file(s) known to git

--- scripts/hot-topics.coffee
+++ scripts/hot-topics.coffee
@@ -0,0 +1,32 @@
+# Let people know of emergent / constant questions
+#
+# hot topic anything = whatever you want to rememeber
+# forget hot topic anything
+# hot topics
+
+module.exports = (robot) ->
+  robot.brain.data.hot_topics or= {}
+
+  robot.respond /hot topic (.*) = (.*)/i, (msg) ->
+    robot.brain.data.hot_topics[msg.match[1].toLowerCase()] = msg.match[2]
+    msg.send "OK I'll remember that and let people know"
+
+  robot.respond /forget hot topic (.*)/i, (msg) ->
+    if robot.brain.data.hot_topics[msg.match[1].toLowerCase()]?
+      delete robot.brain.data.hot_topics[msg.match[1].toLowerCase()]
+      msg.send "OK forgot it."
+    else
+      msg.send "Didn't know anything about that anyway."
+
+  robot.respond /hot topics/i, (msg) ->
+    robot.brain.data.hot_topics or= {}
+      memories = for phrase, memory of robot.brain.data.hot_topics
+        memory
+      msg.send memories.join("\n")
+
+  robot.hear /(.+)/i, (msg) ->
+    text = msg.message.text
+    unless text.match 'hot topic'
+      memories = for phrase, memory of robot.brain.data.hot_topics when text.match(phrase)
+        memory
+      msg.send memories.join("\n")


removed graph spec -- broke on d3 .style


drag and drop uploader view to use in sidebar, but it can be used in apps.


Remove accidental merge conflict message

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/Arm1stice/prosu.git/'


Activity: fixed replyList endpoint

Activity: fixed replyList endpoint

--- workers/social/lib/social/models/socialapi/requests.coffee
+++ workers/social/lib/social/models/socialapi/requests.coffee
@@ -129,7 +129,7 @@
   unless data.messageId
     return callback { message: "Request is not valid for adding a reply"}

-  url = "#{SOCIAL_API_URL}/message/#{data.messageId}/reply"
+  url = "/message/#{data.messageId}/reply"
   get url, data, callback

 fetchPopularTopics = (data, callback)->


Social: glanceNotifications function is added to socialapi requests

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/andrewjcasal/koding.git/'


[TERMINAL] Fixed scrolling animations queuing and taking control of the scroll bar

--- src/coffee/terminal.coffee
+++ src/coffee/terminal.coffee
@@ -149,8 +149,10 @@
       @$output.append(line).append '<br>'

   scrollToBottom: =>
-    console.log "scroll #{@$screen[0].scrollHeight}"
-    @$output.animate scrollTop: @$screen[0].scrollHeight, 200, "swing"
+    # cancel previous animations and start smooth scroll from current position
+    console.log "scroll #{@$output[0].scrollHeight}"
+    @$output.stop()
+    @$output.animate scrollTop: @$output[0].scrollHeight, 200, "swing"

   # Connect to a server
   #


switched to transclude function supplied to linker vs. compile

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/zagushka/ui-scroll.git/'


Add Coffeescript version of fibo.js.

Add Coffeescript version of fibo.js.

error: pathspec 'examples/fibo.coffee' did not match any file(s) known to git

--- examples/fibo.coffee
+++ examples/fibo.coffee
@@ -0,0 +1,8 @@
+fibs = [0, 1]
+f = ->
+    console.log fibs[fibs.length - 1]
+    fibs.push fibs[fibs.length - 1] + fibs[fibs.length - 2]
+    if fibs.length > 10
+        window.clearInterval ticker
+        phantom.exit()
+ticker = window.setInterval(f, 300)


Use existing url for an append request

Use existing url for an append request


real create group request

real create group request

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/prognostikos/uploadcare-widget.git/'


quotes

quotes

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/stevelacy/portal.git/'


Exclude the execSync sub-dependency which avast detects as virus; close #77

--- gulpfile.coffee
+++ gulpfile.coffee
@@ -16,7 +16,10 @@
     if process.argv.indexOf('--toolbar') > 0
       shelljs.sed '-i', '"toolbar": false', '"toolbar": true', './src/package.json'

-    gulp.src './src/**'
+    gulp.src [
+      './src/**'
+      '!./src/node_modules/copy-paste/node_modules/execSync'
+    ]
       .pipe $.nodeWebkitBuilder
         platforms: [platform]
         version: '0.12.2'


Fix the compile tasks

Fix the compile tasks

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/Hiroto-K/SaveTweet.git/'


Be more verbose in error handling and fix bugs


Added snippet for mount()

Added snippet for mount()

error: pathspec 'snippets/mount.cson' did not match any file(s) known to git

--- snippets/mount.cson
+++ snippets/mount.cson
@@ -0,0 +1,6 @@
+".source.js, .source.jsx, .source.ts":
+  "mount()":
+    "prefix": "mount"
+    "body": """
+      ${1:wrapper} = mount(<${2:App}/>);
+      """


Refactoring

Refactoring

--- client/Social/Activity/views/privatemessage/pane.coffee
+++ client/Social/Activity/views/privatemessage/pane.coffee
@@ -500,16 +500,6 @@
     KD.utils.defer @bound 'focus'

-  refresh: ->
-
-    return  if not @listController.getItemCount()
-
-    @resetPadding()
-    item.checkIfItsTooTall()  for item in @listController.getListItems()
-    @scrollView.wrapper.emit 'MutationHappened'
-    @scrollDown()
-
-
   focus: -> @input.focus()

@@ -557,5 +547,3 @@
           datetime : date.toUTCString()

     parse : (args...) -> args.map (item) -> parseInt item
-
-


Removed replace string function

Removed replace string function

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/evercam/evercam-dashboard.git/'


Press Enter key to navigate

Press Enter key to navigate

--- views/components/settings/parts/navigator-bar.cjsx
+++ views/components/settings/parts/navigator-bar.cjsx
@@ -42,6 +42,9 @@
     webview.src = @state.navigateUrl
   handleRefresh: ->
     webview.reload()
+  handlePressEnter: (e) ->
+    if e.keyCode is 13
+	     @handleNavigate()
   handleSetHomepage: ->
     config.set 'poi.homepage', @state.navigateUrl
   componentDidMount: ->
@@ -55,7 +58,7 @@
   render: ->

-        <Input type='text' bsSize='small' placeholder='输入网页地址' value={@state.navigateUrl} onChange={@handleSetUrl} />
+        <Input type='text' bsSize='small' placeholder='输入网页地址' value={@state.navigateUrl} onChange={@handleSetUrl} onKeyDown={@handlePressEnter}/>

         <ButtonGroup>


Increase base VM size

Increase base VM size


vm: fix `JVM::removeFromSubscription`

vm: fix `JVM::removeFromSubscription`

--- workers/social/lib/social/models/vm.coffee
+++ workers/social/lib/social/models/vm.coffee
@@ -629,8 +629,8 @@
               console.warn "VM cannot be credited to user #{account.profile.nickname}: #{err}"  if err
               queue.fin()
         ,
-          ->
-            return  unless @alwaysOn
+          =>
+            return queue.fin()  unless @alwaysOn
             subscription.creditPack tag: "alwayson", (err) ->
               errs.push new KodingError "Always On usage couldn't be credited"  if err
               console.warn "Always On pack couldn't be credited to user #{account.profile.nickname}: #{err}"  if err


Slave: Wrap handoff send in a domain to catch errors

Goal is to always get through the handoff data, so if one listener errors we
would still rather just power on through.

--- src/streammachine/slave/index.coffee
+++ src/streammachine/slave/index.coffee
@@ -272,38 +272,46 @@
                 if id
                     l = stream._lmeta[id]

-                    process.nextTick =>
-                        l.obj.prepForHandoff =>
-                            lobj =
-                                timer:  null,
-                                ack:    false,
-                                socket: l.obj.socket,
-                                opts:
-                                    key:        [stream.key,id].join("::"),
-                                    stream:     stream.key
-                                    id:         id
-                                    startTime:  l.startTime
-                                    minuteTime: l.minuteTime
-                                    client:     l.obj.client
-
-                            # there's a chance that the connection could end
-                            # after we recorded the id but before we get here.
-                            # don't send in that case...
-                            if lobj.socket && !lobj.socket.destroyed
-                                translator.send "stream_listener", lobj.opts, lobj.socket
-
-                                # mark them as in-flight
-                                @_inflight[ lobj.opts.key ] = lobj
+                    process.nextTick =>
+                        # wrap the listener send in an error domain to try as
+                        # hard as we can to get it all there
+                        d = require("domain").create()
+                        d.on "error", (err) =>
+                            @log.error "Send handoff listener for #{id} hit error: #{err}"
+                            slFunc()

-                                # set a timer to check in on them
-                                lobj.timer = setTimeout =>
-                                    if !lobj.ack
-                                        console.error "Failed to get ack for #{lobj.opts.key}"
-                                        translator.send "stream_listener", lobj.opts, lobj.socket
-                                , 1000
-
-                            # go on to the next listener
-                            slFunc()
+                        d.run =>
+                            l.obj.prepForHandoff =>
+                                lobj =
+                                    timer:  null,
+                                    ack:    false,
+                                    socket: l.obj.socket,
+                                    opts:
+                                        key:        [stream.key,id].join("::"),
+                                        stream:     stream.key
+                                        id:         id
+                                        startTime:  l.startTime
+                                        minuteTime: l.minuteTime
+                                        client:     l.obj.client
+
+                                # there's a chance that the connection could end
+                                # after we recorded the id but before we get here.
+                                # don't send in that case...
+                                if lobj.socket && !lobj.socket.destroyed
+                                    translator.send "stream_listener", lobj.opts, lobj.socket
+
+                                    # mark them as in-flight
+                                    @_inflight[ lobj.opts.key ] = lobj
+
+                                    # set a timer to check in on them
+                                    lobj.timer = setTimeout =>
+                                        if !lobj.ack
+                                            console.error "Failed to get ack for #{lobj.opts.key}"
+                                            translator.send "stream_listener", lobj.opts, lobj.socket unless lobj.socket.destroyed
+                                    , 1000
+
+                                # go on to the next listener
+                                slFunc()

                 else
                     fFunc()


Suppress events in both frames

Suppress events in both frames

Signed-off-by: Peter Kröner <4b8373d016f277527198385ba72fda0feb5da015@peterkroener.de>

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/SirPepe/Pik7.git/'


pretty print fix

pretty print fix

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/bubblegroup/bubblebot.git/'


Added atom toolbar.

Added atom toolbar.

error: pathspec 'atom/toolbar.cson' did not match any file(s) known to git

--- atom/toolbar.cson
+++ atom/toolbar.cson
@@ -0,0 +1,45 @@
+# This file is used by Flex Tool Bar to create buttons on your Tool Bar.
+# For more information how to use this package and create your own buttons,
+#   read the documentation on https://atom.io/packages/flex-tool-bar
+
+[
+  # {
+  #   type: "button"
+  #   tooltip: "New File"
+  #   callback: "application:new-file"
+  #   icon: "plus"
+  # }
+  {
+    type: "button"
+    tooltip: "Project"
+    callback: "tree-view:toggle"
+    icon: "file"
+  }
+  {
+    type: "button"
+    icon: "search"
+    callback: "project-find:show"
+    tooltip: "Find in Project"
+  }
+  {
+    type: "button"
+    icon: "git-branch"
+    callback: "github:toggle-git-tab"
+    tooltip: "Git Control"
+  }
+  {
+    type: "button"
+    icon: "list-unordered"
+    callback: "document-outline:toggle"
+    tooltip: "Outline"
+  }
+  {
+    type: "spacer"
+  }
+  {
+    type: "button"
+    icon: "gear"
+    callback: "flex-tool-bar:edit-config-file"
+    tooltip: "Edit Tool Bar"
+  }
+]


Winston-like logger API

Winston-like logger API

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/AppGyver/supersonic.git/'


Increase timeout for one unit test

Increase timeout for one unit test

--- test/unit/local/watcher.coffee
+++ test/unit/local/watcher.coffee
@@ -315,9 +315,9 @@
                             args = @prep.deleteFolder.args[0][1]
                             args.should.have.properties path: 'aga'
                             done()
-                        , 1500
+                        , 1800
                     fs.renameSync src, dst
-                , 1200
+                , 1500

     describe 'onReady', ->
         before 'reset pouchdb', (done) ->


Add support to social share in mobile apps

--- packages/rocketchat-ui/views/app/room.coffee
+++ packages/rocketchat-ui/views/app/room.coffee
@@ -1,3 +1,6 @@
+socialSharing = (options = {}) ->
+	window.plugins.socialsharing.share(options.message, options.subject, options.file, options.link)
+
 isSubscribed = (_id) ->
 	return ChatSubscription.find({ rid: _id }).count() > 0

@@ -197,6 +200,8 @@
 	selectable: ->
 		return Template.instance().selectable.get()

+isSocialSharingOpen = false
+
 Template.room.events
 	"click, touchend": (e, t) ->
 		Meteor.setTimeout ->
@@ -204,24 +209,68 @@
 		, 100

 	"touchstart .message": (e, t) ->
+		isSocialSharingOpen = false
 		if e.originalEvent.touches.length isnt 1
 			return

-		if e.target and e.target.nodeName is 'A'
-			return
-
 		if $(e.currentTarget).hasClass('system')
 			return

+		if e.target and e.target.nodeName is 'A'
+			e.preventDefault()
+			e.stopPropagation()
+
 		message = this._arguments[1]
 		doLongTouch = =>
+
+			if window.plugins?.socialsharing?
+				isSocialSharingOpen = true
+
+				if e.target and e.target.nodeName is 'A'
+					if message.attachments?
+						attachment = _.find message.attachments, (item) -> return item.title is e.target.innerText
+						if attachment?
+							socialSharing
+								file: e.target.href
+								subject: e.target.innerText
+								message: message.msg
+							return
+
+					socialSharing
+						link: e.target.href
+						subject: e.target.innerText
+						message: message.msg
+					return
+
+				if e.target and e.target.nodeName is 'IMG'
+					socialSharing
+						file: e.target.src
+						message: message.msg
+					return
+
 			mobileMessageMenu.show(message, t, e, this)

 		Meteor.clearTimeout t.touchtime
-		t.touchtime = Meteor.setTimeout doLongTouch, 500
+		t.touchtime = Meteor.setTimeout doLongTouch, 300
+
+	"click .message img": (e, t) ->
+		Meteor.clearTimeout t.touchtime
+		if isSocialSharingOpen is true
+			e.preventDefault()
+			e.stopPropagation()

 	"touchend .message": (e, t) ->
 		Meteor.clearTimeout t.touchtime
+		if isSocialSharingOpen is true
+			e.preventDefault()
+			e.stopPropagation()
+			return
+
+		if e.target and e.target.nodeName is 'A'
+			if cordova?.InAppBrowser?
+				cordova.InAppBrowser.open(e.target.href, '_system')
+			else
+				window.open(e.target.href)

 	"touchmove .message": (e, t) ->
 		Meteor.clearTimeout t.touchtime


Translation key is shown after button press

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/RobertsGroza/kakimasu.git/'


add karma config file

add karma config file

error: pathspec 'karma.conf.coffee' did not match any file(s) known to git

--- karma.conf.coffee
+++ karma.conf.coffee
@@ -0,0 +1,70 @@
+# Karma configuration
+# Generated on Mon Jun 09 2014 01:16:57 GMT-0700 (PDT)
+
+fullWebpackConfig = require './webpack.config.js'
+
+webpackConfig =
+  module: fullWebpackConfig.module
+  resolve: fullWebpackConfig.resolve
+  plugins: fullWebpackConfig.plugins
+  devtool: 'eval'
+  cache: true
+
+module.exports = (config) ->
+  config.set
+
+    # base path that will be used to resolve all patterns (eg. files, exclude)
+    basePath: ''
+
+    # frameworks to use
+    # available frameworks: https://npmjs.org/browse/keyword/karma-adapter
+    frameworks: ['jasmine']
+
+    # list of files / patterns to load in the browser
+    files: [
+      'public/coffeescript/**/*.spec.coffee'
+    ]
+
+    # list of files to exclude
+    exclude: [
+
+    ]
+
+    # preprocess matching files before serving them to the browser
+    # available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
+    preprocessors: {
+      '**/*.coffee': ['webpack']
+    }
+
+    webpack: webpackConfig
+
+    # test results reporter to use
+    # possible values: 'dots', 'progress'
+    # available reporters: https://npmjs.org/browse/keyword/karma-reporter
+    reporters: ['progress']
+
+    # web server port
+    port: 9876
+
+    # enable / disable colors in the output (reporters and logs)
+    colors: true
+
+    # level of logging
+    # possible values:
+    # - config.LOG_DISABLE
+    # - config.LOG_ERROR
+    # - config.LOG_WARN
+    # - config.LOG_INFO
+    # - config.LOG_DEBUG
+    logLevel: config.LOG_INFO
+
+    # enable / disable watching file and executing tests whenever any file changes
+    autoWatch: true
+
+    # start these browsers
+    # available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
+    browsers: ['PhantomJS']
+
+    # Continuous Integration mode
+    # if true, Karma captures browsers, runs the tests and exits
+    singleRun: false


Tests: Override Nightwatch::fail.

Tests: Override Nightwatch::fail.

error: pathspec 'client/test/lib/utils/fail.coffee' did not match any file(s) known to git

--- client/test/lib/utils/fail.coffee
+++ client/test/lib/utils/fail.coffee
@@ -0,0 +1,34 @@
+fs          = require 'fs'
+NW          = require '../../../../node_modules/nightwatch/lib/api/element-commands/_waitForElement.js'
+AWS         = require 'aws-sdk'
+coffee      = require 'coffee-script/register'
+config      = require '../../../../../config/main.dev.coffee'
+NW_ORG_FAIL = NW::fail
+
+
+NW::fail = (result, actual, expected, defaultMsg) ->
+  api      = @client.api
+  test     = api.currentTest
+  filename = "#{test.module}-#{test.name}-#{Date.now()}.png"
+
+  { accessKeyId, secretAccessKey } = config().awsKeys.worker_test_data_exporter
+
+  api.saveScreenshot filename, =>
+    AWS.config.update { accessKeyId, secretAccessKey }
+
+    s3 = new AWS.S3
+      params   :
+        Key    : filename
+        Bucket : 'koding-test-data'
+
+    options       =
+      Key         : filename
+      Body        : fs.createReadStream filename
+      ContentType : 'image/png'
+
+    s3.createBucket =>
+      s3.putObject options, (err, data) =>
+        s3path = "https://koding-test-data.s3.amazonaws.com/#{filename}"
+        console.log ' ✔ Test screenshot uploaded to', s3path
+
+        NW_ORG_FAIL.call this, result, actual, expected, defaultMsg


AuthModal handles empty fields, fix #3587

--- app/views/core/AuthModal.coffee
+++ app/views/core/AuthModal.coffee
@@ -59,7 +59,7 @@
     e.preventDefault()
     forms.clearFormAlerts(@$el)
     userObject = forms.formToObject @$el
-    res = tv4.validateMultiple userObject, User.schema
+    res = tv4.validateMultiple userObject, formSchema
     return forms.applyErrorsToForm(@$el, res.errors) unless res.valid
     @enableModalInProgress(@$el) # TODO: part of forms
     loginUser userObject, null, window.nextURL
@@ -133,3 +133,9 @@
   onHidden: ->
     super()
     @playSound 'game-menu-close'
+
+formSchema = {
+  type: 'object'
+  properties: _.pick(User.schema.properties, 'email', 'password')
+  required: ['email', 'password']
+}


bug fixes

bug fixes


More work.

More work.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/damianb/crimson.git/'


add cb

add cb

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/stevelacy/portal-rialu.git/'


Remove unused aborted ivar

Remove unused aborted ivar

--- lib/load-paths-task.coffee
+++ lib/load-paths-task.coffee
@@ -4,8 +4,6 @@

 module.exports =
 class LoadPathsTask
-  aborted: false
-
   constructor: (@callback) ->

   start: ->
@@ -34,7 +32,6 @@
     deferred

   abort: ->
-    @aborted = true
     if @process?
       @process.kill()
       @process = null


Work in Progress

Work in Progress

Queda mucho por traducir del japonés

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/JuanjoSalvador/atom-spanish-menu.git/'


Add jquery fading

Add jquery fading

Also using the level:session-will-save callback

--- app/views/play/level/tome/spell_view.coffee
+++ app/views/play/level/tome/spell_view.coffee
@@ -22,6 +22,7 @@
     'tome:manual-cast': 'onManualCast'
     'tome:reload-code': 'onCodeReload'
     'tome:spell-changed': 'onSpellChanged'
+    'level:session-will-save': 'onSessionWillSave'
     'modal-closed': 'focus'
     'focus-editor': 'focus'

@@ -318,7 +319,21 @@
     #  console.log "valid but not at end of line; recompile in", @autocastDelay + "ms"

   onSpellChanged: (e) ->
-    $('#spell-view #save-status').css('visibility', 'visible')
+    @spellHasChanged = true
+
+  onSessionWillSave: (e) ->
+    setTimeout(->
+      if not @spellHasChanged
+        $('#spell-view #save-status').delay(3000).fadeOut(2000)
+    , 3000)
+
+    if @spellHasChanged
+      # Keep showing the text by stopping the fade animation
+      $('#spell-view #save-status').show('fast')
+      $('#spell-view #save-status').css('visibility', 'visible')
+      $('#spell-view #save-status').stop(true, true)
+
+    @spellHasChanged = false

   onUserCodeProblem: (e) ->
     return @onInfiniteLoop e if e.problem.id is "runtime_InfiniteLoop"


Fix dead variable reference

Fix dead variable reference

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/aki77/atomatigit.git/'


add test for #470

add test for #470

--- spec/BaconSpec.coffee
+++ spec/BaconSpec.coffee
@@ -1892,6 +1892,22 @@
       values.push(v)
     bus.push("foo")
     expect(values).to.deep.equal(["foo"])
+  it "complex scenario (fix #470)", ->
+    values = []
+    bus1 = new Bacon.Bus()
+    bus2 = new Bacon.Bus()
+    p1 = bus1.toProperty("p1")
+    p2 = bus2.toProperty(true)
+    p2.filter(Bacon._.id).changes().onValue -> bus1.push "empty"
+    Bacon.combineAsArray(p1, p2).onValue (val) -> values.push val
+
+    bus2.push false
+    bus2.push true
+    expect(values).to.deep.equal([
+      ["p1", true],
+      ["p1", false],
+      ["p1", true],
+      ["empty", true]])

 describe "observables created while dispatching", ->
   verifyWhileDispatching = (name, f, expected) ->


Ensures we don't try to draw a graph with zero submissions.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/alpire/picoCTF-web.git/'


test saving exclusions

test saving exclusions

error: pathspec 'test/components/questions/exercises-display.spec.coffee' did not match any file(s) known to git

--- test/components/questions/exercises-display.spec.coffee
+++ test/components/questions/exercises-display.spec.coffee
@@ -0,0 +1,49 @@
+{Testing, expect, sinon, _, ReactTestUtils} = require '../helpers/component-testing'
+ld = require 'lodash'
+
+ExercisesDisplay = require '../../../src/components/questions/exercises-display'
+
+EXERCISES = require '../../../api/exercises'
+SECTION_IDS  = [1, 2]
+COURSE_ID = '1'
+
+{ExerciseActions} = require '../../../src/flux/exercise'
+
+
+describe 'QL exercises display', ->
+
+  beforeEach ->
+    @props =
+      courseId: COURSE_ID
+      helpTooltip: 'This is help'
+      sectionIds: SECTION_IDS
+    ExerciseActions.loadedForCourse(EXERCISES, COURSE_ID, SECTION_IDS)
+    sinon.stub(ExerciseActions, 'saveExerciseExclusion').returns(null)
+
+  afterEach ->
+    ExerciseActions.saveExerciseExclusion.restore()
+
+  it 'renders cards', ->
+    Testing.renderComponent( ExercisesDisplay, props: @props ).then ({dom}) ->
+      expect( dom.querySelectorAll('.openstax-exercise-preview').length ).to
+        .equal(EXERCISES.items.length)
+
+  it 'displays dialog when exercises are at minimum (5)', ->
+    expect(EXERCISES.items.length).to.equal(5)
+    Testing.renderComponent( ExercisesDisplay, props: @props ).then ({dom}) ->
+      Testing.actions.click(dom.querySelector('.openstax-exercise-preview .action.exclude'))
+      expect( ExerciseActions.saveExerciseExclusion ).not.to.have.been.called
+      expect( document.querySelector('.question-library-min-exercise-exclusions') ).to.exist
+      Testing.actions.click(
+        document.querySelector('.question-library-min-exercise-exclusions .btn-default')
+      )
+      expect( ExerciseActions.saveExerciseExclusion ).to.have.been.called
+
+  it 'saves exercise exclusions immediately when not at minimum', ->
+    ex = ld.cloneDeep(EXERCISES)
+    ex.items = ex.items.slice(0, 3)
+    ExerciseActions.loadedForCourse(ex, COURSE_ID, SECTION_IDS)
+    Testing.renderComponent( ExercisesDisplay, props: @props ).then ({dom}) ->
+      Testing.actions.click(dom.querySelector('.openstax-exercise-preview .action.exclude'))
+      expect( ExerciseActions.saveExerciseExclusion ).to.have.been
+        .calledWith(COURSE_ID, ex.items[0].id, true)


try some more tests

try some more tests

--- test/cron_events_test.coffee
+++ test/cron_events_test.coffee
@@ -33,6 +33,37 @@
   beforeEach ->
     room = helper.createRoom { httpd: false }
     room.robot.logger.error = sinon.stub()
+
+  # ---------------------------------------------------------------------------------
+  context 'at robot launch', ->
+    beforeEach ->
+      room.robot.brain.data.cron = {
+        somejob: {
+          cronTime: '0 0 1 1 *',
+          eventName: 'event1',
+          eventData: { },
+          started: false
+        },
+        other: {
+          cronTime: '0 0 1 1 *',
+          eventName: 'event2',
+          eventData: { },
+          started: true
+        }
+      }
+      room.robot.brain.emit 'loaded'
+      room.robot.cron.loadAll()
+
+      afterEach ->
+        room.robot.brain.data.cron = { }
+        room.robot.cron.jobs = { }
+
+    context 'when brain is loaded', ->
+      it 'jobs stored as not started are not started', ->
+        expect(room.robot.cron.jobs.somejob).not.to.be.defined
+      it 'jobs stored as started are started', ->
+        expect(room.robot.cron.jobs.other).to.be.defined
+

   # ---------------------------------------------------------------------------------
   context 'user wants to know hubot-cron-events version', ->
@@ -77,6 +108,7 @@

       afterEach ->
         room.robot.brain.data.cron = { }
+        room.robot.cron.jobs = { }

     context 'but job is not known', ->
       hubot 'cron start nojob'


Add tests for bookmakrlet-ext

Add tests for bookmakrlet-ext

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/PiotrCzapla/Browser-To-Mobile.git/'


Added Laboratory Test datatype

Added Laboratory Test datatype

error: pathspec 'app/assets/javascripts/datatypes/laboratorytest.js.coffee' did not match any file(s) known to git

--- app/assets/javascripts/datatypes/laboratorytest.js.coffee
+++ app/assets/javascripts/datatypes/laboratorytest.js.coffee
@@ -0,0 +1,225 @@
+###
+@namespace scoping into the CQL_QDM namespace
+###
+@CQL_QDM ||= {}
+
+
+###
+Data elements that meet criteria using this datatype should document an
+unexpected or dangerous reaction to the laboratory test indicated by the QDM
+category and its corresponding value set.
+###
+class CQL_QDM.LaboratoryTestAdverseEvent
+  constructor: (@entry) ->
+    @_reaction = @entry.reaction
+    @_startDatetime = @entry.start_time
+    @_stopDatetime = @entry.end_time
+
+  ###
+  @returns {Code}
+  ###
+  reaction: ->
+    cql.Code(@_reaction.code, @_reaction.code_system)
+
+  ###
+  @returns {Date}
+  ###
+  startDatetime: ->
+    cql.DateTime.fromDate(moment.utc(@_startDatetime, 'X').toDate())
+
+  ###
+  @returns {Date}
+  ###
+  stopDatetime: ->
+    cql.DateTime.fromDate(moment.utc(@_stopDatetime, 'X').toDate())
+
+
+###
+Data elements that meet criteria using this datatype should document a reaction
+in specific patients representing a low threshold to the normal reported or
+expected reactions of the laboratory test indicated by the QDM category and its
+corresponding value set
+###
+class CQL_QDM.LaboratoryTestIntolerance
+  constructor: (@entry) ->
+    @_reaction = @entry.reaction
+    @_startDatetime = @entry.start_time
+    @_stopDatetime = @entry.end_time
+
+  ###
+  @returns {Code}
+  ###
+  reaction: ->
+    cql.Code(@_reaction.code, @_reaction.code_system)
+
+  ###
+  @returns {Date}
+  ###
+  startDatetime: ->
+    cql.DateTime.fromDate(moment.utc(@_startDatetime, 'X').toDate())
+
+  ###
+  @returns {Date}
+  ###
+  stopDatetime: ->
+    cql.DateTime.fromDate(moment.utc(@_stopDatetime, 'X').toDate())
+
+
+###
+Data elements that meet criteria using this datatype should document a request
+for the laboratory test indicated by the QDM category and its corresponding
+value set.
+###
+class CQL_QDM.LaboratoryTestOrder
+  constructor: (@entry) ->
+    @_method = @entry.method
+    @_negationRationale = @entry.negationRationale
+    @_reason = @entry.reason
+    @_startDatetime = @entry.start_time
+    @_stopDatetime = @entry.end_time
+
+  ###
+  @returns {Code}
+  ###
+  method: ->
+    cql.Code(@_method.code, @_method.code_system)
+
+  ###
+  @returns {Code}
+  ###
+  negationRationale: ->
+    cql.Code(@_negationRationale.code, @_negationRationale.code_system)
+
+  ###
+  @returns {Code}
+  ###
+  reason: ->
+    cql.Code(@_reason.code, @_reason.code_system)
+
+  ###
+  @returns {Date}
+  ###
+  startDatetime: ->
+    cql.DateTime.fromDate(moment.utc(@_startDatetime, 'X').toDate())
+
+  ###
+  @returns {Date}
+  ###
+  stopDatetime: ->
+    cql.DateTime.fromDate(moment.utc(@_stopDatetime, 'X').toDate())
+
+
+###
+Data elements that meet criteria using this datatype should document the
+laboratory test indicated by the QDM category and its corresponding value set
+was performed.
+###
+class CQL_QDM.LaboratoryTestPerformed
+  constructor: (@entry) ->
+    @_method = @entry.method
+    @_negationRationale = @entry.negationRationale
+    @_reason = @entry.reason
+    @_referenceRangeHigh = @entry.referenceRangeHigh
+    @_referenceRangeLow = @entry.referenceRangeLow
+    @_result = @entry.result
+    @_startDatetime = @entry.start_time
+    @_status = @entry.status
+    @_stopDatetime = @entry.end_time
+
+  ###
+  @returns {Code}
+  ###
+  method: ->
+    cql.Code(@_method.code, @_method.code_system)
+
+  ###
+  @returns {Code}
+  ###
+  negationRationale: ->
+    cql.Code(@_negationRationale.code, @_negationRationale.code_system)
+
+  ###
+  @returns {Code}
+  ###
+  reason: ->
+    cql.Code(@_reason.code, @_reason.code_system)
+
+  ###
+  @returns {String}
+  ###
+  referenceRangeHigh: ->
+    @_referenceRangeHigh
+
+  ###
+  @returns {String}
+  ###
+  referenceRangeLow: ->
+    @_referenceRangeLow
+
+  ###
+  @returns {Code}
+  ###
+  result: ->
+    cql.Code(@_result.code, @_result.code_system)
+
+  ###
+  @returns {Date}
+  ###
+  startDatetime: ->
+    cql.DateTime.fromDate(moment.utc(@_startDatetime, 'X').toDate())
+
+  ###
+  @returns {Code}
+  ###
+  status: ->
+    cql.Code(@_status.code, @_status.code_system)
+
+  ###
+  @returns {Date}
+  ###
+  stopDatetime: ->
+    cql.DateTime.fromDate(moment.utc(@_stopDatetime, 'X').toDate())
+
+
+###
+Data elements that meet criteria using this datatype should document a
+recommendation for the laboratory test indicated by the QDM category and its
+corresponding value set.
+###
+class CQL_QDM.LaboratoryTestRecommended
+  constructor: (@entry) ->
+    @_method = @entry.method
+    @_negationRationale = @entry.negationRationale
+    @_reason = @entry.reason
+    @_startDatetime = @entry.start_time
+    @_stopDatetime = @entry.end_time
+
+  ###
+  @returns {Code}
+  ###
+  method: ->
+    cql.Code(@_method.code, @_method.code_system)
+
+  ###
+  @returns {Code}
+  ###
+  negationRationale: ->
+    cql.Code(@_negationRationale.code, @_negationRationale.code_system)
+
+  ###
+  @returns {Code}
+  ###
+  reason: ->
+    cql.Code(@_reason.code, @_reason.code_system)
+
+  ###
+  @returns {Date}
+  ###
+  startDatetime: ->
+    cql.DateTime.fromDate(moment.utc(@_startDatetime, 'X').toDate())
+
+  ###
+  @returns {Date}
+  ###
+  stopDatetime: ->
+    cql.DateTime.fromDate(moment.utc(@_stopDatetime, 'X').toDate())


pricing: fix subscription view content representation

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/andrewjcasal/koding.git/'


Stack-Editor: use debounce on title change

--- client/stack-editor/lib/editor/index.coffee
+++ client/stack-editor/lib/editor/index.coffee
@@ -375,9 +375,10 @@
       placeholder: generatedStackTemplateTitle
       bind: 'keyup'

-      keyup: (e) ->
+      keyup: _.debounce (e) ->
         { changeTemplateTitle } = EnvironmentFlux.actions
         changeTemplateTitle stackTemplate?._id, e.target.value
+      , 100

     @titleTabHandle = new kd.TabHandleView
       cssClass : 'stack-template'


Add project specific settings

Add project specific settings

--- lib/project-manager.coffee
+++ lib/project-manager.coffee
@@ -20,9 +20,32 @@
       @createProjectManagerView(state).toggle(@)
     atom.workspaceView.command 'project-manager:edit-projects', =>
       @editProjects()
+    atom.workspaceView.command 'project-manager:reload-project-settings', =>
+      @loadSettings()

     fs.exists @file, (exists) =>
       unless exists
+        fs.writeFile @file, '{}', (error) ->
+          if error
+            console.log "Error: Could not create the file projects.cson - #{error}"
+      else
+        @loadSettings()
+
+  loadSettings: ->
+    CSON = require 'season'
+    CSON.readFile @file, (error, data) =>
+      unless error
+        for title, project of data
+          for path in project.paths
+            if path is atom.project.getPath()
+              if project.settings?
+                @enableSettings(project.settings)
+              break
+
+  enableSettings: (settings) ->
+    for setting, value of settings
+      atom.workspace.eachEditor (editor) ->
+        editor[setting](value)

   addProject: (project) ->
     CSON = require 'season'


Add partial spec for list-items

Add partial spec for list-items

error: pathspec 'spec/markdown-list_items-spec.coffee' did not match any file(s) known to git

--- spec/markdown-list_items-spec.coffee
+++ spec/markdown-list_items-spec.coffee
@@ -0,0 +1,56 @@
+# NOTE
+# The following examples are skipped,
+# because they rely on multiline awareness.
+#
+# http://spec.commonmark.org/0.22/#example-204
+# http://spec.commonmark.org/0.22/#example-205
+# http://spec.commonmark.org/0.22/#example-206
+# http://spec.commonmark.org/0.22/#example-207
+# http://spec.commonmark.org/0.22/#example-208
+# http://spec.commonmark.org/0.22/#example-209
+# http://spec.commonmark.org/0.22/#example-210
+#
+# http://spec.commonmark.org/0.22/#example-212
+# http://spec.commonmark.org/0.22/#example-213
+
+describe 'Markdown grammar', ->
+  grammar = null
+
+  beforeEach ->
+    waitsForPromise ->
+      atom.packages.activatePackage('language-markdown')
+
+    runs ->
+      grammar = atom.grammars.grammarForScopeName('text.md')
+
+  # http://spec.commonmark.org/0.22/#list-items
+  it 'tokenizes list items', ->
+
+    # http://spec.commonmark.org/0.22/#example-203
+    tokens = grammar.tokenizeLines('A paragraph\nwith two lines.\n\n    indented code\n\n> A block quote.')
+    expect(tokens[0][0]).toEqual value: 'A paragraph', scopes: ['text.md']
+    expect(tokens[1][0]).toEqual value: 'with two lines.', scopes: ['text.md']
+    expect(tokens[2][0]).toEqual value: '', scopes: ['text.md']
+    expect(tokens[3][0]).toEqual value: '    ', scopes: ['text.md', 'indented-code.md']
+    expect(tokens[3][1]).toEqual value: 'indented code', scopes: ['text.md', 'indented-code.md', 'code.md']
+    expect(tokens[4][0]).toEqual value: '', scopes: ['text.md']
+    expect(tokens[5][0]).toEqual value: '>', scopes: ['text.md', 'quote.md', 'punctuation.md']
+    expect(tokens[5][1]).toEqual value: ' ', scopes: ['text.md', 'quote.md']
+    expect(tokens[5][2]).toEqual value: 'A block quote.', scopes: ['text.md', 'quote.md']
+
+    # http://spec.commonmark.org/0.22/#example-211
+    {tokens} = grammar.tokenizeLine('-one')
+    expect(tokens[0]).toEqual value: '-one', scopes: ['text.md']
+
+    {tokens} = grammar.tokenizeLine('2.two')
+    expect(tokens[0]).toEqual value: '2.two', scopes: ['text.md']
+
+    # TODO http://spec.commonmark.org/0.22/#example-214
+
+    # TODO http://spec.commonmark.org/0.22/#example-215
+
+    # TODO http://spec.commonmark.org/0.22/#example-216
+
+    # TODO http://spec.commonmark.org/0.22/#example-217
+
+    # TODO http://spec.commonmark.org/0.22/#example-218


Remove unused component

Remove unused component

--- resources/assets/coffee/react/mp-history/events-list.coffee
+++ resources/assets/coffee/react/mp-history/events-list.coffee
@@ -1,28 +0,0 @@
-###
-# Copyright 2016 ppy Pty. Ltd.
-#
-# This file is part of osu!web. osu!web is distributed with the hope of
-# attracting more community contributions to the core ecosystem of osu!.
-#
-# osu!web is free software: you can redistribute it and/or modify
-# it under the terms of the Affero GNU General Public License version 3
-# as published by the Free Software Foundation.
-#
-# osu!web is distributed WITHOUT ANY WARRANTY; without even the implied
-# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-# See the GNU Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with osu!web.  If not, see <http://www.gnu.org/licenses/>.
-###
-{div} = React.DOM
-el = React.createElement
-
-class MPHistory.EventsList extends React.Component
-  render: ->
-    div className: 'mp-history-events',
-      for event in @props.events
-        el MPHistory.Event,
-          event: event
-          lookupUser: @props.lookupUser
-          key: event.id


Updated Daemon

Updated Daemon

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/iShafayet/nodemgr.git/'


try again

try again

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/bradedelman/pdf2image.git/'


Added a new file.

Added a new file.

error: pathspec 'app/lib/LevelOptions.coffee' did not match any file(s) known to git

--- app/lib/LevelOptions.coffee
+++ app/lib/LevelOptions.coffee
@@ -0,0 +1,197 @@
+module.exports = LevelOptions =
+  'dungeons-of-kithgard':
+    hidesSubmitUntilRun: true
+    hidesPlayButton: true
+    hidesRunShortcut: true
+    hidesHUD: true
+    hidesSay: true
+    hidesCodeToolbar: true
+    requiredGear: {feet: 'simple-boots'}
+    restrictedGear: {feet: 'leather-boots'}
+  'gems-in-the-deep':
+    hidesSubmitUntilRun: true
+    hidesPlayButton: true
+    hidesRunShortcut: true
+    hidesHUD: true
+    hidesSay: true
+    hidesCodeToolbar: true
+    requiredGear: {feet: 'simple-boots'}
+    restrictedGear: {feet: 'leather-boots'}
+  'shadow-guard':
+    hidesSubmitUntilRun: true
+    hidesPlayButton: true
+    hidesRunShortcut: true
+    hidesHUD: true
+    hidesSay: true
+    hidesCodeToolbar: true
+    requiredGear: {feet: 'simple-boots'}
+    restrictedGear: {feet: 'leather-boots', 'right-hand': 'simple-sword'}
+  'kounter-kithwise':
+    hidesPlayButton: true
+    hidesRunShortcut: true
+    hidesHUD: true
+    hidesSay: true
+    hidesCodeToolbar: true
+    requiredGear: {feet: 'simple-boots'}
+    restrictedGear: {feet: 'leather-boots', 'right-hand': 'simple-sword', 'programming-book': 'programmaticon-i'}
+  'crawlways-of-kithgard':
+    hidesPlayButton: true
+    hidesRunShortcut: true
+    hidesHUD: true
+    hidesSay: true
+    hidesCodeToolbar: true
+    requiredGear: {feet: 'simple-boots'}
+    restrictedGear: {feet: 'leather-boots', 'right-hand': 'simple-sword', 'programming-book': 'programmaticon-i'}
+  'forgetful-gemsmith':
+    hidesPlayButton: true
+    hidesRunShortcut: true
+    hidesHUD: true
+    hidesSay: true
+    hidesCodeToolbar: true
+    requiredGear: {feet: 'simple-boots'}
+    restrictedGear: {feet: 'leather-boots', 'programming-book': 'programmaticon-i'}
+  'true-names':
+    hidesPlayButton: true
+    hidesRunShortcut: true
+    hidesHUD: true
+    hidesSay: true
+    hidesCodeToolbar: true
+    requiredGear: {feet: 'simple-boots', 'right-hand': 'simple-sword', waist: 'leather-belt'}
+    restrictedGear: {feet: 'leather-boots'}
+  'favorable-odds':
+    hidesRunShortcut: true
+    hidesHUD: true
+    hidesSay: true
+    hidesCodeToolbar: true
+    requiredGear: {feet: 'simple-boots', 'right-hand': 'simple-sword'}
+    restrictedGear: {feet: 'leather-boots'}
+  'the-raised-sword':
+    hidesRunShortcut: true
+    hidesHUD: true
+    hidesSay: true
+    hidesCodeToolbar: true
+    requiredGear: {feet: 'simple-boots', 'right-hand': 'simple-sword', torso: 'leather-tunic'}
+    restrictedGear: {feet: 'leather-boots'}
+  'the-first-kithmaze':
+    hidesRunShortcut: true
+    hidesHUD: true
+    hidesSay: true
+    hidesCodeToolbar: true
+    requiredGear: {feet: 'simple-boots', 'programming-book': 'programmaticon-i'}
+    restrictedGear: {feet: 'leather-boots'}
+  'haunted-kithmaze':
+    hidesRunShortcut: true
+    hidesHUD: true
+    hidesSay: true
+    hidesCodeToolbar: true
+    requiredGear: {feet: 'simple-boots', 'programming-book': 'programmaticon-i'}
+    restrictedGear: {feet: 'leather-boots'}
+  'descending-further':
+    hidesHUD: true
+    hidesSay: true
+    hidesCodeToolbar: true
+    requiredGear: {feet: 'simple-boots', 'programming-book': 'programmaticon-i'}
+    restrictedGear: {feet: 'leather-boots'}
+  'the-second-kithmaze':
+    hidesHUD: true
+    hidesSay: true
+    hidesCodeToolbar: true
+    requiredGear: {feet: 'simple-boots', 'programming-book': 'programmaticon-i'}
+    restrictedGear: {feet: 'leather-boots'}
+  'dread-door':
+    hidesHUD: true
+    hidesSay: true
+    hidesCodeToolbar: true
+    requiredGear: {'right-hand': 'simple-sword', 'programming-book': 'programmaticon-i'}
+    restrictedGear: {feet: 'leather-boots'}
+  'known-enemy':
+    hidesHUD: true
+    hidesSay: true
+    hidesCodeToolbar: true
+    requiredGear: {'right-hand': 'simple-sword', 'programming-book': 'programmaticon-i', torso: 'leather-tunic'}
+    restrictedGear: {feet: 'leather-boots'}
+  'master-of-names':
+    hidesHUD: true
+    hidesSay: true
+    hidesCodeToolbar: true
+    requiredGear: {feet: 'simple-boots', 'right-hand': 'simple-sword', 'programming-book': 'programmaticon-i', eyes: 'crude-glasses', torso: 'leather-tunic'}
+    restrictedGear: {feet: 'leather-boots'}
+  'lowly-kithmen':
+    hidesHUD: true
+    hidesSay: true
+    hidesCodeToolbar: true
+    requiredGear: {feet: 'simple-boots', 'right-hand': 'simple-sword', 'programming-book': 'programmaticon-i', eyes: 'crude-glasses', torso: 'leather-tunic'}
+    restrictedGear: {feet: 'leather-boots'}
+  'closing-the-distance':
+    hidesHUD: true
+    hidesSay: true
+    hidesCodeToolbar: true
+    requiredGear: {feet: 'simple-boots', 'right-hand': 'simple-sword', torso: 'leather-tunic', eyes: 'crude-glasses'}
+    restrictedGear: {feet: 'leather-boots'}
+  'tactical-strike':
+    hidesHUD: true
+    hidesSay: true
+    hidesCodeToolbar: true
+    requiredGear: {feet: 'simple-boots', 'right-hand': 'simple-sword', torso: 'leather-tunic', eyes: 'crude-glasses'}
+    restrictedGear: {feet: 'leather-boots'}
+  'the-final-kithmaze':
+    hidesHUD: true
+    hidesSay: true
+    hidesCodeToolbar: true
+    requiredGear: {feet: 'simple-boots', 'right-hand': 'simple-sword', torso: 'leather-tunic', 'programming-book': 'programmaticon-i', eyes: 'crude-glasses'}
+  'the-gauntlet':
+    hidesHUD: true
+    hidesSay: true
+    hidesCodeToolbar: true
+    requiredGear: {feet: 'simple-boots', 'right-hand': 'simple-sword', torso: 'leather-tunic', 'programming-book': 'programmaticon-i', eyes: 'crude-glasses'}
+    restrictedGear: {feet: 'leather-boots'}
+  'kithgard-gates':
+    hidesSay: true
+    hidesCodeToolbar: true
+    requiredGear: {feet: 'simple-boots', 'right-hand': 'builders-hammer', torso: 'leather-tunic'}
+    restrictedGear: {'right-hand': 'simple-sword'}
+  'defense-of-plainswood':
+    requiredGear: {feet: 'simple-boots', 'right-hand': 'builders-hammer'}
+    restrictedGear: {'right-hand': 'simple-sword'}
+  'winding-trail':
+    requiredGear: {feet: 'leather-boots', 'right-hand': 'builders-hammer'}
+    restrictedGear: {feet: 'simple-boots', 'right-hand': 'simple-sword'}
+  'thornbush-farm':
+    requiredGear: {feet: 'leather-boots', 'right-hand': 'builders-hammer', eyes: 'crude-glasses'}
+    restrictedGear: {feet: 'simple-boots', 'right-hand': 'simple-sword'}
+  'a-fiery-trap':
+    requiredGear: {feet: 'leather-boots', torso: 'leather-tunic', waist: 'leather-belt', 'programming-book': 'programmaticon-i', eyes: 'crude-glasses', 'right-hand': 'simple-sword', 'left-hand': 'wooden-shield'}
+    restrictedGear: {feet: 'simple-boots', 'right-hand': 'builders-hammer'}
+  'ogre-encampment':
+    requiredGear: {torso: 'leather-tunic', waist: 'leather-belt', 'programming-book': 'programmaticon-i', eyes: 'crude-glasses', 'right-hand': 'simple-sword', 'left-hand': 'wooden-shield'}
+    restrictedGear: {feet: 'simple-boots', 'right-hand': 'builders-hammer'}
+  'woodland-cleaver':
+    requiredGear: {torso: 'leather-tunic', waist: 'leather-belt', 'programming-book': 'programmaticon-i', eyes: 'crude-glasses', 'right-hand': 'long-sword', 'left-hand': 'wooden-shield', wrists: 'sundial-wristwatch', feet: 'leather-boots'}
+    restrictedGear: {feet: 'simple-boots', 'right-hand': 'simple-sword'}
+  'shield-rush':
+    requiredGear: {torso: 'leather-tunic', waist: 'leather-belt', 'programming-book': 'programmaticon-i', eyes: 'crude-glasses', 'right-hand': 'long-sword', 'left-hand': 'bronze-shield', wrists: 'sundial-wristwatch'}
+    restrictedGear: {'left-hand': 'wooden-shield'}
+  'peasant-protection':
+    requiredGear: {torso: 'leather-tunic', waist: 'leather-belt', 'programming-book': 'programmaticon-i', eyes: 'wooden-glasses', 'right-hand': 'long-sword', 'left-hand': 'bronze-shield', wrists: 'sundial-wristwatch'}
+    restrictedGear: {eyes: 'crude-glasses'}
+  'munchkin-swarm':
+    requiredGear: {torso: 'leather-tunic', waist: 'leather-belt', 'programming-book': 'programmaticon-i', eyes: 'wooden-glasses', 'right-hand': 'long-sword', 'left-hand': 'bronze-shield', wrists: 'sundial-wristwatch'}
+    restrictedGear: {}
+  'coinucopia':
+    requiredGear: {'programming-book': 'programmaticon-i', feet: 'leather-boots', flag: 'basic-flags'}
+    restrictedGear: {}
+  'copper-meadows':
+    requiredGear: {'programming-book': 'programmaticon-i', feet: 'leather-boots', flag: 'basic-flags', eyes: 'wooden-glasses'}
+    restrictedGear: {}
+  'drop-the-flag':
+    requiredGear: {'programming-book': 'programmaticon-i', feet: 'leather-boots', flag: 'basic-flags', eyes: 'wooden-glasses', 'right-hand': 'builders-hammer'}
+    restrictedGear: {'right-hand': 'longsword'}
+  'rich-forager':
+    requiredGear: {'programming-book': 'programmaticon-i', feet: 'leather-boots', flag: 'basic-flags', eyes: 'wooden-glasses', torso: 'leather-tunic', 'right-hand': 'longsword', 'left-hand': 'bronze-shield'}
+    restrictedGear: {'right-hand': 'builders-hammer'}
+  'deadly-pursuit':
+    requiredGear: {'programming-book': 'programmaticon-i', feet: 'leather-boots', flag: 'basic-flags', eyes: 'wooden-glasses', 'right-hand': 'builders-hammer'}
+    restrictedGear: {'right-hand': 'longsword'}
+  'multiplayer-treasure-grove':
+    requiredGear: {'programming-book': 'programmaticon-i', feet: 'leather-boots', flag: 'basic-flags', eyes: 'wooden-glasses', torso: 'leather-tunic'}
+    restrictedGear: {}


The noty error for server errors now shows more detailed info.

--- app/models/CocoModel.coffee
+++ app/models/CocoModel.coffee
@@ -153,7 +153,7 @@
       console.warn errorMessage, res.responseJSON
       unless webkit?.messageHandlers  # Don't show these notys on iPad
         try
-          noty text: "#{errorMessage}: #{res.status} #{res.statusText}", layout: 'topCenter', type: 'error', killer: false, timeout: 10000
+          noty text: "#{errorMessage}: #{res.status} #{res.statusText}\n#{res.responseText}", layout: 'topCenter', type: 'error', killer: false, timeout: 10000
         catch notyError
           console.warn "Couldn't even show noty error for", error, "because", notyError
       options.success = options.error = null  # So the callbacks can be garbage-collected.


Added a getHeroStats function stub.

Added a getHeroStats function stub.

--- app/models/ThangType.coffee
+++ app/models/ThangType.coffee
@@ -304,6 +304,31 @@
     return [heroClass] if heroClass = @get 'heroClass'
     ['Warrior', 'Ranger', 'Wizard']

+  getHeroStats: ->
+    return unless heroClass = @get('heroClass')
+
+    return switch heroClass
+      when 'Warrior' then {
+        attack: 0.8
+        health: 0.85
+        speed: 0.6
+        skills: []
+      }
+
+      when 'Ranger' then {
+        attack: 0.6
+        health: 0.7
+        speed: 0.8
+        skills: []
+      }
+
+      when 'Wizard' then {
+        attack: 0.5
+        health: 0.45
+        speed: 0.25
+        skills: []
+      }
+
   getFrontFacingStats: ->
     components = @get('components') or []
     unless itemConfig = _.find(components, original: LevelComponent.ItemID)?.config


add reconnect all host in SR view

add reconnect all host in SR view

--- app/modules/sr/index.coffee
+++ app/modules/sr/index.coffee
@@ -44,15 +44,20 @@

       xoApi.call 'vbd.disconnect', {id: UUID}

-    $scope.connectPBD = (host) ->
-      console.log "Connect PBD to host #{host}"
+    $scope.connectPBD = (UUID) ->
+      console.log "Connect PBD #{UUID}"

-      xoApi.call 'pbd.connect', {id: host}
+      xoApi.call 'pbd.connect', {id: UUID}

-    $scope.disconnectPBD = (host) ->
-      console.log "Disconnect PBD to host #{host}"
+    $scope.disconnectPBD = (UUID) ->
+      console.log "Disconnect PBD #{UUID}"

-      xoApi.call 'pbd.disconnect', {id: host}
+      xoApi.call 'pbd.disconnect', {id: UUID}
+
+    $scope.reconnectAllHosts = () ->
+      for pbd in $scope.SR.$PBDs
+        ref = xo.get pbd
+        xoApi.call 'pbd.connect', ref

     $scope.rescanSr = (UUID) ->
       console.log  "Rescan SR #{UUID}"


commit

commit

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/Romaboy/awesomeadmin.git/'


test (Notifications) Handle upcoming default of context being required by explicitly annotating which context should apply

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/AppGyver/supersonic.git/'


feat (modules) Add cross-platform up and down scaling for iframe height depending on content.


Hotfix of missing variable

Hotfix of missing variable

--- index.coffee
+++ index.coffee
@@ -228,7 +228,7 @@
 			server.changed file

 	watchSources: (sources, type, destinationFile = '*') ->
-		gutil.log 'Watching', gutil.colors.cyan(sources.length), gutil.colors.magenta(type), 'paths for', gutil.colors.green(destFile), '...' if @log
+		gutil.log 'Watching', gutil.colors.cyan(sources.length), gutil.colors.magenta(type), 'paths for', gutil.colors.green(destinationFile), '...' if @log
 		gulp.watch sources
 			.on 'change', (e) =>
 				if destinationFile != '*'


Fix typo 'ambuses'

Fix typo 'ambuses'

--- src/scripts/ambush.coffee
+++ src/scripts/ambush.coffee
@@ -35,7 +35,7 @@
       msg.send "#{msg.match[1]}? Never heard of 'em"

   robot.hear /./i, (msg) ->
-    return unless robot.brain.data.ambuses?
+    return unless robot.brain.data.ambushes?
     if (ambushes = robot.brain.data.ambushes[msg.message.user.name])
       msg.send "Hey, " + msg.message.user.name + ", while you were out:"
       for ambush in ambushes