Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
熊鹏飞
/
xxljob220
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Settings
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
f5ebe8f7
authored
Sep 01, 2017
by
Kevin
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
1.添加GLUE_NODEJS支持
parent
2d160021
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
866 additions
and
3 deletions
xxl-job-admin/src/main/webapp/WEB-INF/template/jobcode/jobcode.index.ftl
xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl
xxl-job-admin/src/main/webapp/static/js/jobcode.index.1.js
xxl-job-admin/src/main/webapp/static/js/jobinfo.index.1.js
xxl-job-admin/src/main/webapp/static/js/joblog.index.1.js
xxl-job-admin/src/main/webapp/static/plugins/codemirror/mode/javascript/javascript.js
xxl-job-core/src/main/java/com/xxl/job/core/biz/impl/ExecutorBizImpl.java
xxl-job-core/src/main/java/com/xxl/job/core/glue/GlueTypeEnum.java
xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java
xxl-job-admin/src/main/webapp/WEB-INF/template/jobcode/jobcode.index.ftl
View file @
f5ebe8f7
...
@@ -113,6 +113,7 @@
...
@@ -113,6 +113,7 @@
<script
src=
"${request.contextPath}/static/plugins/codemirror/mode/clike/clike.js"
></script>
<script
src=
"${request.contextPath}/static/plugins/codemirror/mode/clike/clike.js"
></script>
<script
src=
"${request.contextPath}/static/plugins/codemirror/mode/shell/shell.js"
></script>
<script
src=
"${request.contextPath}/static/plugins/codemirror/mode/shell/shell.js"
></script>
<script
src=
"${request.contextPath}/static/plugins/codemirror/mode/python/python.js"
></script>
<script
src=
"${request.contextPath}/static/plugins/codemirror/mode/python/python.js"
></script>
<script
src=
"${request.contextPath}/static/plugins/codemirror/mode/javascript/javascript.js"
></script>
<script
src=
"${request.contextPath}/static/plugins/codemirror/addon/hint/show-hint.js"
></script>
<script
src=
"${request.contextPath}/static/plugins/codemirror/addon/hint/show-hint.js"
></script>
<script
src=
"${request.contextPath}/static/plugins/codemirror/addon/hint/anyword-hint.js"
></script>
<script
src=
"${request.contextPath}/static/plugins/codemirror/addon/hint/anyword-hint.js"
></script>
<script>
<script>
...
...
xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl
View file @
f5ebe8f7
...
@@ -233,7 +233,17 @@ logging.basicConfig(level=logging.DEBUG)
...
@@ -233,7 +233,17 @@ logging.basicConfig(level=logging.DEBUG)
logging
.
info
("脚本文件:"
+
sys
.
argv
[
0
])
logging
.
info
("脚本文件:"
+
sys
.
argv
[
0
])
--
>
--
>
</textarea>
</textarea>
<textarea
class=
"glueSource_nodejs"
style=
"display:none;"
>
// #!/usr/bin/node
console.log("xxl-job: hello nodejs")
var arguments = process.argv
console.log("脚本文件: " + arguments[1])
for (var i = 2; i
<
arguments
.
length
;
i
++){
console
.
log
("参数
:
%
s
,
%
s
",
i
,
arguments
[
i
]);
}
console
.
log
("
Good
bye
!")
process
.
exit
(
0
)
</
textarea
>
</form>
</form>
</div>
</div>
</div>
</div>
...
...
xxl-job-admin/src/main/webapp/static/js/jobcode.index.1.js
View file @
f5ebe8f7
...
@@ -16,6 +16,8 @@ $(function() {
...
@@ -16,6 +16,8 @@ $(function() {
ideMode
=
"text/x-sh"
;
ideMode
=
"text/x-sh"
;
}
else
if
(
'GLUE_PYTHON'
==
glueType
){
}
else
if
(
'GLUE_PYTHON'
==
glueType
){
ideMode
=
"text/x-python"
;
ideMode
=
"text/x-python"
;
}
else
if
(
'GLUE_NODEJS'
==
glueType
){
ideMode
=
"text/javascript"
}
}
codeEditor
=
CodeMirror
(
document
.
getElementById
(
"ideWindow"
),
{
codeEditor
=
CodeMirror
(
document
.
getElementById
(
"ideWindow"
),
{
...
...
xxl-job-admin/src/main/webapp/static/js/jobinfo.index.1.js
View file @
f5ebe8f7
...
@@ -55,6 +55,8 @@ $(function() {
...
@@ -55,6 +55,8 @@ $(function() {
return
"GLUE模式(Shell)"
;
return
"GLUE模式(Shell)"
;
}
else
if
(
'GLUE_PYTHON'
==
row
.
glueType
)
{
}
else
if
(
'GLUE_PYTHON'
==
row
.
glueType
)
{
return
"GLUE模式(Python)"
;
return
"GLUE模式(Python)"
;
}
else
if
(
'GLUE_NODEJS'
==
row
.
glueType
){
return
"GLUE模式(Nodejs)"
;
}
else
if
(
'BEAN'
==
row
.
glueType
)
{
}
else
if
(
'BEAN'
==
row
.
glueType
)
{
return
"BEAN模式:"
+
row
.
executorHandler
;
return
"BEAN模式:"
+
row
.
executorHandler
;
}
}
...
@@ -341,6 +343,8 @@ $(function() {
...
@@ -341,6 +343,8 @@ $(function() {
$
(
"#addModal .form textarea[name='glueSource']"
).
val
(
$
(
"#addModal .form .glueSource_shell"
).
val
()
);
$
(
"#addModal .form textarea[name='glueSource']"
).
val
(
$
(
"#addModal .form .glueSource_shell"
).
val
()
);
}
else
if
(
'GLUE_PYTHON'
==
glueType
){
}
else
if
(
'GLUE_PYTHON'
==
glueType
){
$
(
"#addModal .form textarea[name='glueSource']"
).
val
(
$
(
"#addModal .form .glueSource_python"
).
val
()
);
$
(
"#addModal .form textarea[name='glueSource']"
).
val
(
$
(
"#addModal .form .glueSource_python"
).
val
()
);
}
else
if
(
'GLUE_NODEJS'
==
glueType
){
$
(
"#addModal .form textarea[name='glueSource']"
).
val
(
$
(
"#addModal .form .glueSource_nodejs"
).
val
()
);
}
}
});
});
...
...
xxl-job-admin/src/main/webapp/static/js/joblog.index.1.js
View file @
f5ebe8f7
...
@@ -105,6 +105,8 @@ $(function() {
...
@@ -105,6 +105,8 @@ $(function() {
glueTypeTitle
=
"GLUE模式(Shell)"
;
glueTypeTitle
=
"GLUE模式(Shell)"
;
}
else
if
(
'GLUE_PYTHON'
==
row
.
glueType
)
{
}
else
if
(
'GLUE_PYTHON'
==
row
.
glueType
)
{
glueTypeTitle
=
"GLUE模式(Python)"
;
glueTypeTitle
=
"GLUE模式(Python)"
;
}
else
if
(
'GLUE_NODEJS'
==
row
.
glueType
)
{
glueTypeTitle
=
"GLUE模式(Nodejs)"
;
}
else
if
(
'BEAN'
==
row
.
glueType
)
{
}
else
if
(
'BEAN'
==
row
.
glueType
)
{
glueTypeTitle
=
"BEAN模式:"
+
row
.
executorHandler
;
glueTypeTitle
=
"BEAN模式:"
+
row
.
executorHandler
;
}
}
...
...
xxl-job-admin/src/main/webapp/static/plugins/codemirror/mode/javascript/javascript.js
0 → 100644
View file @
f5ebe8f7
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE
(
function
(
mod
)
{
if
(
typeof
exports
==
"object"
&&
typeof
module
==
"object"
)
// CommonJS
mod
(
require
(
"../../lib/codemirror"
));
else
if
(
typeof
define
==
"function"
&&
define
.
amd
)
// AMD
define
([
"../../lib/codemirror"
],
mod
);
else
// Plain browser env
mod
(
CodeMirror
);
})(
function
(
CodeMirror
)
{
"use strict"
;
CodeMirror
.
defineMode
(
"javascript"
,
function
(
config
,
parserConfig
)
{
var
indentUnit
=
config
.
indentUnit
;
var
statementIndent
=
parserConfig
.
statementIndent
;
var
jsonldMode
=
parserConfig
.
jsonld
;
var
jsonMode
=
parserConfig
.
json
||
jsonldMode
;
var
isTS
=
parserConfig
.
typescript
;
var
wordRE
=
parserConfig
.
wordCharacters
||
/
[\w
$
\x
a1-
\u
ffff
]
/
;
// Tokenizer
var
keywords
=
function
(){
function
kw
(
type
)
{
return
{
type
:
type
,
style
:
"keyword"
};}
var
A
=
kw
(
"keyword a"
),
B
=
kw
(
"keyword b"
),
C
=
kw
(
"keyword c"
);
var
operator
=
kw
(
"operator"
),
atom
=
{
type
:
"atom"
,
style
:
"atom"
};
var
jsKeywords
=
{
"if"
:
kw
(
"if"
),
"while"
:
A
,
"with"
:
A
,
"else"
:
B
,
"do"
:
B
,
"try"
:
B
,
"finally"
:
B
,
"return"
:
C
,
"break"
:
C
,
"continue"
:
C
,
"new"
:
kw
(
"new"
),
"delete"
:
C
,
"throw"
:
C
,
"debugger"
:
C
,
"var"
:
kw
(
"var"
),
"const"
:
kw
(
"var"
),
"let"
:
kw
(
"var"
),
"function"
:
kw
(
"function"
),
"catch"
:
kw
(
"catch"
),
"for"
:
kw
(
"for"
),
"switch"
:
kw
(
"switch"
),
"case"
:
kw
(
"case"
),
"default"
:
kw
(
"default"
),
"in"
:
operator
,
"typeof"
:
operator
,
"instanceof"
:
operator
,
"true"
:
atom
,
"false"
:
atom
,
"null"
:
atom
,
"undefined"
:
atom
,
"NaN"
:
atom
,
"Infinity"
:
atom
,
"this"
:
kw
(
"this"
),
"class"
:
kw
(
"class"
),
"super"
:
kw
(
"atom"
),
"yield"
:
C
,
"export"
:
kw
(
"export"
),
"import"
:
kw
(
"import"
),
"extends"
:
C
,
"await"
:
C
};
// Extend the 'normal' keywords with the TypeScript language extensions
if
(
isTS
)
{
var
type
=
{
type
:
"variable"
,
style
:
"type"
};
var
tsKeywords
=
{
// object-like things
"interface"
:
kw
(
"class"
),
"implements"
:
C
,
"namespace"
:
C
,
"module"
:
kw
(
"module"
),
"enum"
:
kw
(
"module"
),
// scope modifiers
"public"
:
kw
(
"modifier"
),
"private"
:
kw
(
"modifier"
),
"protected"
:
kw
(
"modifier"
),
"abstract"
:
kw
(
"modifier"
),
"readonly"
:
kw
(
"modifier"
),
// types
"string"
:
type
,
"number"
:
type
,
"boolean"
:
type
,
"any"
:
type
};
for
(
var
attr
in
tsKeywords
)
{
jsKeywords
[
attr
]
=
tsKeywords
[
attr
];
}
}
return
jsKeywords
;
}();
var
isOperatorChar
=
/
[
+
\-
*&%=<>!?|~^@
]
/
;
var
isJsonldKeyword
=
/^@
(
context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph
)
"/
;
function
readRegexp
(
stream
)
{
var
escaped
=
false
,
next
,
inSet
=
false
;
while
((
next
=
stream
.
next
())
!=
null
)
{
if
(
!
escaped
)
{
if
(
next
==
"/"
&&
!
inSet
)
return
;
if
(
next
==
"["
)
inSet
=
true
;
else
if
(
inSet
&&
next
==
"]"
)
inSet
=
false
;
}
escaped
=
!
escaped
&&
next
==
"\\"
;
}
}
// Used as scratch variables to communicate multiple values without
// consing up tons of objects.
var
type
,
content
;
function
ret
(
tp
,
style
,
cont
)
{
type
=
tp
;
content
=
cont
;
return
style
;
}
function
tokenBase
(
stream
,
state
)
{
var
ch
=
stream
.
next
();
if
(
ch
==
'"'
||
ch
==
"'"
)
{
state
.
tokenize
=
tokenString
(
ch
);
return
state
.
tokenize
(
stream
,
state
);
}
else
if
(
ch
==
"."
&&
stream
.
match
(
/^
\d
+
(?:[
eE
][
+
\-]?\d
+
)?
/
))
{
return
ret
(
"number"
,
"number"
);
}
else
if
(
ch
==
"."
&&
stream
.
match
(
".."
))
{
return
ret
(
"spread"
,
"meta"
);
}
else
if
(
/
[\[\]
{}
\(\)
,;
\:\.]
/
.
test
(
ch
))
{
return
ret
(
ch
);
}
else
if
(
ch
==
"="
&&
stream
.
eat
(
">"
))
{
return
ret
(
"=>"
,
"operator"
);
}
else
if
(
ch
==
"0"
&&
stream
.
eat
(
/x/i
))
{
stream
.
eatWhile
(
/
[\d
a-f
]
/i
);
return
ret
(
"number"
,
"number"
);
}
else
if
(
ch
==
"0"
&&
stream
.
eat
(
/o/i
))
{
stream
.
eatWhile
(
/
[
0-7
]
/i
);
return
ret
(
"number"
,
"number"
);
}
else
if
(
ch
==
"0"
&&
stream
.
eat
(
/b/i
))
{
stream
.
eatWhile
(
/
[
01
]
/i
);
return
ret
(
"number"
,
"number"
);
}
else
if
(
/
\d
/
.
test
(
ch
))
{
stream
.
match
(
/^
\d
*
(?:\.\d
*
)?(?:[
eE
][
+
\-]?\d
+
)?
/
);
return
ret
(
"number"
,
"number"
);
}
else
if
(
ch
==
"/"
)
{
if
(
stream
.
eat
(
"*"
))
{
state
.
tokenize
=
tokenComment
;
return
tokenComment
(
stream
,
state
);
}
else
if
(
stream
.
eat
(
"/"
))
{
stream
.
skipToEnd
();
return
ret
(
"comment"
,
"comment"
);
}
else
if
(
expressionAllowed
(
stream
,
state
,
1
))
{
readRegexp
(
stream
);
stream
.
match
(
/^
\b(([
gimyu
])(?![
gimyu
]
*
\2))
+
\b
/
);
return
ret
(
"regexp"
,
"string-2"
);
}
else
{
stream
.
eatWhile
(
isOperatorChar
);
return
ret
(
"operator"
,
"operator"
,
stream
.
current
());
}
}
else
if
(
ch
==
"`"
)
{
state
.
tokenize
=
tokenQuasi
;
return
tokenQuasi
(
stream
,
state
);
}
else
if
(
ch
==
"#"
)
{
stream
.
skipToEnd
();
return
ret
(
"error"
,
"error"
);
}
else
if
(
isOperatorChar
.
test
(
ch
))
{
if
(
ch
!=
">"
||
!
state
.
lexical
||
state
.
lexical
.
type
!=
">"
)
stream
.
eatWhile
(
isOperatorChar
);
return
ret
(
"operator"
,
"operator"
,
stream
.
current
());
}
else
if
(
wordRE
.
test
(
ch
))
{
stream
.
eatWhile
(
wordRE
);
var
word
=
stream
.
current
()
if
(
state
.
lastType
!=
"."
)
{
if
(
keywords
.
propertyIsEnumerable
(
word
))
{
var
kw
=
keywords
[
word
]
return
ret
(
kw
.
type
,
kw
.
style
,
word
)
}
if
(
word
==
"async"
&&
stream
.
match
(
/^
\s
*
[\(\w]
/
,
false
))
return
ret
(
"async"
,
"keyword"
,
word
)
}
return
ret
(
"variable"
,
"variable"
,
word
)
}
}
function
tokenString
(
quote
)
{
return
function
(
stream
,
state
)
{
var
escaped
=
false
,
next
;
if
(
jsonldMode
&&
stream
.
peek
()
==
"@"
&&
stream
.
match
(
isJsonldKeyword
)){
state
.
tokenize
=
tokenBase
;
return
ret
(
"jsonld-keyword"
,
"meta"
);
}
while
((
next
=
stream
.
next
())
!=
null
)
{
if
(
next
==
quote
&&
!
escaped
)
break
;
escaped
=
!
escaped
&&
next
==
"\\"
;
}
if
(
!
escaped
)
state
.
tokenize
=
tokenBase
;
return
ret
(
"string"
,
"string"
);
};
}
function
tokenComment
(
stream
,
state
)
{
var
maybeEnd
=
false
,
ch
;
while
(
ch
=
stream
.
next
())
{
if
(
ch
==
"/"
&&
maybeEnd
)
{
state
.
tokenize
=
tokenBase
;
break
;
}
maybeEnd
=
(
ch
==
"*"
);
}
return
ret
(
"comment"
,
"comment"
);
}
function
tokenQuasi
(
stream
,
state
)
{
var
escaped
=
false
,
next
;
while
((
next
=
stream
.
next
())
!=
null
)
{
if
(
!
escaped
&&
(
next
==
"`"
||
next
==
"$"
&&
stream
.
eat
(
"{"
)))
{
state
.
tokenize
=
tokenBase
;
break
;
}
escaped
=
!
escaped
&&
next
==
"\\"
;
}
return
ret
(
"quasi"
,
"string-2"
,
stream
.
current
());
}
var
brackets
=
"([{}])"
;
// This is a crude lookahead trick to try and notice that we're
// parsing the argument patterns for a fat-arrow function before we
// actually hit the arrow token. It only works if the arrow is on
// the same line as the arguments and there's no strange noise
// (comments) in between. Fallback is to only notice when we hit the
// arrow, and not declare the arguments as locals for the arrow
// body.
function
findFatArrow
(
stream
,
state
)
{
if
(
state
.
fatArrowAt
)
state
.
fatArrowAt
=
null
;
var
arrow
=
stream
.
string
.
indexOf
(
"=>"
,
stream
.
start
);
if
(
arrow
<
0
)
return
;
if
(
isTS
)
{
// Try to skip TypeScript return type declarations after the arguments
var
m
=
/:
\s
*
(?:\w
+
(?:
<
[^
>
]
*>|
\[\])?
|
\{[^
}
]
*
\})\s
*$/
.
exec
(
stream
.
string
.
slice
(
stream
.
start
,
arrow
))
if
(
m
)
arrow
=
m
.
index
}
var
depth
=
0
,
sawSomething
=
false
;
for
(
var
pos
=
arrow
-
1
;
pos
>=
0
;
--
pos
)
{
var
ch
=
stream
.
string
.
charAt
(
pos
);
var
bracket
=
brackets
.
indexOf
(
ch
);
if
(
bracket
>=
0
&&
bracket
<
3
)
{
if
(
!
depth
)
{
++
pos
;
break
;
}
if
(
--
depth
==
0
)
{
if
(
ch
==
"("
)
sawSomething
=
true
;
break
;
}
}
else
if
(
bracket
>=
3
&&
bracket
<
6
)
{
++
depth
;
}
else
if
(
wordRE
.
test
(
ch
))
{
sawSomething
=
true
;
}
else
if
(
/
[
"'
\/]
/
.
test
(
ch
))
{
return
;
}
else
if
(
sawSomething
&&
!
depth
)
{
++
pos
;
break
;
}
}
if
(
sawSomething
&&
!
depth
)
state
.
fatArrowAt
=
pos
;
}
// Parser
var
atomicTypes
=
{
"atom"
:
true
,
"number"
:
true
,
"variable"
:
true
,
"string"
:
true
,
"regexp"
:
true
,
"this"
:
true
,
"jsonld-keyword"
:
true
};
function
JSLexical
(
indented
,
column
,
type
,
align
,
prev
,
info
)
{
this
.
indented
=
indented
;
this
.
column
=
column
;
this
.
type
=
type
;
this
.
prev
=
prev
;
this
.
info
=
info
;
if
(
align
!=
null
)
this
.
align
=
align
;
}
function
inScope
(
state
,
varname
)
{
for
(
var
v
=
state
.
localVars
;
v
;
v
=
v
.
next
)
if
(
v
.
name
==
varname
)
return
true
;
for
(
var
cx
=
state
.
context
;
cx
;
cx
=
cx
.
prev
)
{
for
(
var
v
=
cx
.
vars
;
v
;
v
=
v
.
next
)
if
(
v
.
name
==
varname
)
return
true
;
}
}
function
parseJS
(
state
,
style
,
type
,
content
,
stream
)
{
var
cc
=
state
.
cc
;
// Communicate our context to the combinators.
// (Less wasteful than consing up a hundred closures on every call.)
cx
.
state
=
state
;
cx
.
stream
=
stream
;
cx
.
marked
=
null
,
cx
.
cc
=
cc
;
cx
.
style
=
style
;
if
(
!
state
.
lexical
.
hasOwnProperty
(
"align"
))
state
.
lexical
.
align
=
true
;
while
(
true
)
{
var
combinator
=
cc
.
length
?
cc
.
pop
()
:
jsonMode
?
expression
:
statement
;
if
(
combinator
(
type
,
content
))
{
while
(
cc
.
length
&&
cc
[
cc
.
length
-
1
].
lex
)
cc
.
pop
()();
if
(
cx
.
marked
)
return
cx
.
marked
;
if
(
type
==
"variable"
&&
inScope
(
state
,
content
))
return
"variable-2"
;
return
style
;
}
}
}
// Combinator utils
var
cx
=
{
state
:
null
,
column
:
null
,
marked
:
null
,
cc
:
null
};
function
pass
()
{
for
(
var
i
=
arguments
.
length
-
1
;
i
>=
0
;
i
--
)
cx
.
cc
.
push
(
arguments
[
i
]);
}
function
cont
()
{
pass
.
apply
(
null
,
arguments
);
return
true
;
}
function
register
(
varname
)
{
function
inList
(
list
)
{
for
(
var
v
=
list
;
v
;
v
=
v
.
next
)
if
(
v
.
name
==
varname
)
return
true
;
return
false
;
}
var
state
=
cx
.
state
;
cx
.
marked
=
"def"
;
if
(
state
.
context
)
{
if
(
inList
(
state
.
localVars
))
return
;
state
.
localVars
=
{
name
:
varname
,
next
:
state
.
localVars
};
}
else
{
if
(
inList
(
state
.
globalVars
))
return
;
if
(
parserConfig
.
globalVars
)
state
.
globalVars
=
{
name
:
varname
,
next
:
state
.
globalVars
};
}
}
// Combinators
var
defaultVars
=
{
name
:
"this"
,
next
:
{
name
:
"arguments"
}};
function
pushcontext
()
{
cx
.
state
.
context
=
{
prev
:
cx
.
state
.
context
,
vars
:
cx
.
state
.
localVars
};
cx
.
state
.
localVars
=
defaultVars
;
}
function
popcontext
()
{
cx
.
state
.
localVars
=
cx
.
state
.
context
.
vars
;
cx
.
state
.
context
=
cx
.
state
.
context
.
prev
;
}
function
pushlex
(
type
,
info
)
{
var
result
=
function
()
{
var
state
=
cx
.
state
,
indent
=
state
.
indented
;
if
(
state
.
lexical
.
type
==
"stat"
)
indent
=
state
.
lexical
.
indented
;
else
for
(
var
outer
=
state
.
lexical
;
outer
&&
outer
.
type
==
")"
&&
outer
.
align
;
outer
=
outer
.
prev
)
indent
=
outer
.
indented
;
state
.
lexical
=
new
JSLexical
(
indent
,
cx
.
stream
.
column
(),
type
,
null
,
state
.
lexical
,
info
);
};
result
.
lex
=
true
;
return
result
;
}
function
poplex
()
{
var
state
=
cx
.
state
;
if
(
state
.
lexical
.
prev
)
{
if
(
state
.
lexical
.
type
==
")"
)
state
.
indented
=
state
.
lexical
.
indented
;
state
.
lexical
=
state
.
lexical
.
prev
;
}
}
poplex
.
lex
=
true
;
function
expect
(
wanted
)
{
function
exp
(
type
)
{
if
(
type
==
wanted
)
return
cont
();
else
if
(
wanted
==
";"
)
return
pass
();
else
return
cont
(
exp
);
};
return
exp
;
}
function
statement
(
type
,
value
)
{
if
(
type
==
"var"
)
return
cont
(
pushlex
(
"vardef"
,
value
.
length
),
vardef
,
expect
(
";"
),
poplex
);
if
(
type
==
"keyword a"
)
return
cont
(
pushlex
(
"form"
),
parenExpr
,
statement
,
poplex
);
if
(
type
==
"keyword b"
)
return
cont
(
pushlex
(
"form"
),
statement
,
poplex
);
if
(
type
==
"{"
)
return
cont
(
pushlex
(
"}"
),
block
,
poplex
);
if
(
type
==
";"
)
return
cont
();
if
(
type
==
"if"
)
{
if
(
cx
.
state
.
lexical
.
info
==
"else"
&&
cx
.
state
.
cc
[
cx
.
state
.
cc
.
length
-
1
]
==
poplex
)
cx
.
state
.
cc
.
pop
()();
return
cont
(
pushlex
(
"form"
),
parenExpr
,
statement
,
poplex
,
maybeelse
);
}
if
(
type
==
"function"
)
return
cont
(
functiondef
);
if
(
type
==
"for"
)
return
cont
(
pushlex
(
"form"
),
forspec
,
statement
,
poplex
);
if
(
type
==
"variable"
)
{
if
(
isTS
&&
value
==
"type"
)
{
cx
.
marked
=
"keyword"
return
cont
(
typeexpr
,
expect
(
"operator"
),
typeexpr
,
expect
(
";"
));
}
if
(
isTS
&&
value
==
"declare"
)
{
cx
.
marked
=
"keyword"
return
cont
(
statement
)
}
else
{
return
cont
(
pushlex
(
"stat"
),
maybelabel
);
}
}
if
(
type
==
"switch"
)
return
cont
(
pushlex
(
"form"
),
parenExpr
,
expect
(
"{"
),
pushlex
(
"}"
,
"switch"
),
block
,
poplex
,
poplex
);
if
(
type
==
"case"
)
return
cont
(
expression
,
expect
(
":"
));
if
(
type
==
"default"
)
return
cont
(
expect
(
":"
));
if
(
type
==
"catch"
)
return
cont
(
pushlex
(
"form"
),
pushcontext
,
expect
(
"("
),
funarg
,
expect
(
")"
),
statement
,
poplex
,
popcontext
);
if
(
type
==
"class"
)
return
cont
(
pushlex
(
"form"
),
className
,
poplex
);
if
(
type
==
"export"
)
return
cont
(
pushlex
(
"stat"
),
afterExport
,
poplex
);
if
(
type
==
"import"
)
return
cont
(
pushlex
(
"stat"
),
afterImport
,
poplex
);
if
(
type
==
"module"
)
return
cont
(
pushlex
(
"form"
),
pattern
,
expect
(
"{"
),
pushlex
(
"}"
),
block
,
poplex
,
poplex
)
if
(
type
==
"async"
)
return
cont
(
statement
)
if
(
value
==
"@"
)
return
cont
(
expression
,
statement
)
return
pass
(
pushlex
(
"stat"
),
expression
,
expect
(
";"
),
poplex
);
}
function
expression
(
type
)
{
return
expressionInner
(
type
,
false
);
}
function
expressionNoComma
(
type
)
{
return
expressionInner
(
type
,
true
);
}
function
parenExpr
(
type
)
{
if
(
type
!=
"("
)
return
pass
()
return
cont
(
pushlex
(
")"
),
expression
,
expect
(
")"
),
poplex
)
}
function
expressionInner
(
type
,
noComma
)
{
if
(
cx
.
state
.
fatArrowAt
==
cx
.
stream
.
start
)
{
var
body
=
noComma
?
arrowBodyNoComma
:
arrowBody
;
if
(
type
==
"("
)
return
cont
(
pushcontext
,
pushlex
(
")"
),
commasep
(
funarg
,
")"
),
poplex
,
expect
(
"=>"
),
body
,
popcontext
);
else
if
(
type
==
"variable"
)
return
pass
(
pushcontext
,
pattern
,
expect
(
"=>"
),
body
,
popcontext
);
}
var
maybeop
=
noComma
?
maybeoperatorNoComma
:
maybeoperatorComma
;
if
(
atomicTypes
.
hasOwnProperty
(
type
))
return
cont
(
maybeop
);
if
(
type
==
"function"
)
return
cont
(
functiondef
,
maybeop
);
if
(
type
==
"class"
)
return
cont
(
pushlex
(
"form"
),
classExpression
,
poplex
);
if
(
type
==
"keyword c"
||
type
==
"async"
)
return
cont
(
noComma
?
maybeexpressionNoComma
:
maybeexpression
);
if
(
type
==
"("
)
return
cont
(
pushlex
(
")"
),
maybeexpression
,
expect
(
")"
),
poplex
,
maybeop
);
if
(
type
==
"operator"
||
type
==
"spread"
)
return
cont
(
noComma
?
expressionNoComma
:
expression
);
if
(
type
==
"["
)
return
cont
(
pushlex
(
"]"
),
arrayLiteral
,
poplex
,
maybeop
);
if
(
type
==
"{"
)
return
contCommasep
(
objprop
,
"}"
,
null
,
maybeop
);
if
(
type
==
"quasi"
)
return
pass
(
quasi
,
maybeop
);
if
(
type
==
"new"
)
return
cont
(
maybeTarget
(
noComma
));
return
cont
();
}
function
maybeexpression
(
type
)
{
if
(
type
.
match
(
/
[
;
\}\)\]
,
]
/
))
return
pass
();
return
pass
(
expression
);
}
function
maybeexpressionNoComma
(
type
)
{
if
(
type
.
match
(
/
[
;
\}\)\]
,
]
/
))
return
pass
();
return
pass
(
expressionNoComma
);
}
function
maybeoperatorComma
(
type
,
value
)
{
if
(
type
==
","
)
return
cont
(
expression
);
return
maybeoperatorNoComma
(
type
,
value
,
false
);
}
function
maybeoperatorNoComma
(
type
,
value
,
noComma
)
{
var
me
=
noComma
==
false
?
maybeoperatorComma
:
maybeoperatorNoComma
;
var
expr
=
noComma
==
false
?
expression
:
expressionNoComma
;
if
(
type
==
"=>"
)
return
cont
(
pushcontext
,
noComma
?
arrowBodyNoComma
:
arrowBody
,
popcontext
);
if
(
type
==
"operator"
)
{
if
(
/
\+\+
|--/
.
test
(
value
)
||
isTS
&&
value
==
"!"
)
return
cont
(
me
);
if
(
value
==
"?"
)
return
cont
(
expression
,
expect
(
":"
),
expr
);
return
cont
(
expr
);
}
if
(
type
==
"quasi"
)
{
return
pass
(
quasi
,
me
);
}
if
(
type
==
";"
)
return
;
if
(
type
==
"("
)
return
contCommasep
(
expressionNoComma
,
")"
,
"call"
,
me
);
if
(
type
==
"."
)
return
cont
(
property
,
me
);
if
(
type
==
"["
)
return
cont
(
pushlex
(
"]"
),
maybeexpression
,
expect
(
"]"
),
poplex
,
me
);
if
(
isTS
&&
value
==
"as"
)
{
cx
.
marked
=
"keyword"
;
return
cont
(
typeexpr
,
me
)
}
}
function
quasi
(
type
,
value
)
{
if
(
type
!=
"quasi"
)
return
pass
();
if
(
value
.
slice
(
value
.
length
-
2
)
!=
"${"
)
return
cont
(
quasi
);
return
cont
(
expression
,
continueQuasi
);
}
function
continueQuasi
(
type
)
{
if
(
type
==
"}"
)
{
cx
.
marked
=
"string-2"
;
cx
.
state
.
tokenize
=
tokenQuasi
;
return
cont
(
quasi
);
}
}
function
arrowBody
(
type
)
{
findFatArrow
(
cx
.
stream
,
cx
.
state
);
return
pass
(
type
==
"{"
?
statement
:
expression
);
}
function
arrowBodyNoComma
(
type
)
{
findFatArrow
(
cx
.
stream
,
cx
.
state
);
return
pass
(
type
==
"{"
?
statement
:
expressionNoComma
);
}
function
maybeTarget
(
noComma
)
{
return
function
(
type
)
{
if
(
type
==
"."
)
return
cont
(
noComma
?
targetNoComma
:
target
);
else
if
(
type
==
"variable"
&&
isTS
)
return
cont
(
maybeTypeArgs
,
noComma
?
maybeoperatorNoComma
:
maybeoperatorComma
)
else
return
pass
(
noComma
?
expressionNoComma
:
expression
);
};
}
function
target
(
_
,
value
)
{
if
(
value
==
"target"
)
{
cx
.
marked
=
"keyword"
;
return
cont
(
maybeoperatorComma
);
}
}
function
targetNoComma
(
_
,
value
)
{
if
(
value
==
"target"
)
{
cx
.
marked
=
"keyword"
;
return
cont
(
maybeoperatorNoComma
);
}
}
function
maybelabel
(
type
)
{
if
(
type
==
":"
)
return
cont
(
poplex
,
statement
);
return
pass
(
maybeoperatorComma
,
expect
(
";"
),
poplex
);
}
function
property
(
type
)
{
if
(
type
==
"variable"
)
{
cx
.
marked
=
"property"
;
return
cont
();}
}
function
objprop
(
type
,
value
)
{
if
(
type
==
"async"
)
{
cx
.
marked
=
"property"
;
return
cont
(
objprop
);
}
else
if
(
type
==
"variable"
||
cx
.
style
==
"keyword"
)
{
cx
.
marked
=
"property"
;
if
(
value
==
"get"
||
value
==
"set"
)
return
cont
(
getterSetter
);
return
cont
(
afterprop
);
}
else
if
(
type
==
"number"
||
type
==
"string"
)
{
cx
.
marked
=
jsonldMode
?
"property"
:
(
cx
.
style
+
" property"
);
return
cont
(
afterprop
);
}
else
if
(
type
==
"jsonld-keyword"
)
{
return
cont
(
afterprop
);
}
else
if
(
type
==
"modifier"
)
{
return
cont
(
objprop
)
}
else
if
(
type
==
"["
)
{
return
cont
(
expression
,
expect
(
"]"
),
afterprop
);
}
else
if
(
type
==
"spread"
)
{
return
cont
(
expression
,
afterprop
);
}
else
if
(
type
==
":"
)
{
return
pass
(
afterprop
)
}
}
function
getterSetter
(
type
)
{
if
(
type
!=
"variable"
)
return
pass
(
afterprop
);
cx
.
marked
=
"property"
;
return
cont
(
functiondef
);
}
function
afterprop
(
type
)
{
if
(
type
==
":"
)
return
cont
(
expressionNoComma
);
if
(
type
==
"("
)
return
pass
(
functiondef
);
}
function
commasep
(
what
,
end
,
sep
)
{
function
proceed
(
type
,
value
)
{
if
(
sep
?
sep
.
indexOf
(
type
)
>
-
1
:
type
==
","
)
{
var
lex
=
cx
.
state
.
lexical
;
if
(
lex
.
info
==
"call"
)
lex
.
pos
=
(
lex
.
pos
||
0
)
+
1
;
return
cont
(
function
(
type
,
value
)
{
if
(
type
==
end
||
value
==
end
)
return
pass
()
return
pass
(
what
)
},
proceed
);
}
if
(
type
==
end
||
value
==
end
)
return
cont
();
return
cont
(
expect
(
end
));
}
return
function
(
type
,
value
)
{
if
(
type
==
end
||
value
==
end
)
return
cont
();
return
pass
(
what
,
proceed
);
};
}
function
contCommasep
(
what
,
end
,
info
)
{
for
(
var
i
=
3
;
i
<
arguments
.
length
;
i
++
)
cx
.
cc
.
push
(
arguments
[
i
]);
return
cont
(
pushlex
(
end
,
info
),
commasep
(
what
,
end
),
poplex
);
}
function
block
(
type
)
{
if
(
type
==
"}"
)
return
cont
();
return
pass
(
statement
,
block
);
}
function
maybetype
(
type
,
value
)
{
if
(
isTS
)
{
if
(
type
==
":"
)
return
cont
(
typeexpr
);
if
(
value
==
"?"
)
return
cont
(
maybetype
);
}
}
function
typeexpr
(
type
,
value
)
{
if
(
type
==
"variable"
)
{
if
(
value
==
"keyof"
)
{
cx
.
marked
=
"keyword"
return
cont
(
typeexpr
)
}
else
{
cx
.
marked
=
"type"
return
cont
(
afterType
)
}
}
if
(
type
==
"string"
||
type
==
"number"
||
type
==
"atom"
)
return
cont
(
afterType
);
if
(
type
==
"["
)
return
cont
(
pushlex
(
"]"
),
commasep
(
typeexpr
,
"]"
,
","
),
poplex
,
afterType
)
if
(
type
==
"{"
)
return
cont
(
pushlex
(
"}"
),
commasep
(
typeprop
,
"}"
,
",;"
),
poplex
,
afterType
)
if
(
type
==
"("
)
return
cont
(
commasep
(
typearg
,
")"
),
maybeReturnType
)
}
function
maybeReturnType
(
type
)
{
if
(
type
==
"=>"
)
return
cont
(
typeexpr
)
}
function
typeprop
(
type
,
value
)
{
if
(
type
==
"variable"
||
cx
.
style
==
"keyword"
)
{
cx
.
marked
=
"property"
return
cont
(
typeprop
)
}
else
if
(
value
==
"?"
)
{
return
cont
(
typeprop
)
}
else
if
(
type
==
":"
)
{
return
cont
(
typeexpr
)
}
else
if
(
type
==
"["
)
{
return
cont
(
expression
,
maybetype
,
expect
(
"]"
),
typeprop
)
}
}
function
typearg
(
type
)
{
if
(
type
==
"variable"
)
return
cont
(
typearg
)
else
if
(
type
==
":"
)
return
cont
(
typeexpr
)
}
function
afterType
(
type
,
value
)
{
if
(
value
==
"<"
)
return
cont
(
pushlex
(
">"
),
commasep
(
typeexpr
,
">"
),
poplex
,
afterType
)
if
(
value
==
"|"
||
type
==
"."
)
return
cont
(
typeexpr
)
if
(
type
==
"["
)
return
cont
(
expect
(
"]"
),
afterType
)
if
(
value
==
"extends"
)
return
cont
(
typeexpr
)
}
function
maybeTypeArgs
(
_
,
value
)
{
if
(
value
==
"<"
)
return
cont
(
pushlex
(
">"
),
commasep
(
typeexpr
,
">"
),
poplex
,
afterType
)
}
function
vardef
()
{
return
pass
(
pattern
,
maybetype
,
maybeAssign
,
vardefCont
);
}
function
pattern
(
type
,
value
)
{
if
(
type
==
"modifier"
)
return
cont
(
pattern
)
if
(
type
==
"variable"
)
{
register
(
value
);
return
cont
();
}
if
(
type
==
"spread"
)
return
cont
(
pattern
);
if
(
type
==
"["
)
return
contCommasep
(
pattern
,
"]"
);
if
(
type
==
"{"
)
return
contCommasep
(
proppattern
,
"}"
);
}
function
proppattern
(
type
,
value
)
{
if
(
type
==
"variable"
&&
!
cx
.
stream
.
match
(
/^
\s
*:/
,
false
))
{
register
(
value
);
return
cont
(
maybeAssign
);
}
if
(
type
==
"variable"
)
cx
.
marked
=
"property"
;
if
(
type
==
"spread"
)
return
cont
(
pattern
);
if
(
type
==
"}"
)
return
pass
();
return
cont
(
expect
(
":"
),
pattern
,
maybeAssign
);
}
function
maybeAssign
(
_type
,
value
)
{
if
(
value
==
"="
)
return
cont
(
expressionNoComma
);
}
function
vardefCont
(
type
)
{
if
(
type
==
","
)
return
cont
(
vardef
);
}
function
maybeelse
(
type
,
value
)
{
if
(
type
==
"keyword b"
&&
value
==
"else"
)
return
cont
(
pushlex
(
"form"
,
"else"
),
statement
,
poplex
);
}
function
forspec
(
type
)
{
if
(
type
==
"("
)
return
cont
(
pushlex
(
")"
),
forspec1
,
expect
(
")"
),
poplex
);
}
function
forspec1
(
type
)
{
if
(
type
==
"var"
)
return
cont
(
vardef
,
expect
(
";"
),
forspec2
);
if
(
type
==
";"
)
return
cont
(
forspec2
);
if
(
type
==
"variable"
)
return
cont
(
formaybeinof
);
return
pass
(
expression
,
expect
(
";"
),
forspec2
);
}
function
formaybeinof
(
_type
,
value
)
{
if
(
value
==
"in"
||
value
==
"of"
)
{
cx
.
marked
=
"keyword"
;
return
cont
(
expression
);
}
return
cont
(
maybeoperatorComma
,
forspec2
);
}
function
forspec2
(
type
,
value
)
{
if
(
type
==
";"
)
return
cont
(
forspec3
);
if
(
value
==
"in"
||
value
==
"of"
)
{
cx
.
marked
=
"keyword"
;
return
cont
(
expression
);
}
return
pass
(
expression
,
expect
(
";"
),
forspec3
);
}
function
forspec3
(
type
)
{
if
(
type
!=
")"
)
cont
(
expression
);
}
function
functiondef
(
type
,
value
)
{
if
(
value
==
"*"
)
{
cx
.
marked
=
"keyword"
;
return
cont
(
functiondef
);}
if
(
type
==
"variable"
)
{
register
(
value
);
return
cont
(
functiondef
);}
if
(
type
==
"("
)
return
cont
(
pushcontext
,
pushlex
(
")"
),
commasep
(
funarg
,
")"
),
poplex
,
maybetype
,
statement
,
popcontext
);
if
(
isTS
&&
value
==
"<"
)
return
cont
(
pushlex
(
">"
),
commasep
(
typeexpr
,
">"
),
poplex
,
functiondef
)
}
function
funarg
(
type
)
{
if
(
type
==
"spread"
||
type
==
"modifier"
)
return
cont
(
funarg
);
return
pass
(
pattern
,
maybetype
,
maybeAssign
);
}
function
classExpression
(
type
,
value
)
{
// Class expressions may have an optional name.
if
(
type
==
"variable"
)
return
className
(
type
,
value
);
return
classNameAfter
(
type
,
value
);
}
function
className
(
type
,
value
)
{
if
(
type
==
"variable"
)
{
register
(
value
);
return
cont
(
classNameAfter
);}
}
function
classNameAfter
(
type
,
value
)
{
if
(
value
==
"<"
)
return
cont
(
pushlex
(
">"
),
commasep
(
typeexpr
,
">"
),
poplex
,
classNameAfter
)
if
(
value
==
"extends"
||
value
==
"implements"
||
(
isTS
&&
type
==
","
))
return
cont
(
isTS
?
typeexpr
:
expression
,
classNameAfter
);
if
(
type
==
"{"
)
return
cont
(
pushlex
(
"}"
),
classBody
,
poplex
);
}
function
classBody
(
type
,
value
)
{
if
(
type
==
"modifier"
||
type
==
"async"
||
(
type
==
"variable"
&&
(
value
==
"static"
||
value
==
"get"
||
value
==
"set"
)
&&
cx
.
stream
.
match
(
/^
\s
+
[\w
$
\x
a1-
\u
ffff
]
/
,
false
)))
{
cx
.
marked
=
"keyword"
;
return
cont
(
classBody
);
}
if
(
type
==
"variable"
||
cx
.
style
==
"keyword"
)
{
cx
.
marked
=
"property"
;
return
cont
(
isTS
?
classfield
:
functiondef
,
classBody
);
}
if
(
type
==
"["
)
return
cont
(
expression
,
expect
(
"]"
),
isTS
?
classfield
:
functiondef
,
classBody
)
if
(
value
==
"*"
)
{
cx
.
marked
=
"keyword"
;
return
cont
(
classBody
);
}
if
(
type
==
";"
)
return
cont
(
classBody
);
if
(
type
==
"}"
)
return
cont
();
if
(
value
==
"@"
)
return
cont
(
expression
,
classBody
)
}
function
classfield
(
type
,
value
)
{
if
(
value
==
"?"
)
return
cont
(
classfield
)
if
(
type
==
":"
)
return
cont
(
typeexpr
,
maybeAssign
)
if
(
value
==
"="
)
return
cont
(
expressionNoComma
)
return
pass
(
functiondef
)
}
function
afterExport
(
type
,
value
)
{
if
(
value
==
"*"
)
{
cx
.
marked
=
"keyword"
;
return
cont
(
maybeFrom
,
expect
(
";"
));
}
if
(
value
==
"default"
)
{
cx
.
marked
=
"keyword"
;
return
cont
(
expression
,
expect
(
";"
));
}
if
(
type
==
"{"
)
return
cont
(
commasep
(
exportField
,
"}"
),
maybeFrom
,
expect
(
";"
));
return
pass
(
statement
);
}
function
exportField
(
type
,
value
)
{
if
(
value
==
"as"
)
{
cx
.
marked
=
"keyword"
;
return
cont
(
expect
(
"variable"
));
}
if
(
type
==
"variable"
)
return
pass
(
expressionNoComma
,
exportField
);
}
function
afterImport
(
type
)
{
if
(
type
==
"string"
)
return
cont
();
return
pass
(
importSpec
,
maybeMoreImports
,
maybeFrom
);
}
function
importSpec
(
type
,
value
)
{
if
(
type
==
"{"
)
return
contCommasep
(
importSpec
,
"}"
);
if
(
type
==
"variable"
)
register
(
value
);
if
(
value
==
"*"
)
cx
.
marked
=
"keyword"
;
return
cont
(
maybeAs
);
}
function
maybeMoreImports
(
type
)
{
if
(
type
==
","
)
return
cont
(
importSpec
,
maybeMoreImports
)
}
function
maybeAs
(
_type
,
value
)
{
if
(
value
==
"as"
)
{
cx
.
marked
=
"keyword"
;
return
cont
(
importSpec
);
}
}
function
maybeFrom
(
_type
,
value
)
{
if
(
value
==
"from"
)
{
cx
.
marked
=
"keyword"
;
return
cont
(
expression
);
}
}
function
arrayLiteral
(
type
)
{
if
(
type
==
"]"
)
return
cont
();
return
pass
(
commasep
(
expressionNoComma
,
"]"
));
}
function
isContinuedStatement
(
state
,
textAfter
)
{
return
state
.
lastType
==
"operator"
||
state
.
lastType
==
","
||
isOperatorChar
.
test
(
textAfter
.
charAt
(
0
))
||
/
[
,.
]
/
.
test
(
textAfter
.
charAt
(
0
));
}
function
expressionAllowed
(
stream
,
state
,
backUp
)
{
return
state
.
tokenize
==
tokenBase
&&
/^
(?:
operator|sof|keyword c|case|new|export|default|
[\[
{}
\(
,;:
]
|=>
)
$/
.
test
(
state
.
lastType
)
||
(
state
.
lastType
==
"quasi"
&&
/
\{\s
*$/
.
test
(
stream
.
string
.
slice
(
0
,
stream
.
pos
-
(
backUp
||
0
))))
}
// Interface
return
{
startState
:
function
(
basecolumn
)
{
var
state
=
{
tokenize
:
tokenBase
,
lastType
:
"sof"
,
cc
:
[],
lexical
:
new
JSLexical
((
basecolumn
||
0
)
-
indentUnit
,
0
,
"block"
,
false
),
localVars
:
parserConfig
.
localVars
,
context
:
parserConfig
.
localVars
&&
{
vars
:
parserConfig
.
localVars
},
indented
:
basecolumn
||
0
};
if
(
parserConfig
.
globalVars
&&
typeof
parserConfig
.
globalVars
==
"object"
)
state
.
globalVars
=
parserConfig
.
globalVars
;
return
state
;
},
token
:
function
(
stream
,
state
)
{
if
(
stream
.
sol
())
{
if
(
!
state
.
lexical
.
hasOwnProperty
(
"align"
))
state
.
lexical
.
align
=
false
;
state
.
indented
=
stream
.
indentation
();
findFatArrow
(
stream
,
state
);
}
if
(
state
.
tokenize
!=
tokenComment
&&
stream
.
eatSpace
())
return
null
;
var
style
=
state
.
tokenize
(
stream
,
state
);
if
(
type
==
"comment"
)
return
style
;
state
.
lastType
=
type
==
"operator"
&&
(
content
==
"++"
||
content
==
"--"
)
?
"incdec"
:
type
;
return
parseJS
(
state
,
style
,
type
,
content
,
stream
);
},
indent
:
function
(
state
,
textAfter
)
{
if
(
state
.
tokenize
==
tokenComment
)
return
CodeMirror
.
Pass
;
if
(
state
.
tokenize
!=
tokenBase
)
return
0
;
var
firstChar
=
textAfter
&&
textAfter
.
charAt
(
0
),
lexical
=
state
.
lexical
,
top
// Kludge to prevent 'maybelse' from blocking lexical scope pops
if
(
!
/^
\s
*else
\b
/
.
test
(
textAfter
))
for
(
var
i
=
state
.
cc
.
length
-
1
;
i
>=
0
;
--
i
)
{
var
c
=
state
.
cc
[
i
];
if
(
c
==
poplex
)
lexical
=
lexical
.
prev
;
else
if
(
c
!=
maybeelse
)
break
;
}
while
((
lexical
.
type
==
"stat"
||
lexical
.
type
==
"form"
)
&&
(
firstChar
==
"}"
||
((
top
=
state
.
cc
[
state
.
cc
.
length
-
1
])
&&
(
top
==
maybeoperatorComma
||
top
==
maybeoperatorNoComma
)
&&
!
/^
[
,
\.
=+
\-
*:?[
\(]
/
.
test
(
textAfter
))))
lexical
=
lexical
.
prev
;
if
(
statementIndent
&&
lexical
.
type
==
")"
&&
lexical
.
prev
.
type
==
"stat"
)
lexical
=
lexical
.
prev
;
var
type
=
lexical
.
type
,
closing
=
firstChar
==
type
;
if
(
type
==
"vardef"
)
return
lexical
.
indented
+
(
state
.
lastType
==
"operator"
||
state
.
lastType
==
","
?
lexical
.
info
+
1
:
0
);
else
if
(
type
==
"form"
&&
firstChar
==
"{"
)
return
lexical
.
indented
;
else
if
(
type
==
"form"
)
return
lexical
.
indented
+
indentUnit
;
else
if
(
type
==
"stat"
)
return
lexical
.
indented
+
(
isContinuedStatement
(
state
,
textAfter
)
?
statementIndent
||
indentUnit
:
0
);
else
if
(
lexical
.
info
==
"switch"
&&
!
closing
&&
parserConfig
.
doubleIndentSwitch
!=
false
)
return
lexical
.
indented
+
(
/^
(?:
case|default
)\b
/
.
test
(
textAfter
)
?
indentUnit
:
2
*
indentUnit
);
else
if
(
lexical
.
align
)
return
lexical
.
column
+
(
closing
?
0
:
1
);
else
return
lexical
.
indented
+
(
closing
?
0
:
indentUnit
);
},
electricInput
:
/^
\s
*
(?:
case .*
?
:|default:|
\{
|
\})
$/
,
blockCommentStart
:
jsonMode
?
null
:
"/*"
,
blockCommentEnd
:
jsonMode
?
null
:
"*/"
,
lineComment
:
jsonMode
?
null
:
"//"
,
fold
:
"brace"
,
closeBrackets
:
"()[]{}''\"\"``"
,
helperType
:
jsonMode
?
"json"
:
"javascript"
,
jsonldMode
:
jsonldMode
,
jsonMode
:
jsonMode
,
expressionAllowed
:
expressionAllowed
,
skipExpression
:
function
(
state
)
{
var
top
=
state
.
cc
[
state
.
cc
.
length
-
1
]
if
(
top
==
expression
||
top
==
expressionNoComma
)
state
.
cc
.
pop
()
}
};
});
CodeMirror
.
registerHelper
(
"wordChars"
,
"javascript"
,
/
[\w
$
]
/
);
CodeMirror
.
defineMIME
(
"text/javascript"
,
"javascript"
);
CodeMirror
.
defineMIME
(
"text/ecmascript"
,
"javascript"
);
CodeMirror
.
defineMIME
(
"application/javascript"
,
"javascript"
);
CodeMirror
.
defineMIME
(
"application/x-javascript"
,
"javascript"
);
CodeMirror
.
defineMIME
(
"application/ecmascript"
,
"javascript"
);
CodeMirror
.
defineMIME
(
"application/json"
,
{
name
:
"javascript"
,
json
:
true
});
CodeMirror
.
defineMIME
(
"application/x-json"
,
{
name
:
"javascript"
,
json
:
true
});
CodeMirror
.
defineMIME
(
"application/ld+json"
,
{
name
:
"javascript"
,
jsonld
:
true
});
CodeMirror
.
defineMIME
(
"text/typescript"
,
{
name
:
"javascript"
,
typescript
:
true
});
CodeMirror
.
defineMIME
(
"application/typescript"
,
{
name
:
"javascript"
,
typescript
:
true
});
});
\ No newline at end of file
xxl-job-core/src/main/java/com/xxl/job/core/biz/impl/ExecutorBizImpl.java
View file @
f5ebe8f7
...
@@ -120,7 +120,8 @@ public class ExecutorBizImpl implements ExecutorBiz {
...
@@ -120,7 +120,8 @@ public class ExecutorBizImpl implements ExecutorBiz {
}
}
}
}
}
else
if
(
GlueTypeEnum
.
GLUE_SHELL
==
GlueTypeEnum
.
match
(
triggerParam
.
getGlueType
())
}
else
if
(
GlueTypeEnum
.
GLUE_SHELL
==
GlueTypeEnum
.
match
(
triggerParam
.
getGlueType
())
||
GlueTypeEnum
.
GLUE_PYTHON
==
GlueTypeEnum
.
match
(
triggerParam
.
getGlueType
())
)
{
||
GlueTypeEnum
.
GLUE_PYTHON
==
GlueTypeEnum
.
match
(
triggerParam
.
getGlueType
())
||
GlueTypeEnum
.
GLUE_NODEJS
==
GlueTypeEnum
.
match
(
triggerParam
.
getGlueType
()))
{
// valid old jobThread
// valid old jobThread
if
(
jobThread
!=
null
&&
if
(
jobThread
!=
null
&&
...
...
xxl-job-core/src/main/java/com/xxl/job/core/glue/GlueTypeEnum.java
View file @
f5ebe8f7
...
@@ -8,7 +8,8 @@ public enum GlueTypeEnum {
...
@@ -8,7 +8,8 @@ public enum GlueTypeEnum {
BEAN
(
"BEAN模式"
),
BEAN
(
"BEAN模式"
),
GLUE_GROOVY
(
"GLUE模式(Java)"
),
GLUE_GROOVY
(
"GLUE模式(Java)"
),
GLUE_SHELL
(
"GLUE模式(Shell)"
),
GLUE_SHELL
(
"GLUE模式(Shell)"
),
GLUE_PYTHON
(
"GLUE模式(Python)"
);
GLUE_PYTHON
(
"GLUE模式(Python)"
),
GLUE_NODEJS
(
"GLUE模式(Nodejs)"
);
private
String
desc
;
private
String
desc
;
private
GlueTypeEnum
(
String
desc
)
{
private
GlueTypeEnum
(
String
desc
)
{
...
...
xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java
View file @
f5ebe8f7
...
@@ -40,6 +40,9 @@ public class ScriptJobHandler extends IJobHandler {
...
@@ -40,6 +40,9 @@ public class ScriptJobHandler extends IJobHandler {
}
else
if
(
GlueTypeEnum
.
GLUE_PYTHON
==
glueType
)
{
}
else
if
(
GlueTypeEnum
.
GLUE_PYTHON
==
glueType
)
{
cmd
=
"python"
;
cmd
=
"python"
;
scriptFileName
=
XxlJobFileAppender
.
logPath
.
concat
(
"gluesource/"
).
concat
(
String
.
valueOf
(
jobId
)).
concat
(
"_"
).
concat
(
String
.
valueOf
(
glueUpdatetime
)).
concat
(
".py"
);
scriptFileName
=
XxlJobFileAppender
.
logPath
.
concat
(
"gluesource/"
).
concat
(
String
.
valueOf
(
jobId
)).
concat
(
"_"
).
concat
(
String
.
valueOf
(
glueUpdatetime
)).
concat
(
".py"
);
}
else
if
(
GlueTypeEnum
.
GLUE_NODEJS
==
glueType
)
{
cmd
=
"node"
;
scriptFileName
=
XxlJobFileAppender
.
logPath
.
concat
(
"gluesource/"
).
concat
(
String
.
valueOf
(
jobId
)).
concat
(
"_"
).
concat
(
String
.
valueOf
(
glueUpdatetime
)).
concat
(
".js"
);
}
}
// make script file
// make script file
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment