Nesting
Directives can be nested to define different structures as required:
export default {
scripts: {
"$catch ($pre (yourScript))": "someCommand0",
"$pre (yourScript)": "someCommand1",
"yourScript": "someCommand2",
"$post (yourScript)": "someCommand3"
"$post ($pre (yourScript))": "someCommand4"
}
}
You can disable scripts defined with directives:
export default {
scripts: {
"$disable ($catch ($pre (yourScript)))": "someCommand0",
"$pre (yourScript)": "someCommand1",
"yourScript": "someCommand2",
"$disable ($post (yourScript))": "someCommand3"
"$post ($pre (yourScript))": "someCommand4"
}
}
You can add comments to scripts defined with directives:
export default {
scripts: {
"$pre (yourScript)": "someCommand0",
"$comment ($pre (yourScript))": "This script will ..."
"yourScript": "someCommand",
}
}
An Example
import { styleText } from 'node:util'
function combine(letters) {
const result = []
for(const letter1 of letters)
for(const letter2 of letters) {
result.push(`${letter1}${letter2}`)
for(const letter3 of letters)
result.push(`${letter1}${letter2}${letter3}`)
}
return result
}
const near = new Map([
['q', 'qwa'], ['w', 'wqase'], ['e', 'ewsdr'], ['r', 'redft'], ['t', 'trfgy'], ['y', 'ytghu'],
['u','uyhji'], ['i','iujko'], ['o', 'oiklp'], ['p', 'pol'], ['a', 'aqwsz'], ['s', 'sqazxdew'],
['d', 'dwsxcfre'], ['f', 'fedcvgtr'], ['g', 'grfvbhyt'], ['h', 'htgbjuy'], ['j', 'jyhnmkiu'],
['k', 'kujmloi'], ['l', 'lpok'], ['z', 'zxsa'], ['x', 'xcdsz'], ['c', 'cxdfv'], ['v', 'vcfgb'],
['b', 'bvghn'], ['n', 'nbhjm'], ['m', 'mnjk']
])
function combineNear(letters) {
const result = []
for(const letter1 of letters) {
const neighbor1 = near.get(letter1)
for(const letter2 of letters)
if (neighbor1.indexOf(letter2) !== -1) {
result.push(`${letter1}${letter2}`)
const neighbor2 = near.get(letter2)
for(const letter3 of letters)
if (neighbor1.indexOf(letter3) !== -1 || neighbor2.indexOf(letter3) !== -1)
result.push(`${letter1}${letter2}${letter3}`)
}
}
return result
}
function find(arg1, combiner) {
console.log(`from: ${arg1}`)
const permutations = combiner(arg1)
console.log(`time: ~${(permutations.length / 20).toFixed(2)} minutes`)
process.env.check_list = JSON.stringify(permutations)
return "start"
}
const all = 'qwertyuiopasdfghjklzxcvbnm'
export default {
scripts: {
"find-near": (arg1) => find(arg1, combineNear),
find: (arg1) => find(arg1, combine),
"find-all-near": () => find(all, combineNear),
"find-all": () => find(all, combine),
iterate: (index, from) => {
const n = parseInt(index)
const letters = JSON.parse(from)
const length = letters.length
n != 0 && process.stdout.write(` | ${n}/${length} (${((length - n) / 20).toFixed(2)} m) > `)
process.env.check_name = letters[n]
process.env.check_list = from
process.env.check_n = n + 1
return n < length ? "check" : "end"
},
start: 'echo -n [ \\"\\"> available.json && echo -n [ \\"\\" > used.json && jko -l=e iterate 0 $check_list',
end: "echo ] >> available.json && echo ] >> used.json",
checkName: "npm info $jko_arg_0 1>/dev/null 2>/dev/null",
"$post (checkName)": function (arg1) {
process.stdout.write(`${styleText('red', 'Used:')}${arg1}`)
},
"$post ($post (checkName))": 'echo -n ,\\"$jko_arg_0\\" >> used.json',
"$catch (checkName)": function (arg1) {
process.stdout.write(`${styleText('green', '********* Found: ')}${styleText('bold', arg1)}${styleText('green', ' *********')}`)
},
"$post ($catch (checkName))": 'echo -n ,\\"$jko_arg_0\\" >> available.json',
check: "sleep 1.5 && jko -l=e checkName $check_name && jko -l=e iterate $check_n $check_list"
}
}