@mojaksebastian/allegro-client 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +127 -0
- package/dist/auth/helpers/TokenStorage.d.ts +12 -0
- package/dist/auth/helpers/TokenStorage.d.ts.map +1 -0
- package/dist/auth/helpers/TokenStorage.js +43 -0
- package/dist/auth/helpers/TokenStorage.js.map +1 -0
- package/dist/auth/helpers/refreshTokens.d.ts +3 -0
- package/dist/auth/helpers/refreshTokens.d.ts.map +1 -0
- package/dist/auth/helpers/refreshTokens.js +27 -0
- package/dist/auth/helpers/refreshTokens.js.map +1 -0
- package/dist/auth/index.d.ts +13 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +51 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/strategies/DeviceFlow.d.ts +5 -0
- package/dist/auth/strategies/DeviceFlow.d.ts.map +1 -0
- package/dist/auth/strategies/DeviceFlow.js +72 -0
- package/dist/auth/strategies/DeviceFlow.js.map +1 -0
- package/dist/auth/types.d.ts +55 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +2 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/client/index.d.ts +11 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +34 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/modules.d.ts +2 -0
- package/dist/client/modules.d.ts.map +1 -0
- package/dist/client/modules.js +4 -0
- package/dist/client/modules.js.map +1 -0
- package/dist/client/types.d.ts +12 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +2 -0
- package/dist/client/types.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/package.json +36 -0
package/README.md
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# @mojaksebastian/allegro-client
|
|
2
|
+
|
|
3
|
+
Wydajny i skalowalny klient Allegro REST API dla środowiska Node.js, oferujący pełną automatyzację procesu autoryzacji OAuth2 oraz abstrakcję warstwy przechowywania tokenów.
|
|
4
|
+
|
|
5
|
+
## Główne cechy rozwiązania
|
|
6
|
+
|
|
7
|
+
- **Automatyczna retencja tokenów:** System monitoruje czas wygasania sesji i odświeża tokeny przed ich unieważnieniem.
|
|
8
|
+
- **Abstrakcja warstwy Storage:** Implementacja interfejsu `ITokenStorage` pozwala na delegowanie zapisu sesji do dowolnego silnika (Redis, SQL, NoSQL, FileSystem).
|
|
9
|
+
- **Zgodność ze standardem ESM:** Paczka zoptymalizowana pod nowoczesne środowiska Node.js (20+) oraz moduły ECMAScript.
|
|
10
|
+
- **Silne typowanie:** Kompletne definicje TypeScript dla konfiguracji, strategii oraz interfejsów magazynowania danych.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Instalacja
|
|
15
|
+
|
|
16
|
+
Paczka jest dostępna w rejestrze NPM. Można ją zainstalować za pomocą preferowanego menedżera pakietów:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npm install @mojaksebastian/allegro-client
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Szybki Start
|
|
23
|
+
|
|
24
|
+
Poniższy przykład prezentuje podstawową konfigurację z wykorzystaniem strategii DeviceFlow oraz domyślnego magazynu plikowego.
|
|
25
|
+
|
|
26
|
+
```ts
|
|
27
|
+
import AllegroClient from "@mojaksebastian/allegro-client";
|
|
28
|
+
|
|
29
|
+
const config = {
|
|
30
|
+
credentials: {
|
|
31
|
+
clientId: process.env.ALLEGRO_CLIENT_ID,
|
|
32
|
+
clientSecret: process.env.ALLEGRO_CLIENT_SECRET,
|
|
33
|
+
},
|
|
34
|
+
strategy: "DeviceFlow",
|
|
35
|
+
env: "sandbox", // Opcje: "production" | "sandbox"
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
const allegro = new AllegroClient(config);
|
|
39
|
+
|
|
40
|
+
async function initialize() {
|
|
41
|
+
try {
|
|
42
|
+
const accessToken = await allegro.getAccessToken();
|
|
43
|
+
console.log("Autoryzacja zakończona sukcesem.");
|
|
44
|
+
return accessToken;
|
|
45
|
+
} catch (error) {
|
|
46
|
+
console.error("Błąd autoryzacji:", error.message);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
initialize();
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Implementacja własnego magazynu danych (ITokenStorage)
|
|
54
|
+
|
|
55
|
+
Architektura biblioteki pozwala na wstrzyknięcie własnej klasy zarządzającej danymi sesyjnymi. Jest to rozwiązanie zalecane dla środowisk rozproszonych i bezstanowych (Serverless).
|
|
56
|
+
Przykład: Integracja z Redis
|
|
57
|
+
|
|
58
|
+
```ts
|
|
59
|
+
import { ITokenStorage, IAllegroTokens } from "@mojaksebastian/allegro-client";
|
|
60
|
+
import { createClient } from "redis";
|
|
61
|
+
|
|
62
|
+
export class RedisTokenStorage implements ITokenStorage {
|
|
63
|
+
private client = createClient({ url: "redis://localhost:6379" });
|
|
64
|
+
|
|
65
|
+
private async connect() {
|
|
66
|
+
if (!this.client.isOpen) await this.client.connect();
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
async save(tokens: IAllegroTokens): Promise<void> {
|
|
70
|
+
await this.connect();
|
|
71
|
+
await this.client.set("allegro_session", JSON.stringify(tokens));
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
async read(): Promise<IAllegroTokens | null> {
|
|
75
|
+
await this.connect();
|
|
76
|
+
const data = await this.client.get("allegro_session");
|
|
77
|
+
return data ? JSON.parse(data) : null;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
async clear(): Promise<void> {
|
|
81
|
+
await this.connect();
|
|
82
|
+
await this.client.del("allegro_session");
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Inicjalizacja klienta z wykorzystaniem Redis
|
|
87
|
+
const allegro = new AllegroClient({
|
|
88
|
+
...config,
|
|
89
|
+
storage: new RedisTokenStorage(),
|
|
90
|
+
});
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Specyfikacja techniczna
|
|
94
|
+
|
|
95
|
+
### Interfejs konfiguracji (IAllegroClientConfig)
|
|
96
|
+
|
|
97
|
+
| Właściwość | Typ | Wymagane | Opis |
|
|
98
|
+
| :------------ | :-------------------------- | :------: | :--------------------------------------------------------------------- |
|
|
99
|
+
| `credentials` | `IAuthCredentials` | Tak | Obiekt zawierający `clientId` oraz `clientSecret`. |
|
|
100
|
+
| `strategy` | `TStrategy` | Tak | Wybrana strategia autoryzacji (np. `"DeviceFlow"`). |
|
|
101
|
+
| `env` | `"production" \| "sandbox"` | Nie | Środowisko Allegro (Domyślnie: `"production"`). |
|
|
102
|
+
| `storage` | `ITokenStorage` | Nie | Instancja klasy zarządzającej zapisem (Domyślnie: `FileTokenStorage`). |
|
|
103
|
+
|
|
104
|
+
### Metody klasy AllegroClient
|
|
105
|
+
|
|
106
|
+
* **getAccessToken(): Promise<string>** – Zwraca aktywny token dostępowy. Jeśli token wygasł lub nie istnieje, inicjuje proces odświeżania lub autoryzacji.
|
|
107
|
+
|
|
108
|
+
* **clearSession(): Promise<void>** – Usuwa dane sesyjne z przypisanego magazynu.
|
|
109
|
+
|
|
110
|
+
## Rozwój projektu
|
|
111
|
+
|
|
112
|
+
Biblioteka wymaga Node.js w wersji 20.x lub wyższej.
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
|
|
116
|
+
# Kompilacja kodu źródłowego (TypeScript -> JavaScript)
|
|
117
|
+
npm run build
|
|
118
|
+
|
|
119
|
+
# Uruchomienie skryptów w trybie deweloperskim
|
|
120
|
+
npm run dev
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Licencja
|
|
124
|
+
|
|
125
|
+
Projekt dystrybuowany na warunkach licencji MIT.
|
|
126
|
+
|
|
127
|
+
Autor: mojaksebastian
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ITokenStorage, IAllegroTokens } from "../types.js";
|
|
2
|
+
import { TEnv } from "../../client/types.js";
|
|
3
|
+
export declare class FileTokenStorage implements ITokenStorage {
|
|
4
|
+
private readonly fileName;
|
|
5
|
+
private readonly devFileName;
|
|
6
|
+
private readonly filePath;
|
|
7
|
+
constructor(env: TEnv, customPath?: string);
|
|
8
|
+
save(tokens: IAllegroTokens): Promise<void>;
|
|
9
|
+
read(): Promise<IAllegroTokens | null>;
|
|
10
|
+
clear(): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=TokenStorage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TokenStorage.d.ts","sourceRoot":"","sources":["../../../src/auth/helpers/TokenStorage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAE7C,qBAAa,gBAAiB,YAAW,aAAa;IACpD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwB;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA4B;IACxD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,GAAG,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,MAAM;IAWpC,IAAI,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAY3C,IAAI,IAAI,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAUtC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAO7B"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { writeFile, readFile, unlink } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
export class FileTokenStorage {
|
|
4
|
+
fileName = ".allegro_sessionon";
|
|
5
|
+
devFileName = ".allegro_sessionon_dev";
|
|
6
|
+
filePath;
|
|
7
|
+
constructor(env, customPath) {
|
|
8
|
+
// Domyślnie zapisujemy w folderze głównym projektu
|
|
9
|
+
this.filePath = customPath
|
|
10
|
+
? join(customPath, env === "sandbox" ? this.devFileName : this.fileName)
|
|
11
|
+
: join(process.cwd(), env === "sandbox" ? this.devFileName : this.fileName);
|
|
12
|
+
console.log(`env: ${env}, filepath: ${this.filePath}`);
|
|
13
|
+
}
|
|
14
|
+
async save(tokens) {
|
|
15
|
+
try {
|
|
16
|
+
const data = JSON.stringify(tokens, null, 2);
|
|
17
|
+
console.log(data);
|
|
18
|
+
await writeFile(this.filePath, data, "utf-8");
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
throw new Error(`Nie udało się zapisać tokenów: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
async read() {
|
|
25
|
+
try {
|
|
26
|
+
const data = await readFile(this.filePath, "utf-8");
|
|
27
|
+
return JSON.parse(data);
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
// Jeśli plik nie istnieje, po prostu zwracamy null
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async clear() {
|
|
35
|
+
try {
|
|
36
|
+
await unlink(this.filePath);
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
// Ignorujemy błąd, jeśli plik już nie istnieje
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=TokenStorage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TokenStorage.js","sourceRoot":"","sources":["../../../src/auth/helpers/TokenStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,MAAM,OAAO,gBAAgB;IACV,QAAQ,GAAG,oBAAoB,CAAC;IAChC,WAAW,GAAG,wBAAwB,CAAC;IACvC,QAAQ,CAAS;IAElC,YAAY,GAAS,EAAE,UAAmB;QACxC,mDAAmD;QACnD,IAAI,CAAC,QAAQ,GAAG,UAAU;YACxB,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;YACxE,CAAC,CAAC,IAAI,CACF,OAAO,CAAC,GAAG,EAAE,EACb,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CACrD,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,eAAe,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAsB;QAC/B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClB,MAAM,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,kCAAkC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAC7F,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACpD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAmB,CAAC;QAC5C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,mDAAmD;YACnD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,+CAA+C;QACjD,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refreshTokens.d.ts","sourceRoot":"","sources":["../../../src/auth/helpers/refreshTokens.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EAEd,gBAAgB,EACjB,MAAM,aAAa,CAAC;AAErB,eAAO,MAAM,OAAO,GAClB,UAAU,GAAG,EACb,aAAa,gBAAgB,EAC7B,cAAc,MAAM,KACnB,OAAO,CAAC,cAAc,CA+BxB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export const refresh = async (tokenUrl, credentials, refreshToken) => {
|
|
2
|
+
const { clientId, clientSecret } = credentials;
|
|
3
|
+
const basicAuth = Buffer.from(`${clientId}:${clientSecret}`).toString("base64");
|
|
4
|
+
console.log(`[DeviceFlow] Refreshing access token...`);
|
|
5
|
+
const response = await fetch(`${tokenUrl}`, {
|
|
6
|
+
method: "POST",
|
|
7
|
+
headers: {
|
|
8
|
+
Authorization: `Basic ${basicAuth}`,
|
|
9
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
10
|
+
},
|
|
11
|
+
body: new URLSearchParams({
|
|
12
|
+
grant_type: "refresh_token",
|
|
13
|
+
refresh_token: refreshToken,
|
|
14
|
+
}),
|
|
15
|
+
});
|
|
16
|
+
if (!response.ok) {
|
|
17
|
+
throw new Error(`Błąd odświeżania tokena: ${await response.text()}`);
|
|
18
|
+
}
|
|
19
|
+
console.log(`Access token successfully refreshed!`);
|
|
20
|
+
const data = await response.json();
|
|
21
|
+
return {
|
|
22
|
+
accessToken: data.access_token,
|
|
23
|
+
refreshToken: data.refresh_token,
|
|
24
|
+
expiresAt: Date.now() + data.expires_in * 1000,
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=refreshTokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refreshTokens.js","sourceRoot":"","sources":["../../../src/auth/helpers/refreshTokens.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAC1B,QAAa,EACb,WAA6B,EAC7B,YAAoB,EACK,EAAE;IAC3B,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,WAAW,CAAC;IAC/C,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,IAAI,YAAY,EAAE,CAAC,CAAC,QAAQ,CACnE,QAAQ,CACT,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAQ,MAAM,KAAK,CAAC,GAAG,QAAQ,EAAE,EAAE;QAC/C,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,aAAa,EAAE,SAAS,SAAS,EAAE;YACnC,cAAc,EAAE,mCAAmC;SACpD;QACD,IAAI,EAAE,IAAI,eAAe,CAAC;YACxB,UAAU,EAAE,eAAe;YAC3B,aAAa,EAAE,YAAY;SAC5B,CAAC;KACH,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;IACpD,MAAM,IAAI,GAA2B,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAE3D,OAAO;QACL,WAAW,EAAE,IAAI,CAAC,YAAY;QAC9B,YAAY,EAAE,IAAI,CAAC,aAAa;QAChC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI;KAC/C,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { IAuthStrategy, ITokenStorage, IAuthCredentials, IAuthConfig } from "./types.js";
|
|
2
|
+
export declare class AllegroAuth implements IAuthConfig {
|
|
3
|
+
private baseUrl;
|
|
4
|
+
private strategy;
|
|
5
|
+
private storage;
|
|
6
|
+
private credentials;
|
|
7
|
+
private readonly tokenUrl;
|
|
8
|
+
private readonly authUrl;
|
|
9
|
+
constructor(baseUrl: URL, strategy: IAuthStrategy, storage: ITokenStorage, credentials: IAuthCredentials);
|
|
10
|
+
getToken(): Promise<string>;
|
|
11
|
+
clearToken(): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,WAAW,EACZ,MAAM,YAAY,CAAC;AAGpB,qBAAa,WAAY,YAAW,WAAW;IAK3C,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,WAAW;IAPrB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAM;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAM;gBAGpB,OAAO,EAAE,GAAG,EACZ,QAAQ,EAAE,aAAa,EACvB,OAAO,EAAE,aAAa,EACtB,WAAW,EAAE,gBAAgB;IAMjC,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC;IA0C3B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAGlC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { refresh } from "./helpers/refreshTokens.js";
|
|
2
|
+
export class AllegroAuth {
|
|
3
|
+
baseUrl;
|
|
4
|
+
strategy;
|
|
5
|
+
storage;
|
|
6
|
+
credentials;
|
|
7
|
+
tokenUrl;
|
|
8
|
+
authUrl;
|
|
9
|
+
constructor(baseUrl, strategy, storage, credentials) {
|
|
10
|
+
this.baseUrl = baseUrl;
|
|
11
|
+
this.strategy = strategy;
|
|
12
|
+
this.storage = storage;
|
|
13
|
+
this.credentials = credentials;
|
|
14
|
+
this.authUrl = new URL(`${this.baseUrl}auth/oauth`);
|
|
15
|
+
this.tokenUrl = new URL(`${this.baseUrl}auth/oauth/token`);
|
|
16
|
+
}
|
|
17
|
+
async getToken() {
|
|
18
|
+
let tokens = await this.storage.read();
|
|
19
|
+
// Brak jakichkolwiek tokenów
|
|
20
|
+
if (!tokens) {
|
|
21
|
+
console.log("[Auth] Brak tokenów w magazynie. Inicjuję pełną autoryzację...");
|
|
22
|
+
tokens = await this.strategy.authorize(this.authUrl, this.credentials);
|
|
23
|
+
await this.storage.save(tokens);
|
|
24
|
+
return tokens.accessToken;
|
|
25
|
+
}
|
|
26
|
+
// Sprawdzenie ważności
|
|
27
|
+
// Jeśli obecny czas + 5 min jest większy niż czas wygaśnięcia, odświeżanie
|
|
28
|
+
const safetyMargin = 5 * 60 * 1000;
|
|
29
|
+
const isExpired = Date.now() + safetyMargin >= tokens.expiresAt;
|
|
30
|
+
if (isExpired) {
|
|
31
|
+
console.log("[Auth] Token wygasł lub zaraz wygaśnie. Odświeżam...");
|
|
32
|
+
try {
|
|
33
|
+
const newTokens = await refresh(this.tokenUrl, this.credentials, tokens.refreshToken);
|
|
34
|
+
await this.storage.save(newTokens);
|
|
35
|
+
return newTokens.accessToken;
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
console.error("[Auth] Odświeżanie nieudane:", error);
|
|
39
|
+
// Jeśli refresh token wygasł (np. po 3 miesiącach), ponowna autoryzacja
|
|
40
|
+
await this.clearToken();
|
|
41
|
+
throw new Error("Sesja wygasła. Wymagana ponowna autoryzacja użytkownika.");
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// Token jest nadal ważny
|
|
45
|
+
return tokens.accessToken;
|
|
46
|
+
}
|
|
47
|
+
async clearToken() {
|
|
48
|
+
await this.storage.clear();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAErD,MAAM,OAAO,WAAW;IAKZ;IACA;IACA;IACA;IAPO,QAAQ,CAAM;IACd,OAAO,CAAM;IAE9B,YACU,OAAY,EACZ,QAAuB,EACvB,OAAsB,EACtB,WAA6B;QAH7B,YAAO,GAAP,OAAO,CAAK;QACZ,aAAQ,GAAR,QAAQ,CAAe;QACvB,YAAO,GAAP,OAAO,CAAe;QACtB,gBAAW,GAAX,WAAW,CAAkB;QAErC,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,YAAY,CAAC,CAAC;QACpD,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,kBAAkB,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,IAAI,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAEvC,6BAA6B;QAC7B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CACT,gEAAgE,CACjE,CAAC;YACF,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YACvE,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAChC,OAAO,MAAM,CAAC,WAAW,CAAC;QAC5B,CAAC;QAED,uBAAuB;QACvB,2EAA2E;QAC3E,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QACnC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,IAAI,MAAM,CAAC,SAAS,CAAC;QAEhE,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;YACpE,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,OAAO,CAC7B,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,WAAW,EAChB,MAAM,CAAC,YAAY,CACpB,CAAC;gBACF,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACnC,OAAO,SAAS,CAAC,WAAW,CAAC;YAC/B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;gBACrD,wEAAwE;gBACxE,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CACb,0DAA0D,CAC3D,CAAC;YACJ,CAAC;QACH,CAAC;QAED,yBAAyB;QACzB,OAAO,MAAM,CAAC,WAAW,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;CACF"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { IAuthStrategy, IAllegroTokens, IAuthCredentials } from "../types.js";
|
|
2
|
+
export declare class DeviceFlow implements IAuthStrategy {
|
|
3
|
+
authorize(authUrl: URL, credentials: IAuthCredentials): Promise<IAllegroTokens>;
|
|
4
|
+
}
|
|
5
|
+
//# sourceMappingURL=DeviceFlow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeviceFlow.d.ts","sourceRoot":"","sources":["../../../src/auth/strategies/DeviceFlow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EACd,gBAAgB,EAGjB,MAAM,aAAa,CAAC;AAErB,qBAAa,UAAW,YAAW,aAAa;IACxC,SAAS,CACb,OAAO,EAAE,GAAG,EACZ,WAAW,EAAE,gBAAgB,GAC5B,OAAO,CAAC,cAAc,CAAC;CAyF3B"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
export class DeviceFlow {
|
|
2
|
+
async authorize(authUrl, credentials) {
|
|
3
|
+
const { clientId, clientSecret } = credentials;
|
|
4
|
+
const basicAuth = Buffer.from(`${clientId}:${clientSecret}`).toString("base64");
|
|
5
|
+
// KROK 1: Pobranie device_code
|
|
6
|
+
console.log(`[DeviceFlow] Requesting device code from ${authUrl}/device`);
|
|
7
|
+
const deviceResponse = await fetch(`${authUrl}/device?client_id=${clientId}`, {
|
|
8
|
+
method: "POST",
|
|
9
|
+
headers: {
|
|
10
|
+
Authorization: `Basic ${basicAuth}`,
|
|
11
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
12
|
+
},
|
|
13
|
+
});
|
|
14
|
+
if (!deviceResponse.ok) {
|
|
15
|
+
throw new Error(`Device Flow error: ${await deviceResponse.text()}`);
|
|
16
|
+
}
|
|
17
|
+
const deviceData = (await deviceResponse.json());
|
|
18
|
+
console.log(`[DeviceFlow] Successfully retrieved device code. Interval: ${deviceData.interval}s`);
|
|
19
|
+
console.log("\n--- AUTORYZACJA ALLEGRO ---");
|
|
20
|
+
console.log(`Zaloguj się pod adresem: ${deviceData.verification_uri_complete}`);
|
|
21
|
+
console.log(`Lub wejdź na: ${deviceData.verification_uri} i wpisz kod: ${deviceData.user_code}`);
|
|
22
|
+
console.log("---------------------------\n");
|
|
23
|
+
// KROK 2: Polling (odpytywanie o token)
|
|
24
|
+
return new Promise((resolve, reject) => {
|
|
25
|
+
const intervalMs = deviceData.interval * 1000;
|
|
26
|
+
console.log(`[DeviceFlow] Starting polling for token every ${deviceData.interval}s...`);
|
|
27
|
+
const poll = setInterval(async () => {
|
|
28
|
+
try {
|
|
29
|
+
const tokenResponse = await fetch(`${authUrl}/token`, {
|
|
30
|
+
method: "POST",
|
|
31
|
+
headers: {
|
|
32
|
+
Authorization: `Basic ${basicAuth}`,
|
|
33
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
34
|
+
},
|
|
35
|
+
body: new URLSearchParams({
|
|
36
|
+
grant_type: "urn:ietf:params:oauth:grant-type:device_code",
|
|
37
|
+
device_code: deviceData.device_code,
|
|
38
|
+
}),
|
|
39
|
+
});
|
|
40
|
+
const data = (await tokenResponse.json());
|
|
41
|
+
if (tokenResponse.ok) {
|
|
42
|
+
console.log(`[DeviceFlow] Access token successfully acquired!`);
|
|
43
|
+
clearInterval(poll);
|
|
44
|
+
resolve({
|
|
45
|
+
accessToken: data.access_token,
|
|
46
|
+
refreshToken: data.refresh_token,
|
|
47
|
+
expiresAt: Date.now() + data.expires_in * 1000,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
console.log(`[DeviceFlow] Polling status: ${data.error}`);
|
|
52
|
+
if (data.error === "access_denied") {
|
|
53
|
+
clearInterval(poll);
|
|
54
|
+
reject(new Error("Użytkownik odmówił dostępu."));
|
|
55
|
+
}
|
|
56
|
+
else if (data.error === "Invalid device code") {
|
|
57
|
+
clearInterval(poll);
|
|
58
|
+
reject(new Error("Niepoprawny, wygasły lub zużyty device_code."));
|
|
59
|
+
}
|
|
60
|
+
// Inne błędy (np. authorization_pending) ignorujemy i czekamy dalej
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
console.error(`[DeviceFlow] Polling error:`, err);
|
|
65
|
+
clearInterval(poll);
|
|
66
|
+
reject(err);
|
|
67
|
+
}
|
|
68
|
+
}, intervalMs);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=DeviceFlow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeviceFlow.js","sourceRoot":"","sources":["../../../src/auth/strategies/DeviceFlow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication Strategies
|
|
3
|
+
*/
|
|
4
|
+
export type Tstrategy = "DeviceFlow";
|
|
5
|
+
/**
|
|
6
|
+
* Token related interfaces
|
|
7
|
+
*/
|
|
8
|
+
export interface IAllegroTokens {
|
|
9
|
+
accessToken: string;
|
|
10
|
+
refreshToken: string;
|
|
11
|
+
expiresAt: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* API Response interfaces
|
|
15
|
+
*/
|
|
16
|
+
export interface IAllegroTokensResponse {
|
|
17
|
+
access_token: string;
|
|
18
|
+
refresh_token: string;
|
|
19
|
+
expires_in: number;
|
|
20
|
+
error?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface IDeviceCodeResponse {
|
|
23
|
+
device_code: string;
|
|
24
|
+
expires_in: number;
|
|
25
|
+
user_code: string;
|
|
26
|
+
interval: number;
|
|
27
|
+
verification_uri: string;
|
|
28
|
+
verification_uri_complete: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Configuration and Credentials
|
|
32
|
+
*/
|
|
33
|
+
export interface IAuthCredentials {
|
|
34
|
+
clientId: string;
|
|
35
|
+
clientSecret: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Storage and Strategy Interfaces
|
|
39
|
+
*/
|
|
40
|
+
export interface ITokenStorage {
|
|
41
|
+
save(tokens: IAllegroTokens): Promise<void>;
|
|
42
|
+
read(): Promise<IAllegroTokens | null>;
|
|
43
|
+
clear(): Promise<void>;
|
|
44
|
+
}
|
|
45
|
+
export interface IAuthStrategy {
|
|
46
|
+
authorize(authUrl: URL, credentials: IAuthCredentials): Promise<IAllegroTokens>;
|
|
47
|
+
}
|
|
48
|
+
export interface IAuthConfig {
|
|
49
|
+
getToken(): Promise<string>;
|
|
50
|
+
clearToken(): Promise<void>;
|
|
51
|
+
}
|
|
52
|
+
export interface IRefreshTokensParameters {
|
|
53
|
+
refresh(refreshUrl: URL, credentials: IAuthCredentials, refreshToken: string): Promise<IAllegroTokens>;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,YAAY,CAAC;AAErC;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,yBAAyB,EAAE,MAAM,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,IAAI,IAAI,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACvC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,CACP,OAAO,EAAE,GAAG,EACZ,WAAW,EAAE,gBAAgB,GAC5B,OAAO,CAAC,cAAc,CAAC,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,CACL,UAAU,EAAE,GAAG,EACf,WAAW,EAAE,gBAAgB,EAC7B,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,cAAc,CAAC,CAAC;CAC5B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { IAllegroClientConfig } from "./types.js";
|
|
2
|
+
export declare class AllegroClient {
|
|
3
|
+
private auth;
|
|
4
|
+
constructor(config: IAllegroClientConfig);
|
|
5
|
+
/**
|
|
6
|
+
* Metoda pomocnicza do ręcznego wywołania autoryzacji
|
|
7
|
+
* lub po prostu pobrania aktualnego tokena.
|
|
8
|
+
*/
|
|
9
|
+
getAccessToken(): Promise<string>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAKlD,qBAAa,aAAa;IACxB,OAAO,CAAC,IAAI,CAAc;gBAEd,MAAM,EAAE,oBAAoB;IAgCxC;;;OAGG;IACG,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;CAGxC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { AllegroAuth } from "../auth/index.js";
|
|
2
|
+
import { DeviceFlow } from "../auth/strategies/DeviceFlow.js";
|
|
3
|
+
import { FileTokenStorage } from "../auth/helpers/TokenStorage.js";
|
|
4
|
+
const baseUrl = new URL("https://allegro.pl");
|
|
5
|
+
const devBaseUrl = new URL("https://allegro.pl.allegrosandbox.pl");
|
|
6
|
+
export class AllegroClient {
|
|
7
|
+
auth;
|
|
8
|
+
constructor(config) {
|
|
9
|
+
console.log("Inicjalizacja AllegroClient...");
|
|
10
|
+
const { env = "production", // Domyślnie production, jeśli nie podano
|
|
11
|
+
credentials, strategy, storage, } = config;
|
|
12
|
+
const authBaseUrl = env === "sandbox" ? devBaseUrl : baseUrl;
|
|
13
|
+
// Inicjalizacja Storage (wbudowany/użytkownika)
|
|
14
|
+
const tokenStorage = storage ?? new FileTokenStorage(env);
|
|
15
|
+
// Wybór strategii
|
|
16
|
+
console.log("Strategia autoryzacji: " + strategy);
|
|
17
|
+
let strategyInstance;
|
|
18
|
+
switch (strategy) {
|
|
19
|
+
case "DeviceFlow":
|
|
20
|
+
console.log("Wybrano strategię DeviceFlow");
|
|
21
|
+
strategyInstance = new DeviceFlow();
|
|
22
|
+
}
|
|
23
|
+
// Zarządca autoryzacji
|
|
24
|
+
this.auth = new AllegroAuth(authBaseUrl, strategyInstance, tokenStorage, credentials);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Metoda pomocnicza do ręcznego wywołania autoryzacji
|
|
28
|
+
* lub po prostu pobrania aktualnego tokena.
|
|
29
|
+
*/
|
|
30
|
+
async getAccessToken() {
|
|
31
|
+
return await this.auth.getToken();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAGnE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,oBAAoB,CAAC,CAAC;AAC9C,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,sCAAsC,CAAC,CAAC;AAEnE,MAAM,OAAO,aAAa;IAChB,IAAI,CAAc;IAE1B,YAAY,MAA4B;QACtC,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC9C,MAAM,EACJ,GAAG,GAAG,YAAY,EAAE,yCAAyC;QAC7D,WAAW,EACX,QAAQ,EACR,OAAO,GACR,GAAG,MAAM,CAAC;QACX,MAAM,WAAW,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC;QAE7D,gDAAgD;QAChD,MAAM,YAAY,GAAG,OAAO,IAAI,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAE1D,kBAAkB;QAClB,OAAO,CAAC,GAAG,CAAC,yBAAyB,GAAG,QAAQ,CAAC,CAAC;QAElD,IAAI,gBAAgB,CAAC;QACrB,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,YAAY;gBACf,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;gBAC5C,gBAAgB,GAAG,IAAI,UAAU,EAAE,CAAC;QACxC,CAAC;QAED,uBAAuB;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,WAAW,CACzB,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,WAAW,CACZ,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,cAAc;QAClB,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;IACpC,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modules.d.ts","sourceRoot":"","sources":["../../src/client/modules.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modules.js","sourceRoot":"","sources":["../../src/client/modules.ts"],"names":[],"mappings":";AAAA,qDAAqD;AACrD,oDAAoD"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { IAuthCredentials, ITokenStorage, Tstrategy } from "../auth/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Client Configuration Types
|
|
4
|
+
*/
|
|
5
|
+
export type TEnv = "production" | "sandbox";
|
|
6
|
+
export interface IAllegroClientConfig {
|
|
7
|
+
credentials: IAuthCredentials;
|
|
8
|
+
env?: TEnv;
|
|
9
|
+
storage?: ITokenStorage;
|
|
10
|
+
strategy: Tstrategy;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EACb,SAAS,EACV,MAAM,kBAAkB,CAAC;AAE1B;;GAEG;AACH,MAAM,MAAM,IAAI,GAAG,YAAY,GAAG,SAAS,CAAC;AAE5C,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,gBAAgB,CAAC;IAC9B,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,QAAQ,EAAE,SAAS,CAAC;CACrB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":""}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { AllegroClient } from "./client/index.js";
|
|
2
|
+
export { AllegroClient };
|
|
3
|
+
export * from "./auth/index.js";
|
|
4
|
+
export * from "./client/index.js";
|
|
5
|
+
export * from "./auth/types.js";
|
|
6
|
+
export * from "./client/types.js";
|
|
7
|
+
export default AllegroClient;
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,OAAO,EAAE,aAAa,EAAE,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAElC,eAAe,aAAa,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { AllegroClient } from "./client/index.js";
|
|
2
|
+
export { AllegroClient };
|
|
3
|
+
export * from "./auth/index.js";
|
|
4
|
+
export * from "./client/index.js";
|
|
5
|
+
export * from "./auth/types.js";
|
|
6
|
+
export * from "./client/types.js";
|
|
7
|
+
export default AllegroClient;
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,OAAO,EAAE,aAAa,EAAE,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAElC,eAAe,aAAa,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mojaksebastian/allegro-client",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Allegro REST API Client with automatic token refresh. Fetches tokens from allegro and serves them to the user. Supports both the production and sandbox enviroments",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"import": "./dist/index.js"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"type": "module",
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "rm -rf dist && tsc",
|
|
19
|
+
"test": "node dist/test.js",
|
|
20
|
+
"start": "node dist/server.js",
|
|
21
|
+
"dev": "node --loader ts-node/esm src/server.ts",
|
|
22
|
+
"prepublishOnly": "npm run build"
|
|
23
|
+
},
|
|
24
|
+
"keywords": [
|
|
25
|
+
"allegro",
|
|
26
|
+
"api",
|
|
27
|
+
"oauth2"
|
|
28
|
+
],
|
|
29
|
+
"author": "mojaksebastian",
|
|
30
|
+
"license": "MIT",
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@types/node": "^20.11.0",
|
|
33
|
+
"ts-node": "^10.9.2",
|
|
34
|
+
"typescript": "^5.4.0"
|
|
35
|
+
}
|
|
36
|
+
}
|