рдирд╡реАрдирддрдо рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛рдПрдБ

рд╣рд╛рдп, рд╣реИрдмреНрд░ред рдпрд╣ рд▓реЗрдЦ рдирд╡реАрдирддрдо рддрдХрдиреАрдХ рдХреЗ рд╕рд╛рде рд╣реИрд▓реЛ рджреБрдирд┐рдпрд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред


рдЕрдВрдд рдореЗрдВ, рд╣рдореЗрдВ рдПрдХ рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдорд┐рд▓реЗрдЧреА рдЬреЛ:


  • рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ
  • рдХреЛрдбрд╕реНрдЯрд╛рдЗрд▓ рдХреА рджреЗрдЦрднрд╛рд▓ рдХрд░рддрд╛ рд╣реИ
  • рдПрдХ рдЧреЛрджреА рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ
  • рдкрд░реАрдХреНрд╖рдг рдЖрдпреЛрдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ

рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛


рдирдП рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ, git рдФрд░ npm рдЖрд░рдВрдн рдХрд░реЗрдВ


git init npm init 

рдЬрдм npm рдХреА рд╕реНрдерд╛рдкрдирд╛


  package name: (bestlibever) version: (1.0.0) 0.1.0 description: Best lib forever entry point: (index.js) test command: jest git repository: keywords: author: >MAX_ (maximmasterr) license: (ISC) MIT 

рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕рдВрд░рдЪрдирд╛


рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдПрдБ рд╣реЛрдВрдЧреА:


  • src - рдпрд╣рд╛рдВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдлрд╛рдЗрд▓реЗрдВ рдЦреБрдж рд╣реЛрдВрдЧреА (рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ)
  • lib - рдпрд╣рд╛рдБ tsc рд╕рдВрдХрд▓рд┐рдд рдлрд╛рдЗрд▓реЛрдВ рдХреЛ src рд╕реЗ рдбрд╛рд▓реЗрдЧрд╛
  • рдкрд░реАрдХреНрд╖рдг - рдпрд╣рд╛рдБ рдкрд░реАрдХреНрд╖рдг рд╣реИрдВ
  • рдЙрджрд╛рд╣рд░рдг - рдЙрдкрдпреЛрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг

рдЖрдкрдХреЛ .gitignore рдХреЛ рднреА рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:


 lib/ node_modules/ 

рдЯрд╛рдЗрдкрдкреНрд░рддрд┐


рдЕрдм рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реНрдерд╛рдкрд┐рдд рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ:


 npm i typescript -D 

рдФрд░ tsconifg.json рдирд╛рдордХ рдПрдХ рдлрд╛рдЗрд▓ tsconifg.json


  { "compilerOptions": { "target": "es5", "module": "commonjs", "declaration": true, "outDir": "./lib", "strict": true, "sourceMap": true }, "include": ["src"], "exclude": ["node_modules", "**/__tests__/*"] } 

рдЕрдм рдореБрдЦреНрдп рдлрд╛рдЗрд▓ рдХреЛ src/index.ts


 export function helloWorld(){ return 'Hello world!' } 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ package.json рдЬреЛрдбрд╝реЗрдВ:


  "build": "tsc", "dev": "tsc --watch" 

рдЕрдм рд╣рдо рдПрдХ-рдмрд╛рд░ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ:


 npm run build 

рдФрд░ рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп:


 npm run dev 

Codestyle


рдХреЛрдб рд╢реИрд▓реА рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо tslint рдФрд░ prettier рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рд╕рд╛рде рд╣реА рдЗрд╕реЗ рдХрдорд┐рдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЪрд▓рд╛рдПрдВрдЧреЗред
Tslint, prettier, рдХрд░реНрдХрд╢ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:


 npm i tslint tslint-config-prettier prettier husky -D 

рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдПрдХ .prettierrc рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдХрд░ .prettierrc рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ


 { "printWidth": 120, "trailingComma": "none", "singleQuote": true } 

рдкреНрд░реАрдЯрд┐рдпрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЛрдбрд╝реЗрдВ


  "prettier": "npx prettier --write src/* test/* example/*" 

рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде tslint.json рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдХрд░ tslint рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ


 { "extends": ["tslint:recommended", "tslint-config-prettier"], "rules": { "curly": false, "ordered-imports": false, "interface-name": [true, "never-prefix"] } } 

Tslint рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдХреЛрдбрд╕реНрдЯрд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВ:


  "tslint": "tslint -p tslint -p tsconfig.json", "codestyle": "npm run prettier && npm run tslint" 

рдЕрдм рдХрдорд┐рдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреЛрдбреЗрдХреНрд╕ рд░рди рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ package.json рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:


 "husky": { "hooks": { "pre-commit": "npm run codestyle" } } 

рдкреНрд░рд▓реЗрдЦрди


Md рд╕реЗ рд╡реЗрдм рдкреЗрдЬ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдбреЙрдХреНрд╕рд┐рдлрд╛рдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдкреАрдЖрдИ tsdoc рд╕реЗ рдкреНрд░рд▓реЗрдЦрди рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ


рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ


 npm i docsify-cli typedoc -D 

рдбреЙрдХреНрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ, README.md рдмрдирд╛рдПрдБ:


 # Best lib ever Best lib ever `helloWorld` return `'hello world'` ## Example ``js const a = require('') console.log(a.helloWorld()) // prints 'Hello world!' `` 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдзрд┐рдХ рдЬреЛрдбрд╝реЗрдВ
рд╕реНрд░реЛрдд рдпрд╣рд╛рдБ рд╣реИ


рдЖрдЧреЗ рдХрд░рддреЗ рд╣реИрдВ


 npx docsify init ./docs 

рд╕рд╛рдЗрдбрдмрд╛рд░ рдореЗрдВ рд╕рд╛рдЗрдбрдмрд╛рд░ рдХреЛ рд╕реЗрдЯ рдХрд░реЗрдВред рд╕рд╛рдЗрдбрдмрд╛рд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрдирд╛рдХрд░


 # Best lib ever * [Best lib ever](/) * [More examples](/moreExamples) 

рдЕрдм, рдпрд╣ рд╕рдм рд╕реБрдВрджрд░рддрд╛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЛрдбрд╝реЗрдВ


 "docsify": "docsify serve ./docs" 

рдФрд░ рджреМрдбрд╝реЛ


 npm run docsify 

рдЕрдм рдПрдХ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рдзрд┐ рдкреНрд░рд▓реЗрдЦрди рд▓реЗрддреЗ рд╣реИрдВ
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХреЛрдб рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╡рд┐рд╡рд░рдг рдЬреЛрдбрд╝реЗрдВ:


 /** * Returns `Hello world!` */ 

ред .gitinore рдореЗрдВ docs/api рдЬреЛрдбрд╝реЗрдВ


рдЯрд╛рдЗрдкреНрдбреЛрдХ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЛрдбрд╝реЗрдВ


 "typedoc": "typedoc --out ./docs/api ./src --mode file --readme docs/README.md" 

рдЕрдВрдд рдореЗрдВ, рдЕрдВрддрд┐рдо рдбреЙрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЛрдбрд╝реЗрдВ


 "docs": "npm run typedoc && npm run docsify" 

рдбреЙрдХ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдм рд╕рдм рдХреБрдЫ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ


 npm run docs 

рдкрд░реАрдХреНрд╖рдг


рдЬреЗрд╕реНрдЯ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ


 npm install --save-dev @types/jest @types/node jest ts-jest typescript 

рдЪрд▓реЛ jest.config.js рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмрдирд╛рддреЗ рд╣реИрдВ


 module.exports = { roots: ['/src'], transform: { '^.+\\.tsx?$': 'ts-jest', }, testRegex: '(/__test__/.*|(\\.|/)(test|spec))\\.tsx?$', moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], } 

рдПрдХ рдкрд░реАрдХреНрд╖рдг рдмрдирд╛рдПрдВ ( test/index.ts ):


 import { helloWorld } from "../src"; test('Should return helloWorld', () => { expect(helloWorld()).toBe('Hello world!') }) 

рдФрд░ рдЕрдм рдЖрдк рдкрд░ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ


 npm test 

рд╣рдо рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг


рдЕрдм рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ


 npm run build #   npm run dev #    npm run codestyle #    npm run docs #   npm test #   

рдЕрдВрддрд┐рдо рдЧрд┐рддреБрдм рднрдВрдбрд╛рд░

Source: https://habr.com/ru/post/hi467187/


All Articles