{"id":17356876,"url":"https://github.com/artpani4/matey","last_synced_at":"2026-05-03T01:32:02.565Z","repository":{"id":85520441,"uuid":"594226023","full_name":"artpani4/matey","owner":"artpani4","description":"Creating text interfaces for Deno","archived":false,"fork":false,"pushed_at":"2023-08-18T11:38:13.000Z","size":169,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-05T13:01:56.088Z","etag":null,"topics":["cli","cli-app","command-line","command-line-tool","deno","shell","terminal","ts","typescript"],"latest_commit_sha":null,"homepage":"https://deno.land/x/matey","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"lgpl-2.1","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/artpani4.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-01-27T22:31:42.000Z","updated_at":"2024-08-21T07:32:07.000Z","dependencies_parsed_at":null,"dependency_job_id":"fdfa4ba9-c323-473b-8208-965cff2ceeea","html_url":"https://github.com/artpani4/matey","commit_stats":null,"previous_names":["artpani4/matey"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/artpani4/matey","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artpani4%2Fmatey","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artpani4%2Fmatey/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artpani4%2Fmatey/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artpani4%2Fmatey/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/artpani4","download_url":"https://codeload.github.com/artpani4/matey/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artpani4%2Fmatey/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":271078587,"owners_count":24695473,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-18T02:00:08.743Z","response_time":89,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","cli-app","command-line","command-line-tool","deno","shell","terminal","ts","typescript"],"created_at":"2024-10-15T18:59:06.897Z","updated_at":"2026-05-03T01:32:02.527Z","avatar_url":"https://github.com/artpani4.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Matey\n[![deno.land/x/matey](https://shield.deno.dev/x/matey)](https://deno.land/x/matey)\n\nMatey - модуль для построения обработчиков консольных команд с субкомандами, аргументами, опциями и флагами.\n\nMatey содержит две основные сущности: _Cli_ и _ComandBuilder_. _Cli_ - это класс, который хранит все команды, промежуточное программное обеспечение. _CommandBuilder_ - это класс, который позволяет создавать команды, добавлять их в _Cli_ и настраивать их (опции, флаги, аргументы, субкоманды и т.д.).\n\nКоманды могут быть вложенными, что позволяет создавать сложные консольные приложения.\n\n\u003e Планируется поддержка диалогового ввода-вывода.\n\n---\n\n## Оглавление\n\n- [Matey](#matey)\n  - [Оглавление](#оглавление)\n  - [Использование](#использование)\n    - [Схематичный пример](#схематичный-пример)\n    - [Пример использования (отправка email)](#пример-использования-отправка-email)\n  - [Middleware](#middleware)\n\n## Использование\n\n### Схематичный пример\n\n\u003e 🔧 Аргументы-**опции**(которые хранят какое-то полезное значение) каждой команды описываются в виде\n\n```ts\nconst argA_1: ICommandArgument = {\n  name: 'argA_1',\n  description: 'argA_1 description',\n  type: ArgumentType.OPTION,\n  valueValidator: (val: string) =\u003e val.length \u003e 0,\n  optionNameRequired: true,\n  required: true,\n};\n```\n\n\u003e 🚩 Аргументы-**флаги**(наличие которых само по себе влияет на логику обработчика) каждой команды описываются в виде\n\n```ts\nconst argA_2: ICommandArgument = {\n  name: 'argA_2',\n  description: 'argA_2 description',\n  type: ArgumentType.FLAG,\n  required: false,\n};\n```\n\n\u003e ⚡ Сама команда собирается так\n\n```ts\nconst cmdA = new CliCommandBuilder()\n  .setName('cmdA')\n  .setDescription('cmdA description')\n  .addArgument(argA_1)\n  .addArgument(argA_2)\n  .addSubcommand(subA)\n  .setHandler(handlerA)\n  .build();\n```\n\n\u003e 🛡️ После создания команды, ее можно добавить в _Cli_\\\n\u003e При необходимости, можно добавить промежуточное программное обеспечение (middleware)\n\n```ts\nconst cli = new Cli();\ncli\n  .addCommand(cmdA)\n  .addCommand(cmdB)\n  .addCommand(cmdC)\n  .use(rexExpA, handlerA)\n  .use(rexExpB, handlerB);\n```\n\n\u003e 🚀 Выполнение команды происходит так\n\n```ts\ncli.execute`cmdA --argA_1 \"Hello\" --argA_2 150`;\n```\n\n### Пример использования (отправка email)\n\nКоманда для отправки email выглядит одним из следующих вариантов:\n\n- _email \\\u003cemail\\\u003e \\\u003cmessage\\\u003e_\n- _email --email \\\u003cemail\\\u003e --msg \\\u003cmessage\\\u003e_\n\nОбработчик команды будет принимать два аргумента: _--email_ и _--msg_, затем будет \"отправлять\" сообщение по указанному адресу.\n\n```ts\nconst emailHandler = (options: HandlerArgs) =\u003e {\n  console.log(\n    `Email sent to ${options['--email']} with message: ${\n      options['--msg']\n    }`,\n  );\n};\n```\n\nДобавить команду и ее аргументы можно с помощью _CommandBuilder_:\n\n```ts\nimport {\n  ArgumentType,\n  Cli,\n  CliCommandBuilder,\n  HandlerArgs,\n  validateFunctions,\n} from '../mod.ts';\n\nconst emailCommand = new CliCommandBuilder()\n  .setName('email')\n  .setDescription('Send an email to a specified email address')\n  .addArgument({\n    name: '--email',\n    description: 'The email address to send the email to',\n    type: ArgumentType.OPTION,\n    valueValidator: validateFunctions.emailValidate,\n    required: true,\n  })\n  .addArgument({\n    name: '--msg',\n    description: 'The message to include in the email',\n    type: ArgumentType.OPTION,\n    required: true,\n  })\n  .setHandler(emailHandler)\n  .build();\n```\n\n\u003e Вместо _validateFunctions.emailValidate_ можно использовать свою функцию вида _string =\u003e boolean_\n\nЭкземпляр _Cli_ хранит все команды и промежуточное программное обеспечение. Добавить команду в _Cli_ можно с помощью метода _addCommand_, выполнить команду с помощью метода _execute_:\n\n```ts\nconst cli = new Cli();\ncli.addCommand(emailCommand);\n\nawait cli.execute`email example@example.com \"Hello, World!\"`;\n```\n\n[![Typing SVG](https://readme-typing-svg.demolab.com?font=Fira+Code\u0026duration=2000\u0026pause=3000\u0026width=800\u0026lines=Email+sent+to+example%40example.com+with+message%3A+%22Hello%2C+World!%22)](https://git.io/typing-svg)\n\n---\n\n[Пример](examples/commit/mod.ts) генерации коммита с помощью OpenAI API.\n\n## Middleware\n\nЕсли перед срабатыванием обработчика команды нужно дополнительно обработать запрос, можно использовать middleware-функции. Данные функции возвращают true/false. Обработчик команды срабатывает в том случае, если все middleware-функции вернули true. Если хотя бы одна из них вернула false, цепочка обработки прерывается.\n\n```ts\n//middleware.ts\nconst helpMiddleware = {\n  pattern: / help /,\n  handler: (lexemes: ILexeme[]) =\u003e {\n    const toHelpCmds = lexemes.filter((lexeme) =\u003e {\n      return lexeme.type === LexemeType.COMMAND;\n    }).map((cmd) =\u003e cmd.content);\n    console.log(`Find commands ${toHelpCmds} `);\n    return false;\n  },\n};\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fartpani4%2Fmatey","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fartpani4%2Fmatey","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fartpani4%2Fmatey/lists"}