Рубрики
Uncategorized

Повысьте свою производительность, создав собственную команду CLI с помощью TypeScript (часть 1) 🔥

Контекст Ваша ежедневная производительность может быть значительно улучшена 🚀 Если вы можете автоматизировать всю задачу … Tagged с DevOps, TypeScript, Node, NPM.

Повысьте свою производительность, создав собственную команду CLI с помощью TypeScript (2 серии деталей)

Контекст

Ваш Ежедневная производительность может быть значительно улучшен 🚀 Если вы можете автоматизировать Все задачи, которые вы раньше выполняли.

Спасибо Узел, NPM, NPX и TypeScript : Создание CLI Command И сделать его доступным в вашей системе или во всем мире никогда не было проще.

В качестве примера мы создадим команду CLI, чтобы получить стоимость запаса для символа. Эта команда будет называться пике-сус (как ссылка на персонажа Диснея «Дядя $ Crooge» на французском языке 😄 🦆 🦆 🦆 🦆 🦆 🦆 🦆 🦆 🦆

$ pique-sous MSFT SFIX GOOG

Результат:

Retrieving stock information for MSFT at date 2021-01-10T01:37:57.574Z
{
  language: 'en-US',
  region: 'US',
  quoteType: 'EQUITY',
  quoteSourceName: 'Delayed Quote',
  regularMarketOpen: 218.68,
  exchange: 'NMS',
  shortName: 'Microsoft Corporation',
  longName: 'Microsoft Corporation',
  messageBoardId: 'finmb_21835',
  exchangeTimezoneName: 'America/New_York',
  exchangeTimezoneShortName: 'EST',
  gmtOffSetMilliseconds: -18000000,
  market: 'us_market',
  esgPopulated: false,
  displayName: 'Microsoft',
  symbol: 'MSFT'
}

Окончательные результаты доступны в https://github.com/raphaelmansuy/pique-sous и опубликовано в https://www.npmjs.com/package/pique-sous Анкет

Эта статья была первоначально опубликована в https://www.elitizon.com/

🏗 6 Простых шагов, чтобы это произошло!

Шаг 1: Создание базового проекта TypeScript

✅ Создать каталог под названием пике-сумасшедшие

$ mkdir ./pique-sous

✅ Создайте файл index.ts под пике-сумасшедшие

$ cd ./pique-sous
$ touch ./index.ts

В результате вы должны иметь:

pique-sous
└── index.ts

✅ Редактировать index.ts и добавьте простую команду для тестирования, например:

const currentDateAndTime = new Date().toIsoString()

console.log(currentDateTime)

✅ Выполните и протестируйте файл с помощью TS-узла

npx ts-node index.ts

npx это инструмент из реестра NPM, позволяющий выполнять команды без установки TS-Node TypeScript — это версия узла, поддерживающая TypeScript

В результате у вас должно быть что -то вроде этого:

2021-01-10T02:37:49.683Z

Шаг 2: Сделайте исполняемый файл

✅ Измените index.ts Файл, такой как

#!/usr/bin/env npx ts-node

const currentDateAndTime = new Date().toIsoString()

console.log(currentDateTime)

Первая строка #!/usr/bin/env npx ts-node указывает, что файл должен быть выполнен NPX и TS-узлом

✅ Добавить Исполняемая разрешение к index.ts файл

$ chmod u+x ./index.ts

✅ Проверьте файл

$ ./index.ts

Полученные результаты:

$ ./index.ts
$ 2021-01-10T03:24:43.190Z

Шаг 3: Пакет проекта

✅ Добавить файл package.json

Внутри каталога используйте команду NPM для создания файла package.json

$ npm init

Ответь на вопросы:

package name: (pique-sous) 
version: (1.0.0) 
description: A simple package
entry point: (index.js) bin/index.js
test command: 
git repository: 
keywords: 
author: raphael mansuy
license: (ISC) MIT
About to write to /Users/raphaelmansuy/Projects/Github/raphaelmansuy/ElitizonWeb/data/blog/2021/01-09-how-to-create-a-cli-command-with-typescript/steps/step01/pique-sous/package.json:

{
  "name": "pique-sous",
  "version": "1.0.0",
  "description": "A simple package",
  "main": "bin/index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "raphael mansuy",
  "license": "MIT"
}

✅ Настройте компиляцию из TypeScript в JavaScript

Создайте файл с именем tsconfig.json следующим образом:

{
  "compilerOptions": {
    "module": "commonjs",
    "target": "es2017",
    "lib": ["es2015"],
    "moduleResolution": "node",
    "sourceMap": true,
    "outDir": "bin",
    "baseUrl": ".",
    "paths": {
      "*": ["node_modules/*", "src/types/*"]
    },
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true
  },
  "include": ["src/**/*"]
}

✅ Создать SRC каталог и перемещать index.ts в ./SRC каталог

$ mkdir ./src
$ mv ./index.ts ./src

Полученные результаты:

.
├── package.json
├── src
│   └── index.ts
└── tsconfig.json

1 directory, 3 files

✅ Добавить поддержку TypeScript для компиляции

$ yarn add typescript @types/node -D

Результат:

yarn add v1.22.10
info No lockfile found.
[1/4] 🔍  Resolving packages...
[2/4] 🚚  Fetching packages...
[3/4] 🔗  Linking dependencies...
[4/4] 🔨  Building fresh packages...
success Saved lockfile.
success Saved 2 new dependencies.
info Direct dependencies
├─ @types/node@14.14.20
└─ typescript@4.1.3
info All dependencies
├─ @types/node@14.14.20
└─ typescript@4.1.3
✨  Done in 1.44s.

Package.json должен выглядеть так:

{
  "name": "pique-sous",
  "version": "1.0.0",
  "description": "A simple package",
  "main": "bin/index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "raphael mansuy",
  "license": "MIT",
  "devDependencies": {
    "@types/node": "^14.14.20",
    "typescript": "^4.1.3"
  }
}

✅ Редактировать Package.json следующим образом

👉 Добавить вход «bin» со значением «bin/index.js» 👉 👉 Добавить команду «сборка» в «Скрипты»

{
  "name": "pique-sous",
  "version": "1.0.0",
  "description": "A simple package",
  "main": "bin/index.js",
  "bin": "bin/index.js",
  "scripts": {
    "build": "tsc",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "raphael mansuy",
  "license": "MIT",
  "devDependencies": {
    "@types/node": "^14.14.20",
    "typescript": "^4.1.3"
  }
}

✅ Редактировать index.ts следующим образом

👉 Замените NPX TS-Node Node, потому что результатом компиляции компилятора TypeScript будет файл JavaScript

#!/usr/bin/env node

const currentDateTime = new Date().toISOString()

console.log(currentDateTime)

✅ Строить

yarn build

Полученные результаты:

yarn run v1.22.10
$ tsc
✨  Done in 1.66s.

Справочник Bin теперь содержит результат процесса компиляции:

$ tree ./bin
./bin
├── index.js
└── index.js.map

0 directories, 2 files

✅ сделать ./bin/index.js исполняемый файл

chmod u+x ./bin/index.js

✅ Проверьте результат

./bin/index.js

Результат:

❯ pique-sous
2021-01-10T04:33:08.303Z

Шаг 4: Публикуйте команду локально

🔥 Команда теперь может быть доступна для использования локально:

$ yarn link --global

Результат:

yarn link v1.22.10
success Registered "pique-sous".
info You can now run `yarn link "pique-sous"` in the projects where you want to use this package and it will be used instead.
✨  Done in 0.04s.

🎉 💪 Теперь мы можем использовать команду повсюду

❯ pique-sous
2021-01-10T05:45:10.586Z

🌈 🙈 Мы можем перерегистрировать команду:

$ yarn unlink --global

Шаг 5: опубликовать команду CLI на www.npmjs.org

👉 Во -первых, вам нужно зарегистрироваться и создать учетную запись на https://www.npmjs.com/ 👉.

Введите следующую команду в базовом каталоге:

$ npm publish

Введите свои учетные данные NPM

Результат:

npm notice 
npm notice 📦  pique-sous@1.0.0
npm notice === Tarball Contents === 
npm notice 133B bin/index.js    
npm notice 198B bin/index.js.map
npm notice 372B package.json    
npm notice 100B src/index.ts    
npm notice 364B tsconfig.json   
npm notice === Tarball Details === 
npm notice name:          pique-sous                              
npm notice version:       1.0.0                                   
npm notice filename:      pique-sous-1.0.0.tgz                    
npm notice package size:  810 B                                   
npm notice unpacked size: 1.2 kB                                  
npm notice shasum:        6c8aea7b85c125a2d9dbbeec81d15ef94b07240a
npm notice integrity:     sha512-ozbnViT18DSUI[...]FquBcXBSV8f2g==
npm notice total files:   5                                       
npm notice 

Ваша команда теперь опубликована на NPM и быть установленным или выполненным повсюду.

Пример:

Выполнение без официальной установки:

npx pique-sous

Или глобальная установка:

npm install -g pique-sous

Шаг 6: Добавить Yahoo Finance Получить информацию о акциях

✅ Установите библиотеку Axios

yarn add axios

✅ Добавить файл ./src/getstock.ts

import axios from "axios"

export const getSingleStockInfo = async (stock: string) => {
  if (!stock) {
    throw new Error("Stock symbol argument required")
  }

  if (typeof stock !== "string") {
    throw new Error(
      `Invalid argument type for stock argument. Required: string. Found: ${typeof stock}`
    )
  }

  const url = `https://query1.finance.yahoo.com/v7/finance/quote?symbols=${stock}`

  const res = await axios.get(url)

  const { data } = res
  if (
    !data ||
    !data.quoteResponse ||
    !data.quoteResponse.result ||
    data.quoteResponse.result.length === 0
  ) {
    throw new Error(`Error retrieving info for symbol ${stock}`)
  }

  const quoteResponse = data.quoteResponse.result[0]

  return quoteResponse
}

✅ Добавить файл «./src/getversion.ts»

import * as fs from "fs"
import * as Path from "path"

export const getVersion = () => {
  const packageJSONPath = Path.resolve(__dirname, "../package.json")
  const content = fs.readFileSync(packageJSONPath, { encoding: "utf8" })
  const config = JSON.parse(content)
  return config.version
}

✅ Изменить ./src/index.ts

#!/usr/bin/env node

import { getSingleStockInfo } from "./getStock"
import { getVersion } from "./getVersion"

/**
 *  return the arguments of the command except node and index.ts
 */
const getArgs = () => {
  // We retrieve all the command argumnts except the first 2
  const args = process.argv.slice(2)
  return args
}

/**
 * Command Help
 */
const printCommandHelp = () => {
  const version = getVersion()
  const help = `
pique-sous (version: ${version})

A simple command to retrieve stock information.

Example:

$ pique-sous MSFT SFIX GOOG

`
  console.log(help)
}

const symbols = getArgs()

// Print help if no arguments
if (symbols.length === 0) {
  printCommandHelp()
  getVersion()
  process.exit(0)
}

const now = new Date().toISOString()

// Call the yahoo API for each symbol and display the result on the console
symbols.forEach((symbol) => {
  console.log(`Retrieving stock information for ${symbol} at date ${now}`)
  getSingleStockInfo(symbol).then(console.log)
})

✅ Увеличьте номер версии в package.json до 1.1.0 («Версия»)

{
  "devDependencies": {
    "@types/axios": "^0.14.0",
    "@types/node": "^14.14.20"
  },
  "name": "pique-sous",
  "version": "1.1.0",
  "description": "A simple command to retrieve stock information",
  "main": "./bin/index.js",
  "dependencies": {
    "axios": "^0.21.1",
    "typescript": "^4.1.3"
  },
  "bin": "bin/index.js",
  "scripts": {
    "build": "tsc",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [
    "cli",
    "node",
    "typescript",
    "npm",
    "stock",
    "yahoo finance"
  ],
  "contributors": [
    "raphaelmansuy"
  ],
  "repository": {
    "url": "https://github.com/raphaelmansuy/pique-sous.git",
    "type": ""
  },
  "author": {
    "email": "raphael.mansuy@gmail.com",
    "name": "raphaelmansuy"
  },
  "license": "MIT"
}

✅ Создайте новую версию

$ yarn build

✅ Проверка локально

Публикуйте компонент:

$ yarn link --global

✅ Выполнять

$ pique-sous MSFT

Результат:

Retrieving stock information for MSFT at date 2021-01-10T06:11:41.305Z
{
  language: 'en-US',
  region: 'US',
  quoteType: 'EQUITY',
  quoteSourceName: 'Delayed Quote',
  triggerable: true,
  currency: 'USD',
  exchange: 'NMS',
  shortName: 'Microsoft Corporation',
  longName: 'Microsoft Corporation',
  messageBoardId: 'finmb_21835',
  exchangeTimezoneName: 'America/New_York',
  exchangeTimezoneShortName: 'EST',
  gmtOffSetMilliseconds: -18000000,

  ...

🔥🔥🔥 Пакет теперь может быть переиздан на npm 💪.

Повысьте свою производительность, создав собственную команду CLI с помощью TypeScript (2 серии деталей)

Оригинал: «https://dev.to/raphaelmansuy/boost-your-productivity-by-creating-your-own-cli-command-with-typescript-part-1-5g37»