octo-deno/lib/utils/script.js

137 lines
4.1 KiB
JavaScript
Raw Normal View History

2017-04-22 22:49:49 +00:00
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
const random = require('../random')
2018-03-19 04:54:40 +00:00
const make = require('../make')
const utils = require('../utils')
2018-03-19 05:34:18 +00:00
const {o} = require('./objects')
class script extends utils {
2018-05-21 16:04:34 +00:00
static addElementToBody (name) {
return `(document.body || document.documentElement).appendChild${script.methodHead([name])}`
}
2018-05-21 16:04:34 +00:00
static getRandomElement () {
return `document.getElementsByTagName('*')[${random.number(document.getElementsByTagName('*').length)}]`
}
2018-05-21 16:04:34 +00:00
static makeArray (type, arrayLength, cb) {
if (type === null || type === undefined) {
type = random.item(['Uint8', 'Float32'])
}
switch (random.number(8)) {
case 0:
let src = `function() { let buffer = new ${type}Array(${arrayLength});`
src += script.makeLoop(`buffer[i] = ${cb()};`, arrayLength)
src += 'return buffer;}()'
return src
case 1:
return `new ${type}Array([${make.arrays.filledArray(cb, arrayLength)}])`
default:
return `new ${type}Array(${arrayLength})`
2017-04-22 22:49:49 +00:00
}
}
static makeConstraint (keys, values) {
2017-05-02 14:01:32 +00:00
let o = {}
let n = random.range(0, keys.length)
2017-04-22 22:49:49 +00:00
while (n--) {
o[random.pick(keys)] = random.pick(values)
2017-04-22 22:49:49 +00:00
}
return o
}
2018-05-21 16:04:34 +00:00
static makeLoop (s, max) {
return `for (let i = 0; i < ${max || make.number.tiny()}; i++) {${s}}`
2018-05-21 16:04:34 +00:00
}
static makeRandomOptions (baseObject) {
2017-05-02 14:01:32 +00:00
let o = {}
let unique = random.subset(Object.keys(baseObject))
2017-05-02 14:01:32 +00:00
for (let i = 0; i < unique.length; i++) {
o[unique[i]] = random.pick(baseObject[unique[i]])
2017-04-22 22:49:49 +00:00
}
return JSON.stringify(o)
}
2018-05-21 16:04:34 +00:00
static methodCall (objectName, methodHash) {
if (!utils.common.getKeysFromHash(methodHash).length || !objectName) {
return ''
2018-04-06 17:45:19 +00:00
}
2018-05-21 16:04:34 +00:00
let methodName = random.key(methodHash)
let methodArgs = methodHash[methodName]
if (typeof (methodArgs) === 'function') { // Todo: Hmmmm..
return methodArgs()
}
return `${objectName}.${methodName}${script.methodHead(methodArgs)}`
}
2018-05-21 16:04:34 +00:00
static methodHead (list, numOptional) {
if (isNaN(numOptional)) {
numOptional = 0
2017-04-22 22:49:49 +00:00
}
2018-05-21 16:04:34 +00:00
let arity = list.length - random.number(numOptional)
let params = []
for (let i = 0; i < arity; i++) {
params.push(random.pick([list[i]]))
2017-04-22 22:49:49 +00:00
}
2018-05-21 16:04:34 +00:00
return `(${params.join(', ')})`
}
2018-05-21 16:17:48 +00:00
static offset (s) {
return `(${random.number()} % ${s})`
}
2018-08-22 19:35:03 +00:00
/**
* Wrap command(s) in setInterval, setTimeout, loop or run directly
* @param {string|string[]} cmds - Command(s) to be executed
2018-08-27 23:39:19 +00:00
* @returns {array}
2018-08-22 19:35:03 +00:00
*/
2018-05-21 16:18:09 +00:00
static runner (cmds) {
cmds = (Array.isArray(cmds)) ? cmds : [cmds]
2018-08-22 19:35:03 +00:00
cmds = cmds.filter((i) => i !== undefined)
2018-05-21 16:18:09 +00:00
if (cmds.length) {
2018-08-27 23:00:00 +00:00
// Wrap each command in try/catch for use in setInterval, setTimeout, repeater
switch (random.number(50)) {
case 0:
2018-08-27 23:39:19 +00:00
return [`setInterval(function () { ${script.safely(cmds)} }, ${random.range(100, 400)} )`]
2018-08-27 23:00:00 +00:00
case 1:
2018-08-27 23:39:19 +00:00
return [`setTimeout(function () { ${script.safely(cmds)} }, ${random.range(100, 400)} )`]
2018-08-27 23:00:00 +00:00
case 2:
2018-08-27 23:39:19 +00:00
return [`for (let i = 0; i < ${random.number(random.number(30))}; i++) { ${script.safely(cmds)} }`]
2018-08-27 23:00:00 +00:00
default:
2018-08-27 23:39:19 +00:00
return cmds
2018-05-21 16:18:09 +00:00
}
}
}
2018-05-21 16:04:34 +00:00
static safely (obj) {
if (Array.isArray(obj)) {
return obj.map(s => utils.script.safely(s)).join(' ')
} else {
return `try { ${obj} } catch(e) { }`
}
}
2018-05-21 16:04:34 +00:00
static setAttribute (objectName, attributeHash) {
if (!utils.common.getKeysFromHash(attributeHash).length || !objectName) {
return ''
}
let attributeName = random.key(attributeHash)
let attributeValue = random.pick(attributeHash[attributeName])
let operator = ' = '
/*
if (typeof(attributeValue) == "number" && Random.chance(8)) {
operator = " " + Make.randomAssignmentOperator() + " ";
}
if (typeof(attributeValue) == "string") {
attributeValue = "'" + attributeValue + "'";
}
*/
return `${objectName}.${attributeName}${operator}${attributeValue};`
2017-04-22 22:49:49 +00:00
}
}
module.exports = script