mirror of
https://github.com/logseq/logseq.git
synced 2026-05-01 01:16:27 +00:00
110 lines
2.4 KiB
JavaScript
110 lines
2.4 KiB
JavaScript
'use strict';
|
|
|
|
const OPERATION_ORDER = Object.freeze([
|
|
'add',
|
|
'copyPaste',
|
|
'copyPasteTreeToEmptyTarget',
|
|
'move',
|
|
'indent',
|
|
'outdent',
|
|
'delete',
|
|
'undo',
|
|
'redo',
|
|
]);
|
|
|
|
function buildOperationPlan(totalOps) {
|
|
if (!Number.isInteger(totalOps) || totalOps <= 0) {
|
|
throw new Error('totalOps must be a positive integer');
|
|
}
|
|
|
|
const plan = [];
|
|
for (let i = 0; i < totalOps; i += 1) {
|
|
plan.push(OPERATION_ORDER[i % OPERATION_ORDER.length]);
|
|
}
|
|
return plan;
|
|
}
|
|
|
|
function chooseRunnableOperation(requestedOperation, managedCount) {
|
|
switch (requestedOperation) {
|
|
case 'copyPaste':
|
|
case 'copyPasteTreeToEmptyTarget':
|
|
return managedCount >= 1 ? requestedOperation : 'add';
|
|
case 'move':
|
|
case 'indent':
|
|
case 'delete':
|
|
return managedCount >= 2 ? requestedOperation : 'add';
|
|
case 'outdent':
|
|
case 'add':
|
|
case 'undo':
|
|
case 'redo':
|
|
return requestedOperation;
|
|
default:
|
|
throw new Error(`Unsupported operation kind: ${requestedOperation}`);
|
|
}
|
|
}
|
|
|
|
function parsePositiveInteger(value, flagName) {
|
|
const parsed = Number.parseInt(value, 10);
|
|
if (!Number.isInteger(parsed) || parsed <= 0) {
|
|
throw new Error(`${flagName} must be a positive integer`);
|
|
}
|
|
return parsed;
|
|
}
|
|
|
|
function parseNonNegativeInteger(value, flagName) {
|
|
const parsed = Number.parseInt(value, 10);
|
|
if (!Number.isInteger(parsed) || parsed < 0) {
|
|
throw new Error(`${flagName} must be a non-negative integer`);
|
|
}
|
|
return parsed;
|
|
}
|
|
|
|
function parseArgs(argv) {
|
|
const result = {
|
|
ops: 200,
|
|
port: 9333,
|
|
undoRedoDelayMs: 350,
|
|
};
|
|
|
|
for (let i = 0; i < argv.length; i += 1) {
|
|
const arg = argv[i];
|
|
if (arg === '--help' || arg === '-h') {
|
|
return { ...result, help: true };
|
|
}
|
|
|
|
const next = argv[i + 1];
|
|
if (arg === '--ops') {
|
|
result.ops = parsePositiveInteger(next, '--ops');
|
|
i += 1;
|
|
continue;
|
|
}
|
|
|
|
if (arg === '--port') {
|
|
result.port = parsePositiveInteger(next, '--port');
|
|
i += 1;
|
|
continue;
|
|
}
|
|
|
|
if (arg === '--undo-redo-delay-ms') {
|
|
result.undoRedoDelayMs = parseNonNegativeInteger(next, '--undo-redo-delay-ms');
|
|
i += 1;
|
|
continue;
|
|
}
|
|
|
|
throw new Error(`Unknown argument: ${arg}`);
|
|
}
|
|
|
|
if (result.ops < 200) {
|
|
throw new Error('--ops must be at least 200');
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
module.exports = {
|
|
OPERATION_ORDER,
|
|
buildOperationPlan,
|
|
chooseRunnableOperation,
|
|
parseArgs,
|
|
};
|