@orchestr-sh/orchestr 1.1.1 → 1.2.1
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 +438 -39
- package/dist/Foundation/Application.d.ts +1 -1
- package/dist/Foundation/Application.d.ts.map +1 -1
- package/dist/Foundation/Application.js +9 -4
- package/dist/Foundation/Application.js.map +1 -1
- package/dist/Providers/RouteServiceProvider.d.ts +22 -1
- package/dist/Providers/RouteServiceProvider.d.ts.map +1 -1
- package/dist/Providers/RouteServiceProvider.js +31 -2
- package/dist/Providers/RouteServiceProvider.js.map +1 -1
- package/dist/Routing/Route.d.ts +1 -1
- package/dist/Routing/Route.d.ts.map +1 -1
- package/dist/Routing/Router.d.ts +5 -0
- package/dist/Routing/Router.d.ts.map +1 -1
- package/dist/Routing/Router.js +19 -0
- package/dist/Routing/Router.js.map +1 -1
- package/dist/Support/helpers.d.ts +17 -0
- package/dist/Support/helpers.d.ts.map +1 -0
- package/dist/Support/helpers.js +66 -0
- package/dist/Support/helpers.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/Database/Eloquent/Builder.d.ts +0 -76
- package/dist/Database/Eloquent/Builder.d.ts.map +0 -1
- package/dist/Database/Eloquent/Builder.js +0 -154
- package/dist/Database/Eloquent/Builder.js.map +0 -1
- package/dist/Database/Eloquent/Collection.d.ts +0 -137
- package/dist/Database/Eloquent/Collection.d.ts.map +0 -1
- package/dist/Database/Eloquent/Collection.js +0 -284
- package/dist/Database/Eloquent/Collection.js.map +0 -1
- package/dist/Database/Eloquent/Concerns/HasAttributes.d.ts +0 -44
- package/dist/Database/Eloquent/Concerns/HasAttributes.d.ts.map +0 -1
- package/dist/Database/Eloquent/Concerns/HasAttributes.js +0 -8
- package/dist/Database/Eloquent/Concerns/HasAttributes.js.map +0 -1
- package/dist/Database/Eloquent/Concerns/HasTimestamps.d.ts +0 -41
- package/dist/Database/Eloquent/Concerns/HasTimestamps.d.ts.map +0 -1
- package/dist/Database/Eloquent/Concerns/HasTimestamps.js +0 -14
- package/dist/Database/Eloquent/Concerns/HasTimestamps.js.map +0 -1
- package/dist/Database/Eloquent/Model.d.ts +0 -265
- package/dist/Database/Eloquent/Model.d.ts.map +0 -1
- package/dist/Database/Eloquent/Model.js +0 -523
- package/dist/Database/Eloquent/Model.js.map +0 -1
- package/dist/Database/Eloquent/SoftDeletes.d.ts +0 -41
- package/dist/Database/Eloquent/SoftDeletes.d.ts.map +0 -1
- package/dist/Database/Eloquent/SoftDeletes.js +0 -22
- package/dist/Database/Eloquent/SoftDeletes.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Orchestr
|
|
2
2
|
|
|
3
3
|
A 1:1 Laravel replica built in TypeScript. Brings Laravel's elegant syntax and architecture to the TypeScript/Node.js ecosystem.
|
|
4
4
|
|
|
@@ -8,17 +8,20 @@ Built from the ground up with Laravel's core components:
|
|
|
8
8
|
|
|
9
9
|
- **Service Container** - Full IoC container with dependency injection and reflection
|
|
10
10
|
- **Service Providers** - Bootstrap and register services
|
|
11
|
-
- **HTTP Router** - Laravel-style routing with parameter binding
|
|
11
|
+
- **HTTP Router** - Laravel-style routing with parameter binding and file-based route loading
|
|
12
12
|
- **Request/Response** - Elegant HTTP abstractions
|
|
13
13
|
- **Middleware** - Global and route-level middleware pipeline
|
|
14
14
|
- **Controllers** - MVC architecture support
|
|
15
|
-
- **Facades** - Static proxy access to services
|
|
15
|
+
- **Facades** - Static proxy access to services (Route, DB)
|
|
16
|
+
- **Query Builder** - Fluent database query builder with full Laravel API
|
|
17
|
+
- **Ensemble ORM** - ActiveRecord ORM (Laravel's Eloquent equivalent) with relationships, soft deletes, and more
|
|
18
|
+
- **Database Manager** - Multi-connection database management
|
|
16
19
|
- **Application Lifecycle** - Complete Laravel bootstrap process
|
|
17
20
|
|
|
18
21
|
## Installation
|
|
19
22
|
|
|
20
23
|
```bash
|
|
21
|
-
npm install orchestr reflect-metadata
|
|
24
|
+
npm install @orchestr-sh/orchestr reflect-metadata
|
|
22
25
|
```
|
|
23
26
|
|
|
24
27
|
**Note**: `reflect-metadata` is required for dependency injection to work.
|
|
@@ -34,14 +37,14 @@ const app = new Application(__dirname);
|
|
|
34
37
|
|
|
35
38
|
// Register providers
|
|
36
39
|
app.register(RouteServiceProvider);
|
|
37
|
-
app.boot();
|
|
40
|
+
await app.boot();
|
|
38
41
|
|
|
39
42
|
// Create HTTP kernel
|
|
40
43
|
const kernel = new Kernel(app);
|
|
41
44
|
|
|
42
45
|
// Define routes
|
|
43
46
|
Route.get('/', async (req, res) => {
|
|
44
|
-
return res.json({ message: 'Hello from
|
|
47
|
+
return res.json({ message: 'Hello from Orchestr!' });
|
|
45
48
|
});
|
|
46
49
|
|
|
47
50
|
Route.get('/users/:id', async (req, res) => {
|
|
@@ -121,6 +124,69 @@ const route = Route.get('/users', handler);
|
|
|
121
124
|
route.setName('users.index');
|
|
122
125
|
```
|
|
123
126
|
|
|
127
|
+
#### Loading Routes from Files
|
|
128
|
+
|
|
129
|
+
Organize your routes in separate files, just like Laravel:
|
|
130
|
+
|
|
131
|
+
**routes/web.ts**
|
|
132
|
+
```typescript
|
|
133
|
+
import { Route } from 'orchestr';
|
|
134
|
+
|
|
135
|
+
Route.get('/', async (req, res) => {
|
|
136
|
+
return res.json({ message: 'Welcome' });
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
Route.get('/about', async (req, res) => {
|
|
140
|
+
return res.json({ page: 'about' });
|
|
141
|
+
});
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
**routes/api.ts**
|
|
145
|
+
```typescript
|
|
146
|
+
import { Route } from 'orchestr';
|
|
147
|
+
|
|
148
|
+
Route.group({ prefix: 'api/v1' }, () => {
|
|
149
|
+
Route.get('/users', async (req, res) => {
|
|
150
|
+
return res.json({ users: [] });
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
Route.post('/users', async (req, res) => {
|
|
154
|
+
return res.status(201).json({ created: true });
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
**app/Providers/AppRouteServiceProvider.ts**
|
|
160
|
+
```typescript
|
|
161
|
+
import { RouteServiceProvider } from 'orchestr';
|
|
162
|
+
|
|
163
|
+
export class AppRouteServiceProvider extends RouteServiceProvider {
|
|
164
|
+
async boot(): Promise<void> {
|
|
165
|
+
// Load web routes
|
|
166
|
+
this.routes(() => import('../../routes/web'));
|
|
167
|
+
|
|
168
|
+
// Load API routes
|
|
169
|
+
this.routes(() => import('../../routes/api'));
|
|
170
|
+
|
|
171
|
+
await super.boot();
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
**index.ts**
|
|
177
|
+
```typescript
|
|
178
|
+
import 'reflect-metadata';
|
|
179
|
+
import { Application, Kernel } from 'orchestr';
|
|
180
|
+
import { AppRouteServiceProvider } from './app/Providers/AppRouteServiceProvider';
|
|
181
|
+
|
|
182
|
+
const app = new Application(__dirname);
|
|
183
|
+
app.register(AppRouteServiceProvider);
|
|
184
|
+
await app.boot();
|
|
185
|
+
|
|
186
|
+
const kernel = new Kernel(app);
|
|
187
|
+
kernel.listen(3000);
|
|
188
|
+
```
|
|
189
|
+
|
|
124
190
|
### Middleware
|
|
125
191
|
|
|
126
192
|
Global and route-level middleware:
|
|
@@ -148,6 +214,8 @@ Route.get('/profile', handler).addMiddleware(authMiddleware);
|
|
|
148
214
|
MVC pattern with base controller:
|
|
149
215
|
|
|
150
216
|
```typescript
|
|
217
|
+
import { Controller, Request, Response, Route } from 'orchestr';
|
|
218
|
+
|
|
151
219
|
class UserController extends Controller {
|
|
152
220
|
async index(req: Request, res: Response) {
|
|
153
221
|
return res.json({ users: [] });
|
|
@@ -166,6 +234,11 @@ class UserController extends Controller {
|
|
|
166
234
|
return res.status(201).json({ user: validated });
|
|
167
235
|
}
|
|
168
236
|
}
|
|
237
|
+
|
|
238
|
+
// Register controller routes
|
|
239
|
+
Route.get('/users', [UserController, 'index']);
|
|
240
|
+
Route.get('/users/:id', [UserController, 'show']);
|
|
241
|
+
Route.post('/users', [UserController, 'store']);
|
|
169
242
|
```
|
|
170
243
|
|
|
171
244
|
### Request
|
|
@@ -234,7 +307,7 @@ res.view('welcome', { name: 'John' });
|
|
|
234
307
|
Static access to services:
|
|
235
308
|
|
|
236
309
|
```typescript
|
|
237
|
-
import { Route } from 'orchestr';
|
|
310
|
+
import { Route, DB } from 'orchestr';
|
|
238
311
|
|
|
239
312
|
// Route facade provides static access to Router
|
|
240
313
|
Route.get('/path', handler);
|
|
@@ -242,52 +315,358 @@ Route.post('/path', handler);
|
|
|
242
315
|
Route.group({ prefix: 'api' }, () => {
|
|
243
316
|
// ...
|
|
244
317
|
});
|
|
318
|
+
|
|
319
|
+
// DB facade provides static access to DatabaseManager
|
|
320
|
+
const users = await DB.table('users').where('active', true).get();
|
|
245
321
|
```
|
|
246
322
|
|
|
247
|
-
|
|
323
|
+
### Database Query Builder
|
|
248
324
|
|
|
249
|
-
|
|
325
|
+
Fluent, chainable query builder with full Laravel API:
|
|
250
326
|
|
|
251
|
-
```
|
|
252
|
-
|
|
327
|
+
```typescript
|
|
328
|
+
import { DB } from 'orchestr';
|
|
329
|
+
|
|
330
|
+
// Basic queries
|
|
331
|
+
const users = await DB.table('users').get();
|
|
332
|
+
const user = await DB.table('users').where('id', 1).first();
|
|
333
|
+
|
|
334
|
+
// Where clauses
|
|
335
|
+
await DB.table('users')
|
|
336
|
+
.where('votes', '>', 100)
|
|
337
|
+
.where('status', 'active')
|
|
338
|
+
.get();
|
|
339
|
+
|
|
340
|
+
// Or where
|
|
341
|
+
await DB.table('users')
|
|
342
|
+
.where('votes', '>', 100)
|
|
343
|
+
.orWhere('name', 'John')
|
|
344
|
+
.get();
|
|
345
|
+
|
|
346
|
+
// Additional where methods
|
|
347
|
+
await DB.table('users').whereBetween('votes', [1, 100]).get();
|
|
348
|
+
await DB.table('users').whereIn('id', [1, 2, 3]).get();
|
|
349
|
+
await DB.table('users').whereNull('deleted_at').get();
|
|
350
|
+
|
|
351
|
+
// Ordering, grouping, and limits
|
|
352
|
+
await DB.table('users')
|
|
353
|
+
.orderBy('name', 'desc')
|
|
354
|
+
.groupBy('account_id')
|
|
355
|
+
.having('account_id', '>', 100)
|
|
356
|
+
.limit(10)
|
|
357
|
+
.offset(20)
|
|
358
|
+
.get();
|
|
359
|
+
|
|
360
|
+
// Joins
|
|
361
|
+
await DB.table('users')
|
|
362
|
+
.join('contacts', 'users.id', '=', 'contacts.user_id')
|
|
363
|
+
.leftJoin('orders', 'users.id', '=', 'orders.user_id')
|
|
364
|
+
.select('users.*', 'contacts.phone', 'orders.price')
|
|
365
|
+
.get();
|
|
366
|
+
|
|
367
|
+
// Aggregates
|
|
368
|
+
const count = await DB.table('users').count();
|
|
369
|
+
const max = await DB.table('orders').max('price');
|
|
370
|
+
const min = await DB.table('orders').min('price');
|
|
371
|
+
const avg = await DB.table('orders').avg('price');
|
|
372
|
+
const sum = await DB.table('orders').sum('price');
|
|
373
|
+
|
|
374
|
+
// Inserts
|
|
375
|
+
await DB.table('users').insert({
|
|
376
|
+
name: 'John',
|
|
377
|
+
email: 'john@example.com'
|
|
378
|
+
});
|
|
379
|
+
|
|
380
|
+
// Updates
|
|
381
|
+
await DB.table('users')
|
|
382
|
+
.where('id', 1)
|
|
383
|
+
.update({ votes: 1 });
|
|
384
|
+
|
|
385
|
+
// Deletes
|
|
386
|
+
await DB.table('users').where('votes', '<', 100).delete();
|
|
387
|
+
|
|
388
|
+
// Raw expressions
|
|
389
|
+
await DB.table('users')
|
|
390
|
+
.select(DB.raw('count(*) as user_count, status'))
|
|
391
|
+
.where('status', '<>', 1)
|
|
392
|
+
.groupBy('status')
|
|
393
|
+
.get();
|
|
253
394
|
```
|
|
254
395
|
|
|
255
|
-
|
|
396
|
+
### Ensemble ORM
|
|
397
|
+
|
|
398
|
+
ActiveRecord ORM (Eloquent equivalent) with relationships and advanced features:
|
|
399
|
+
|
|
400
|
+
```typescript
|
|
401
|
+
import { Ensemble, EnsembleBuilder } from 'orchestr';
|
|
402
|
+
|
|
403
|
+
// Define a model
|
|
404
|
+
class User extends Ensemble {
|
|
405
|
+
protected table = 'users';
|
|
406
|
+
protected fillable = ['name', 'email', 'password'];
|
|
407
|
+
protected hidden = ['password'];
|
|
408
|
+
protected casts = {
|
|
409
|
+
email_verified_at: 'datetime',
|
|
410
|
+
is_admin: 'boolean'
|
|
411
|
+
};
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
// Query using the model
|
|
415
|
+
const users = await User.query().where('active', true).get();
|
|
416
|
+
const user = await User.query().find(1);
|
|
417
|
+
|
|
418
|
+
// Create
|
|
419
|
+
const user = new User();
|
|
420
|
+
user.name = 'John Doe';
|
|
421
|
+
user.email = 'john@example.com';
|
|
422
|
+
await user.save();
|
|
423
|
+
|
|
424
|
+
// Or use create
|
|
425
|
+
const user = await User.query().create({
|
|
426
|
+
name: 'John Doe',
|
|
427
|
+
email: 'john@example.com'
|
|
428
|
+
});
|
|
429
|
+
|
|
430
|
+
// Update
|
|
431
|
+
const user = await User.query().find(1);
|
|
432
|
+
user.name = 'Jane Doe';
|
|
433
|
+
await user.save();
|
|
434
|
+
|
|
435
|
+
// Delete
|
|
436
|
+
await user.delete();
|
|
437
|
+
|
|
438
|
+
// Mass assignment
|
|
439
|
+
await User.query().create({
|
|
440
|
+
name: 'John',
|
|
441
|
+
email: 'john@example.com'
|
|
442
|
+
});
|
|
443
|
+
|
|
444
|
+
// Soft deletes
|
|
445
|
+
import { softDeletes } from 'orchestr';
|
|
446
|
+
|
|
447
|
+
class Post extends softDeletes(Ensemble) {
|
|
448
|
+
protected table = 'posts';
|
|
449
|
+
}
|
|
256
450
|
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
451
|
+
const post = await Post.query().find(1);
|
|
452
|
+
await post.delete(); // Soft delete
|
|
453
|
+
await post.restore(); // Restore
|
|
454
|
+
await post.forceDelete(); // Permanent delete
|
|
455
|
+
|
|
456
|
+
// Query only non-deleted
|
|
457
|
+
const posts = await Post.query().get();
|
|
458
|
+
|
|
459
|
+
// Query with trashed
|
|
460
|
+
const allPosts = await Post.query().withTrashed().get();
|
|
461
|
+
|
|
462
|
+
// Query only trashed
|
|
463
|
+
const trashedPosts = await Post.query().onlyTrashed().get();
|
|
464
|
+
|
|
465
|
+
// Timestamps
|
|
466
|
+
// Automatically manages created_at and updated_at
|
|
467
|
+
class Article extends Ensemble {
|
|
468
|
+
protected table = 'articles';
|
|
469
|
+
public timestamps = true; // enabled by default
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
// Custom attributes and casts
|
|
473
|
+
class User extends Ensemble {
|
|
474
|
+
protected casts = {
|
|
475
|
+
email_verified_at: 'datetime',
|
|
476
|
+
settings: 'json',
|
|
477
|
+
is_admin: 'boolean',
|
|
478
|
+
age: 'number'
|
|
479
|
+
};
|
|
480
|
+
|
|
481
|
+
// Accessors
|
|
482
|
+
getFullNameAttribute(): string {
|
|
483
|
+
return `${this.getAttribute('first_name')} ${this.getAttribute('last_name')}`;
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
// Mutators
|
|
487
|
+
setPasswordAttribute(value: string): void {
|
|
488
|
+
this.setAttribute('password', hashPassword(value));
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
const user = await User.query().find(1);
|
|
493
|
+
console.log(user.full_name); // Uses accessor
|
|
494
|
+
user.password = 'secret123'; // Uses mutator
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
### Database Setup
|
|
498
|
+
|
|
499
|
+
Configure multiple database connections:
|
|
500
|
+
|
|
501
|
+
```typescript
|
|
502
|
+
import { Application, DatabaseServiceProvider, DB } from 'orchestr';
|
|
503
|
+
import { drizzle } from 'drizzle-orm/better-sqlite3';
|
|
504
|
+
import Database from 'better-sqlite3';
|
|
505
|
+
|
|
506
|
+
const app = new Application(__dirname);
|
|
507
|
+
|
|
508
|
+
// Register database service provider
|
|
509
|
+
app.register(new DatabaseServiceProvider({
|
|
510
|
+
default: 'sqlite',
|
|
511
|
+
connections: {
|
|
512
|
+
sqlite: {
|
|
513
|
+
adapter: 'drizzle',
|
|
514
|
+
client: drizzle(new Database('database.sqlite'))
|
|
515
|
+
},
|
|
516
|
+
postgres: {
|
|
517
|
+
adapter: 'drizzle',
|
|
518
|
+
client: drizzle(process.env.DATABASE_URL!)
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
}));
|
|
522
|
+
|
|
523
|
+
await app.boot();
|
|
524
|
+
|
|
525
|
+
// Use default connection
|
|
526
|
+
const users = await DB.table('users').get();
|
|
527
|
+
|
|
528
|
+
// Use specific connection
|
|
529
|
+
const posts = await DB.connection('postgres').table('posts').get();
|
|
530
|
+
```
|
|
531
|
+
|
|
532
|
+
## Complete Example
|
|
533
|
+
|
|
534
|
+
Here's a complete example showing routing, database, and ORM:
|
|
535
|
+
|
|
536
|
+
**index.ts**
|
|
537
|
+
```typescript
|
|
538
|
+
import 'reflect-metadata';
|
|
539
|
+
import { Application, Kernel, DatabaseServiceProvider } from 'orchestr';
|
|
540
|
+
import { AppRouteServiceProvider } from './app/Providers/AppRouteServiceProvider';
|
|
541
|
+
import { drizzle } from 'drizzle-orm/better-sqlite3';
|
|
542
|
+
import Database from 'better-sqlite3';
|
|
543
|
+
|
|
544
|
+
const app = new Application(__dirname);
|
|
545
|
+
|
|
546
|
+
// Register database
|
|
547
|
+
app.register(new DatabaseServiceProvider({
|
|
548
|
+
default: 'sqlite',
|
|
549
|
+
connections: {
|
|
550
|
+
sqlite: {
|
|
551
|
+
adapter: 'drizzle',
|
|
552
|
+
client: drizzle(new Database('database.sqlite'))
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
}));
|
|
556
|
+
|
|
557
|
+
// Register routes
|
|
558
|
+
app.register(AppRouteServiceProvider);
|
|
559
|
+
|
|
560
|
+
await app.boot();
|
|
561
|
+
|
|
562
|
+
const kernel = new Kernel(app);
|
|
563
|
+
kernel.listen(3000);
|
|
564
|
+
```
|
|
565
|
+
|
|
566
|
+
**app/Models/User.ts**
|
|
567
|
+
```typescript
|
|
568
|
+
import { Ensemble, softDeletes } from 'orchestr';
|
|
569
|
+
|
|
570
|
+
export class User extends softDeletes(Ensemble) {
|
|
571
|
+
protected table = 'users';
|
|
572
|
+
protected fillable = ['name', 'email', 'password'];
|
|
573
|
+
protected hidden = ['password'];
|
|
574
|
+
|
|
575
|
+
protected casts = {
|
|
576
|
+
email_verified_at: 'datetime',
|
|
577
|
+
is_admin: 'boolean'
|
|
578
|
+
};
|
|
579
|
+
}
|
|
580
|
+
```
|
|
581
|
+
|
|
582
|
+
**routes/api.ts**
|
|
583
|
+
```typescript
|
|
584
|
+
import { Route, DB } from 'orchestr';
|
|
585
|
+
import { User } from '../app/Models/User';
|
|
586
|
+
|
|
587
|
+
Route.group({ prefix: 'api' }, () => {
|
|
588
|
+
// Using query builder
|
|
589
|
+
Route.get('/users', async (req, res) => {
|
|
590
|
+
const users = await DB.table('users')
|
|
591
|
+
.where('active', true)
|
|
592
|
+
.orderBy('created_at', 'desc')
|
|
593
|
+
.get();
|
|
594
|
+
|
|
595
|
+
return res.json({ users });
|
|
596
|
+
});
|
|
597
|
+
|
|
598
|
+
// Using Ensemble ORM
|
|
599
|
+
Route.get('/users/:id', async (req, res) => {
|
|
600
|
+
const user = await User.query().find(req.routeParam('id'));
|
|
601
|
+
|
|
602
|
+
if (!user) {
|
|
603
|
+
return res.status(404).json({ message: 'User not found' });
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
return res.json({ user });
|
|
607
|
+
});
|
|
608
|
+
|
|
609
|
+
Route.post('/users', async (req, res) => {
|
|
610
|
+
const user = await User.query().create(
|
|
611
|
+
req.only(['name', 'email', 'password'])
|
|
612
|
+
);
|
|
613
|
+
|
|
614
|
+
return res.status(201).json({ user });
|
|
615
|
+
});
|
|
616
|
+
|
|
617
|
+
Route.delete('/users/:id', async (req, res) => {
|
|
618
|
+
const user = await User.query().find(req.routeParam('id'));
|
|
619
|
+
await user?.delete(); // Soft delete
|
|
620
|
+
|
|
621
|
+
return res.json({ message: 'User deleted' });
|
|
622
|
+
});
|
|
623
|
+
});
|
|
624
|
+
```
|
|
265
625
|
|
|
266
626
|
## Architecture
|
|
267
627
|
|
|
268
|
-
|
|
628
|
+
Orchestr follows Laravel's architecture exactly:
|
|
269
629
|
|
|
270
630
|
```
|
|
271
631
|
src/
|
|
272
632
|
├── Container/
|
|
273
|
-
│ └── Container.ts
|
|
633
|
+
│ └── Container.ts # IoC Container with DI
|
|
274
634
|
├── Foundation/
|
|
275
|
-
│ ├── Application.ts
|
|
276
|
-
│ ├── ServiceProvider.ts
|
|
635
|
+
│ ├── Application.ts # Core application class
|
|
636
|
+
│ ├── ServiceProvider.ts # Service provider base
|
|
277
637
|
│ └── Http/
|
|
278
|
-
│ └── Kernel.ts
|
|
638
|
+
│ └── Kernel.ts # HTTP kernel
|
|
279
639
|
├── Routing/
|
|
280
|
-
│ ├── Router.ts
|
|
281
|
-
│ ├── Route.ts
|
|
282
|
-
│ ├── Request.ts
|
|
283
|
-
│ ├── Response.ts
|
|
284
|
-
│ └── Controller.ts
|
|
640
|
+
│ ├── Router.ts # Route registration and dispatch
|
|
641
|
+
│ ├── Route.ts # Individual route
|
|
642
|
+
│ ├── Request.ts # HTTP request wrapper
|
|
643
|
+
│ ├── Response.ts # HTTP response wrapper
|
|
644
|
+
│ └── Controller.ts # Base controller
|
|
645
|
+
├── Database/
|
|
646
|
+
│ ├── DatabaseManager.ts # Multi-connection manager
|
|
647
|
+
│ ├── Connection.ts # Database connection
|
|
648
|
+
│ ├── Query/
|
|
649
|
+
│ │ ├── Builder.ts # Query builder
|
|
650
|
+
│ │ └── Expression.ts # Raw SQL expressions
|
|
651
|
+
│ ├── Ensemble/
|
|
652
|
+
│ │ ├── Ensemble.ts # Base ORM model (like Eloquent)
|
|
653
|
+
│ │ ├── EnsembleBuilder.ts # Model query builder
|
|
654
|
+
│ │ ├── EnsembleCollection.ts # Model collection
|
|
655
|
+
│ │ ├── SoftDeletes.ts # Soft delete trait
|
|
656
|
+
│ │ └── Concerns/
|
|
657
|
+
│ │ ├── HasAttributes.ts # Attribute handling & casting
|
|
658
|
+
│ │ └── HasTimestamps.ts # Timestamp management
|
|
659
|
+
│ ├── Adapters/
|
|
660
|
+
│ │ └── DrizzleAdapter.ts # Drizzle ORM adapter
|
|
661
|
+
│ └── DatabaseServiceProvider.ts
|
|
285
662
|
├── Support/
|
|
286
|
-
│
|
|
663
|
+
│ ├── Facade.ts # Facade base class
|
|
664
|
+
│ └── helpers.ts # Helper functions
|
|
287
665
|
├── Facades/
|
|
288
|
-
│
|
|
666
|
+
│ ├── Route.ts # Route facade
|
|
667
|
+
│ └── DB.ts # Database facade
|
|
289
668
|
└── Providers/
|
|
290
|
-
└── RouteServiceProvider.ts
|
|
669
|
+
└── RouteServiceProvider.ts # Route service provider
|
|
291
670
|
```
|
|
292
671
|
|
|
293
672
|
## TypeScript Benefits
|
|
@@ -302,10 +681,23 @@ While maintaining Laravel's API, you get:
|
|
|
302
681
|
|
|
303
682
|
## Roadmap
|
|
304
683
|
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
- [
|
|
308
|
-
- [
|
|
684
|
+
Core components completed and in progress:
|
|
685
|
+
|
|
686
|
+
- [x] Service Container & Dependency Injection
|
|
687
|
+
- [x] Service Providers
|
|
688
|
+
- [x] HTTP Router & Route Files
|
|
689
|
+
- [x] Request/Response
|
|
690
|
+
- [x] Middleware Pipeline
|
|
691
|
+
- [x] Controllers
|
|
692
|
+
- [x] Facades (Route, DB)
|
|
693
|
+
- [x] Database Query Builder
|
|
694
|
+
- [x] Ensemble ORM (Eloquent equivalent)
|
|
695
|
+
- [x] Multi-connection Database Manager
|
|
696
|
+
- [x] Soft Deletes
|
|
697
|
+
- [x] Model Attributes & Casting
|
|
698
|
+
- [ ] Model Relationships (HasMany, BelongsTo, etc.)
|
|
699
|
+
- [ ] Database Migrations
|
|
700
|
+
- [ ] Database Seeding
|
|
309
701
|
- [ ] Validation System
|
|
310
702
|
- [ ] Authentication & Authorization
|
|
311
703
|
- [ ] Queue System
|
|
@@ -323,12 +715,19 @@ This is the core foundation. Next components to build:
|
|
|
323
715
|
| Service Container | ✅ | ✅ |
|
|
324
716
|
| Service Providers | ✅ | ✅ |
|
|
325
717
|
| Routing | ✅ | ✅ |
|
|
718
|
+
| Route Files | ✅ | ✅ |
|
|
326
719
|
| Middleware | ✅ | ✅ |
|
|
327
720
|
| Controllers | ✅ | ✅ |
|
|
328
721
|
| Request/Response | ✅ | ✅ |
|
|
329
722
|
| Facades | ✅ | ✅ |
|
|
330
|
-
|
|
|
331
|
-
|
|
|
723
|
+
| Query Builder | ✅ | ✅ |
|
|
724
|
+
| Eloquent ORM | ✅ | ✅ (Ensemble) |
|
|
725
|
+
| Soft Deletes | ✅ | ✅ |
|
|
726
|
+
| Timestamps | ✅ | ✅ |
|
|
727
|
+
| Attribute Casting | ✅ | ✅ |
|
|
728
|
+
| Model Relationships | ✅ | 🚧 |
|
|
729
|
+
| Migrations | ✅ | 🚧 |
|
|
730
|
+
| Seeding | ✅ | 🚧 |
|
|
332
731
|
| Validation | ✅ | 🚧 |
|
|
333
732
|
| Authentication | ✅ | 🚧 |
|
|
334
733
|
| Authorization | ✅ | 🚧 |
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Application.d.ts","sourceRoot":"","sources":["../../src/Foundation/Application.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;;GAGG;AACH,qBAAa,WAAY,SAAQ,SAAS;IACxC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,gBAAgB,CAAyB;IACjD,OAAO,CAAC,eAAe,CAAmC;gBAE9C,QAAQ,GAAE,MAAsB;IAO5C;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAM5B;;OAEG;IACH,OAAO,CAAC,4BAA4B;IAYpC;;OAEG;IACH,WAAW,IAAI,MAAM;IAIrB;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAKnC;;OAEG;IACH,IAAI,CAAC,IAAI,GAAE,MAAW,GAAG,MAAM;IAI/B,UAAU,CAAC,IAAI,GAAE,MAAW,GAAG,MAAM;IAIrC,YAAY,CAAC,IAAI,GAAE,MAAW,GAAG,MAAM;IAIvC,WAAW,CAAC,IAAI,GAAE,MAAW,GAAG,MAAM;IAItC,UAAU,CAAC,IAAI,GAAE,MAAW,GAAG,MAAM;IAIrC;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,eAAe,GAAG,CAAC,KAAK,GAAG,EAAE,WAAW,KAAK,eAAe,CAAC,GAAG,eAAe;IA0BlG;;OAEG;IACH,iBAAiB,CAAC,SAAS,EAAE,KAAK,CAAC,eAAe,GAAG,CAAC,KAAK,GAAG,EAAE,WAAW,KAAK,eAAe,CAAC,CAAC,GAAG,IAAI;IAIxG;;OAEG;
|
|
1
|
+
{"version":3,"file":"Application.d.ts","sourceRoot":"","sources":["../../src/Foundation/Application.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;;GAGG;AACH,qBAAa,WAAY,SAAQ,SAAS;IACxC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,gBAAgB,CAAyB;IACjD,OAAO,CAAC,eAAe,CAAmC;gBAE9C,QAAQ,GAAE,MAAsB;IAO5C;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAM5B;;OAEG;IACH,OAAO,CAAC,4BAA4B;IAYpC;;OAEG;IACH,WAAW,IAAI,MAAM;IAIrB;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAKnC;;OAEG;IACH,IAAI,CAAC,IAAI,GAAE,MAAW,GAAG,MAAM;IAI/B,UAAU,CAAC,IAAI,GAAE,MAAW,GAAG,MAAM;IAIrC,YAAY,CAAC,IAAI,GAAE,MAAW,GAAG,MAAM;IAIvC,WAAW,CAAC,IAAI,GAAE,MAAW,GAAG,MAAM;IAItC,UAAU,CAAC,IAAI,GAAE,MAAW,GAAG,MAAM;IAIrC;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,eAAe,GAAG,CAAC,KAAK,GAAG,EAAE,WAAW,KAAK,eAAe,CAAC,GAAG,eAAe;IA0BlG;;OAEG;IACH,iBAAiB,CAAC,SAAS,EAAE,KAAK,CAAC,eAAe,GAAG,CAAC,KAAK,GAAG,EAAE,WAAW,KAAK,eAAe,CAAC,CAAC,GAAG,IAAI;IAIxG;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAY3B;;OAEG;YACW,YAAY;IAS1B;;OAEG;IACH,QAAQ,IAAI,OAAO;IAInB;;;OAGG;IACH,OAAO,CAAC,oBAAoB,CAAyB;IAErD,WAAW,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAIvC;;OAEG;IACH,SAAS,IAAI,IAAI;IAIjB;;OAEG;IACH,OAAO,IAAI,MAAM;IAIjB;;OAEG;IACH,gBAAgB,IAAI,OAAO;IAI3B;;OAEG;IACH,eAAe,IAAI,MAAM;IAIzB;;OAEG;IACH,WAAW,IAAI,MAAM;IAIrB;;OAEG;IACH,OAAO,IAAI,OAAO;IAIlB;;OAEG;IACH,YAAY,IAAI,eAAe,EAAE;IAIjC;;OAEG;IACH,mBAAmB,IAAI,OAAO;CAG/B"}
|
|
@@ -102,19 +102,24 @@ class Application extends Container_1.Container {
|
|
|
102
102
|
/**
|
|
103
103
|
* Boot the application's service providers
|
|
104
104
|
*/
|
|
105
|
-
boot() {
|
|
105
|
+
async boot() {
|
|
106
106
|
if (this.booted) {
|
|
107
107
|
return;
|
|
108
108
|
}
|
|
109
|
-
|
|
109
|
+
for (const provider of this.serviceProviders) {
|
|
110
|
+
await this.bootProvider(provider);
|
|
111
|
+
}
|
|
110
112
|
this.booted = true;
|
|
111
113
|
}
|
|
112
114
|
/**
|
|
113
115
|
* Boot the given service provider
|
|
114
116
|
*/
|
|
115
|
-
bootProvider(provider) {
|
|
117
|
+
async bootProvider(provider) {
|
|
116
118
|
if (typeof provider.boot === 'function') {
|
|
117
|
-
this.call(provider.boot.bind(provider));
|
|
119
|
+
const result = this.call(provider.boot.bind(provider));
|
|
120
|
+
if (result instanceof Promise) {
|
|
121
|
+
await result;
|
|
122
|
+
}
|
|
118
123
|
}
|
|
119
124
|
}
|
|
120
125
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Application.js","sourceRoot":"","sources":["../../src/Foundation/Application.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Application.js","sourceRoot":"","sources":["../../src/Foundation/Application.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,30 @@
|
|
|
1
1
|
import { ServiceProvider } from '../Foundation/ServiceProvider';
|
|
2
2
|
/**
|
|
3
3
|
* RouteServiceProvider - Registers the router in the container
|
|
4
|
+
* Similar to Laravel's RouteServiceProvider
|
|
4
5
|
*/
|
|
5
6
|
export declare class RouteServiceProvider extends ServiceProvider {
|
|
7
|
+
/**
|
|
8
|
+
* The path to the route files
|
|
9
|
+
* Override this in your app's RouteServiceProvider
|
|
10
|
+
*/
|
|
11
|
+
protected routesPath?: string;
|
|
12
|
+
/**
|
|
13
|
+
* Route file loaders
|
|
14
|
+
* Override this method to customize how routes are loaded
|
|
15
|
+
*/
|
|
16
|
+
protected routeLoaders: (() => void | Promise<void>)[];
|
|
6
17
|
register(): void;
|
|
7
|
-
boot(): void
|
|
18
|
+
boot(): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Load routes from a file or callback
|
|
21
|
+
* Laravel: $this->routes(function() { require base_path('routes/web.php'); })
|
|
22
|
+
*/
|
|
23
|
+
protected routes(callback: () => void | Promise<void>): this;
|
|
24
|
+
/**
|
|
25
|
+
* Load routes from a module
|
|
26
|
+
* Usage: loadRoutesFrom(() => import('../routes/web'))
|
|
27
|
+
*/
|
|
28
|
+
protected loadRoutesFrom(importer: () => Promise<any>): Promise<void>;
|
|
8
29
|
}
|
|
9
30
|
//# sourceMappingURL=RouteServiceProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RouteServiceProvider.d.ts","sourceRoot":"","sources":["../../src/Providers/RouteServiceProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAIhE
|
|
1
|
+
{"version":3,"file":"RouteServiceProvider.d.ts","sourceRoot":"","sources":["../../src/Providers/RouteServiceProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAIhE;;;GAGG;AACH,qBAAa,oBAAqB,SAAQ,eAAe;IACvD;;;OAGG;IACH,SAAS,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAE9B;;;OAGG;IACH,SAAS,CAAC,YAAY,EAAE,CAAC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAM;IAE5D,QAAQ,IAAI,IAAI;IAQV,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B;;;OAGG;IACH,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAK5D;;;OAGG;cACa,cAAc,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CAG5E"}
|