
Security News
Attackers Are Hunting High-Impact Node.js Maintainers in a Coordinated Social Engineering Campaign
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.
ts-combo-script
Advanced tools
combo-script is light-weight and extensible script language to describe gamepad command input.
It also supports validation to prevent logically inconsistent operations(duplicate or unable button push or stick operation etc).
See DEMO.
npm -i ts-combo-script
If just single button name is described(for example, A), it means pushDown(A) and pushUp(A).
A
Note that all button names are case insensitive. So you can write both A and a.
Use pushDown or pushUp function to describe push-down or push-up event separatedly.
pushDown(left), pushUp(left)
Note that function names are case insensitive, so you can write pushDown or pushdown.
You can describe multiple pushing by using tuple like this.
(A, B)
(right, down)
(A, B) means pushing down A and B at the same time(and pushing up A and B at the same time).
You can use special syntax(called holding syntax) to describe this situation. For example,
(a, b) { rotateL(0, 180), x, y }, L1
It means,
a and b while
left stick from 0deg to 180degxya and bL1You can describe selective operation(like A or B) by using or idiom.
rotateL(0, 90), or(triangle, circle)
It means,
triangle or circle button.Note that if you use or inside multiple push like this...
(a, b, or(x, y))
it's disassembled to following operation like set operation(a and b and (x or y))
or((a, b, x), (a, b, y))
Rotating stick is described by rotateL(for left stick) or rotateR(for right stick) function.
rotateL(90, 180)
It means rotating left stick from 90deg to 180deg.
Moving stick is described by moveL(for left stick) or moveR(for right stick) function.
moveR(90, 180)
It means moveing right stick from 0deg to 90deg.
Tilting stick is described by setL(for left stick) or setR(for right stick) function.
setR(90)
It means tilting right stick to 90deg.
Releasing stick is described by unsetL(for left stick) or unsetR(for right stick) function.
unsetL(90)
It means release right stick from 90deg pos.
Touching stick in any way is described by touchL(for left stick) or touchR(for right stick) function.
touchL(), touchR()
You can output some helper message by using string literal enclosed by " or '.
"Input quickly!", left, circle
Or you can use info, warn, error functions.
info("this is info"), warn("this is warning"), error("this is error")
import { compile } from 'combo-script'
const { ast, errors } = compile("(a, b){ rotateL(0, 90), L1 }, x, y");
console.log(ast);
console.log(errors);
Although we have combo-player already, you can create your own player easily by implementing ActionPlayer interface.
import { compile, Action, ActionTextGroup, ActionContext, ActionPlayer, ButtonName, StickName } from 'combo-script';
const code = "(a, b) { rotateL(90, 180), up, down }, x, y, (left, a)"
const { ast, errors } = compile(code);
if(errors.length > 0){
console.error(errors);
return;
}
// Implement your own ActionPlayer interface.
class MyActionPlayer implements ActionPlayer {
visitPush(target: ButtonName, context: ActionContext): Promise<any> {
console.log(`visitPush(${target})`);
return Promise.resolve();
},
// ... full fill other interface functions here ...
}
// And pass your own ActionPlayer to ast.
ast.acceptActionPlayer(new MyActionPlayer());
Functions that are not pre-defined are treated as plugin function.
By using plugin function, you can extend language in your own way.
To use plugin, you should implement your own behaviour in visitPlugin and visitPluginHoldStart and visitPluginHoldEnd in ActionPlayer interface.
import { ActionPlayer, Action, ActionContext } from 'combo-script';
class MyActionPlayer implements ActionPlayer {
visitPushDown(action: Action, context: ActionContext): Promise<any>{
reutrn Promise.resolve();
}
// ...
// <full fill other interfaces>
// ...
// called in normal sequence.
visitPlugin(name: string, args: string[], context: ActionContext): Promise<any> {
console.log(`plugin:${name}`);
return Promise.resolve();
}
// called when holding action is started.
visitPluginHoldStart(name: string, args: string[], context: ActionContext): Promise<any> {
console.log(`plugin:${name}(hold start)`);
return Promise.resolve();
}
// called when holding action is finished.
visitPluginHoldEnd(name: string, args: string[], context: ActionContext): Promise<any> {
console.log(`plugin:${name}(hold end)`);
return Promise.resolve();
}
}
MIT
FAQs
Tiny script language to describe gamepad command input
We found that ts-combo-script demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.

Security News
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.

Security News
Node.js has paused its bug bounty program after funding ended, removing payouts for vulnerability reports but keeping its security process unchanged.