{"id":96194,"date":"2025-02-06T01:43:39","date_gmt":"2025-02-05T22:13:39","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/how-to-build-a-cli-using-typescript-and-bun-2afo\/"},"modified":"2025-02-06T01:43:39","modified_gmt":"2025-02-05T22:13:39","slug":"how-to-build-a-cli-using-typescript-and-bun-2afo","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/how-to-build-a-cli-using-typescript-and-bun-2afo\/","title":{"rendered":"\u0646\u062d\u0648\u0647 \u0633\u0627\u062e\u062a CLI \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 TypeScript \u0648 Bun"},"content":{"rendered":"<div data-article-id=\"2261154\" id=\"article-body\">\n<p>\u0631\u0627\u0628\u0637 \u062e\u0637 \u0641\u0631\u0645\u0627\u0646 (CLI) \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u06cc \u0627\u0633\u062a \u06a9\u0647 \u062f\u0631 \u062a\u0631\u0645\u06cc\u0646\u0627\u0644 \u0627\u062c\u0631\u0627 \u0645\u06cc \u0634\u0648\u062f. \u0648\u0631\u0648\u062f\u06cc \u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u060c \u062f\u0633\u062a\u0648\u0631\u0627\u062a \u0631\u0627 \u067e\u0631\u062f\u0627\u0632\u0634 \u0645\u06cc \u06a9\u0646\u062f \u0648 \u062a\u0648\u0627\u0628\u0639 \u0633\u06cc\u0633\u062a\u0645 \u0631\u0627 \u0627\u062c\u0631\u0627 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>\u062f\u0631 \u0627\u0648\u0627\u06cc\u0644 \u0645\u062d\u0627\u0633\u0628\u0627\u062a \u060c \u062a\u0631\u0645\u06cc\u0646\u0627\u0644 \u062a\u0646\u0647\u0627 \u0631\u0627\u0647 \u062a\u0639\u0627\u0645\u0644 \u0628\u0627 \u0631\u0627\u06cc\u0627\u0646\u0647 \u0628\u0648\u062f. \u0627\u0645\u0631\u0648\u0632 \u060c \u0628\u06cc\u0634\u062a\u0631 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0631\u0627\u06cc\u0627\u0646\u0647 \u062e\u0648\u062f \u0628\u0647 \u0631\u0627\u0628\u0637 \u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u06af\u0631\u0627\u0641\u06cc\u06a9\u06cc (GUI) \u0645\u062a\u06a9\u06cc \u0647\u0633\u062a\u0646\u062f &#8211; \u0628\u0631\u062e\u06cc \u062d\u062a\u06cc \u0646\u0645\u06cc \u062f\u0627\u0646\u0646\u062f \u06a9\u0647 \u0632\u0645\u0627\u0646\u06cc \u0645\u0627\u0646\u0646\u062f \u0622\u0646 \u0648\u062c\u0648\u062f \u062f\u0627\u0634\u062a\u0647 \u0627\u0633\u062a :). \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644 \u060c \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u062a\u0648\u0633\u0639\u0647 \u062f\u0647\u0646\u062f\u0647 \u0646\u0631\u0645 \u0627\u0641\u0632\u0627\u0631 \u060c CLI \u0628\u062e\u0634 \u0645\u0647\u0645\u06cc \u0627\u0632 \u0646\u0648\u0627\u0631 \u0627\u0628\u0632\u0627\u0631 \u062a\u0648\u0633\u0639\u0647 \u0634\u0645\u0627 \u0627\u0633\u062a. \u0645\u0627 \u0628\u0647 \u0637\u0648\u0631 \u0645\u06a9\u0631\u0631 \u0627\u0632 \u0622\u0646 \u0628\u0631\u0627\u06cc \u0646\u0635\u0628 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u060c \u062a\u0646\u0638\u06cc\u0645\u0627\u062a Docker \u0648 \u0686\u0646\u062f\u06cc\u0646 \u0627\u062a\u0648\u0645\u0627\u0633\u06cc\u0648\u0646 \u062f\u06cc\u06af\u0631 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u063a\u06cc\u0631 \u0639\u0645\u0644\u06cc \u0628\u0627 GUI \u0647\u0633\u062a\u0646\u062f.<\/p>\n<p>\u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634 \u0628\u0647 \u0634\u0645\u0627 \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f CLI \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 TypeScript \u0648 Bun-\u06cc\u06a9 \u0632\u0645\u0627\u0646 \u0627\u062c\u0631\u0627 \u0633\u0631\u06cc\u0639 \u0648 \u0647\u0645\u0647 \u062f\u0631 \u06cc\u06a9 \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a-\u0633\u0627\u062e\u062a. \u0627\u06af\u0631 \u0641\u06cc\u0644\u0645 \u0631\u0627 \u062a\u0631\u062c\u06cc\u062d \u0645\u06cc \u062f\u0647\u06cc\u062f \u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u06cc\u0646 \u0648\u06cc\u062f\u06cc\u0648\u06cc YouTube \u0631\u0627 \u0645\u0634\u0627\u0647\u062f\u0647 \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u062d\u0627\u0648\u06cc \u0647\u0645\u0627\u0646 \u0645\u062d\u062a\u0648\u0627 \u0627\u0633\u062a.<\/p>\n<p><a href=\"https:\/\/www.youtube.com\/watch\u061fv=nyvdxzdksuc\" rel=\"nofollow noopener\" target=\"_blank\">https:\/\/www.youtube.com\/watch\u061fv=nyvdxzdksuc<\/a><br \/>\n<\/iframe>\n <\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_85 counter-hierarchy ez-toc-counter-rtl ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/nabfollower.com\/blog\/how-to-build-a-cli-using-typescript-and-bun-2afo\/#%D8%A2%D9%86%DA%86%D9%87_%D9%85%DB%8C_%D8%AE%D9%88%D8%A7%D9%87%DB%8C%D8%AF_%D8%A8%D8%B3%D8%A7%D8%B2%DB%8C%D8%AF\" >\u0622\u0646\u0686\u0647 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u0628\u0633\u0627\u0632\u06cc\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/how-to-build-a-cli-using-typescript-and-bun-2afo\/#%D8%AA%D9%86%D8%B8%DB%8C%D9%85_%D9%88_%D8%B3%D8%A7%D8%AE%D8%AA%D8%A7%D8%B1_%D9%BE%D8%B1%D9%88%DA%98%D9%87\" >\u062a\u0646\u0638\u06cc\u0645 \u0648 \u0633\u0627\u062e\u062a\u0627\u0631 \u067e\u0631\u0648\u0698\u0647<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/how-to-build-a-cli-using-typescript-and-bun-2afo\/#%D8%A7%D8%B3%D8%AA%D8%AF%D9%84%D8%A7%D9%84_%D9%87%D8%A7%DB%8C_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_%D8%B1%D8%A7_%D8%AA%D8%B9%D8%B1%DB%8C%D9%81_%DA%A9%D9%86%DB%8C%D8%AF\" >\u0627\u0633\u062a\u062f\u0644\u0627\u0644 \u0647\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0646\u06cc\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/nabfollower.com\/blog\/how-to-build-a-cli-using-typescript-and-bun-2afo\/#%D8%A8%D8%A7%D8%B1%DA%AF%D8%B0%D8%A7%D8%B1%DB%8C_%D9%BE%D8%B1%D9%88%D9%86%D8%AF%D9%87_%D9%87%D8%A7_%D8%A8%D8%A7_%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87_%D8%A7%D8%B2_%D9%85%D8%B4%D8%AA%D8%B1%DB%8C_S3_Bun\" >\u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u067e\u0631\u0648\u0646\u062f\u0647 \u0647\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0645\u0634\u062a\u0631\u06cc S3 Bun<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/nabfollower.com\/blog\/how-to-build-a-cli-using-typescript-and-bun-2afo\/#%D9%86%D8%AD%D9%88%D9%87_%D8%A8%D8%B3%D8%AA%D9%87_%D8%A8%D9%86%D8%AF%DB%8C_%D9%88_%D8%A7%D9%86%D8%AA%D8%B4%D8%A7%D8%B1_CLI\" >\u0646\u062d\u0648\u0647 \u0628\u0633\u062a\u0647 \u0628\u0646\u062f\u06cc \u0648 \u0627\u0646\u062a\u0634\u0627\u0631 CLI<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/nabfollower.com\/blog\/how-to-build-a-cli-using-typescript-and-bun-2afo\/#%D8%A8%D8%B3%D8%AA%D9%87_%D8%A8%D9%86%D8%AF%DB%8C_%DA%A9%D8%B1%D8%AF%D9%86\" >\u0628\u0633\u062a\u0647 \u0628\u0646\u062f\u06cc \u06a9\u0631\u062f\u0646<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D8%A2%D9%86%DA%86%D9%87_%D9%85%DB%8C_%D8%AE%D9%88%D8%A7%D9%87%DB%8C%D8%AF_%D8%A8%D8%B3%D8%A7%D8%B2%DB%8C%D8%AF\"><\/span>\n<p>  \u0622\u0646\u0686\u0647 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u0628\u0633\u0627\u0632\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634 \u0634\u0645\u0627 \u0631\u0627 \u06af\u0627\u0645 \u0628\u0647 \u06af\u0627\u0645 \u062f\u0631 \u0633\u0627\u062e\u062a CLI \u0628\u0631\u0627\u06cc \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u067e\u0631\u0648\u0646\u062f\u0647 \u0647\u0627 \u06cc\u0627 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0647\u0627 \u062f\u0631 \u0630\u062e\u06cc\u0631\u0647 \u0633\u0627\u0632\u06af\u0627\u0631 \u0628\u0627 S3 \u0631\u0627\u0647\u0646\u0645\u0627\u06cc\u06cc \u0645\u06cc \u06a9\u0646\u062f. \u0628\u0627 \u067e\u0627\u06cc\u0627\u0646 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634 \u060c \u0634\u0645\u0627 \u0645\u06cc \u062f\u0627\u0646\u06cc\u062f \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 \u0627\u0633\u062a\u062f\u0644\u0627\u0644 \u0647\u0627\u06cc \u062e\u0637 \u0641\u0631\u0645\u0627\u0646 \u0631\u0627 \u062a\u062c\u0632\u06cc\u0647 \u06a9\u0646\u06cc\u062f \u0648 CLI \u062e\u0648\u062f \u0631\u0627 \u0628\u0647 \u0645\u0646\u062a\u0634\u0631 \u06a9\u0646\u06cc\u062f <em>NPM<\/em> \u0631\u062c\u06cc\u0633\u062a\u0631\u06cc \u0645\u0627 \u0627\u0632 S3 API \u062f\u0631 Bun \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f <em>\u0645\u06cc\u0645\u0648\u0646<\/em>\u060c \u06cc\u06a9 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 CLI Helper \u06a9\u0647 \u067e\u0631\u0686\u0645 \u0647\u0627 \u0631\u0627 \u062a\u062c\u0632\u06cc\u0647 \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0628\u0647 \u0622\u0646\u0647\u0627 \u06a9\u0645\u06a9 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0646\u06af\u0627\u0647\u06cc \u0627\u062c\u0645\u0627\u0644\u06cc \u0628\u0647 \u0622\u0646\u0686\u0647 \u0634\u0645\u0627 \u062a\u0627 \u067e\u0627\u06cc\u0627\u0646 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634 \u0627\u06cc\u062c\u0627\u062f \u062e\u0648\u0627\u0647\u06cc\u062f \u06a9\u0631\u062f.<\/p>\n<p><\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D8%AA%D9%86%D8%B8%DB%8C%D9%85_%D9%88_%D8%B3%D8%A7%D8%AE%D8%AA%D8%A7%D8%B1_%D9%BE%D8%B1%D9%88%DA%98%D9%87\"><\/span>\n<p>  \u062a\u0646\u0638\u06cc\u0645 \u0648 \u0633\u0627\u062e\u062a\u0627\u0631 \u067e\u0631\u0648\u0698\u0647<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u0628\u0627 \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u067e\u0631\u0648\u0698\u0647 BON \u0648 \u0646\u0635\u0628 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0647\u0627\u06cc \u0644\u0627\u0632\u0645 \u0634\u0631\u0648\u0639 \u06a9\u0646\u06cc\u0645. \u062a\u0631\u0645\u06cc\u0646\u0627\u0644 \u062e\u0648\u062f \u0631\u0627 \u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f \u0648 \u062f\u0633\u062a\u0648\u0631 \u0632\u06cc\u0631 \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"nb\">mkdir <\/span>s3upload <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">cd <\/span>s3upload\nbun init <span class=\"nt\">-y<\/span>\nbun add meow\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062f\u0633\u062a\u0648\u0631\u0627\u062a\u06cc \u06a9\u0647 \u0634\u0645\u0627 \u0628\u0647 \u062a\u0627\u0632\u06af\u06cc \u0627\u062c\u0631\u0627 \u06a9\u0631\u062f\u0647 \u0627\u06cc\u062f \u060c \u06cc\u06a9 \u067e\u0631\u0648\u0698\u0647 BON \u0628\u0647 \u0646\u0627\u0645 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0631\u062f\u0647 \u0627\u0633\u062a <strong>S3UPLOAD<\/strong>\u060c \u0648 \u0628\u0633\u062a\u0647 Meow \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0631\u062f. <em>\u0645\u06cc\u0645\u0648\u0646<\/em> \u062f\u0631 \u062a\u062c\u0632\u06cc\u0647 \u0648 \u062a\u062d\u0644\u06cc\u0644 \u0627\u0633\u062a\u062f\u0644\u0627\u0644 \u0647\u0627 \u0648 \u067e\u0631\u0686\u0645 \u0647\u0627 \u0648 \u0647\u0645\u0686\u0646\u06cc\u0646:<\/p>\n<ul>\n<li>\n<p>\u067e\u0631\u0686\u0645 \u0647\u0627 \u0631\u0627 \u0628\u0647 \u0634\u062a\u0631 \u062a\u0628\u062f\u06cc\u0644 \u0645\u06cc \u06a9\u0646\u062f<\/p>\n<\/li>\n<li>\n<p>\u0647\u0646\u06af\u0627\u0645 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u067e\u0631\u0686\u0645 \u0647\u0627 \u0646\u0641\u06cc \u0645\u06cc \u06a9\u0646\u062f <code>--no-<\/code> \u067e\u06cc\u0634\u0648\u0646\u062f<\/p>\n<\/li>\n<li>\n<p>\u0646\u0633\u062e\u0647 \u062e\u0631\u0648\u062c\u06cc \u0686\u0647 \u0632\u0645\u0627\u0646\u06cc <code>--version<\/code><\/p>\n<\/li>\n<li>\n<p>\u062a\u0648\u0636\u06cc\u062d\u0627\u062a \u062e\u0631\u0648\u062c\u06cc \u0648 \u0627\u0631\u0633\u0627\u0644 \u0645\u062a\u0646 \u06a9\u0645\u06a9 \u062f\u0631 \u0647\u0646\u06af\u0627\u0645 <code>--help<\/code><\/p>\n<\/li>\n<li>\n<p>\u0639\u0646\u0648\u0627\u0646 \u0641\u0631\u0622\u06cc\u0646\u062f \u0631\u0627 \u0628\u0647 \u0646\u0627\u0645 \u0628\u0627\u06cc\u0646\u0631\u06cc \u062a\u0639\u0631\u06cc\u0641 \u0634\u062f\u0647 \u062f\u0631 Pack.json \u062a\u0646\u0638\u06cc\u0645 \u0645\u06cc \u06a9\u0646\u062f<\/p>\n<\/li>\n<\/ul>\n<p>\u0645\u0627 \u06cc\u06a9 <em>index.ts<\/em> \u067e\u0631\u0648\u0646\u062f\u0647 \u0648 \u0627\u06cc\u0646 \u062c\u0627\u06cc\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u0627 \u062a\u0645\u0627\u0645 \u06a9\u062f \u0628\u0631\u0646\u0627\u0645\u0647 CLI \u062e\u0648\u062f \u0631\u0627 \u062d\u0641\u0638 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f. \u0628\u0627\u0632 \u06a9\u0631\u062f\u0646 <em>index.ts<\/em> \u067e\u0631\u0648\u0646\u062f\u0647 \u0647\u0627\u06cc \u062e\u0648\u062f \u0631\u0627 \u0628\u0627 \u0628\u06cc\u0627\u0646\u06cc\u0647 \u0647\u0627\u06cc \u0648\u0627\u0631\u062f\u0627\u062a \u0632\u06cc\u0631 \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646 \u06a9\u0646\u06cc\u062f \u0648 \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646 \u06a9\u0646\u06cc\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"cp\">#!\/usr\/bin\/env bun\n<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">S3Client<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">bun<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">basename<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">node:path<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">readdir<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">node:fs\/promises<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">meow<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">meow<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062f\u0631 \u06a9\u062f \u0641\u0648\u0642 \u060c \u0645\u0627 \u0648\u0627\u0631\u062f\u0627\u062a \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0631\u062f\u06cc\u0645 <code>S3Client<\/code> \u0628\u0631\u0627\u06cc \u062a\u0639\u0627\u0645\u0644 \u0628\u0627 \u0647\u0631 \u0630\u062e\u06cc\u0631\u0647 \u0633\u0627\u0632\u06cc \u0634\u06cc\u0621 \u0633\u0627\u0632\u06af\u0627\u0631 \u0628\u0627 S3. \u0645\u0627 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0634\u0627\u0645\u0644 <code>fs<\/code> \u0648\u062a <code>path<\/code> \u0645\u0627\u0698\u0648\u0644 \u0647\u0627\u06cc \u062e\u0648\u0627\u0646\u062f\u0646 \u067e\u0631\u0648\u0646\u062f\u0647 \u0647\u0627 \u0648 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0647\u0627 \u0628\u0639\u062f\u0627\u064b \u062f\u0631 \u0622\u0645\u0648\u0632\u0634. \u062f\u0631 \u0628\u0627\u0644\u0627\u06cc \u067e\u0631\u0648\u0646\u062f\u0647 \u060c \u0645\u062a\u0648\u062c\u0647 \u0628\u06cc\u0627\u0646\u06cc\u0647 Shebang \u062e\u0648\u0627\u0647\u06cc\u062f \u0634\u062f (<code>#!\/usr\/bin\/env bun<\/code>) \u06a9\u0647 \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0639\u0627\u0645\u0644 \u0645\u06cc \u06af\u0648\u06cc\u062f \u0628\u0631\u0627\u06cc \u0627\u062c\u0631\u0627\u06cc \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0627\u0632 \u0632\u0645\u0627\u0646 \u0627\u062c\u0631\u0627 Bun \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u062f.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D8%A7%D8%B3%D8%AA%D8%AF%D9%84%D8%A7%D9%84_%D9%87%D8%A7%DB%8C_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_%D8%B1%D8%A7_%D8%AA%D8%B9%D8%B1%DB%8C%D9%81_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \u0627\u0633\u062a\u062f\u0644\u0627\u0644 \u0647\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0645\u0631\u062d\u0644\u0647 \u0628\u0639\u062f\u06cc \u067e\u0633 \u0627\u0632 \u0627\u06cc\u062c\u0627\u062f \u067e\u0631\u0648\u0698\u0647 \u060c \u062a\u0639\u0631\u06cc\u0641 \u067e\u0631\u0686\u0645 \u0647\u0627\/\u06af\u0632\u06cc\u0646\u0647 \u0647\u0627\u06cc CLI \u0627\u0633\u062a \u06a9\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0646\u062a\u0638\u0627\u0631 \u062f\u0627\u0631\u062f. \u0645\u0627 \u0628\u0647 \u0631\u0648\u0634\u06cc \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u0645 \u062a\u0627 \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u06af\u0648\u06cc\u06cc\u0645 \u0628\u0631\u0627\u06cc \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u062e\u0627\u0635 \u06cc\u0627 \u067e\u0631\u0648\u0646\u062f\u0647 \u0647\u0627 \u062f\u0631 \u06cc\u06a9 \u0641\u0647\u0631\u0633\u062a. \u0645\u0627 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u0645 \u0628\u0647 \u0635\u0648\u0631\u062a \u0627\u062e\u062a\u06cc\u0627\u0631\u06cc \u06a9\u0644\u06cc\u062f \u062f\u0633\u062a\u0631\u0633\u06cc \u0648 \u0631\u0627\u0632 \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632 \u0628\u0631\u0627\u06cc \u062a\u0623\u06cc\u06cc\u062f \u0627\u0639\u062a\u0628\u0627\u0631 \u0628\u0627 \u0633\u0631\u0648\u06cc\u0633 \u0630\u062e\u06cc\u0631\u0647 \u0634\u06cc \u0631\u0627 \u0645\u0634\u062e\u0635 \u06a9\u0646\u06cc\u0645.<\/p>\n<p>\u0628\u0627\u0632 <em>index.ts<\/em> \u0648 \u062f\u0631 \u06a9\u062f \u0632\u06cc\u0631 \u0686\u0633\u0628\u0627\u0646\u062f\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"kd\">const<\/span> <span class=\"nx\">cli<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">meow<\/span><span class=\"p\">(<\/span>\n  <span class=\"s2\">`\n    Usage\n        $ s3upload <bucket>\n\n    Options\n    --file, -f             Single file to upload\n    --dir                  Directory to upload recursively\n    --region               AWS region\n    --endpoint             S3 endpoint\/url\n    --access-key-id        AWS access key ID\n    --secret-access-key    AWS secret access key\n    --help                 Displays this message\n    --version              Displays the version number\n\n    Examples\n       $ s3upload my-bucket --file index.html\n    $ s3upload react-site --dir build --access-key-id $AWS_ACCESS_KEY_ID --secret-access-key $AWS_SECRET_ACCESS_KEY --endpoint $S3_URL --region $AWS_REGION\n`<\/bucket><\/span><span class=\"p\">,<\/span>\n  <span class=\"p\">{<\/span>\n    <span class=\"na\">importMeta<\/span><span class=\"p\">:<\/span> <span class=\"k\">import<\/span><span class=\"p\">.<\/span><span class=\"nx\">meta<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/ This is required<\/span>\n    <span class=\"na\">flags<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">file<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n        <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">string<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">shortFlag<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">f<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n      <span class=\"p\">},<\/span>\n      <span class=\"na\">dir<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n        <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">string<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n      <span class=\"p\">},<\/span>\n      <span class=\"na\">region<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n        <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">string<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n      <span class=\"p\">},<\/span>\n      <span class=\"na\">endpoint<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n        <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">string<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n      <span class=\"p\">},<\/span>\n      <span class=\"na\">accessKeyId<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n        <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">string<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n      <span class=\"p\">},<\/span>\n      <span class=\"na\">secretAccessKey<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n        <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">string<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n      <span class=\"p\">},<\/span>\n    <span class=\"p\">},<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">);<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">bucket<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">cli<\/span><span class=\"p\">.<\/span><span class=\"nx\">input<\/span><span class=\"p\">.<\/span><span class=\"nf\">at<\/span><span class=\"p\">(<\/span><span class=\"mi\">0<\/span><span class=\"p\">);<\/span>\n<span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">bucket<\/span><span class=\"p\">)<\/span> <span class=\"nf\">upload<\/span><span class=\"p\">(<\/span><span class=\"nx\">bucket<\/span><span class=\"p\">,<\/span> <span class=\"nx\">cli<\/span><span class=\"p\">.<\/span><span class=\"nx\">flags<\/span><span class=\"p\">);<\/span>\n<span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">error<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">Please provide a bucket name as argument<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n  <span class=\"nx\">cli<\/span><span class=\"p\">.<\/span><span class=\"nf\">showHelp<\/span><span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">);<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0645\u0627 \u0627\u0632 <code>meow(helpText, options)<\/code> \u0639\u0645\u0644\u06a9\u0631\u062f\u06cc \u0628\u0631\u0627\u06cc \u062a\u0639\u0631\u06cc\u0641 \u0631\u0641\u062a\u0627\u0631 \u0628\u0631\u0646\u0627\u0645\u0647. \u0645\u0627 \u0628\u0647 \u0622\u0646 \u0645\u062a\u0646 \u0631\u0627\u0647\u0646\u0645\u0627 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0646\u0645\u0627\u06cc\u0634 \u0648 \u062a\u0639\u0631\u06cc\u0641 \u067e\u0631\u0686\u0645 \u0647\u0627 \u062f\u0631 \u067e\u0627\u0631\u0627\u0645\u062a\u0631 \u062f\u0648\u0645 \u062f\u0627\u062f\u06cc\u0645. \u062f\u0631 <code>flags<\/code> \u0634\u06cc\u0621 \u067e\u0631\u0686\u0645 \u0647\u0627 \u0631\u0627 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06a9\u0644\u06cc\u062f\u0647\u0627 \u0628\u0647 \u0647\u0645\u0631\u0627\u0647 \u0646\u0648\u0639 \u0648 \u0627\u062e\u062a\u06cc\u0627\u0631\u06cc \u0622\u0646\u0647\u0627 \u0645\u0634\u062e\u0635 \u0645\u06cc \u06a9\u0646\u062f <code>shortFlag<\/code> (\u06cc\u0627 \u0646\u0627\u0645 \u0645\u0633\u062a\u0639\u0627\u0631).<\/p>\n<p>\u0627\u06af\u0631 <code>--version<\/code> \u06cc\u0627 <code>--help<\/code> \u067e\u0631\u0686\u0645 \u0647\u0627 \u0628\u062e\u0634\u06cc \u0627\u0632 \u0627\u0633\u062a\u062f\u0644\u0627\u0644 \u0647\u0627\u06cc \u0645\u0646\u062a\u0642\u0644 \u0634\u062f\u0647 \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0646\u06cc\u0633\u062a\u0646\u062f \u060c \u067e\u06cc\u0634 \u0645\u06cc \u0631\u0648\u062f \u062a\u0627 \u0628\u0642\u06cc\u0647 \u06a9\u062f \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u062f. \u062f\u0631 \u0627\u06cc\u0646 \u062d\u0627\u0644\u062a \u060c \u0622\u0646 \u0631\u0627 \u0635\u062f\u0627 \u0645\u06cc \u06a9\u0646\u062f <code>upload()<\/code> \u0639\u0645\u0644\u06a9\u0631\u062f \u0627\u06af\u0631 \u0633\u0637\u0644 \u0645\u0634\u062e\u0635 \u0634\u062f\u0647 \u0628\u0627\u0634\u062f \u060c \u062f\u0631 \u063a\u06cc\u0631 \u0627\u06cc\u0646 \u0635\u0648\u0631\u062a \u060c \u06cc\u06a9 \u067e\u06cc\u0627\u0645 \u062e\u0637\u0627 \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u0648 \u0645\u062a\u0646 \u0631\u0627\u0647\u0646\u0645\u0627 \u0631\u0627 \u0686\u0627\u067e \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D8%A8%D8%A7%D8%B1%DA%AF%D8%B0%D8%A7%D8%B1%DB%8C_%D9%BE%D8%B1%D9%88%D9%86%D8%AF%D9%87_%D9%87%D8%A7_%D8%A8%D8%A7_%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87_%D8%A7%D8%B2_%D9%85%D8%B4%D8%AA%D8%B1%DB%8C_S3_Bun\"><\/span>\n<p>  \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u067e\u0631\u0648\u0646\u062f\u0647 \u0647\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0645\u0634\u062a\u0631\u06cc S3 Bun<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0628\u062e\u0634 \u060c \u0645\u0627 \u0642\u0635\u062f \u062f\u0627\u0631\u06cc\u0645 <code>upload()<\/code> \u0628\u0631\u0627\u06cc \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u067e\u0631\u0648\u0646\u062f\u0647 \u0647\u0627 \u06cc\u0627 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0647\u0627 \u0628\u0627 \u06a9\u062f \u06a9\u0627\u0631 \u06a9\u0646\u06cc\u062f. \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0627\u0628\u062a\u062f\u0627 \u0628\u0627 \u06a9\u062f \u0634\u0631\u0648\u0639 \u06a9\u0646\u06cc\u0645 \u062a\u0627 \u067e\u0631\u0648\u0646\u062f\u0647 \u0647\u0627 \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u0634\u0648\u062f.<\/p>\n<p>\u0639\u0645\u0644\u06a9\u0631\u062f \u0632\u06cc\u0631 \u0631\u0627 \u062f\u0631 <em>index.ts<\/em> \u067e\u0631\u0648\u0646\u062f\u0647:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"k\">async<\/span> <span class=\"kd\">function<\/span> <span class=\"nf\">upload<\/span><span class=\"p\">(<\/span><span class=\"nx\">bucket<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">,<\/span> <span class=\"nx\">flags<\/span><span class=\"p\">:<\/span> <span class=\"k\">typeof<\/span> <span class=\"nx\">cli<\/span><span class=\"p\">.<\/span><span class=\"nx\">flags<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"nx\">flags<\/span><span class=\"p\">.<\/span><span class=\"nx\">file<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"o\">!<\/span><span class=\"nx\">flags<\/span><span class=\"p\">.<\/span><span class=\"nx\">dir<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">error<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">Either --file or --dir must be specified<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n    <span class=\"nx\">process<\/span><span class=\"p\">.<\/span><span class=\"nf\">exit<\/span><span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">);<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"kd\">const<\/span> <span class=\"nx\">client<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">S3Client<\/span><span class=\"p\">({<\/span>\n    <span class=\"na\">bucket<\/span><span class=\"p\">:<\/span> <span class=\"nx\">bucket<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">region<\/span><span class=\"p\">:<\/span> <span class=\"nx\">flags<\/span><span class=\"p\">.<\/span><span class=\"nx\">region<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">accessKeyId<\/span><span class=\"p\">:<\/span> <span class=\"nx\">flags<\/span><span class=\"p\">.<\/span><span class=\"nx\">accessKeyId<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">secretAccessKey<\/span><span class=\"p\">:<\/span> <span class=\"nx\">flags<\/span><span class=\"p\">.<\/span><span class=\"nx\">secretAccessKey<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">endpoint<\/span><span class=\"p\">:<\/span> <span class=\"nx\">flags<\/span><span class=\"p\">.<\/span><span class=\"nx\">endpoint<\/span><span class=\"p\">,<\/span>\n  <span class=\"p\">});<\/span>\n\n  <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">flags<\/span><span class=\"p\">.<\/span><span class=\"nx\">file<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">key<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">basename<\/span><span class=\"p\">(<\/span><span class=\"nx\">flags<\/span><span class=\"p\">.<\/span><span class=\"nx\">file<\/span><span class=\"p\">);<\/span>\n    <span class=\"k\">await<\/span> <span class=\"nx\">client<\/span><span class=\"p\">.<\/span><span class=\"nf\">write<\/span><span class=\"p\">(<\/span><span class=\"nx\">key<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Bun<\/span><span class=\"p\">.<\/span><span class=\"nf\">file<\/span><span class=\"p\">(<\/span><span class=\"nx\">flags<\/span><span class=\"p\">.<\/span><span class=\"nx\">file<\/span><span class=\"p\">));<\/span>\n    <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">log<\/span><span class=\"p\">(<\/span><span class=\"s2\">`\u2713 Uploaded <\/span><span class=\"p\">${<\/span><span class=\"nx\">key<\/span><span class=\"p\">}<\/span><span class=\"s2\">  to <\/span><span class=\"p\">${<\/span><span class=\"nx\">bucket<\/span><span class=\"p\">}<\/span><span class=\"s2\">`<\/span><span class=\"p\">);<\/span>\n    <span class=\"k\">return<\/span><span class=\"p\">;<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062f\u0631 <code>upload()<\/code> \u0639\u0645\u0644\u06a9\u0631\u062f \u0627\u0628\u062a\u062f\u0627 \u0628\u0631\u0631\u0633\u06cc \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0622\u06cc\u0627 \u067e\u0631\u0686\u0645 \u067e\u0631\u0648\u0646\u062f\u0647 \u06cc\u0627 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0645\u0634\u062e\u0635 \u0634\u062f\u0647 \u0627\u0633\u062a. \u0627\u06af\u0631 \u067e\u0631\u0686\u0645 \u0641\u0627\u06cc\u0644 \u062a\u0646\u0638\u06cc\u0645 \u0634\u062f\u0647 \u0628\u0627\u0634\u062f \u060c \u0627\u0632 \u0622\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f <code>client.write()<\/code> \u0631\u0648\u0634 \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u067e\u0631\u0648\u0646\u062f\u0647. <code>client<\/code> \u0646\u0645\u0648\u0646\u0647 \u0627\u06cc \u0627\u0632 <code>S3Client<\/code> \u062f\u0631 \u0635\u0648\u0631\u062a \u0645\u0634\u062e\u0635 \u0634\u062f\u0646 \u0627\u0632 AccessKeyID \u060c \u0645\u0646\u0637\u0642\u0647 \u060c \u0646\u0642\u0637\u0647 \u067e\u0627\u06cc\u0627\u0646\u06cc \u0648 SecretAccessKey \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f. \u062f\u0631 \u063a\u06cc\u0631 \u0627\u06cc\u0646 \u0635\u0648\u0631\u062a \u060c \u0622\u0646 \u0627\u0639\u062a\u0628\u0627\u0631 \u0631\u0627 \u0627\u0632 \u0645\u062a\u063a\u06cc\u0631 \u0645\u062d\u06cc\u0637 \u0645\u06cc \u062e\u0648\u0627\u0646\u062f (\u0628\u0647 \u0645\u0633\u062a\u0646\u062f\u0627\u062a \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0645\u062d\u06cc\u0637 \u0645\u0631\u0627\u062c\u0639\u0647 \u06a9\u0646\u06cc\u062f).<\/p>\n<p>\u062f\u0631 \u0645\u0631\u062d\u0644\u0647 \u0628\u0639\u062f \u060c \u0645\u0627 \u06a9\u062f \u0631\u0627 \u0628\u0631\u0627\u06cc \u062e\u0648\u0627\u0646\u062f\u0646 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0648 \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u067e\u0631\u0648\u0646\u062f\u0647 \u0647\u0627 \u062f\u0631 \u0622\u0646 \u0641\u0647\u0631\u0633\u062a \u0627\u0636\u0627\u0641\u0647 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"k\">async<\/span> <span class=\"kd\">function<\/span> <span class=\"nf\">upload<\/span><span class=\"p\">(<\/span><span class=\"nx\">bucket<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">,<\/span> <span class=\"nx\">flags<\/span><span class=\"p\">:<\/span> <span class=\"k\">typeof<\/span> <span class=\"nx\">cli<\/span><span class=\"p\">.<\/span><span class=\"nx\">flags<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n <span class=\"c1\">\/\/...The rest of the code from the previous snippet<\/span>\n\n  <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">flags<\/span><span class=\"p\">.<\/span><span class=\"nx\">dir<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"c1\">\/\/ Handle recursive directory upload<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">directoryContent<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nf\">readdir<\/span><span class=\"p\">(<\/span><span class=\"nx\">flags<\/span><span class=\"p\">.<\/span><span class=\"nx\">dir<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">recursive<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">withFileTypes<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">});<\/span>\n\n    <span class=\"kd\">const<\/span> <span class=\"nx\">files<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">directoryContent<\/span><span class=\"p\">.<\/span><span class=\"nf\">reduce<\/span><span class=\"p\">((<\/span><span class=\"nx\">acc<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">[],<\/span> <span class=\"nx\">dirent<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n      <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">dirent<\/span><span class=\"p\">.<\/span><span class=\"nf\">isFile<\/span><span class=\"p\">())<\/span> <span class=\"p\">{<\/span>\n        <span class=\"nx\">acc<\/span><span class=\"p\">.<\/span><span class=\"nf\">push<\/span><span class=\"p\">(<\/span>\n          <span class=\"nx\">dirent<\/span><span class=\"p\">.<\/span><span class=\"nx\">parentPath<\/span>\n            <span class=\"p\">?<\/span> <span class=\"nx\">dirent<\/span><span class=\"p\">.<\/span><span class=\"nx\">parentPath<\/span> <span class=\"o\">+<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">\/<\/span><span class=\"dl\">\"<\/span> <span class=\"o\">+<\/span> <span class=\"nx\">dirent<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span>\n            <span class=\"p\">:<\/span> <span class=\"nx\">dirent<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span>\n        <span class=\"p\">);<\/span>\n      <span class=\"p\">}<\/span>\n      <span class=\"k\">return<\/span> <span class=\"nx\">acc<\/span><span class=\"p\">;<\/span>\n    <span class=\"p\">},<\/span> <span class=\"p\">[]);<\/span>\n\n    <span class=\"k\">for <\/span><span class=\"p\">(<\/span><span class=\"kd\">const<\/span> <span class=\"nx\">file<\/span> <span class=\"k\">of<\/span> <span class=\"nx\">files<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n      <span class=\"k\">await<\/span> <span class=\"nx\">client<\/span><span class=\"p\">.<\/span><span class=\"nf\">write<\/span><span class=\"p\">(<\/span><span class=\"nx\">file<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Bun<\/span><span class=\"p\">.<\/span><span class=\"nf\">file<\/span><span class=\"p\">(<\/span><span class=\"nx\">file<\/span><span class=\"p\">));<\/span>\n      <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">log<\/span><span class=\"p\">(<\/span><span class=\"s2\">`\u2713 Uploaded <\/span><span class=\"p\">${<\/span><span class=\"nx\">file<\/span><span class=\"p\">}<\/span><span class=\"s2\"> to <\/span><span class=\"p\">${<\/span><span class=\"nx\">bucket<\/span><span class=\"p\">}<\/span><span class=\"s2\">`<\/span><span class=\"p\">);<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">log<\/span><span class=\"p\">(<\/span><span class=\"s2\">`Uploaded <\/span><span class=\"p\">${<\/span><span class=\"nx\">files<\/span><span class=\"p\">.<\/span><span class=\"nx\">length<\/span><span class=\"p\">}<\/span><span class=\"s2\"> files to <\/span><span class=\"p\">${<\/span><span class=\"nx\">bucket<\/span><span class=\"p\">}<\/span><span class=\"s2\">`<\/span><span class=\"p\">);<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0645\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0631\u062f\u06cc\u0645 <code>readdir()<\/code> \u0639\u0645\u0644\u06a9\u0631\u062f \u0628\u0631\u0627\u06cc \u062e\u0648\u0627\u0646\u062f\u0646 \u0628\u0627\u0632\u06af\u0634\u062a\u06cc \u0645\u062d\u062a\u0648\u0627\u06cc \u0641\u0647\u0631\u0633\u062a \u0645\u0634\u062e\u0635 \u0634\u062f\u0647. \u0645\u0627 \u0646\u062a\u06cc\u062c\u0647 \u0631\u0627 \u0641\u06cc\u0644\u062a\u0631 \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u062a\u0627 \u0641\u0642\u0637 \u067e\u0631\u0648\u0646\u062f\u0647 \u0647\u0627 \u0631\u0627 \u0628\u062f\u0633\u062a \u0622\u0648\u0631\u06cc\u0645 \u0648 \u0628\u0647 \u0637\u0648\u0631 \u063a\u06cc\u0631 \u0647\u0645\u0632\u0645\u0627\u0646 \u0622\u0646\u0647\u0627 \u0631\u0627 \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u06a9\u0646\u06cc\u0645.<\/p>\n<p>\u0627\u06cc\u0646 \u062a\u0646\u0647\u0627 \u0686\u06cc\u0632\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u0627 \u0628\u0631\u0627\u06cc \u062a\u0647\u06cc\u0647 \u062e\u0648\u062f \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u0645 <em>S3UPLOAD<\/em> CLI \u06a9\u0627\u0631 \u0645\u06cc \u06a9\u0646\u062f. \u0627\u06af\u0631 \u062a\u0631\u0645\u06cc\u0646\u0627\u0644 \u0631\u0627 \u0628\u0627\u0632 \u06a9\u0631\u062f\u0647 \u0648 \u062f\u0633\u062a\u0648\u0631 \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f <code>bun index.ts <s3-bucket> --file index.ts<\/s3-bucket><\/code> \u0628\u0627\u06cc\u062f \u0622\u0646 \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u062f \u06a9\u0647 \u0622\u0646 \u067e\u0631\u0648\u0646\u062f\u0647 \u0631\u0627 \u062f\u0631 \u0633\u0637\u0644 \u0645\u0634\u062e\u0635 \u0634\u062f\u0647 \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u06a9\u0646\u06cc\u062f.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpaj9manzvifayydq0o5t.png\" alt=\"\u062a\u0635\u0648\u06cc\u0631 \u062a\u0648\u0635\u06cc\u0641 \u062f\u0633\u062a\u0648\u0631 \u0648 \u062e\u0631\u0648\u062c\u06cc \u0628\u0631\u0627\u06cc \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u06cc\u06a9 \u0633\u0627\u06cc\u062a \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 CLI \u06a9\u0647 \u0645\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0631\u062f\u06cc\u0645\" loading=\"lazy\" width=\"800\" height=\"125\" title=\"\"><\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D9%86%D8%AD%D9%88%D9%87_%D8%A8%D8%B3%D8%AA%D9%87_%D8%A8%D9%86%D8%AF%DB%8C_%D9%88_%D8%A7%D9%86%D8%AA%D8%B4%D8%A7%D8%B1_CLI\"><\/span>\n<p>  \u0646\u062d\u0648\u0647 \u0628\u0633\u062a\u0647 \u0628\u0646\u062f\u06cc \u0648 \u0627\u0646\u062a\u0634\u0627\u0631 CLI<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u062a\u0627\u06a9\u0646\u0648\u0646 \u0645\u0627 \u062a\u0648\u0627\u0646\u0633\u062a\u0647 \u0627\u06cc\u0645 \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Bun CLI \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u0645 \u060c \u0627\u0645\u0627 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u0645 \u0622\u0646 \u0631\u0627 \u062a\u0648\u0632\u06cc\u0639 \u06a9\u0646\u06cc\u0645 \u062a\u0627 \u0647\u0631 \u06a9\u0633\u06cc \u0628\u062a\u0648\u0627\u0646\u062f \u0622\u0646 \u0631\u0627 \u0646\u0635\u0628 \u0648 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u062f. \u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0647\u0631 \u06cc\u06a9 \u0627\u0632 \u0645\u0648\u0627\u0631\u062f \u0632\u06cc\u0631 \u0622\u0646 \u0631\u0627 \u0628\u0633\u062a\u0647 \u0628\u0646\u062f\u06cc \u0648 \u062a\u0648\u0632\u06cc\u0639 \u06a9\u0646\u06cc\u0645:<\/p>\n<ol>\n<li>\n<p>\u06a9\u062f \u0631\u0627 \u062f\u0631 \u06cc\u06a9 \u0627\u062c\u0631\u0627\u06cc\u06cc \u0628\u0627\u06cc\u0646\u0631\u06cc \u06a9\u0627\u0645\u067e\u0627\u06cc\u0644 \u06a9\u0646\u06cc\u062f. \u0633\u067e\u0633 \u060c \u0622\u0646 \u0631\u0627 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u062b\u0628\u062a \u0647\u0627\u06cc \u0628\u0633\u062a\u0647 \u0645\u0627\u0646\u0646\u062f Homebrew \u062a\u0648\u0632\u06cc\u0639 \u06a9\u0646\u06cc\u062f \u060c \u06cc\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0646\u0635\u0628 \u0631\u0627 \u062f\u0631 \u0627\u062e\u062a\u06cc\u0627\u0631 \u0627\u0641\u0631\u0627\u062f \u0642\u0631\u0627\u0631 \u062f\u0647\u06cc\u062f \u06a9\u0647 \u0627\u062c\u0631\u0627\u06cc\u06cc \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0631\u062f\u0647 \u0648 \u0622\u0646 \u0631\u0627 \u0628\u0647 \u0645\u0633\u06cc\u0631 \u0633\u06cc\u0633\u062a\u0645 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f.<\/p>\n<\/li>\n<li>\n<p>\u0627\u0646\u062a\u0634\u0627\u0631 \u0628\u0647 <em>\u0631\u062c\u06cc\u0633\u062a\u0631\u06cc NPM<\/em>\u0628\u0634\u0631 \u0633\u067e\u0633 \u0622\u0646 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0647\u0631 \u0645\u062f\u06cc\u0631 \u0628\u0633\u062a\u0647 JavaScript \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f.<\/p>\n<\/li>\n<\/ol>\n<p>\u0645\u0627 \u0642\u0635\u062f \u062f\u0627\u0631\u06cc\u0645 \u0628\u0631\u0648\u06cc\u0645 <em>NPM<\/em> \u0645\u0633\u06cc\u0631 \u0631\u062c\u06cc\u0633\u062a\u0631\u06cc \u0628\u0631\u0627\u06cc \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634. \u0645\u0627 \u0628\u0627\u06cc\u062f \u0628\u0647 \u0631\u0648\u0632 \u06a9\u0646\u06cc\u0645 <strong>\u0628\u0633\u062a\u0647<\/strong> \u067e\u0631\u0648\u0646\u062f\u0647 \u0628\u0631\u0627\u06cc \u0634\u0627\u0645\u0644 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0632\u06cc\u0631:<\/p>\n<ol>\n<li>\n<p><strong>\u0634\u0631\u062d<\/strong>: \u0627\u06cc\u0646 \u0628\u0633\u062a\u0647 \u0631\u0627 \u062a\u0648\u0635\u06cc\u0641 \u0645\u06cc \u06a9\u0646\u062f \u0648 \u062f\u0631 NPM \u0646\u0645\u0627\u06cc\u0634 \u062f\u0627\u062f\u0647 \u0645\u06cc \u0634\u0648\u062f.<\/p>\n<\/li>\n<li>\n<p><strong>\u0646\u0633\u062e\u0647<\/strong>: \u0628\u0631\u0627\u06cc \u06af\u0641\u062a\u0646 \u0646\u0633\u062e\u0647 \u0628\u0633\u062a\u0647 \u0645\u0646\u062a\u0634\u0631 \u0634\u062f\u0647. \u0627\u06cc\u0646 \u0646\u06cc\u0632 \u062f\u0631 \u0635\u0648\u0631\u062a \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc CLI \u0628\u0627 CLI \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u0634\u0648\u062f <code>--version<\/code> \u067e\u0631\u0686\u0645<\/p>\n<\/li>\n<li>\n<p><strong>\u0645\u062e\u0627\u0632\u0646<\/strong>: \u0627\u06cc\u0646\u062c\u0627\u0633\u062a \u06a9\u0647 \u067e\u0631\u0648\u0646\u062f\u0647 \u0627\u062c\u0631\u0627\u06cc\u06cc \u0631\u0627 \u06a9\u0647 NPM (\u06cc\u0627 \u0647\u0631 \u0645\u062f\u06cc\u0631 \u0628\u0633\u062a\u0647) \u062f\u0631 \u0633\u06cc\u0633\u062a\u0645 \u0646\u0635\u0628 \u0645\u06cc \u06a9\u0646\u062f \u060c \u0645\u0634\u062e\u0635 \u0645\u06cc \u06a9\u0646\u06cc\u0645 <em>\u0645\u0633\u06cc\u0631<\/em>\u0628\u0634\u0631 \u0628\u0647 \u0647\u0645\u06cc\u0646 \u062f\u0644\u06cc\u0644 \u0645\u0627 \u0645\u0634\u062e\u0635 \u06a9\u0631\u062f\u06cc\u0645 <code>!\/usr\/bin\/env bun<\/code> \u062f\u0631 \u0622\u063a\u0627\u0632 <em>index.ts<\/em>\u0628\u0634\u0631<\/p>\n<\/li>\n<\/ol>\n<p>\u0628\u0627\u0632 <strong>\u0628\u0633\u062a\u0647<\/strong> \u0648 \u0627\u06cc\u0646 \u0645\u0642\u0627\u062f\u06cc\u0631 \u0631\u0627 \u0628\u0647 \u0622\u0646 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight json\"><code><span class=\"p\">{<\/span><span class=\"w\">\n  <\/span><span class=\"err\">\/\/...<\/span><span class=\"w\"> <\/span><span class=\"err\">The<\/span><span class=\"w\"> <\/span><span class=\"err\">rest<\/span><span class=\"w\"> <\/span><span class=\"err\">of<\/span><span class=\"w\"> <\/span><span class=\"err\">package.json<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"version\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"1.0.0\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"description\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"A CLI to upload files to S3\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"bin\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n    <\/span><span class=\"nl\">\"s3upload\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"index.ts\"<\/span><span class=\"w\">\n  <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0628\u0627 \u0627\u0636\u0627\u0641\u0647 \u0634\u062f\u0646 \u060c \u0627\u0646\u062a\u0634\u0627\u0631 \u0628\u0633\u062a\u0647 \u0628\u0647 \u0633\u0627\u062f\u06af\u06cc \u062f\u0631 \u062d\u0627\u0644 \u0627\u062c\u0631\u0627 \u0627\u0633\u062a <code>npm publish<\/code>\u0628\u0634\u0631 \u0627\u06af\u0631 \u0622\u0646 \u0631\u0627 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u0628\u0633\u062a\u0647 scoped \u0645\u0646\u062a\u0634\u0631 \u0645\u06cc \u06a9\u0646\u06cc\u062f \u060c \u0628\u0627\u06cc\u062f \u0627\u0632 \u0622\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f <code>npm publish --access public<\/code> \u062a\u0627 \u0622\u0646 \u0631\u0627 \u0628\u0647 \u06cc\u06a9 \u0628\u0633\u062a\u0647 \u0639\u0645\u0648\u0645\u06cc \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0646\u062f. \u0627\u06cc\u0646 \u0627\u0645\u0631 \u0628\u0647 \u0627\u06cc\u0646 \u062f\u0644\u06cc\u0644 \u0627\u0633\u062a \u06a9\u0647 \u0628\u0633\u062a\u0647 \u0647\u0627\u06cc scoped \u0628\u0647 \u0637\u0648\u0631 \u067e\u06cc\u0634 \u0641\u0631\u0636 \u0628\u0647 <em>\u0645\u062d\u062f\u0648\u062f<\/em> \u062f\u0633\u062a\u0631\u0633\u06cc<\/p>\n<blockquote>\n<p>\u0627\u0632 \u0634\u0645\u0627 \u062e\u0648\u0627\u0633\u062a\u0647 \u0645\u06cc \u0634\u0648\u062f \u0627\u06af\u0631 \u0628\u0647 \u0631\u062c\u06cc\u0633\u062a\u0631\u06cc NPM \u062a\u0623\u06cc\u06cc\u062f \u0646\u0634\u062f\u0647 \u0627\u06cc\u062f \u060c \u0648\u0627\u0631\u062f \u0634\u0648\u06cc\u062f. \u0627\u0632 \u0637\u0631\u0641 \u062f\u06cc\u06af\u0631 \u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f <code>npm login<\/code> \u0642\u0628\u0644 \u0627\u0632 \u0627\u0646\u062a\u0634\u0627\u0631<\/p>\n<\/blockquote>\n<h2><span class=\"ez-toc-section\" id=\"%D8%A8%D8%B3%D8%AA%D9%87_%D8%A8%D9%86%D8%AF%DB%8C_%DA%A9%D8%B1%D8%AF%D9%86\"><\/span>\n<p>  \u0628\u0633\u062a\u0647 \u0628\u0646\u062f\u06cc \u06a9\u0631\u062f\u0646<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634 \u0634\u0645\u0627 \u0631\u0627 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0633\u0627\u062e\u062a\u0646 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0637 \u0641\u0631\u0645\u0627\u0646 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 TypeScript \u0648 Bun \u0631\u0627\u0647\u0646\u0645\u0627\u06cc\u06cc \u0645\u06cc \u06a9\u0646\u062f. \u0645\u0627 \u06cc\u06a9 \u0627\u0628\u0632\u0627\u0631 \u0628\u0631\u0627\u06cc \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u067e\u0631\u0648\u0646\u062f\u0647 \u0647\u0627 \u06cc\u0627 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0647\u0627 \u062f\u0631 \u0630\u062e\u06cc\u0631\u0647 \u0633\u0627\u0632\u06af\u0627\u0631 \u0628\u0627 S3 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0631\u062f\u06cc\u0645. \u0645\u0627 \u06cc\u0627\u062f \u06af\u0631\u0641\u062a\u06cc\u0645 \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u0645 <em>\u0645\u06cc\u0645\u0648\u0646<\/em> \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u06cc\u0627\u0648\u0631 \u0648 \u0645\u0634\u062a\u0631\u06cc S3 Bun. \u0639\u0644\u0627\u0648\u0647 \u0628\u0631 \u0627\u06cc\u0646 \u060c \u0634\u0645\u0627 \u06cc\u0627\u062f \u06af\u0631\u0641\u062a\u06cc\u062f \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 CLI \u0631\u0627 \u062f\u0631 \u0631\u062c\u06cc\u0633\u062a\u0631\u06cc NPM \u0628\u0633\u062a\u0647 \u0628\u0646\u062f\u06cc \u0648 \u0645\u0646\u062a\u0634\u0631 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u06a9\u062f \u0646\u0645\u0648\u0646\u0647 \u0631\u0627 \u0627\u0632 GitHub \u0628\u0627\u0631\u06af\u06cc\u0631\u06cc \u06a9\u0631\u062f\u0647 \u0648 Buntastic \u0631\u0627 \u06a9\u0627\u0648\u0634 \u06a9\u0646\u06cc\u062f \u060c \u0627\u0628\u0632\u0627\u0631\u06cc \u06a9\u0647 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0648 \u0645\u06cc\u0632\u0628\u0627\u0646\u06cc \u0648\u0628 \u0633\u0627\u06cc\u062a \u0647\u0627\u06cc \u0627\u0633\u062a\u0627\u062a\u06cc\u06a9 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 S3 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0632\u0645\u06cc\u0646\u0647 \u0630\u062e\u06cc\u0631\u0647 \u0633\u0627\u0632\u06cc \u0622\u0646 \u0637\u0631\u0627\u062d\u06cc \u0634\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u0631\u0627\u0628\u0637 \u062e\u0637 \u0641\u0631\u0645\u0627\u0646 (CLI) \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u06cc \u0627\u0633\u062a \u06a9\u0647 \u062f\u0631 \u062a\u0631\u0645\u06cc\u0646\u0627\u0644 \u0627\u062c\u0631\u0627 \u0645\u06cc \u0634\u0648\u062f. \u0648\u0631\u0648\u062f\u06cc \u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u060c \u062f\u0633\u062a\u0648\u0631\u0627\u062a \u0631\u0627 \u067e\u0631\u062f\u0627\u0632\u0634 \u0645\u06cc \u06a9\u0646\u062f \u0648 \u062a\u0648\u0627\u0628\u0639 \u0633\u06cc\u0633\u062a\u0645 \u0631\u0627 \u0627\u062c\u0631\u0627 \u0645\u06cc \u06a9\u0646\u062f. \u062f\u0631 \u0627\u0648\u0627\u06cc\u0644 \u0645\u062d\u0627\u0633\u0628\u0627\u062a \u060c \u062a\u0631\u0645\u06cc\u0646\u0627\u0644 \u062a\u0646\u0647\u0627 \u0631\u0627\u0647 \u062a\u0639\u0627\u0645\u0644 \u0628\u0627 \u0631\u0627\u06cc\u0627\u0646\u0647 \u0628\u0648\u062f. \u0627\u0645\u0631\u0648\u0632 \u060c \u0628\u06cc\u0634\u062a\u0631 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0631\u0627\u06cc\u0627\u0646\u0647 \u062e\u0648\u062f \u0628\u0647 \u0631\u0627\u0628\u0637 \u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u06af\u0631\u0627\u0641\u06cc\u06a9\u06cc (GUI) &hellip;<\/p>\n","protected":false},"author":2,"featured_media":96196,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-96194","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/96194","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=96194"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/96194\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/96196"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=96194"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=96194"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=96194"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}