commander.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.fCallArguments = exports.transformCommandReply = exports.transformLegacyCommandArguments = exports.transformCommandArguments = exports.attachExtensions = exports.attachCommands = void 0;
  4. const command_options_1 = require("./command-options");
  5. function attachCommands({ BaseClass, commands, executor }) {
  6. for (const [name, command] of Object.entries(commands)) {
  7. BaseClass.prototype[name] = function (...args) {
  8. return executor.call(this, command, args, name);
  9. };
  10. }
  11. }
  12. exports.attachCommands = attachCommands;
  13. function attachExtensions(config) {
  14. let Commander;
  15. if (config.modules) {
  16. Commander = attachWithNamespaces({
  17. BaseClass: config.BaseClass,
  18. namespaces: config.modules,
  19. executor: config.modulesExecutor
  20. });
  21. }
  22. if (config.functions) {
  23. Commander = attachWithNamespaces({
  24. BaseClass: Commander ?? config.BaseClass,
  25. namespaces: config.functions,
  26. executor: config.functionsExecutor
  27. });
  28. }
  29. if (config.scripts) {
  30. Commander ?? (Commander = class extends config.BaseClass {
  31. });
  32. attachCommands({
  33. BaseClass: Commander,
  34. commands: config.scripts,
  35. executor: config.scriptsExecutor
  36. });
  37. }
  38. return Commander ?? config.BaseClass;
  39. }
  40. exports.attachExtensions = attachExtensions;
  41. function attachWithNamespaces({ BaseClass, namespaces, executor }) {
  42. const Commander = class extends BaseClass {
  43. constructor(...args) {
  44. super(...args);
  45. for (const namespace of Object.keys(namespaces)) {
  46. this[namespace] = Object.create(this[namespace], {
  47. self: {
  48. value: this
  49. }
  50. });
  51. }
  52. }
  53. };
  54. for (const [namespace, commands] of Object.entries(namespaces)) {
  55. Commander.prototype[namespace] = {};
  56. for (const [name, command] of Object.entries(commands)) {
  57. Commander.prototype[namespace][name] = function (...args) {
  58. return executor.call(this.self, command, args, name);
  59. };
  60. }
  61. }
  62. return Commander;
  63. }
  64. function transformCommandArguments(command, args) {
  65. let options;
  66. if ((0, command_options_1.isCommandOptions)(args[0])) {
  67. options = args[0];
  68. args = args.slice(1);
  69. }
  70. return {
  71. jsArgs: args,
  72. args: command.transformArguments(...args),
  73. options
  74. };
  75. }
  76. exports.transformCommandArguments = transformCommandArguments;
  77. function transformLegacyCommandArguments(args) {
  78. return args.flat().map(arg => {
  79. return typeof arg === 'number' || arg instanceof Date ?
  80. arg.toString() :
  81. arg;
  82. });
  83. }
  84. exports.transformLegacyCommandArguments = transformLegacyCommandArguments;
  85. function transformCommandReply(command, rawReply, preserved) {
  86. if (!command.transformReply) {
  87. return rawReply;
  88. }
  89. return command.transformReply(rawReply, preserved);
  90. }
  91. exports.transformCommandReply = transformCommandReply;
  92. function fCallArguments(name, fn, args) {
  93. const actualArgs = [
  94. fn.IS_READ_ONLY ? 'FCALL_RO' : 'FCALL',
  95. name
  96. ];
  97. if (fn.NUMBER_OF_KEYS !== undefined) {
  98. actualArgs.push(fn.NUMBER_OF_KEYS.toString());
  99. }
  100. actualArgs.push(...args);
  101. return actualArgs;
  102. }
  103. exports.fCallArguments = fCallArguments;