priority -50

############
#  COMMON  #
############

# The smart snippets use a global options called
# "g:ultisnips_javascript.{option}" which can control the format
# of trailing semicolon, space before function paren, etc.
#
# e.g.
# let g:ultisnips_javascript = {
#      \ 'keyword-spacing': 'always',
#      \ 'semi': 'never',
#      \ 'space-before-function-paren': 'always',
#      \ }


global !p
from javascript_snippets import (
	semi, space_before_function_paren, keyword_spacing
)
endglobal

###########################################################################
#                            TextMate Snippets                            #
###########################################################################
snippet get "Get Elements"
getElement${1/(T)|(C)|.*/(?1:s)(?2:s)/}By${1:T}${1/(T)|(I)|(C).*/(?1:agName)(?2:d)(?3:lassName)/}('$2')
endsnippet

snippet '':f "object method string"
'${1:${2:#thing}:${3:click}}': function`!p snip.rv = space_before_function_paren(snip)`(element) {
	${VISUAL}$0
}${10:,}
endsnippet

snippet :f "Object Method"
${1:method_name}: function`!p snip.rv = space_before_function_paren(snip)`(${3:attribute}) {
	${VISUAL}$0
}${10:,}
endsnippet

snippet :, "Object Value JS"
${1:value_name}: ${0:value},
endsnippet

snippet : "Object key key: 'value'"
${1:key}: ${2:"${3:value}"}${4:, }
endsnippet

snippet proto "Prototype (proto)"
${1:class_name}.prototype.${2:method_name} = function`!p snip.rv = space_before_function_paren(snip)`(${3:first_argument}) {
	${VISUAL}$0
}`!p snip.rv = semi(snip)`

endsnippet

snippet fun "function (named)" b
function ${1:function_name}`!p snip.rv = space_before_function_paren(snip)`(${2:argument}) {
	${VISUAL}$0
}
endsnippet

snippet vf "function (assigned to var)"
${1:var }${2:function_name} = function $2`!p snip.rv = space_before_function_paren(snip)`($3) {
	${VISUAL}$0
}`!p snip.rv = semi(snip)`
endsnippet

# Drop priority so this only triggers when not beginning of line.
priority -51
snippet fun "function (anonymous)" w
function`!p snip.rv = space_before_function_paren(snip)`($1) {
	${VISUAL}$0
}$2
endsnippet
priority -50

snippet anf "function (anonymous)" i
function`!p snip.rv = space_before_function_paren(snip)`($1) {
	${VISUAL}$0
}
endsnippet

snippet iife "Immediately-Invoked Function Expression (iife)"
(function`!p snip.rv = space_before_function_paren(snip)`(${1:window}) {
	${VISUAL}$0
}(${2:$1}))`!p snip.rv = semi(snip)`
endsnippet

snippet ;fe "Minify safe iife"
;(function`!p snip.rv = space_before_function_paren(snip)`(${1}) {
	${VISUAL}$0
}(${2}))
endsnippet

snippet timeout "setTimeout function"
setTimeout(function`!p snip.rv = space_before_function_paren(snip)`() {
	${VISUAL}$0
}${2:.bind(${3:this})}, ${1:10})`!p snip.rv = semi(snip)`
endsnippet

snippet fi "for prop in obj using hasOwnProperty" b
for`!p snip.rv = keyword_spacing(snip)`(${1:prop} in ${2:obj}){
	if`!p snip.rv = keyword_spacing(snip)`($2.hasOwnProperty($1)) {
		${VISUAL}$0
	}
}
endsnippet

snippet if "if (condition) { ... }"
if`!p snip.rv = keyword_spacing(snip)`(${1:true}) {
	${VISUAL}$0
}
endsnippet

snippet ife "if (condition) { ... } else { ... }"
if`!p snip.rv = keyword_spacing(snip)`(${1:true}) {
	${VISUAL}$0
}`!p snip.rv = keyword_spacing(snip)`else`!p snip.rv = keyword_spacing(snip)`{
	${2}
}
endsnippet

snippet switch
switch`!p snip.rv = keyword_spacing(snip)`(${VISUAL}${1:expression}) {
	case '${VISUAL}${3:case}':
		${4}
		break`!p snip.rv = semi(snip)`
	${0}
	default:
		${2}
}
endsnippet

snippet case "case 'xyz': ... break"
case`!p snip.rv = keyword_spacing(snip)`'${VISUAL}${1:case}':
	${VISUAL}$0
	break`!p snip.rv = semi(snip)`
endsnippet

snippet do "do { ... } while (condition)"
do`!p snip.rv = keyword_spacing(snip)`{
	${VISUAL}$0
}`!p snip.rv = keyword_spacing(snip)`while`!p snip.rv = keyword_spacing(snip)`(${1:/* condition */})`!p snip.rv = semi(snip)`
endsnippet

snippet ret "Return statement"
return ${VISUAL}$0`!p snip.rv = semi(snip)`
endsnippet

snippet us
'use strict'`!p snip.rv = semi(snip)`
endsnippet

snippet imp "import"
import ${2} from ${1}
endsnippet

# Debugging
snippet de
debugger`!p snip.rv = semi(snip)`
endsnippet
snippet cl "console.log"
console.log(${0})`!p snip.rv = semi(snip)`
endsnippet
snippet cd "console.debug"
console.debug(${0})`!p snip.rv = semi(snip)`
endsnippet
snippet ce "console.error"
console.error(${0})`!p snip.rv = semi(snip)`
endsnippet
snippet cw "console.warn"
console.warn(${0})`!p snip.rv = semi(snip)`
endsnippet
snippet ci "console.info"
console.info(${0})`!p snip.rv = semi(snip)`
endsnippet
snippet ct "console.trace"
console.trace(${0:label})`!p snip.rv = semi(snip)`
endsnippet
snippet ctime "console.time ... console.timeEnd"
console.time("${1:label}")`!p snip.rv = semi(snip)`
${0:${VISUAL}}
console.timeEnd("$1")`!p snip.rv = semi(snip)`
endsnippet
snippet ctimestamp "console.timeStamp"
console.timeStamp("${1:label}")`!p snip.rv = semi(snip)`
endsnippet
snippet ca "console.assert"
console.assert(${1:expression}, ${0:obj})`!p snip.rv = semi(snip)`
endsnippet
snippet cclear "console.clear"
console.clear()`!p snip.rv = semi(snip)`
endsnippet
snippet cdir "console.dir"
console.dir(${0:obj})`!p snip.rv = semi(snip)`
endsnippet
snippet cdirx "console.dirxml"
console.dirxml(${1:object})`!p snip.rv = semi(snip)`
endsnippet
snippet cgroup "console.group"
console.group("${1:label}")`!p snip.rv = semi(snip)`
${0:${VISUAL}}
console.groupEnd()`!p snip.rv = semi(snip)`
endsnippet
snippet cgroupc "console.groupCollapsed"
console.groupCollapsed("${1:label}")`!p snip.rv = semi(snip)`
${0:${VISUAL}}
console.groupEnd()`!p snip.rv = semi(snip)`
endsnippet
snippet cprof "console.profile"
console.profile("${1:label}")`!p snip.rv = semi(snip)`
${0:${VISUAL}}
console.profileEnd()`!p snip.rv = semi(snip)`
endsnippet
snippet ctable "console.table"
console.table(${1:"${2:value}"})`!p snip.rv = semi(snip)`
endsnippet
snippet clstr "console.log stringified"
console.log(JSON.stringify(${0}, null, 2))`!p snip.rv = semi(snip)`
endsnippet

# vim:ft=snippets:
