> π [English](README.md) Β· **Π ΡΡΡΠΊΠΈΠΉ**
## Π Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅
**Jira.js** β ΡΡΠΎ ΠΌΠΎΡΠ½Π°Ρ, Π³ΠΎΡΠΎΠ²Π°Ρ ΠΊ ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½Ρ TypeScript-Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π΄Π»Ρ [Node.js](https://nodejs.org/) ΠΈ Π±ΡΠ°ΡΠ·Π΅ΡΠΎΠ², ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡΠ°Ρ ΡΠ΄ΠΎΠ±Π½ΠΎΠ΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ API Atlassian Jira Cloud. ΠΡΠΎΡ npm-ΠΏΠ°ΠΊΠ΅Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΏΠΎΠ»Π½ΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ:
- **[Jira Cloud REST API v2/v3](https://developer.atlassian.com/cloud/jira/platform/rest/)** β ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΏΠΎΠΊΡΡΡΠΈΠ΅ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ API
- **[Jira Agile Cloud API](https://developer.atlassian.com/cloud/jira/software/rest/intro/)** β ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠΏΡΠΈΠ½ΡΠ°ΠΌΠΈ, Π΄ΠΎΡΠΊΠ°ΠΌΠΈ ΠΈ Π±ΡΠΊΠ»ΠΎΠ³Π°ΠΌΠΈ
- **[Jira Service Desk Cloud API](https://developer.atlassian.com/cloud/jira/service-desk/rest/intro/)** β ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ service desk
### ΠΠ»ΡΡΠ΅Π²ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ
- β
**Π’ΠΈΠΏΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ**: ΠΏΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° TypeScript Ρ ΠΈΡΡΠ΅ΡΠΏΡΠ²Π°ΡΡΠΈΠΌΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡΠΌΠΈ ΡΠΈΠΏΠΎΠ² ΠΈ IntelliSense
- β
**ΠΠ° ΠΏΡΠΎΠΌΠΈΡΠ°Ρ
**: ΠΏΠΎΠ½ΡΡΠ½ΡΠΉ async/await-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° API
- β
**ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° tree-shaking**: ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΡΠΉΡΠ΅ ΡΠ°Π·ΠΌΠ΅Ρ Π±Π°Π½Π΄Π»Π°, ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎ, ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ (ΠΈΠ΄Π΅Π°Π»ΡΠ½ΠΎ Π΄Π»Ρ Π±ΡΠ°ΡΠ·Π΅ΡΠ½ΡΡ
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ)
- β
**Π£Π½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΠΎΡΡΡ**: ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π² Node.js (v20+) ΠΈ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
Π±ΡΠ°ΡΠ·Π΅ΡΠ°Ρ
Ρ ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ ESM/CJS
- β
**ΠΠΎΠ»Π½ΠΎΠ΅ ΠΏΠΎΠΊΡΡΡΠΈΠ΅**: ΠΏΠΎΡΡΠΈ 100% Jira Cloud REST API v2/v3, Agile ΠΈ Service Desk API
- β
**Π₯ΠΎΡΠΎΡΠ°Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ**: ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΡΠ΅ JSDoc, ΡΠΏΡΠ°Π²ΠΎΡΠ½ΠΈΠΊ ΠΏΠΎ API ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΊΠΎΠ΄Π°
- β
**Π‘ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ ΡΡΠ΅ΠΊ**: Π½Π°ΠΏΠΈΡΠ°Π½Π° Π½Π° TypeScript, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ES Modules ΠΈ CommonJS
- β
**ΠΠΊΡΠΈΠ²Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ°**: ΡΠ΅Π³ΡΠ»ΡΡΠ½ΡΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ Ρ Π½ΠΎΠ²ΡΠΌΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠΌΠΈ Jira API ΠΈ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡΠΌΠΈ ΠΎΡΠΈΠ±ΠΎΠΊ
- β
**ΠΠΎΡΠΎΠ²Π½ΠΎΡΡΡ ΠΊ ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½Ρ**: ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΡΡΡΡΠ°ΠΌΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² Π² ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½Π΅
ΠΠ΄Π΅Π°Π»ΡΠ½ΠΎ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΠΈΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΉ Ρ Jira, ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΠΈ, Π²Π΅Π±Ρ
ΡΠΊΠΎΠ², CI/CD-ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ΠΎΠ², ΠΊΠ°ΡΡΠΎΠΌΠ½ΡΡ
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Jira ΠΈ Π±ΡΠ°ΡΠ·Π΅ΡΠ½ΡΡ
ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Jira.
## Π‘ΠΎΠ΄Π΅ΡΠΆΠ°Π½ΠΈΠ΅
- [ΠΠ°ΡΠ°Π»ΠΎ ΡΠ°Π±ΠΎΡΡ](#Π½Π°ΡΠ°Π»ΠΎ-ΡΠ°Π±ΠΎΡΡ)
- [Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°](#ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ°)
- [ΠΡΡΡΡΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ](#Π±ΡΡΡΡΡΠΉ-ΠΏΡΠΈΠΌΠ΅Ρ)
- [ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ](#Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ)
- [ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅](#ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅)
- [ΠΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ](#Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ)
- [Email ΠΈ API-ΡΠΎΠΊΠ΅Π½](#email-ΠΈ-api-ΡΠΎΠΊΠ΅Π½)
- [OAuth 2.0](#oauth-20)
- [JWT (Atlassian Connect)](#jwt-atlassian-connect)
- [ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΎΡΠΈΠ±ΠΎΠΊ](#ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°-ΠΎΡΠΈΠ±ΠΎΠΊ)
- [Π‘ΡΡΡΠΊΡΡΡΠ° API](#ΡΡΡΡΠΊΡΡΡΠ°-api)
- [Tree-shaking](#tree-shaking-ΠΈ-ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ-Π±Π°Π½Π΄Π»Π°)
- [ΠΡΡΠ³ΠΈΠ΅ ΠΏΡΠΎΠ΄ΡΠΊΡΡ](#Π΄ΡΡΠ³ΠΈΠ΅-ΠΏΡΠΎΠ΄ΡΠΊΡΡ)
- [ΠΠΈΡΠ΅Π½Π·ΠΈΡ](#Π»ΠΈΡΠ΅Π½Π·ΠΈΡ)
## ΠΠ°ΡΠ°Π»ΠΎ ΡΠ°Π±ΠΎΡΡ
### Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°
Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ npm-ΠΏΠ°ΠΊΠ΅Ρ Jira.js Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°Π΅ΠΌΠΎΠ³ΠΎ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ° ΠΏΠ°ΠΊΠ΅ΡΠΎΠ². **Π’ΡΠ΅Π±ΡΠ΅ΡΡΡ Node.js 20.0.0 ΠΈΠ»ΠΈ Π½ΠΎΠ²Π΅Π΅.**
```bash
# Π§Π΅ΡΠ΅Π· npm
npm install jira.js
# Π§Π΅ΡΠ΅Π· yarn
yarn add jira.js
# Π§Π΅ΡΠ΅Π· pnpm
pnpm add jira.js
```
**ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ TypeScript**: ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠΈΠΏΠΎΠ² ΡΠΆΠ΅ Π²ΠΊΠ»ΡΡΠ΅Π½Ρ β ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΠΏΠ°ΠΊΠ΅Ρ `@types` Π½Π΅ Π½ΡΠΆΠ΅Π½!
### ΠΡΡΡΡΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ
ΠΠ°ΡΠ½ΠΈΡΠ΅ ΡΠ°Π±ΠΎΡΡ Ρ Jira.js ΠΌΠ΅Π½Π΅Π΅ ΡΠ΅ΠΌ Π·Π° 5 ΠΌΠΈΠ½ΡΡ. Π ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°ΡΡ Π·Π°Π΄Π°ΡΡ Π² Jira Ρ ΠΏΠΎΠΌΠΎΡΡΡ TypeScript-ΠΊΠ»ΠΈΠ΅Π½ΡΠ°:
```typescript
import { Version3Client } from 'jira.js';
const client = new Version3Client({
host: 'https://your-domain.atlassian.net',
authentication: {
basic: {
email: 'your@email.com',
apiToken: 'YOUR_API_TOKEN', // Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ Π΅Π³ΠΎ: https://id.atlassian.com/manage-profile/security/api-tokens
},
},
});
async function createIssue() {
const project = await client.projects.getProject({ projectIdOrKey: 'Your project id or key' });
const newIssue = await client.issues.createIssue({
fields: {
summary: 'Hello Jira.js!',
issuetype: { name: 'Task' },
project: { key: project.key },
},
});
console.log(`Issue created: ${newIssue.id}`);
}
createIssue();
```
## ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ
π **ΠΠΎΠ»Π½ΡΠΉ ΡΠΏΡΠ°Π²ΠΎΡΠ½ΠΈΠΊ ΠΏΠΎ API, ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²Π° ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΡ** Π΄ΠΎΡΡΡΠΏΠ½Ρ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ:
**[https://mrrefactoring.github.io/jira.js/](https://mrrefactoring.github.io/jira.js/)**
ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ:
- ΠΠΎΠ»Π½ΡΠΉ ΡΠΏΡΠ°Π²ΠΎΡΠ½ΠΈΠΊ ΠΏΠΎ API Π΄Π»Ρ Π²ΡΠ΅Ρ
ΡΠ½Π΄ΠΏΠΎΠΈΠ½ΡΠΎΠ²
- ΠΡΠΈΠΌΠ΅ΡΡ Π½Π° TypeScript ΠΈ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΡ ΠΊΠΎΠ΄Π°
- Π ΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²Π° ΠΏΠΎ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ
- ΠΠ°ΡΡΠ΅ΡΠ½Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΎΡΠΈΠ±ΠΎΠΊ
- ΠΡΡΡΠΈΠ΅ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΈ ΠΈ ΡΠΎΠ²Π΅ΡΡ
## ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΠ΅ API
Jira.js ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΏΠΎΠ»Π½ΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ Π²ΡΠ΅Ρ
ΠΎΡΠ½ΠΎΠ²Π½ΡΡ
API Jira Cloud:
- **Jira Platform REST API v2**: ΡΡΡΠ°ΡΠ΅Π²ΡΠΈΠ΅ ΡΠ½Π΄ΠΏΠΎΠΈΠ½ΡΡ API Π΄Π»Ρ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ², Π·Π°Π΄Π°Ρ, ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΠΈ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ
- **Jira Platform REST API v3**: ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ API Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½Π½ΡΠΌΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠΌΠΈ ΠΈ ΡΠ»ΡΡΡΠ΅Π½Π½ΠΎΠΉ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡΡ
- **Jira Software (Agile) API**: ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠΏΡΠΈΠ½ΡΠ°ΠΌΠΈ, Π΄ΠΎΡΠΊΠΈ, Π±ΡΠΊΠ»ΠΎΠ³ΠΈ ΠΈ agile-ΠΏΡΠΎΡΠ΅ΡΡΡ
- **Jira Service Desk API**: ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ service desk, ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌΠΈ ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π·Π°ΠΏΡΠΎΡΠΎΠ²
ΠΡΠ΅ API ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΡΠΈΠΏΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ TypeScript, ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΡ Π±ΡΡΡΡΠ΅Π΅ ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½Π΅Π΅.
## ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅
### ΠΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ
#### Email ΠΈ API-ΡΠΎΠΊΠ΅Π½
1. Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ API-ΡΠΎΠΊΠ΅Π½: [https://id.atlassian.com/manage-profile/security/api-tokens](https://id.atlassian.com/manage-profile/security/api-tokens)
2. ΠΠ°ΡΡΡΠΎΠΉΡΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ:
```typescript
const client = new Version3Client({
host: 'https://your-domain.atlassian.net',
authentication: {
basic: { email: 'YOUR@EMAIL.ORG', apiToken: 'YOUR_API_TOKEN' },
},
});
```
#### OAuth 2.0
jira.js ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΏΠΎΠ»Π½ΡΠΉ ΠΏΠΎΡΠΎΠΊ Atlassian [OAuth 2.0 (3LO)](https://developer.atlassian.com/cloud/jira/platform/oauth-2-3lo-apps/). ΠΡΠΎΡΡΠ΅ΠΉΡΠ°Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ access-ΡΠΎΠΊΠ΅Π½:
```typescript
const client = new Version3Client({
host: 'https://your-domain.atlassian.net',
authentication: {
oauth2: { accessToken: 'YOUR_ACCESS_TOKEN' },
},
});
```
**ΠΠΎΠ»Π½ΡΠΉ ΠΏΠΎΡΠΎΠΊ Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ cloudId.** ΠΠ΅ΡΠ΅Π΄Π°ΠΉΡΠ΅ ΡΡΡΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π΄Π»Ρ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ β ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ Π±ΡΠ΄Π΅Ρ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡΡ access-ΡΠΎΠΊΠ΅Π½ ΠΏΠΎ ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΠΈ ΡΡΠΎΠΊΠ° Π΄Π΅ΠΉΡΡΠ²ΠΈΡ (Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΈ `401`), ΡΠΎΡ
ΡΠ°Π½ΡΡΡ ΡΠΎΡΠΈΡΡΠ΅ΠΌΡΠΉ refresh-ΡΠΎΠΊΠ΅Π½ ΡΠ΅ΡΠ΅Π· `onTokenRefresh` ΠΈ Π½Π°ΠΏΡΠ°Π²Π»ΡΡΡ Π·Π°ΠΏΡΠΎΡΡ ΡΠ΅ΡΠ΅Π· API-ΡΠ»ΡΠ· (`https://api.atlassian.com/ex/jira/{cloudId}`), ΡΠ°ΠΊ ΡΡΠΎ `host` Π½Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ. `clientSecret` ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠΎΠΊΠ΅Π½ΠΎΠ² β **ΡΠΎΠ»ΡΠΊΠΎ Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΡΠ΅ΡΠ²Π΅ΡΠ°**.
```typescript
const client = new Version3Client({
// Π±Π΅Π· `host` β cloudId ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ (ΠΏΠ΅ΡΠ΅Π΄Π°ΠΉΡΠ΅ `siteUrl` ΠΈΠ»ΠΈ `cloudId`, ΡΡΠΎΠ±Ρ Π·Π°ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ)
authentication: {
oauth2: {
accessToken: 'CURRENT_ACCESS_TOKEN',
refreshToken: 'CURRENT_REFRESH_TOKEN',
clientId: 'YOUR_CLIENT_ID',
clientSecret: 'YOUR_CLIENT_SECRET',
expiresAt: Date.now() + 3600 * 1000, // Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ; ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄Ρ ΡΠΏΠΎΡ
ΠΈ
onTokenRefresh: async ({ accessToken, refreshToken, expiresAt }) => {
await saveTokens({ accessToken, refreshToken, expiresAt }); // ΡΠΎΡ
ΡΠ°Π½ΠΈΡΠ΅ ΡΠΎΡΠΈΡΡΠ΅ΠΌΡΠ΅ ΡΠΎΠΊΠ΅Π½Ρ
},
},
},
});
```
jira.js ΡΠ°ΠΊΠΆΠ΅ ΡΠΊΡΠΏΠΎΡΡΠΈΡΡΠ΅Ρ stateless-Ρ
Π΅Π»ΠΏΠ΅ΡΡ Π΄Π»Ρ ΠΏΠΎΡΠΎΠΊΠ° Ρ ΠΊΠΎΠ΄ΠΎΠΌ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ β `generateAuthorizationUrl`, `exchangeAuthorizationCode`, `refreshOAuth2Token`, `getAccessibleResources`. Π‘ΠΌ. [ΠΏΠΎΡΠ°Π³ΠΎΠ²ΠΎΠ΅ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ ΠΏΠΎ OAuth 2.0](./guides/oauth2-authentication.ru.md).
#### JWT (Atlassian Connect)
ΠΠ»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ [Atlassian Connect](https://developer.atlassian.com/cloud/jira/platform/getting-started-with-connect/) Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΠ΅ΡΠ΅Π· JWT, ΡΠΎΡΠΌΠΈΡΡΠ΅ΠΌΡΠΉ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π·Π°ΠΏΡΠΎΡΠ° ΠΈ ΠΏΠΎΠ΄ΠΏΠΈΡΡΠ²Π°Π΅ΠΌΡΠΉ ΠΎΠ±ΡΠΈΠΌ ΡΠ΅ΠΊΡΠ΅ΡΠΎΠΌ (shared secret) Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΡΠΎ **ΡΠ΅ΡΠ²Π΅ΡΠ½ΡΠΉ** ΠΏΠΎΡΠΎΠΊ β ΠΎΠ±ΡΠΈΠΉ ΡΠ΅ΠΊΡΠ΅Ρ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠΏΠ°Π΄Π°ΡΡ Π² Π±ΡΠ°ΡΠ·Π΅Ρ.
> **ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅:** ΠΠ»Ρ Atlassian Connect Π½Π°ΡΡΡΠΏΠ°Π΅Ρ [ΠΊΠΎΠ½Π΅Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ (Q4 2026)](https://www.atlassian.com/blog/development/announcing-connect-end-of-support-timeline-and-next-steps), ΠΈ Π½ΠΎΠ²ΡΠ΅ ΠΏΡΠΈΠ²Π°ΡΠ½ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅Π»ΡΠ·Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΠ΅ΡΠ΅Π· URL Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ°. JWT-Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π·Π΄Π΅ΡΡ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π° Π΄Π»Ρ **ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΡ
** ΡΡΡΠ°Π½ΠΎΠ²ΠΎΠΊ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Connect.
- `issuer`: ΠΊΠ»ΡΡ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ β ΠΏΠΎΠ»Π΅ `key` Π² Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ΅ `atlassian-connect.json`.
- `secret`: Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ `sharedSecret`, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π² ΡΠ΅Π»Π΅ lifecycle-Π²Π΅Π±Ρ
ΡΠΊΠ° `installed` Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΡΠΊΠΎΠΏΠΎΠΆΠ°ΡΠΈΡ ΠΏΡΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅. Π₯ΡΠ°Π½ΠΈΡΠ΅ Π΅Π³ΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ΅Π½Π°Π½ΡΠ°.
- `expiryTimeSeconds` (Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ): Π²ΡΠ΅ΠΌΡ ΠΆΠΈΠ·Π½ΠΈ ΡΠΎΠΊΠ΅Π½Π° Π² ΡΠ΅ΠΊΡΠ½Π΄Π°Ρ
(ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ `180`, Ρ.Π΅. 3 ΠΌΠΈΠ½ΡΡΡ).
```typescript
const client = new Version3Client({
host: 'https://your-domain.atlassian.net',
authentication: {
jwt: {
issuer: 'YOUR_APP_KEY',
secret: 'YOUR_SHARED_SECRET',
expiryTimeSeconds: 180, // Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ
},
},
});
```
ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π·Π°ΠΏΡΠΎΡΠ° Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΡΡΡ Π½ΠΎΠ²ΡΠΉ JWT Ρ Ρ
Π΅ΡΠ΅ΠΌ ΡΡΡΠΎΠΊΠΈ Π·Π°ΠΏΡΠΎΡΠ° (`qsh`), ΠΏΡΠΈΠ²ΡΠ·Π°Π½Π½ΡΠΌ ΠΊ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΈ URL ΡΡΠΎΠ³ΠΎ Π·Π°ΠΏΡΠΎΡΠ°. Π ΡΠΎΠΌ, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Connect ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΡ `issuer` ΠΈ `secret`, ΡΠΌ. [ΠΏΠΎΡΠ°Π³ΠΎΠ²ΠΎΠ΅ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ ΠΏΠΎ Π½Π°ΡΡΡΠΎΠΉΠΊΠ΅](./guides/jwt-authentication.ru.md).
### ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΎΡΠΈΠ±ΠΎΠΊ
ΠΡΠΈΠ±ΠΊΠΈ Π΄Π΅Π»ΡΡΡΡ Π½Π° ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΈ:
- `HttpException`: ΡΠ΅ΡΠ²Π΅Ρ ΠΎΡΠ²Π΅ΡΠΈΠ» ΠΎΡΠΈΠ±ΠΊΠΎΠΉ (Π²ΠΊΠ»ΡΡΠ°Π΅Ρ ΡΠ°Π·ΠΎΠ±ΡΠ°Π½Π½ΡΠ΅ Π΄Π΅ΡΠ°Π»ΠΈ ΠΎΡΠΈΠ±ΠΊΠΈ)
- `AxiosError`: ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΡΠ΅ΡΠΈ ΠΈΠ»ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ°ΠΉΠΌΠ°ΡΡΡ)
**ΠΡΠΈΠΌΠ΅Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ:**
```typescript
try {
await client.issues.getIssue({ issueIdOrKey: 'INVALID-123' });
} catch (error) {
if (error instanceof HttpException) {
console.error('Server error:', error.message);
console.debug('Response headers:', error.cause.response?.headers);
} else if (error instanceof AxiosError) {
console.error('Network error:', error.code);
} else {
console.error('Unexpected error:', error);
}
}
```
### Π‘ΡΡΡΠΊΡΡΡΠ° API
ΠΠΎΡΡΡΠΏ ΠΊ ΡΠ½Π΄ΠΏΠΎΠΈΠ½ΡΠ°ΠΌ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠΎ ΡΡ
Π΅ΠΌΠ΅ `client..`:
```typescript
// ΠΠΎΠ»ΡΡΠΈΡΡ Π²ΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΡ
const projects = await client.projects.searchProjects();
// Π‘ΠΎΠ·Π΄Π°ΡΡ ΡΠΏΡΠΈΠ½Ρ
const sprint = await client.sprint.createSprint({ name: 'Q4 Sprint' });
```
**ΠΠΎΡΡΡΠΏΠ½ΡΠ΅ Π³ΡΡΠΏΠΏΡ API:**
π½ Agile Cloud API
- [backlog](https://developer.atlassian.com/cloud/jira/software/rest/api-group-backlog/#api-group-backlog)
- [board](https://developer.atlassian.com/cloud/jira/software/rest/api-group-board/#api-group-board)
- [builds](https://developer.atlassian.com/cloud/jira/software/rest/api-group-builds/#api-group-builds)
- [deployments](https://developer.atlassian.com/cloud/jira/software/rest/api-group-deployments/#api-group-deployments)
- [developmentInformation](https://developer.atlassian.com/cloud/jira/software/rest/api-group-development-information/#api-group-development-information)
- [devopsComponents](https://developer.atlassian.com/cloud/jira/software/rest/api-group-devops-components/#api-group-devops-components)
- [epic](https://developer.atlassian.com/cloud/jira/software/rest/api-group-epic/#api-group-epic)
- [featureFlags](https://developer.atlassian.com/cloud/jira/software/rest/api-group-feature-flags/#api-group-feature-flags)
- [issue](https://developer.atlassian.com/cloud/jira/software/rest/api-group-issue/#api-group-issue)
- [operations](https://developer.atlassian.com/cloud/jira/software/rest/api-group-operations/#api-group-operations)
- [remoteLinks](https://developer.atlassian.com/cloud/jira/software/rest/api-group-remote-links/#api-group-remote-links)
- [securityInformation](https://developer.atlassian.com/cloud/jira/software/rest/api-group-security-information/#api-group-security-information)
- [sprint](https://developer.atlassian.com/cloud/jira/software/rest/api-group-sprint/#api-group-sprint)
π½ Core REST API (v2/v3)
- [api](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-other-operations/#api-group-other-operations)
- [announcementBanner](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-announcement-banner/#api-group-announcement-banner)
- [appDataPolicy](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-app-data-policies/#api-group-app-data-policies)
- [applicationRoles](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-application-roles/#api-group-application-roles)
- [appMigration](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-app-migration/#api-group-app-migration)
- [auditRecords](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-audit-records/#api-group-audit-records)
- [avatars](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-avatars/#api-group-avatars)
- [classificationLevels](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-classification-levels/#api-group-classification-levels)
- [dashboards](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-dashboards/#api-group-dashboards)
- [filters](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-filters/#api-group-filters)
- [fieldSchemes](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-field-schemes/#api-group-field-schemes)
- [filterSharing](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-filter-sharing/#api-group-filter-sharing)
- [groupAndUserPicker](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-group-and-user-picker/#api-group-group-and-user-picker)
- [groups](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-groups/#api-group-groups)
- [instanceInformation](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-instance-information/#api-group-instance-information)
- [issues](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issues/#api-group-issues)
- [issueAttachments](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-attachments/#api-group-issue-attachments)
- [issueBulkOperations](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-bulk-operations/#api-group-issue-bulk-operations)
- [issueComments](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-comments/#api-group-issue-comments)
- [issueCustomFieldAssociations](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-custom-field-associations/#api-group-issue-custom-field-associations)
- [issueCustomFieldConfigurationApps](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-custom-field-configuration--apps-/#api-group-issue-custom-field-configuration--apps-)
- [issueCommentProperties](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-comment-properties/#api-group-issue-comment-properties)
- [issueFields](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-fields/#api-group-issue-fields)
- [issueFieldConfigurations](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-field-configurations/#api-group-issue-field-configurations)
- [issueCustomFieldContexts](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-custom-field-contexts/#api-group-issue-custom-field-contexts)
- [issueCustomFieldOptions](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-custom-field-options/#api-group-issue-custom-field-options)
- [issueCustomFieldOptionsApps](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-custom-field-options--apps-/#api-group-issue-custom-field-options--apps-)
- [issueCustomFieldValuesApps](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-custom-field-values--apps-/#api-group-issue-custom-field-values--apps-)
- [issueLinks](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-links/#api-group-issue-links)
- [issueLinkTypes](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-link-types/#api-group-issue-link-types)
- [issueNavigatorSettings](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-navigator-settings/#api-group-issue-navigator-settings)
- [issueNotificationSchemes](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-notification-schemes/#api-group-issue-notification-schemes)
- [issuePriorities](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-priorities/#api-group-issue-priorities)
- [issueProperties](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-properties/#api-group-issue-properties)
- [issueRedaction](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-redaction/#api-group-issue-redaction)
- [issueRemoteLinks](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-remote-links/#api-group-issue-remote-links)
- [issueResolutions](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-resolutions/#api-group-issue-resolutions)
- [issueSearch](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-search/#api-group-issue-search)
- [issueSecurityLevel](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-security-level/#api-group-issue-security-level)
- [issueSecuritySchemes](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-security-schemes/#api-group-issue-security-schemes)
- [issueTypes](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-types/#api-group-issue-types)
- [issueTypeSchemes](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-type-schemes/#api-group-issue-type-schemes)
- [issueTypeScreenSchemes](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-type-screen-schemes/#api-group-issue-type-screen-schemes)
- [issueTypeProperties](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-type-properties/#api-group-issue-type-properties)
- [issueVotes](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-votes/#api-group-issue-votes)
- [issueWatchers](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-watchers/#api-group-issue-watchers)
- [issueWorklogs](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-worklogs/#api-group-issue-worklogs)
- [issueWorklogProperties](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-worklog-properties/#api-group-issue-worklog-properties)
- [jiraExpressions](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-jira-expressions/#api-group-jira-expressions)
- [jiraSettings](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-jira-settings/#api-group-jira-settings)
- [jql](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-jql/#api-group-jql)
- [jqlFunctionsApps](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-jql-functions--apps-/#api-group-jql-functions--apps-)
- [labels](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-labels/#api-group-labels)
- [licenseMetrics](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-license-metrics/#api-group-license-metrics)
- [migrationOfConnectModulesToForge](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-migration-of-connect-modules-to-forge/#api-group-migration-of-connect-modules-to-forge)
- [myself](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-myself/#api-group-myself)
- [permissions](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-permissions/#api-group-permissions)
- [permissionSchemes](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-permission-schemes/#api-group-permission-schemes)
- [plans](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-plans/#api-group-plans)
- [prioritySchemes](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-priority-schemes/#api-group-priority-schemes)
- [projects](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-projects/#api-group-projects)
- [projectTemplates](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-project-templates/#api-group-project-templates)
- [projectAvatars](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-project-avatars/#api-group-project-avatars)
- [projectCategories](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-project-categories/#api-group-project-categories)
- [projectClassificationLevels](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-project-classification-levels/#api-group-project-classification-levels)
- [projectComponents](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-project-components/#api-group-project-components)
- [projectEmail](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-project-email/#api-group-project-email)
- [projectFeatures](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-project-features/#api-group-project-features)
- [projectKeyAndNameValidation](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-project-key-and-name-validation/#api-group-project-key-and-name-validation)
- [projectPermissionSchemes](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-project-permission-schemes/#api-group-project-permission-schemes)
- [projectProperties](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-project-properties/#api-group-project-properties)
- [projectRoles](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-project-roles/#api-group-project-roles)
- [projectRoleActors](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-project-role-actors/#api-group-project-role-actors)
- [projectTypes](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-project-types/#api-group-project-types)
- [projectVersions](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-project-versions/#api-group-project-versions)
- [screens](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-screens/#api-group-screens)
- [screenTabs](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-screen-tabs/#api-group-screen-tabs)
- [screenTabFields](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-screen-tab-fields/#api-group-screen-tab-fields)
- [screenSchemes](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-screen-schemes/#api-group-screen-schemes)
- [serverInfo](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-server-info/#api-group-server-info)
- [serviceRegistry](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-service-registry/#api-group-service-registry)
- [status](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-status/#api-group-status)
- [tasks](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-tasks/#api-group-tasks)
- [teamsInPlan](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-teams-in-plan/#api-group-teams-in-plan)
- [timeTracking](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-time-tracking/#api-group-time-tracking)
- [uiModificationsApps](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-ui-modifications--apps-/#api-group-ui-modifications--apps-)
- [users](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-users/#api-group-users)
- [userNavProperties](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-other-operations/#api-group-other-operations)
- [userProperties](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-user-properties/#api-group-user-properties)
- [userSearch](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-user-search/#api-group-user-search)
- [webhooks](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-webhooks/#api-group-webhooks)
- [workflows](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-workflows/#api-group-workflows)
- [workflowTransitionRules](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-workflow-transition-rules/#api-group-workflow-transition-rules)
- [workflowSchemes](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-workflow-schemes/#api-group-workflow-schemes)
- [workflowSchemeProjectAssociations](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-workflow-scheme-project-associations/#api-group-workflow-scheme-project-associations)
- [workflowSchemeDrafts](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-workflow-scheme-drafts/#api-group-workflow-scheme-drafts)
- [workflowStatuses](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-workflow-statuses/#api-group-workflow-statuses)
- [workflowStatusCategories](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-workflow-status-categories/#api-group-workflow-status-categories)
- [workflowTransitionProperties](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-workflow-transition-properties/#api-group-workflow-transition-properties)
- [appProperties](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-app-properties/#api-group-app-properties)
- [dynamicModules](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-dynamic-modules/#api-group-dynamic-modules)
π½ Service Desk API
- [customer](https://developer.atlassian.com/cloud/jira/service-desk/rest/api-group-customer/)
- [info](https://developer.atlassian.com/cloud/jira/service-desk/rest/api-group-info/#api-group-info)
- [insight](https://developer.atlassian.com/cloud/jira/service-desk/rest/api-group-insight/#api-group-insight)
- [knowledgeBase](https://developer.atlassian.com/cloud/jira/service-desk/rest/api-group-knowledgebase/#api-group-knowledgebase)
- [organizations](https://developer.atlassian.com/cloud/jira/service-desk/rest/api-group-organization/#api-group-organization)
- [request](https://developer.atlassian.com/cloud/jira/service-desk/rest/api-group-request/#api-group-request)
- [requestType](https://developer.atlassian.com/cloud/jira/service-desk/rest/api-group-requesttype/#api-group-requesttype)
- [serviceDesk](https://developer.atlassian.com/cloud/jira/service-desk/rest/api-group-servicedesk/#api-group-servicedesk)
ΠΠΎΠ»Π½ΡΠΉ ΡΠΏΡΠ°Π²ΠΎΡΠ½ΠΈΠΊ ΠΏΠΎ ΡΠ½Π΄ΠΏΠΎΠΈΠ½ΡΠ°ΠΌ β Π² [Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ API](https://mrrefactoring.github.io/jira.js/).
## Tree-shaking ΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π±Π°Π½Π΄Π»Π°
Jira.js ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ tree-shaking Π΄Π»Ρ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π±Π°Π½Π΄Π»Π°. ΠΠΌΠΏΠΎΡΡΠΈΡΡΠΉΡΠ΅ ΡΠΎΠ»ΡΠΊΠΎ Π½ΡΠΆΠ½ΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ:
```typescript
// custom-client.ts
import { BaseClient } from 'jira.js';
import { Issues } from 'jira.js/version3';
import { Board } from 'jira.js/agile';
export class CustomClient extends BaseClient {
issues = new Issues(this);
board = new Board(this);
}
// ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅
const client = new CustomClient({ /* ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ */ });
await client.issues.getIssue({ issueIdOrKey: 'KEY-1' });
```
Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠΈΠΏΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π±Π°ΡΡΠ΅Π»Ρ **parameters** ΠΈ **models** ΡΠ΅ΡΠ΅Π· Π³Π»ΡΠ±ΠΎΠΊΠΈΠ΅ ΠΏΠΎΠ΄ΠΏΡΡΠΈ:
```typescript
import type { SearchForIssuesUsingJqlEnhancedSearchPost } from 'jira.js/version3/parameters';
import type { Issue } from 'jira.js/version3/models';
// ΠΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ ΡΠ΅ΡΠ΅Π· ΠΊΠΎΡΠ½Π΅Π²ΠΎΠΉ namespace (ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΏΡΠΈ Π»ΡΠ±ΠΎΠΌ moduleResolution):
import { Version3 } from 'jira.js';
// type Params = Version3.Version3Parameters.SearchForIssuesUsingJqlEnhancedSearchPost;
```
> Π€ΠΎΡΠΌΠ° Ρ Π³Π»ΡΠ±ΠΎΠΊΠΈΠΌ ΠΏΠΎΠ΄ΠΏΡΡΡΠΌ (`jira.js//parameters`, `jira.js//models`) ΡΡΠ΅Π±ΡΠ΅Ρ ΡΠ΅Π·ΠΎΠ»Π²Π΅ΡΠ° Ρ
> ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ `exports` (`moduleResolution: "bundler" | "node16" | "nodenext"`). ΠΡΠΈ ΡΡΡΠ°ΡΠ΅Π²ΡΠ΅ΠΌ
> `moduleResolution: "node"` ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΠΎΡΠΌΡ ΡΠ΅ΡΠ΅Π· ΠΊΠΎΡΠ½Π΅Π²ΠΎΠΉ namespace Π²ΡΡΠ΅.
**ΠΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π°:**
- ΠΠ΅Π½ΡΡΠΈΠΉ ΡΠ°Π·ΠΌΠ΅Ρ Π±Π°Π½Π΄Π»Π° Π΄Π»Ρ Π±ΡΠ°ΡΠ·Π΅ΡΠ½ΡΡ
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ
- ΠΠΎΠ»Π΅Π΅ Π±ΡΡΡΡΠ°Ρ Π·Π°Π³ΡΡΠ·ΠΊΠ°
- ΠΠΎΠ»Π΅Π΅ Π²ΡΡΠΎΠΊΠ°Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π² ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½Π΅
## Π‘ΡΠ΅Π½Π°ΡΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ
Jira.js ΠΈΠ΄Π΅Π°Π»ΡΠ½ΠΎ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΠΈΡ Π΄Π»Ρ:
- π **ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ CI/CD**: Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΡΠΉΡΠ΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Ρ Π² Π²Π°ΡΠΈΡ
ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π°Ρ
ΡΠ°Π·Π²ΡΡΡΡΠ²Π°Π½ΠΈΡ
- π€ **Π‘ΠΊΡΠΈΠΏΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΠΈ**: ΡΠΎΠ·Π΄Π°Π²Π°ΠΉΡΠ΅ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΠΈΡ
ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Jira
- π **ΠΡΡΡΡΠ½ΠΎΡΡΡ ΠΈ Π°Π½Π°Π»ΠΈΡΠΈΠΊΠ°**: ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΠΉΡΠ΅ ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΡΠΉΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Jira Π΄Π»Ρ ΠΊΠ°ΡΡΠΎΠΌΠ½ΡΡ
Π΄Π°ΡΠ±ΠΎΡΠ΄ΠΎΠ²
- π **ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ Π²Π΅Π±Ρ
ΡΠΊΠΎΠ²**: ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΠΉΡΠ΅ Π²Π΅Π±Ρ
ΡΠΊΠΈ Jira ΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΡΠΉΡΠ΅ΡΡ Ρ Π²Π½Π΅ΡΠ½ΠΈΠΌΠΈ ΡΠΈΡΡΠ΅ΠΌΠ°ΠΌΠΈ
- π οΈ **ΠΠ°ΡΡΠΎΠΌΠ½ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ**: ΡΠΎΠ·Π΄Π°Π²Π°ΠΉΡΠ΅ Π°Π΄ΠΌΠΈΠ½-ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ, ΡΠΊΡΠΈΠΏΡΡ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΈ ΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Jira
- π± **ΠΡΠ°ΡΠ·Π΅ΡΠ½ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ**: ΡΠΎΠ·Π΄Π°Π²Π°ΠΉΡΠ΅ Π±ΡΠ°ΡΠ·Π΅ΡΠ½ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ Π΄Π»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Jira
- π **Π‘ΡΠΎΡΠΎΠ½Π½ΠΈΠ΅ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ**: ΡΠ²ΡΠ·ΡΠ²Π°ΠΉΡΠ΅ Jira Ρ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌΠΈ ΠΈ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°ΠΌΠΈ
## Π§Π°ΡΡΡΠ΅ Π²ΠΎΠΏΡΠΎΡΡ (FAQ)
**Π: Π Π°Π±ΠΎΡΠ°Π΅Ρ Π»ΠΈ ΡΡΠΎ Ρ Jira Server/Data Center?**
Π: ΠΠ΅Ρ, Jira.js ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π½Π° ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎ Π΄Π»Ρ Jira Cloud. ΠΠ»Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ (on-premise) Jira ΡΠ°ΡΡΠΌΠΎΡΡΠΈΡΠ΅ ΠΏΡΡΠΌΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ REST API.
**Π: ΠΠ±ΡΠ·Π°ΡΠ΅Π»Π΅Π½ Π»ΠΈ TypeScript?**
Π: ΠΠ΅Ρ, Π½ΠΎ TypeScript ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ Ρ ΠΈΡΡΠ΅ΡΠΏΡΠ²Π°ΡΡΠΈΠΌΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡΠΌΠΈ ΡΠΈΠΏΠΎΠ². ΠΡ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Jira.js Ρ ΠΎΠ±ΡΡΠ½ΡΠΌ JavaScript.
**Π: ΠΠΎΠΆΠ½ΠΎ Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΎ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅?**
Π: ΠΠ°! Jira.js ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΊΠ°ΠΊ Π² Node.js, ΡΠ°ΠΊ ΠΈ Π² ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
Π±ΡΠ°ΡΠ·Π΅ΡΠ°Ρ
. ΠΠ΅ Π·Π°Π±ΡΠ΄ΡΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ CORS, Π΅ΡΠ»ΠΈ Π²ΡΠ·ΡΠ²Π°Π΅ΡΠ΅ API Jira ΠΈΠ· Π±ΡΠ°ΡΠ·Π΅ΡΠ°.
**Π: ΠΠ°ΠΊ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ?**
Π: Jira.js ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Basic Auth (email + API-ΡΠΎΠΊΠ΅Π½), OAuth 2.0 ΠΈ JWT Π΄Π»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Atlassian Connect. Π‘ΠΌ. ΡΠ°Π·Π΄Π΅Π» [ΠΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ](#Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ) Π²ΡΡΠ΅.
## ΠΡΡΠ³ΠΈΠ΅ ΠΏΡΠΎΠ΄ΡΠΊΡΡ
ΠΠ·ΡΡΠΈΡΠ΅ Π½Π°ΡΠΈ Π΄ΡΡΠ³ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π΄Π»Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ Ρ Atlassian:
- [Confluence.js](https://github.com/MrRefactoring/confluence.js) β Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ API Confluence
- [Trello.js](https://github.com/MrRefactoring/trello.js) β ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ API Trello
## Π£ΡΠ°ΡΡΠΈΠ΅ Π² ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅
ΠΠΊΠ»Π°Π΄ Π² ΠΏΡΠΎΠ΅ΠΊΡ ΠΏΡΠΈΠ²Π΅ΡΡΡΠ²ΡΠ΅ΡΡΡ! ΠΠ΅ ΡΡΠ΅ΡΠ½ΡΠΉΡΠ΅ΡΡ ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡ Pull Request. ΠΠ»Ρ ΠΊΡΡΠΏΠ½ΡΡ
ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΡΠ½Π°ΡΠ°Π»Π° ΠΎΡΠΊΡΠΎΠΉΡΠ΅ issue, ΡΡΠΎΠ±Ρ ΠΎΠ±ΡΡΠ΄ΠΈΡΡ, ΡΡΠΎ Π²Ρ Ρ
ΠΎΡΠ΅Π»ΠΈ Π±Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ.
## ΠΠΈΡΠ΅Π½Π·ΠΈΡ
ΠΠΈΡΠ΅Π½Π·ΠΈΡ MIT Β© MrRefactoring
ΠΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ ΡΠΌ. Π² [LICENSE](https://github.com/mrrefactoring/jira.js/blob/develop/LICENSE).