logseq-electron-op-sim.cjs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. 'use strict';
  2. const OPERATION_ORDER = Object.freeze([
  3. 'add',
  4. 'copyPaste',
  5. 'copyPasteTreeToEmptyTarget',
  6. 'move',
  7. 'indent',
  8. 'outdent',
  9. 'delete',
  10. 'undo',
  11. 'redo',
  12. ]);
  13. function buildOperationPlan(totalOps) {
  14. if (!Number.isInteger(totalOps) || totalOps <= 0) {
  15. throw new Error('totalOps must be a positive integer');
  16. }
  17. const plan = [];
  18. for (let i = 0; i < totalOps; i += 1) {
  19. plan.push(OPERATION_ORDER[i % OPERATION_ORDER.length]);
  20. }
  21. return plan;
  22. }
  23. function chooseRunnableOperation(requestedOperation, managedCount) {
  24. switch (requestedOperation) {
  25. case 'copyPaste':
  26. case 'copyPasteTreeToEmptyTarget':
  27. return managedCount >= 1 ? requestedOperation : 'add';
  28. case 'move':
  29. case 'indent':
  30. case 'delete':
  31. return managedCount >= 2 ? requestedOperation : 'add';
  32. case 'outdent':
  33. case 'add':
  34. case 'undo':
  35. case 'redo':
  36. return requestedOperation;
  37. default:
  38. throw new Error(`Unsupported operation kind: ${requestedOperation}`);
  39. }
  40. }
  41. function parsePositiveInteger(value, flagName) {
  42. const parsed = Number.parseInt(value, 10);
  43. if (!Number.isInteger(parsed) || parsed <= 0) {
  44. throw new Error(`${flagName} must be a positive integer`);
  45. }
  46. return parsed;
  47. }
  48. function parseNonNegativeInteger(value, flagName) {
  49. const parsed = Number.parseInt(value, 10);
  50. if (!Number.isInteger(parsed) || parsed < 0) {
  51. throw new Error(`${flagName} must be a non-negative integer`);
  52. }
  53. return parsed;
  54. }
  55. function parseArgs(argv) {
  56. const result = {
  57. ops: 200,
  58. port: 9333,
  59. undoRedoDelayMs: 350,
  60. };
  61. for (let i = 0; i < argv.length; i += 1) {
  62. const arg = argv[i];
  63. if (arg === '--help' || arg === '-h') {
  64. return { ...result, help: true };
  65. }
  66. const next = argv[i + 1];
  67. if (arg === '--ops') {
  68. result.ops = parsePositiveInteger(next, '--ops');
  69. i += 1;
  70. continue;
  71. }
  72. if (arg === '--port') {
  73. result.port = parsePositiveInteger(next, '--port');
  74. i += 1;
  75. continue;
  76. }
  77. if (arg === '--undo-redo-delay-ms') {
  78. result.undoRedoDelayMs = parseNonNegativeInteger(next, '--undo-redo-delay-ms');
  79. i += 1;
  80. continue;
  81. }
  82. throw new Error(`Unknown argument: ${arg}`);
  83. }
  84. if (result.ops < 200) {
  85. throw new Error('--ops must be at least 200');
  86. }
  87. return result;
  88. }
  89. module.exports = {
  90. OPERATION_ORDER,
  91. buildOperationPlan,
  92. chooseRunnableOperation,
  93. parseArgs,
  94. };