@shohaghinfo/aerojs 0.1.2 → 0.2.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 +181 -7
- package/dist/cli/runner.d.ts.map +1 -1
- package/dist/cli/runner.js +16 -2
- package/dist/cli/runner.js.map +1 -1
- package/dist/http/http.d.ts +44 -0
- package/dist/http/http.d.ts.map +1 -0
- package/dist/http/http.js +132 -0
- package/dist/http/http.js.map +1 -0
- package/dist/http/index.d.ts +8 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +8 -0
- package/dist/http/index.js.map +1 -0
- package/dist/http/request-builder.d.ts +48 -0
- package/dist/http/request-builder.d.ts.map +1 -0
- package/dist/http/request-builder.js +186 -0
- package/dist/http/request-builder.js.map +1 -0
- package/dist/http/response.d.ts +34 -0
- package/dist/http/response.d.ts.map +1 -0
- package/dist/http/response.js +77 -0
- package/dist/http/response.js.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/mail/drivers/smtp-mail-driver.d.ts +39 -0
- package/dist/mail/drivers/smtp-mail-driver.d.ts.map +1 -0
- package/dist/mail/drivers/smtp-mail-driver.js +318 -0
- package/dist/mail/drivers/smtp-mail-driver.js.map +1 -0
- package/dist/mail/index.d.ts +1 -0
- package/dist/mail/index.d.ts.map +1 -1
- package/dist/mail/index.js +1 -0
- package/dist/mail/index.js.map +1 -1
- package/dist/mail/mailer.d.ts +20 -3
- package/dist/mail/mailer.d.ts.map +1 -1
- package/dist/mail/mailer.js +28 -1
- package/dist/mail/mailer.js.map +1 -1
- package/dist/queue/drivers/redis-queue-driver.d.ts +20 -0
- package/dist/queue/drivers/redis-queue-driver.d.ts.map +1 -1
- package/dist/queue/drivers/redis-queue-driver.js +92 -33
- package/dist/queue/drivers/redis-queue-driver.js.map +1 -1
- package/dist/queue/queue-manager.d.ts +4 -1
- package/dist/queue/queue-manager.d.ts.map +1 -1
- package/dist/queue/queue-manager.js +8 -1
- package/dist/queue/queue-manager.js.map +1 -1
- package/dist/security/index.d.ts +1 -1
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/index.js +1 -1
- package/dist/security/index.js.map +1 -1
- package/dist/security/rate-limiter.d.ts +20 -0
- package/dist/security/rate-limiter.d.ts.map +1 -1
- package/dist/security/rate-limiter.js +85 -0
- package/dist/security/rate-limiter.js.map +1 -1
- package/package.json +6 -2
package/README.md
CHANGED
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
### The Blazing-Fast, Zero-Dependency Full-Stack Web Framework for Node.js
|
|
6
6
|
|
|
7
7
|
[](https://github.com/atifsoftware/AeroJS/actions/workflows/ci.yml)
|
|
8
|
-
[](https://www.npmjs.com/package/@shohaghinfo/aerojs)
|
|
9
|
+
[](https://www.npmjs.com/package/@shohaghinfo/aerojs)
|
|
9
10
|
[](package.json)
|
|
10
11
|
[](package.json)
|
|
11
12
|
[](package.json)
|
|
@@ -57,6 +58,10 @@
|
|
|
57
58
|
28. [Background Queue & Mail System (`Queue`, `Mail`)](#28-background-queue--mail-system-queue-mail)
|
|
58
59
|
29. [OpenAPI 3.0 & Interactive Swagger UI (`useSwagger`)](#29-openapi-30--interactive-swagger-ui-useswagger)
|
|
59
60
|
30. [Aero Command-Line Interface (`aero` CLI)](#30-aero-command-line-interface-aero-cli)
|
|
61
|
+
31. [SMTP Mail Driver (`SmtpMailDriver`, `Mail`)](#31-smtp-mail-driver-smtpmaildriver-mail)
|
|
62
|
+
32. [Distributed Redis Rate Limiter (`RedisRateLimitStore`)](#32-distributed-redis-rate-limiter-redisratelimitstore)
|
|
63
|
+
33. [Redis Queue Driver with DLQ (`RedisQueueDriver`)](#33-redis-queue-driver-with-dlq-redisqueuedriver)
|
|
64
|
+
34. [Fluent HTTP Client (`Http`, `HttpResponse`)](#34-fluent-http-client-http-httpresponse)
|
|
60
65
|
- [Performance, Size & Advantages](#-performance-size--advantages)
|
|
61
66
|
- [Comparison Matrix](#-comparison-matrix)
|
|
62
67
|
- [License](#-license)
|
|
@@ -146,13 +151,50 @@ Aero is engineered from first principles to combine the best architectural conce
|
|
|
146
151
|
|
|
147
152
|
## 📦 Installation
|
|
148
153
|
|
|
154
|
+
### Option 1: Create a New Project (Recommended)
|
|
155
|
+
|
|
156
|
+
Scaffold a complete production-ready application in seconds using `npx`:
|
|
157
|
+
|
|
149
158
|
```bash
|
|
150
|
-
|
|
159
|
+
# Interactive project creation
|
|
160
|
+
npx @shohaghinfo/aerojs new my-app
|
|
161
|
+
|
|
162
|
+
# Or scaffold in current directory
|
|
163
|
+
npx @shohaghinfo/aerojs init
|
|
151
164
|
```
|
|
152
165
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
166
|
+
### Option 2: Install into an Existing Project
|
|
167
|
+
|
|
168
|
+
Add AeroJS to your project with your favorite package manager:
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
# npm
|
|
172
|
+
npm install @shohaghinfo/aerojs
|
|
173
|
+
|
|
174
|
+
# pnpm
|
|
175
|
+
pnpm add @shohaghinfo/aerojs
|
|
176
|
+
|
|
177
|
+
# yarn
|
|
178
|
+
yarn add @shohaghinfo/aerojs
|
|
179
|
+
|
|
180
|
+
# bun
|
|
181
|
+
bun add @shohaghinfo/aerojs
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### Option 3: Global CLI Installation
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
npm install -g @shohaghinfo/aerojs
|
|
188
|
+
|
|
189
|
+
# Now you can use the 'aero' command anywhere:
|
|
190
|
+
aero new my-app
|
|
191
|
+
# or
|
|
192
|
+
aerojs new my-app
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
#### Requirements:
|
|
196
|
+
- **Node.js**: `>= 20.0.0`
|
|
197
|
+
- **Module System**: ESM (`"type": "module"` in `package.json`)
|
|
156
198
|
|
|
157
199
|
---
|
|
158
200
|
|
|
@@ -1145,7 +1187,7 @@ Unlike legacy Node.js frameworks that ship with bloated dependency trees, AeroJS
|
|
|
1145
1187
|
- Ideal for **Serverless environments** (AWS Lambda, Cloudflare Containers, Vercel Serverless, Google Cloud Run) and autoscaling Docker microservices.
|
|
1146
1188
|
|
|
1147
1189
|
#### 🏎️ Lightning-Fast CI/CD Deployments
|
|
1148
|
-
- `npm install
|
|
1190
|
+
- `npm install @shohaghinfo/aerojs` downloads only a few kilobytes and completes in **1–2 seconds**, drastically cutting down pipeline build times and bandwidth costs.
|
|
1149
1191
|
|
|
1150
1192
|
#### 🌐 Unified Full-Stack Architecture
|
|
1151
1193
|
- Eliminates context switching and multi-repository overhead: build **REST APIs**, **React/Vue 3 SPAs (Inertia.js)**, and traditional **SSR Views (Edge.js/EJS)** in a single cohesive codebase.
|
|
@@ -1155,9 +1197,141 @@ Unlike legacy Node.js frameworks that ship with bloated dependency trees, AeroJS
|
|
|
1155
1197
|
|
|
1156
1198
|
---
|
|
1157
1199
|
|
|
1200
|
+
### 31. SMTP Mail Driver (`SmtpMailDriver`, `Mail`)
|
|
1201
|
+
|
|
1202
|
+
AeroJS includes a **zero-dependency native SMTP transport** directly built on Node.js `net` and `tls` sockets. Supports SSL (port 465), STARTTLS (port 587/25), AUTH LOGIN, multipart HTML & plain text, and base64 attachments.
|
|
1203
|
+
|
|
1204
|
+
```typescript
|
|
1205
|
+
import { Mail, MailMessage, SmtpMailDriver } from '@shohaghinfo/aerojs';
|
|
1206
|
+
|
|
1207
|
+
// 1. Configure in MailManager
|
|
1208
|
+
Mail.configure({
|
|
1209
|
+
default: 'smtp',
|
|
1210
|
+
mailers: {
|
|
1211
|
+
smtp: {
|
|
1212
|
+
driver: 'smtp',
|
|
1213
|
+
host: 'smtp.mailtrap.io',
|
|
1214
|
+
port: 587,
|
|
1215
|
+
auth: {
|
|
1216
|
+
user: process.env.SMTP_USER!,
|
|
1217
|
+
pass: process.env.SMTP_PASS!,
|
|
1218
|
+
},
|
|
1219
|
+
},
|
|
1220
|
+
},
|
|
1221
|
+
});
|
|
1222
|
+
|
|
1223
|
+
// 2. Dispatch with attachments & HTML
|
|
1224
|
+
await Mail.send((msg) => {
|
|
1225
|
+
msg.to('patient@example.com')
|
|
1226
|
+
.from('billing@hospital.org', 'Hospital Billing')
|
|
1227
|
+
.subject('Monthly Statement & Invoice')
|
|
1228
|
+
.html('<h1>Hello!</h1><p>Please find your medical invoice attached.</p>')
|
|
1229
|
+
.attach('invoice.pdf', pdfBuffer, 'application/pdf');
|
|
1230
|
+
});
|
|
1231
|
+
```
|
|
1232
|
+
|
|
1233
|
+
---
|
|
1234
|
+
|
|
1235
|
+
### 32. Distributed Redis Rate Limiter (`RedisRateLimitStore`)
|
|
1236
|
+
|
|
1237
|
+
For distributed production deployments running behind reverse proxies or multiple server nodes, `RedisRateLimitStore` synchronizes rate limit counters across all instances via atomic Redis commands.
|
|
1238
|
+
|
|
1239
|
+
```typescript
|
|
1240
|
+
import { Aero, rateLimit, RedisRateLimitStore, RedisClient } from '@shohaghinfo/aerojs';
|
|
1241
|
+
|
|
1242
|
+
const app = new Aero();
|
|
1243
|
+
const redis = new RedisClient({ host: '127.0.0.1', port: 6379 });
|
|
1244
|
+
|
|
1245
|
+
app.use(
|
|
1246
|
+
rateLimit({
|
|
1247
|
+
windowMs: 60_000, // 1 minute
|
|
1248
|
+
max: 100, // 100 requests per minute
|
|
1249
|
+
store: new RedisRateLimitStore({
|
|
1250
|
+
client: redis,
|
|
1251
|
+
prefix: 'rl:api:',
|
|
1252
|
+
fallbackToMemory: true, // Gracefully handles Redis disconnection
|
|
1253
|
+
}),
|
|
1254
|
+
})
|
|
1255
|
+
);
|
|
1256
|
+
```
|
|
1257
|
+
|
|
1258
|
+
---
|
|
1259
|
+
|
|
1260
|
+
### 33. Redis Queue Driver with DLQ (`RedisQueueDriver`)
|
|
1261
|
+
|
|
1262
|
+
AeroJS provides a production-grade background job queue backed by Redis with FIFO execution (`LPUSH`/`RPOP`), delayed scheduling (`ZADD`), worker reservation tracking, retry backoff, and a Dead Letter Queue (DLQ).
|
|
1263
|
+
|
|
1264
|
+
```typescript
|
|
1265
|
+
import { Queue, Job, RedisQueueDriver, RedisClient } from '@shohaghinfo/aerojs';
|
|
1266
|
+
|
|
1267
|
+
// 1. Configure Redis Queue Connection
|
|
1268
|
+
Queue.configure({
|
|
1269
|
+
default: 'redis',
|
|
1270
|
+
connections: {
|
|
1271
|
+
redis: {
|
|
1272
|
+
driver: 'redis',
|
|
1273
|
+
redis: new RedisClient({ host: '127.0.0.1', port: 6379 }),
|
|
1274
|
+
},
|
|
1275
|
+
},
|
|
1276
|
+
});
|
|
1277
|
+
|
|
1278
|
+
// 2. Define Background Job
|
|
1279
|
+
class ProcessPayrollJob extends Job {
|
|
1280
|
+
public async handle(): Promise<void> {
|
|
1281
|
+
console.log(`Processing payroll batch #${this.data.batchId}...`);
|
|
1282
|
+
}
|
|
1283
|
+
}
|
|
1284
|
+
Queue.registerJob('ProcessPayrollJob', ProcessPayrollJob);
|
|
1285
|
+
|
|
1286
|
+
// 3. Dispatch Job (Immediate or Delayed)
|
|
1287
|
+
await Queue.dispatch(new ProcessPayrollJob({ batchId: 402 }), {
|
|
1288
|
+
delay: 10, // Wait 10 seconds before execution
|
|
1289
|
+
});
|
|
1290
|
+
|
|
1291
|
+
// 4. Start Worker
|
|
1292
|
+
const worker = Queue.createWorker({ concurrency: 5 });
|
|
1293
|
+
await worker.start();
|
|
1294
|
+
```
|
|
1295
|
+
|
|
1296
|
+
---
|
|
1297
|
+
|
|
1298
|
+
### 34. Fluent HTTP Client (`Http`, `HttpResponse`)
|
|
1299
|
+
|
|
1300
|
+
AeroJS ships with a powerful, zero-dependency fluent HTTP client built on native `fetch`. It supports automatic JSON serialization, query string formatting, Bearer/Basic authentication, timeouts, retries, and comprehensive testing fakes.
|
|
1301
|
+
|
|
1302
|
+
```typescript
|
|
1303
|
+
import { Http } from '@shohaghinfo/aerojs';
|
|
1304
|
+
|
|
1305
|
+
// 1. Fluent API calls
|
|
1306
|
+
const response = await Http.baseUrl('https://api.hospital-network.com/v1')
|
|
1307
|
+
.withToken(process.env.API_KEY!)
|
|
1308
|
+
.withQuery({ status: 'active', limit: 50 })
|
|
1309
|
+
.timeout(5000)
|
|
1310
|
+
.retry(3, 200)
|
|
1311
|
+
.get('/patients');
|
|
1312
|
+
|
|
1313
|
+
if (response.successful) {
|
|
1314
|
+
const patients = response.json();
|
|
1315
|
+
console.log('Patients fetched:', patients);
|
|
1316
|
+
}
|
|
1317
|
+
|
|
1318
|
+
// 2. Testing Fakes (Mocking external services)
|
|
1319
|
+
Http.fake({
|
|
1320
|
+
'/patients': [{ id: 1, name: 'Alice Smith' }],
|
|
1321
|
+
'/billing': Http.response({ invoiceId: 'INV-101' }, 201),
|
|
1322
|
+
});
|
|
1323
|
+
|
|
1324
|
+
const res = await Http.post('https://api.hospital-network.com/v1/billing', { amount: 500 });
|
|
1325
|
+
expect(res.status).toBe(201);
|
|
1326
|
+
|
|
1327
|
+
Http.assertSent((req) => req.url.includes('/billing') && req.method === 'POST');
|
|
1328
|
+
```
|
|
1329
|
+
|
|
1330
|
+
---
|
|
1331
|
+
|
|
1158
1332
|
## 📊 Comparison Matrix
|
|
1159
1333
|
|
|
1160
|
-
| Feature | Express | Koa | Fastify | AdonisJS | **
|
|
1334
|
+
| Feature | Express | Koa | Fastify | AdonisJS | **AeroJS** |
|
|
1161
1335
|
|---|:---:|:---:|:---:|:---:|:---:|
|
|
1162
1336
|
| **Zero Runtime Dependencies** | ❌ (30+) | ❌ (20+) | ❌ (15+) | ❌ (50+) | **✅ ZERO** |
|
|
1163
1337
|
| **Radix Tree Routing** | ❌ | ❌ | ✅ | ❌ | **✅ O(k)** |
|
package/dist/cli/runner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/cli/runner.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/cli/runner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAyBH,qBAAa,OAAO;IAClB,OAAc,OAAO,SAAwB;WAEzB,GAAG,CAAC,IAAI,GAAE,MAAM,EAA0B,GAAG,OAAO,CAAC,MAAM,CAAC;WAmLlE,SAAS,IAAI,IAAI;CA+BhC"}
|
package/dist/cli/runner.js
CHANGED
|
@@ -5,13 +5,27 @@
|
|
|
5
5
|
import fs from 'node:fs';
|
|
6
6
|
import path from 'node:path';
|
|
7
7
|
import { pathToFileURL } from 'node:url';
|
|
8
|
+
import { fileURLToPath } from 'node:url';
|
|
8
9
|
import { makeController, makeModel, makeMigration, makeMiddleware, makeSeeder } from './commands/make.js';
|
|
9
10
|
import { initProject } from './commands/init.js';
|
|
10
11
|
import { createNewProject } from './commands/new.js';
|
|
11
12
|
import { encryptEnv, decryptEnv } from './commands/vault.js';
|
|
12
13
|
import { Migrator } from '../database/migrator.js';
|
|
14
|
+
function readPackageVersion() {
|
|
15
|
+
try {
|
|
16
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
17
|
+
const __dirname = path.dirname(__filename);
|
|
18
|
+
// dist/cli/runner.js → ../../package.json
|
|
19
|
+
const pkgPath = path.resolve(__dirname, '../../package.json');
|
|
20
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
|
|
21
|
+
return pkg.version ?? '0.1.2';
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return '0.1.2';
|
|
25
|
+
}
|
|
26
|
+
}
|
|
13
27
|
export class AeroCLI {
|
|
14
|
-
static version =
|
|
28
|
+
static version = readPackageVersion();
|
|
15
29
|
static async run(argv = process.argv.slice(2)) {
|
|
16
30
|
const command = argv[0];
|
|
17
31
|
if (!command || command === '--help' || command === '-h' || command === 'help') {
|
|
@@ -186,7 +200,7 @@ Options:
|
|
|
186
200
|
|
|
187
201
|
Available Commands:
|
|
188
202
|
init [dir] Scaffold a complete production AeroJS application
|
|
189
|
-
new <name>
|
|
203
|
+
new <name> [--template] Create a new AeroJS app (api-starter, react-inertia, vue-inertia, hospital-erp)
|
|
190
204
|
|
|
191
205
|
make:controller <name> Create a new RESTful controller class
|
|
192
206
|
make:model <name> [-m] Create a new Active Record Model (optionally with migration)
|
package/dist/cli/runner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/cli/runner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC1G,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAEnD,MAAM,OAAO,OAAO;
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/cli/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file http.ts
|
|
3
|
+
* @description Central Http client facade and fluent API for AeroJS.
|
|
4
|
+
*/
|
|
5
|
+
import { HttpRequestBuilder, type HttpFakeHandler, type RequestSentRecord } from './request-builder.js';
|
|
6
|
+
import { HttpResponse } from './response.js';
|
|
7
|
+
export declare class Http {
|
|
8
|
+
/**
|
|
9
|
+
* Creates a new fluent HTTP request builder.
|
|
10
|
+
*/
|
|
11
|
+
static create(): HttpRequestBuilder;
|
|
12
|
+
static baseUrl(url: string): HttpRequestBuilder;
|
|
13
|
+
static withToken(token: string, type?: string): HttpRequestBuilder;
|
|
14
|
+
static withBasicAuth(username: string, password?: string): HttpRequestBuilder;
|
|
15
|
+
static withHeaders(headers: Record<string, string>): HttpRequestBuilder;
|
|
16
|
+
static withQuery(query: Record<string, any>): HttpRequestBuilder;
|
|
17
|
+
static timeout(ms: number): HttpRequestBuilder;
|
|
18
|
+
static retry(times?: number, delayMs?: number): HttpRequestBuilder;
|
|
19
|
+
static acceptJson(): HttpRequestBuilder;
|
|
20
|
+
static asJson(): HttpRequestBuilder;
|
|
21
|
+
static asForm(): HttpRequestBuilder;
|
|
22
|
+
static get(url: string, query?: Record<string, any>): Promise<HttpResponse>;
|
|
23
|
+
static post(url: string, data?: any): Promise<HttpResponse>;
|
|
24
|
+
static put(url: string, data?: any): Promise<HttpResponse>;
|
|
25
|
+
static patch(url: string, data?: any): Promise<HttpResponse>;
|
|
26
|
+
static delete(url: string, data?: any): Promise<HttpResponse>;
|
|
27
|
+
static head(url: string): Promise<HttpResponse>;
|
|
28
|
+
/**
|
|
29
|
+
* Helper to construct a synthetic mock HttpResponse.
|
|
30
|
+
*/
|
|
31
|
+
static response(body?: any, status?: number, headers?: Record<string, string>): HttpResponse;
|
|
32
|
+
/**
|
|
33
|
+
* Intercepts outgoing requests for testing assertions.
|
|
34
|
+
*/
|
|
35
|
+
static fake(patternOrHandler?: string | RegExp | HttpFakeHandler | Record<string, any>, handler?: HttpFakeHandler): void;
|
|
36
|
+
/**
|
|
37
|
+
* Resets all fakes and recorded requests.
|
|
38
|
+
*/
|
|
39
|
+
static reset(): void;
|
|
40
|
+
static getSent(): RequestSentRecord[];
|
|
41
|
+
static assertSent(callback: (request: RequestSentRecord) => boolean): void;
|
|
42
|
+
static assertNotSent(callback: (request: RequestSentRecord) => boolean): void;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/http/http.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,kBAAkB,EAAE,KAAK,eAAe,EAAE,KAAK,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACxG,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,qBAAa,IAAI;IACf;;OAEG;WACW,MAAM,IAAI,kBAAkB;WAI5B,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB;WAIxC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,SAAW,GAAG,kBAAkB;WAI7D,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,SAAK,GAAG,kBAAkB;WAIlE,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,kBAAkB;WAIhE,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,kBAAkB;WAIzD,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,kBAAkB;WAIvC,KAAK,CAAC,KAAK,SAAI,EAAE,OAAO,SAAM,GAAG,kBAAkB;WAInD,UAAU,IAAI,kBAAkB;WAIhC,MAAM,IAAI,kBAAkB;WAI5B,MAAM,IAAI,kBAAkB;WAM5B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;WAIpE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,YAAY,CAAC;WAIpD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,YAAY,CAAC;WAInD,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,YAAY,CAAC;WAIrD,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,YAAY,CAAC;WAItD,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAMtD;;OAEG;WACW,QAAQ,CAAC,IAAI,GAAE,GAAQ,EAAE,MAAM,SAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,YAAY;IASxG;;OAEG;WACW,IAAI,CAChB,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1E,OAAO,CAAC,EAAE,eAAe,GACxB,IAAI;IA8BP;;OAEG;WACW,KAAK,IAAI,IAAI;WAIb,OAAO,IAAI,iBAAiB,EAAE;WAI9B,UAAU,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,OAAO,GAAG,IAAI;WAQnE,aAAa,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,OAAO,GAAG,IAAI;CAOrF"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file http.ts
|
|
3
|
+
* @description Central Http client facade and fluent API for AeroJS.
|
|
4
|
+
*/
|
|
5
|
+
import { HttpRequestBuilder } from './request-builder.js';
|
|
6
|
+
import { HttpResponse } from './response.js';
|
|
7
|
+
export class Http {
|
|
8
|
+
/**
|
|
9
|
+
* Creates a new fluent HTTP request builder.
|
|
10
|
+
*/
|
|
11
|
+
static create() {
|
|
12
|
+
return new HttpRequestBuilder();
|
|
13
|
+
}
|
|
14
|
+
static baseUrl(url) {
|
|
15
|
+
return new HttpRequestBuilder().baseUrl(url);
|
|
16
|
+
}
|
|
17
|
+
static withToken(token, type = 'Bearer') {
|
|
18
|
+
return new HttpRequestBuilder().withToken(token, type);
|
|
19
|
+
}
|
|
20
|
+
static withBasicAuth(username, password = '') {
|
|
21
|
+
return new HttpRequestBuilder().withBasicAuth(username, password);
|
|
22
|
+
}
|
|
23
|
+
static withHeaders(headers) {
|
|
24
|
+
return new HttpRequestBuilder().withHeaders(headers);
|
|
25
|
+
}
|
|
26
|
+
static withQuery(query) {
|
|
27
|
+
return new HttpRequestBuilder().withQuery(query);
|
|
28
|
+
}
|
|
29
|
+
static timeout(ms) {
|
|
30
|
+
return new HttpRequestBuilder().timeout(ms);
|
|
31
|
+
}
|
|
32
|
+
static retry(times = 3, delayMs = 100) {
|
|
33
|
+
return new HttpRequestBuilder().retry(times, delayMs);
|
|
34
|
+
}
|
|
35
|
+
static acceptJson() {
|
|
36
|
+
return new HttpRequestBuilder().acceptJson();
|
|
37
|
+
}
|
|
38
|
+
static asJson() {
|
|
39
|
+
return new HttpRequestBuilder().asJson();
|
|
40
|
+
}
|
|
41
|
+
static asForm() {
|
|
42
|
+
return new HttpRequestBuilder().asForm();
|
|
43
|
+
}
|
|
44
|
+
// --- Convenience HTTP Verbs ---
|
|
45
|
+
static get(url, query) {
|
|
46
|
+
return new HttpRequestBuilder().get(url, query);
|
|
47
|
+
}
|
|
48
|
+
static post(url, data) {
|
|
49
|
+
return new HttpRequestBuilder().post(url, data);
|
|
50
|
+
}
|
|
51
|
+
static put(url, data) {
|
|
52
|
+
return new HttpRequestBuilder().put(url, data);
|
|
53
|
+
}
|
|
54
|
+
static patch(url, data) {
|
|
55
|
+
return new HttpRequestBuilder().patch(url, data);
|
|
56
|
+
}
|
|
57
|
+
static delete(url, data) {
|
|
58
|
+
return new HttpRequestBuilder().delete(url, data);
|
|
59
|
+
}
|
|
60
|
+
static head(url) {
|
|
61
|
+
return new HttpRequestBuilder().head(url);
|
|
62
|
+
}
|
|
63
|
+
// --- Testing Utilities ---
|
|
64
|
+
/**
|
|
65
|
+
* Helper to construct a synthetic mock HttpResponse.
|
|
66
|
+
*/
|
|
67
|
+
static response(body = {}, status = 200, headers = {}) {
|
|
68
|
+
const rawBody = typeof body === 'string' ? body : JSON.stringify(body);
|
|
69
|
+
const headerObj = new Headers(headers);
|
|
70
|
+
if (!headerObj.has('content-type') && typeof body === 'object') {
|
|
71
|
+
headerObj.set('content-type', 'application/json');
|
|
72
|
+
}
|
|
73
|
+
return new HttpResponse(status, status === 200 ? 'OK' : 'Mock Response', headerObj, rawBody);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Intercepts outgoing requests for testing assertions.
|
|
77
|
+
*/
|
|
78
|
+
static fake(patternOrHandler, handler) {
|
|
79
|
+
if (typeof patternOrHandler === 'object' && !(patternOrHandler instanceof RegExp)) {
|
|
80
|
+
// Map of URL -> response or mock data
|
|
81
|
+
const routes = patternOrHandler;
|
|
82
|
+
HttpRequestBuilder.setFake((url) => {
|
|
83
|
+
for (const [routePattern, mockResponse] of Object.entries(routes)) {
|
|
84
|
+
if (url.includes(routePattern) || routePattern === '*') {
|
|
85
|
+
if (mockResponse instanceof HttpResponse) {
|
|
86
|
+
return mockResponse;
|
|
87
|
+
}
|
|
88
|
+
return Http.response(mockResponse);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return Http.response({}, 404);
|
|
92
|
+
});
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
if (typeof patternOrHandler === 'function') {
|
|
96
|
+
HttpRequestBuilder.setFake(patternOrHandler);
|
|
97
|
+
}
|
|
98
|
+
else if (typeof patternOrHandler === 'string' || patternOrHandler instanceof RegExp) {
|
|
99
|
+
if (handler) {
|
|
100
|
+
HttpRequestBuilder.setFake(patternOrHandler, handler);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
// Default stub response if called with Http.fake()
|
|
105
|
+
HttpRequestBuilder.setFake(() => Http.response({ mocked: true }, 200));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Resets all fakes and recorded requests.
|
|
110
|
+
*/
|
|
111
|
+
static reset() {
|
|
112
|
+
HttpRequestBuilder.clearFakes();
|
|
113
|
+
}
|
|
114
|
+
static getSent() {
|
|
115
|
+
return HttpRequestBuilder.getSent();
|
|
116
|
+
}
|
|
117
|
+
static assertSent(callback) {
|
|
118
|
+
const sent = HttpRequestBuilder.getSent();
|
|
119
|
+
const match = sent.some(callback);
|
|
120
|
+
if (!match) {
|
|
121
|
+
throw new Error(`Expected HTTP request matching condition was not sent. Total requests sent: ${sent.length}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
static assertNotSent(callback) {
|
|
125
|
+
const sent = HttpRequestBuilder.getSent();
|
|
126
|
+
const match = sent.some(callback);
|
|
127
|
+
if (match) {
|
|
128
|
+
throw new Error('Unexpected HTTP request matching condition was sent.');
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/http/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file request-builder.ts
|
|
3
|
+
* @description Fluent Request Builder for AeroJS HTTP client.
|
|
4
|
+
*/
|
|
5
|
+
import { HttpResponse } from './response.js';
|
|
6
|
+
export type HttpFakeHandler = (url: string, init?: RequestInit) => HttpResponse | Promise<HttpResponse>;
|
|
7
|
+
export interface RequestSentRecord {
|
|
8
|
+
url: string;
|
|
9
|
+
method: string;
|
|
10
|
+
headers: Record<string, string>;
|
|
11
|
+
body?: any;
|
|
12
|
+
}
|
|
13
|
+
export declare class HttpRequestBuilder {
|
|
14
|
+
private _baseUrl;
|
|
15
|
+
private _headers;
|
|
16
|
+
private _query;
|
|
17
|
+
private _timeoutMs;
|
|
18
|
+
private _retryCount;
|
|
19
|
+
private _retryDelayMs;
|
|
20
|
+
private _contentType;
|
|
21
|
+
private static fakeHandlers;
|
|
22
|
+
private static defaultFakeHandler?;
|
|
23
|
+
private static sentRequests;
|
|
24
|
+
static setFake(pattern: string | RegExp | HttpFakeHandler, handler?: HttpFakeHandler): void;
|
|
25
|
+
static clearFakes(): void;
|
|
26
|
+
static recordSent(record: RequestSentRecord): void;
|
|
27
|
+
static getSent(): RequestSentRecord[];
|
|
28
|
+
baseUrl(url: string): this;
|
|
29
|
+
withHeaders(headers: Record<string, string>): this;
|
|
30
|
+
withToken(token: string, type?: string): this;
|
|
31
|
+
withBasicAuth(username: string, password?: string): this;
|
|
32
|
+
accept(mimeType: string): this;
|
|
33
|
+
acceptJson(): this;
|
|
34
|
+
asJson(): this;
|
|
35
|
+
asForm(): this;
|
|
36
|
+
withQuery(query: Record<string, any>): this;
|
|
37
|
+
timeout(ms: number): this;
|
|
38
|
+
retry(times?: number, delayMs?: number): this;
|
|
39
|
+
get(url: string, query?: Record<string, any>): Promise<HttpResponse>;
|
|
40
|
+
post(url: string, data?: any): Promise<HttpResponse>;
|
|
41
|
+
put(url: string, data?: any): Promise<HttpResponse>;
|
|
42
|
+
patch(url: string, data?: any): Promise<HttpResponse>;
|
|
43
|
+
delete(url: string, data?: any): Promise<HttpResponse>;
|
|
44
|
+
head(url: string): Promise<HttpResponse>;
|
|
45
|
+
send(method: string, path: string, data?: any): Promise<HttpResponse>;
|
|
46
|
+
private findFake;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=request-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-builder.d.ts","sourceRoot":"","sources":["../../src/http/request-builder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;AAExG,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,GAAG,CAAC;CACZ;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAM;IACtB,OAAO,CAAC,QAAQ,CAEd;IACF,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,aAAa,CAAO;IAC5B,OAAO,CAAC,YAAY,CAAsB;IAG1C,OAAO,CAAC,MAAM,CAAC,YAAY,CAAoD;IAC/E,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAkB;IACpD,OAAO,CAAC,MAAM,CAAC,YAAY,CAA2B;WAExC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,eAAe,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI;WAQpF,UAAU,IAAI,IAAI;WAMlB,UAAU,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI;WAI3C,OAAO,IAAI,iBAAiB,EAAE;IAIrC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAK1B,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAKlD,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,SAAW,GAAG,IAAI;IAK/C,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,SAAK,GAAG,IAAI;IAMpD,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAK9B,UAAU,IAAI,IAAI;IAIlB,MAAM,IAAI,IAAI;IAKd,MAAM,IAAI,IAAI;IAKd,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAK3C,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAKzB,KAAK,CAAC,KAAK,SAAI,EAAE,OAAO,SAAM,GAAG,IAAI;IAQrC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;IAKpE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,YAAY,CAAC;IAIpD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,YAAY,CAAC;IAInD,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,YAAY,CAAC;IAIrD,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,YAAY,CAAC;IAItD,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAMlC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,YAAY,CAAC;IA4ElF,OAAO,CAAC,QAAQ;CAWjB"}
|