canxjs 1.6.2 → 1.6.3
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 +23 -0
- package/dist/src/Application.d.ts +17 -0
- package/dist/src/Application.d.ts.map +1 -1
- package/dist/src/Application.js +36 -0
- package/dist/src/adapter/inertia/InertiaManager.d.ts +31 -0
- package/dist/src/adapter/inertia/InertiaManager.d.ts.map +1 -0
- package/dist/src/adapter/inertia/InertiaManager.js +54 -0
- package/dist/src/adapter/inertia/InertiaMiddleware.d.ts +3 -0
- package/dist/src/adapter/inertia/InertiaMiddleware.d.ts.map +1 -0
- package/dist/src/adapter/inertia/InertiaMiddleware.js +127 -0
- package/dist/src/auth/OAuth.d.ts +39 -36
- package/dist/src/auth/OAuth.d.ts.map +1 -1
- package/dist/src/auth/OAuth.js +127 -174
- package/dist/src/cli/commands/DownCommand.d.ts +17 -0
- package/dist/src/cli/commands/DownCommand.d.ts.map +1 -0
- package/dist/src/cli/commands/DownCommand.js +67 -0
- package/dist/src/cli/commands/MakeCommand.d.ts.map +1 -1
- package/dist/src/cli/commands/MakeCommand.js +81 -21
- package/dist/src/cli/commands/UpCommand.d.ts +13 -0
- package/dist/src/cli/commands/UpCommand.d.ts.map +1 -0
- package/dist/src/cli/commands/UpCommand.js +34 -0
- package/dist/src/cli/index.d.ts.map +1 -1
- package/dist/src/cli/index.js +4 -0
- package/dist/src/core/MaintenanceMode.d.ts +95 -0
- package/dist/src/core/MaintenanceMode.d.ts.map +1 -0
- package/dist/src/core/MaintenanceMode.js +258 -0
- package/dist/src/core/Server.d.ts.map +1 -1
- package/dist/src/core/Server.js +7 -0
- package/dist/src/i18n/LocalizationMiddleware.d.ts +8 -0
- package/dist/src/i18n/LocalizationMiddleware.d.ts.map +1 -0
- package/dist/src/i18n/LocalizationMiddleware.js +38 -0
- package/dist/src/i18n/Translator.d.ts +39 -0
- package/dist/src/i18n/Translator.d.ts.map +1 -0
- package/dist/src/i18n/Translator.js +120 -0
- package/dist/src/i18n/helpers.d.ts +13 -0
- package/dist/src/i18n/helpers.d.ts.map +1 -0
- package/dist/src/i18n/helpers.js +32 -0
- package/dist/src/index.d.ts +36 -10
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +46 -16
- package/dist/src/inertia/InertiaManager.d.ts +31 -0
- package/dist/src/inertia/InertiaManager.d.ts.map +1 -0
- package/dist/src/inertia/InertiaManager.js +54 -0
- package/dist/src/inertia/InertiaMiddleware.d.ts +3 -0
- package/dist/src/inertia/InertiaMiddleware.d.ts.map +1 -0
- package/dist/src/inertia/InertiaMiddleware.js +127 -0
- package/dist/src/inertia/index.d.ts +3 -0
- package/dist/src/inertia/index.d.ts.map +1 -0
- package/dist/src/inertia/index.js +2 -0
- package/dist/src/mvc/ModelObserver.d.ts +152 -0
- package/dist/src/mvc/ModelObserver.d.ts.map +1 -0
- package/dist/src/mvc/ModelObserver.js +239 -0
- package/dist/src/mvc/View.d.ts +9 -0
- package/dist/src/mvc/View.d.ts.map +1 -1
- package/dist/src/mvc/View.js +10 -1
- package/dist/src/notifications/Notification.d.ts.map +1 -1
- package/dist/src/notifications/Notification.js +1 -0
- package/dist/src/notifications/channels/SmsChannel.d.ts +128 -0
- package/dist/src/notifications/channels/SmsChannel.d.ts.map +1 -0
- package/dist/src/notifications/channels/SmsChannel.js +268 -0
- package/dist/src/queue/JobBatch.d.ts +146 -0
- package/dist/src/queue/JobBatch.d.ts.map +1 -0
- package/dist/src/queue/JobBatch.js +300 -0
- package/dist/src/queue/JobChain.d.ts +113 -0
- package/dist/src/queue/JobChain.d.ts.map +1 -0
- package/dist/src/queue/JobChain.js +216 -0
- package/dist/src/queue/Queue.d.ts +4 -1
- package/dist/src/queue/Queue.d.ts.map +1 -1
- package/dist/src/queue/Queue.js +3 -2
- package/dist/src/realtime/Broadcasting.d.ts +137 -0
- package/dist/src/realtime/Broadcasting.d.ts.map +1 -0
- package/dist/src/realtime/Broadcasting.js +265 -0
- package/dist/src/search/SearchManager.d.ts +4 -4
- package/dist/src/search/SearchManager.d.ts.map +1 -1
- package/dist/src/search/SearchManager.js +5 -5
- package/dist/src/search/Searchable.d.ts +25 -0
- package/dist/src/search/Searchable.d.ts.map +1 -0
- package/dist/src/search/Searchable.js +19 -0
- package/dist/src/search/engines/DatabaseEngine.d.ts +17 -0
- package/dist/src/search/engines/DatabaseEngine.d.ts.map +1 -0
- package/dist/src/search/engines/DatabaseEngine.js +67 -0
- package/dist/src/search/engines/Engine.d.ts +26 -0
- package/dist/src/search/engines/Engine.d.ts.map +1 -0
- package/dist/src/search/engines/Engine.js +25 -0
- package/dist/src/storage/Storage.d.ts.map +1 -1
- package/dist/src/storage/Storage.js +7 -0
- package/dist/src/storage/drivers/GCSDriver.d.ts +10 -0
- package/dist/src/storage/drivers/GCSDriver.d.ts.map +1 -0
- package/dist/src/storage/drivers/GCSDriver.js +17 -0
- package/dist/src/storage/drivers/types.d.ts +4 -1
- package/dist/src/storage/drivers/types.d.ts.map +1 -1
- package/dist/src/storage/index.d.ts +6 -0
- package/dist/src/storage/index.d.ts.map +1 -0
- package/dist/src/storage/index.js +5 -0
- package/dist/src/telescope/Telescope.d.ts +110 -0
- package/dist/src/telescope/Telescope.d.ts.map +1 -0
- package/dist/src/telescope/Telescope.js +205 -0
- package/dist/src/telescope/ui/TelescopeController.d.ts +26 -0
- package/dist/src/telescope/ui/TelescopeController.d.ts.map +1 -0
- package/dist/src/telescope/ui/TelescopeController.js +387 -0
- package/dist/src/telescope/watchers/index.d.ts +13 -0
- package/dist/src/telescope/watchers/index.d.ts.map +1 -0
- package/dist/src/telescope/watchers/index.js +119 -0
- package/dist/src/testing/TestHelper.d.ts +11 -11
- package/dist/src/testing/TestHelper.d.ts.map +1 -1
- package/dist/src/testing/dusk/Browser.d.ts +73 -0
- package/dist/src/testing/dusk/Browser.d.ts.map +1 -0
- package/dist/src/testing/dusk/Browser.js +123 -0
- package/dist/src/testing/dusk/Chrome.d.ts +9 -0
- package/dist/src/testing/dusk/Chrome.d.ts.map +1 -0
- package/dist/src/testing/dusk/Chrome.js +31 -0
- package/dist/src/testing/index.d.ts +14 -0
- package/dist/src/testing/index.d.ts.map +1 -0
- package/dist/src/testing/index.js +36 -0
- package/dist/src/types/index.d.ts +8 -0
- package/dist/src/types/index.d.ts.map +1 -1
- package/dist/src/utils/Helpers.d.ts.map +1 -1
- package/dist/src/utils/Helpers.js +2 -3
- package/dist/src/validator/FormRequest.d.ts +24 -0
- package/dist/src/validator/FormRequest.d.ts.map +1 -0
- package/dist/src/validator/FormRequest.js +82 -0
- package/dist/src/vite/Vite.d.ts +44 -0
- package/dist/src/vite/Vite.d.ts.map +1 -0
- package/dist/src/vite/Vite.js +148 -0
- package/dist/src/vite/helpers.d.ts +13 -0
- package/dist/src/vite/helpers.d.ts.map +1 -0
- package/dist/src/vite/helpers.js +19 -0
- package/dist/src/vite/index.d.ts +3 -0
- package/dist/src/vite/index.d.ts.map +1 -0
- package/dist/src/vite/index.js +2 -0
- package/package.json +21 -1
- package/src/Application.ts +48 -0
- package/src/auth/OAuth.ts +259 -0
- package/src/cli/commands/DownCommand.ts +79 -0
- package/src/cli/commands/MakeCommand.ts +108 -21
- package/src/cli/commands/UpCommand.ts +39 -0
- package/src/cli/index.ts +4 -0
- package/src/core/MaintenanceMode.ts +336 -0
- package/src/core/Server.ts +8 -0
- package/src/i18n/LocalizationMiddleware.ts +52 -0
- package/src/i18n/Translator.ts +147 -0
- package/src/i18n/helpers.ts +35 -0
- package/src/index.ts +141 -28
- package/src/inertia/InertiaManager.ts +73 -0
- package/src/inertia/InertiaMiddleware.ts +148 -0
- package/src/inertia/index.ts +2 -0
- package/src/mvc/ModelObserver.ts +347 -0
- package/src/mvc/View.ts +15 -1
- package/src/notifications/Notification.ts +2 -0
- package/src/notifications/channels/SmsChannel.ts +362 -0
- package/src/queue/JobBatch.ts +398 -0
- package/src/queue/JobChain.ts +279 -0
- package/src/queue/Queue.ts +3 -2
- package/src/realtime/Broadcasting.ts +367 -0
- package/src/search/SearchManager.ts +9 -8
- package/src/search/Searchable.ts +35 -0
- package/src/search/engines/DatabaseEngine.ts +88 -0
- package/src/search/engines/Engine.ts +41 -0
- package/src/storage/Storage.ts +8 -0
- package/src/storage/drivers/GCSDriver.ts +19 -0
- package/src/storage/drivers/types.ts +6 -1
- package/src/storage/index.ts +5 -0
- package/src/testing/TestHelper.ts +12 -12
- package/src/testing/dusk/Browser.ts +150 -0
- package/src/testing/dusk/Chrome.ts +33 -0
- package/src/testing/index.ts +45 -0
- package/src/types/index.ts +10 -0
- package/src/utils/Helpers.ts +2 -3
- package/src/validator/FormRequest.ts +101 -0
- package/src/vite/Vite.ts +185 -0
- package/src/vite/helpers.ts +22 -0
- package/src/vite/index.ts +2 -0
- package/src/testing/Browser.ts +0 -112
package/README.md
CHANGED
|
@@ -227,6 +227,29 @@ my-app/
|
|
|
227
227
|
- [Middleware](http://docs-canxjs.netlify.app/docs/middleware)
|
|
228
228
|
- [HotWire](http://docs-canxjs.netlify.app/docs/hotwire)
|
|
229
229
|
|
|
230
|
+
## Optional Dependencies
|
|
231
|
+
|
|
232
|
+
CanxJS is designed to be lightweight. Some features require additional packages:
|
|
233
|
+
|
|
234
|
+
| Feature | Required Package | Install Command |
|
|
235
|
+
| ----------- | --------------------- | -------------------- |
|
|
236
|
+
| PostgreSQL | `pg` | `bun add pg` |
|
|
237
|
+
| S3 Storage | Built-in (uses fetch) | - |
|
|
238
|
+
| SMTP Email | `nodemailer` | `bun add nodemailer` |
|
|
239
|
+
| Redis Cache | `ioredis` | `bun add ioredis` |
|
|
240
|
+
|
|
241
|
+
## Official Packages
|
|
242
|
+
|
|
243
|
+
Extend CanxJS with official packages:
|
|
244
|
+
|
|
245
|
+
| Package | Description | Install |
|
|
246
|
+
| ------------------------------------------------------------------ | -------------------------------------------------- | -------------------------- |
|
|
247
|
+
| [@canxjs/citadel](https://www.npmjs.com/package/@canxjs/citadel) | API Token Authentication (like Laravel Sanctum) | `bun add @canxjs/citadel` |
|
|
248
|
+
| [@canxjs/dominion](https://www.npmjs.com/package/@canxjs/dominion) | Role-Based Access Control (like Spatie Permission) | `bun add @canxjs/dominion` |
|
|
249
|
+
| [@canxjs/blocks](https://www.npmjs.com/package/@canxjs/blocks) | Modular Architecture (HMVC) | `bun add @canxjs/blocks` |
|
|
250
|
+
| [@canxjs/payment](https://www.npmjs.com/package/@canxjs/payment) | Midtrans Payment Gateway | `bun add @canxjs/payment` |
|
|
251
|
+
| [@canxjs/echo](https://www.npmjs.com/package/@canxjs/echo) | Real-time Event Broadcasting | `bun add @canxjs/echo` |
|
|
252
|
+
|
|
230
253
|
## License
|
|
231
254
|
|
|
232
255
|
MIT © CanxJS Team
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* CanxJS - Main Application Class
|
|
3
3
|
*/
|
|
4
4
|
import type { ServerConfig, MiddlewareHandler, CanxApplication, RouterInstance, Plugin } from './types';
|
|
5
|
+
import { Server } from './core/Server';
|
|
5
6
|
import { Router } from './core/Router';
|
|
6
7
|
export declare class Canx implements CanxApplication {
|
|
7
8
|
config: ServerConfig;
|
|
@@ -38,6 +39,10 @@ export declare class Canx implements CanxApplication {
|
|
|
38
39
|
* Stop the server
|
|
39
40
|
*/
|
|
40
41
|
close(): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Get the internal server instance
|
|
44
|
+
*/
|
|
45
|
+
getServer(): Server | null;
|
|
41
46
|
/**
|
|
42
47
|
* Get router for chaining
|
|
43
48
|
*/
|
|
@@ -71,5 +76,17 @@ export declare function createApp(config?: ServerConfig): Canx;
|
|
|
71
76
|
* Helper for creating typed configuration objects
|
|
72
77
|
*/
|
|
73
78
|
export declare function defineConfig<T extends Record<string, any>>(config: T): T;
|
|
79
|
+
export { Canx as Application };
|
|
80
|
+
/**
|
|
81
|
+
* Application Configuration for module-based bootstrap
|
|
82
|
+
*/
|
|
83
|
+
interface ApplicationConfig extends ServerConfig {
|
|
84
|
+
rootModule?: any;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Create a new CanxJS application instance with module support
|
|
88
|
+
* This is a NestJS-style factory function
|
|
89
|
+
*/
|
|
90
|
+
export declare function createApplication(config?: ApplicationConfig): Canx;
|
|
74
91
|
export default Canx;
|
|
75
92
|
//# sourceMappingURL=Application.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Application.d.ts","sourceRoot":"","sources":["../../src/Application.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAc,eAAe,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"Application.d.ts","sourceRoot":"","sources":["../../src/Application.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAc,eAAe,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACpH,OAAO,EAAE,MAAM,EAAyC,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,MAAM,EAAgB,MAAM,eAAe,CAAC;AAKrD,qBAAa,IAAK,YAAW,eAAe;IAC1C,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,OAAO,CAAgB;gBAEnB,MAAM,GAAE,YAAiB;IAgBrC;;OAEG;IACH,GAAG,CAAC,UAAU,EAAE,iBAAiB,GAAG,IAAI;IAKxC;;OAEG;IACH,MAAM,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,GAAG,IAAI;IAKxD;;OAEG;IACH,UAAU,CAAC,eAAe,EAAE,UAAU,GAAG,GAAG,IAAI;IAoBhD;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK5B;;OAEG;IACG,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBhF;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;IA6ChD;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAW5B;;OAEG;IACH,SAAS,IAAI,MAAM,GAAG,IAAI;IAI1B;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,GAAG,EAAE,GAAG,IAAI;IAC3C,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,GAAG,EAAE,GAAG,IAAI;IAC5C,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,GAAG,EAAE,GAAG,IAAI;IAC3C,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,GAAG,EAAE,GAAG,IAAI;IAC7C,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,GAAG,EAAE,GAAG,IAAI;IAC9C,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,GAAG,EAAE,GAAG,IAAI;IAE3C;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,WAAW,EAAE,iBAAiB,EAAE,GAAG,IAAI;IAKlF;;OAEG;IACH,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,GAAG,IAAI;IAKvE;;;;OAIG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,GAAG,IAAI;CAK3E;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,IAAI,CAErD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAExE;AAGD,OAAO,EAAE,IAAI,IAAI,WAAW,EAAE,CAAC;AAE/B;;GAEG;AACH,UAAU,iBAAkB,SAAQ,YAAY;IAC9C,UAAU,CAAC,EAAE,GAAG,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAyBlE;AAED,eAAe,IAAI,CAAC"}
|
package/dist/src/Application.js
CHANGED
|
@@ -137,6 +137,12 @@ export class Canx {
|
|
|
137
137
|
scheduler.stop();
|
|
138
138
|
}
|
|
139
139
|
}
|
|
140
|
+
/**
|
|
141
|
+
* Get the internal server instance
|
|
142
|
+
*/
|
|
143
|
+
getServer() {
|
|
144
|
+
return this.server;
|
|
145
|
+
}
|
|
140
146
|
/**
|
|
141
147
|
* Get router for chaining
|
|
142
148
|
*/
|
|
@@ -184,4 +190,34 @@ export function createApp(config) {
|
|
|
184
190
|
export function defineConfig(config) {
|
|
185
191
|
return config;
|
|
186
192
|
}
|
|
193
|
+
// Alias for consistency with NestJS-style naming
|
|
194
|
+
export { Canx as Application };
|
|
195
|
+
/**
|
|
196
|
+
* Create a new CanxJS application instance with module support
|
|
197
|
+
* This is a NestJS-style factory function
|
|
198
|
+
*/
|
|
199
|
+
export function createApplication(config) {
|
|
200
|
+
const app = new Canx(config);
|
|
201
|
+
// If rootModule is provided, bootstrap it
|
|
202
|
+
if (config?.rootModule) {
|
|
203
|
+
const meta = Reflect.getMetadata('module:metadata', config.rootModule);
|
|
204
|
+
if (meta) {
|
|
205
|
+
// Register controllers from the module
|
|
206
|
+
if (meta.controllers) {
|
|
207
|
+
for (const ControllerClass of meta.controllers) {
|
|
208
|
+
app.controller(ControllerClass);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// Register providers to container
|
|
212
|
+
if (meta.providers) {
|
|
213
|
+
for (const provider of meta.providers) {
|
|
214
|
+
if (typeof provider === 'function') {
|
|
215
|
+
container.bind(provider, provider);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return app;
|
|
222
|
+
}
|
|
187
223
|
export default Canx;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export interface InertiaConfig {
|
|
2
|
+
rootView: string;
|
|
3
|
+
sharedProps: Record<string, any>;
|
|
4
|
+
version: string | (() => string | Promise<string>);
|
|
5
|
+
}
|
|
6
|
+
export declare class InertiaManager {
|
|
7
|
+
private static instance;
|
|
8
|
+
private sharedProps;
|
|
9
|
+
private rootView;
|
|
10
|
+
private versionData;
|
|
11
|
+
constructor();
|
|
12
|
+
static getInstance(): InertiaManager;
|
|
13
|
+
/**
|
|
14
|
+
* Set the root view (e.g. 'app' for app.blade.php / app.html)
|
|
15
|
+
*/
|
|
16
|
+
setRootView(view: string): void;
|
|
17
|
+
getRootView(): string;
|
|
18
|
+
/**
|
|
19
|
+
* Share data globally for all requests
|
|
20
|
+
*/
|
|
21
|
+
share(key: string, value: any): void;
|
|
22
|
+
share(data: Record<string, any>): void;
|
|
23
|
+
getShared(key?: string): any;
|
|
24
|
+
/**
|
|
25
|
+
* Set version
|
|
26
|
+
*/
|
|
27
|
+
version(v: string | (() => string | Promise<string>)): void;
|
|
28
|
+
getVersion(): Promise<string | undefined>;
|
|
29
|
+
}
|
|
30
|
+
export declare const inertiaManager: InertiaManager;
|
|
31
|
+
//# sourceMappingURL=InertiaManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InertiaManager.d.ts","sourceRoot":"","sources":["../../../../src/adapter/inertia/InertiaManager.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;CACtD;AAED,qBAAa,cAAc;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAiB;IACxC,OAAO,CAAC,WAAW,CAA2B;IAC9C,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,WAAW,CAA0D;;WAU/D,WAAW,IAAI,cAAc;IAO3C;;OAEG;IACI,WAAW,CAAC,IAAI,EAAE,MAAM;IAIxB,WAAW,IAAI,MAAM;IAI5B;;OAEG;IACI,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI;IACpC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAStC,SAAS,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,GAAG;IAKnC;;OAEG;IACI,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAI9C,UAAU,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;CAKzD;AAED,eAAO,MAAM,cAAc,gBAA+B,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export class InertiaManager {
|
|
2
|
+
static instance;
|
|
3
|
+
sharedProps = {};
|
|
4
|
+
rootView = 'root'; // default view name
|
|
5
|
+
versionData = null;
|
|
6
|
+
// Per-request sharing storage (using a weak map or similar mechanism in real frameworks,
|
|
7
|
+
// but here we might rely on the middleware attaching an instance to the request)
|
|
8
|
+
// Actually, distinct requests need distinct shared props (e.g. flash messages, auth user).
|
|
9
|
+
// So `share()` should ideally be scoped.
|
|
10
|
+
// For global shared props (e.g. app name), we use this class.
|
|
11
|
+
constructor() { }
|
|
12
|
+
static getInstance() {
|
|
13
|
+
if (!InertiaManager.instance) {
|
|
14
|
+
InertiaManager.instance = new InertiaManager();
|
|
15
|
+
}
|
|
16
|
+
return InertiaManager.instance;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Set the root view (e.g. 'app' for app.blade.php / app.html)
|
|
20
|
+
*/
|
|
21
|
+
setRootView(view) {
|
|
22
|
+
this.rootView = view;
|
|
23
|
+
}
|
|
24
|
+
getRootView() {
|
|
25
|
+
return this.rootView;
|
|
26
|
+
}
|
|
27
|
+
share(keyOrData, value) {
|
|
28
|
+
if (typeof keyOrData === 'string') {
|
|
29
|
+
this.sharedProps[keyOrData] = value;
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
Object.assign(this.sharedProps, keyOrData);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
getShared(key) {
|
|
36
|
+
if (key)
|
|
37
|
+
return this.sharedProps[key];
|
|
38
|
+
return this.sharedProps;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Set version
|
|
42
|
+
*/
|
|
43
|
+
version(v) {
|
|
44
|
+
this.versionData = v;
|
|
45
|
+
}
|
|
46
|
+
async getVersion() {
|
|
47
|
+
if (!this.versionData)
|
|
48
|
+
return undefined;
|
|
49
|
+
if (typeof this.versionData === 'function')
|
|
50
|
+
return await this.versionData();
|
|
51
|
+
return this.versionData;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export const inertiaManager = InertiaManager.getInstance();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InertiaMiddleware.d.ts","sourceRoot":"","sources":["../../../../src/adapter/inertia/InertiaMiddleware.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3E,wBAAgB,iBAAiB,KACjB,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,8BA8ItE"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { inertiaManager } from './InertiaManager';
|
|
2
|
+
export function inertiaMiddleware() {
|
|
3
|
+
return async (req, res, next) => {
|
|
4
|
+
// 1. Check if Inertia Request
|
|
5
|
+
const isInertia = req.headers.get('x-inertia') === 'true';
|
|
6
|
+
// Attach an inertia context to the request for scoped sharing
|
|
7
|
+
const scopeProps = {};
|
|
8
|
+
// Helper to share data for THIS request only
|
|
9
|
+
req.inertiaShare = (key, value) => {
|
|
10
|
+
if (typeof key === 'string') {
|
|
11
|
+
scopeProps[key] = value;
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
Object.assign(scopeProps, key);
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
// 2. Asset Versioning
|
|
18
|
+
if (isInertia && req.method === 'GET') {
|
|
19
|
+
const version = await inertiaManager.getVersion();
|
|
20
|
+
const headerVersion = req.headers.get('x-inertia-version');
|
|
21
|
+
if (version && headerVersion !== version) {
|
|
22
|
+
// Asset version mismatch -> Force full reload
|
|
23
|
+
res.status(409).header('X-Inertia-Location', req.raw.url);
|
|
24
|
+
return res.empty();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
// 3. Setup Response Helper
|
|
28
|
+
// We override or attach `res.inertia` here
|
|
29
|
+
res.inertia = async (component, props = {}) => {
|
|
30
|
+
const version = await inertiaManager.getVersion();
|
|
31
|
+
const globalProps = inertiaManager.getShared();
|
|
32
|
+
// Merge props: Global -> Request Scope -> Controller Props
|
|
33
|
+
const allProps = { ...globalProps, ...scopeProps, ...props };
|
|
34
|
+
// Lazy Evaluation (Partial Reloads)
|
|
35
|
+
const partialData = req.headers.get('x-inertia-partial-data');
|
|
36
|
+
const partialComponent = req.headers.get('x-inertia-partial-component');
|
|
37
|
+
let finalProps = allProps;
|
|
38
|
+
if (isInertia && partialData && partialComponent === component) {
|
|
39
|
+
const only = partialData.split(',').map(s => s.trim());
|
|
40
|
+
const newProps = {};
|
|
41
|
+
for (const key of only) {
|
|
42
|
+
if (key in allProps) {
|
|
43
|
+
newProps[key] = allProps[key];
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
finalProps = newProps;
|
|
47
|
+
}
|
|
48
|
+
// Resolve Lazy Props (functions)
|
|
49
|
+
for (const key in finalProps) {
|
|
50
|
+
if (typeof finalProps[key] === 'function') {
|
|
51
|
+
try {
|
|
52
|
+
finalProps[key] = await finalProps[key]();
|
|
53
|
+
}
|
|
54
|
+
catch (e) {
|
|
55
|
+
console.error(`[Inertia] Error resolving prop ${key}:`, e);
|
|
56
|
+
finalProps[key] = null;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const page = {
|
|
61
|
+
component,
|
|
62
|
+
props: finalProps,
|
|
63
|
+
url: req.raw.url, // Original URL
|
|
64
|
+
version: version || '',
|
|
65
|
+
};
|
|
66
|
+
if (isInertia) {
|
|
67
|
+
// JSON Response
|
|
68
|
+
res.header('X-Inertia', 'true')
|
|
69
|
+
.header('Content-Type', 'application/json')
|
|
70
|
+
.header('Vary', 'Accept');
|
|
71
|
+
return res.json(page);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
// HTML Full Page Load
|
|
75
|
+
const rootView = inertiaManager.getRootView();
|
|
76
|
+
const encodedPage = JSON.stringify(page).replace(/"/g, '"');
|
|
77
|
+
// We need a way to render the root view with the app payload
|
|
78
|
+
// In Laravel/Blade: <div id="app" data-page="{{ json($page) }}"></div>
|
|
79
|
+
// Here, we'll try to use the view engine if available.
|
|
80
|
+
// Assumption: The user creates a view that prints `inertiaHead` and `inertiaBody`?
|
|
81
|
+
// Or simpler: We inject it into a template placeholder.
|
|
82
|
+
// Let's assume standard SSR/View usage.
|
|
83
|
+
// For now, we will construct a basic HTML shell if NO view engine is found,
|
|
84
|
+
// OR render the view passing `page` string.
|
|
85
|
+
try {
|
|
86
|
+
// Try to render the root view, passing 'page' variable
|
|
87
|
+
// The root view should have: <div id="app" data-page='<%= page %>'></div>
|
|
88
|
+
// or React-style.
|
|
89
|
+
// Construct a default html if view is likely missing or simple usage
|
|
90
|
+
const customView = await import('../../mvc/View').then(m => m.viewIfExists(rootView, { page: page }));
|
|
91
|
+
if (customView) {
|
|
92
|
+
return res.html(customView);
|
|
93
|
+
}
|
|
94
|
+
// Fallback default HTML
|
|
95
|
+
const html = `<!DOCTYPE html>
|
|
96
|
+
<html lang="en">
|
|
97
|
+
<head>
|
|
98
|
+
<meta charset="UTF-8">
|
|
99
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
100
|
+
<title>${component}</title>
|
|
101
|
+
<!-- Inertia Head -->
|
|
102
|
+
</head>
|
|
103
|
+
<body>
|
|
104
|
+
<div id="app" data-page="${encodedPage}"></div>
|
|
105
|
+
<!-- Scripts -->
|
|
106
|
+
</body>
|
|
107
|
+
</html>`;
|
|
108
|
+
return res.html(html);
|
|
109
|
+
}
|
|
110
|
+
catch (e) {
|
|
111
|
+
console.error('[Inertia] View render error:', e);
|
|
112
|
+
return res.status(500).text('Inertia View Error');
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
// 4. Handle External Redirects (303 for PUT/PATCH/DELETE)
|
|
117
|
+
// Common inertia pattern: non-GET requests redirecting must use 303 to avoid method preservation
|
|
118
|
+
const originalRedirect = res.redirect;
|
|
119
|
+
res.redirect = (url, status) => {
|
|
120
|
+
if (isInertia && ['PUT', 'PATCH', 'DELETE'].includes(req.method)) {
|
|
121
|
+
status = 303;
|
|
122
|
+
}
|
|
123
|
+
return originalRedirect.call(res, url, status);
|
|
124
|
+
};
|
|
125
|
+
return next();
|
|
126
|
+
};
|
|
127
|
+
}
|
package/dist/src/auth/OAuth.d.ts
CHANGED
|
@@ -1,64 +1,67 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* OAuth - Simple OAuth2 Social Login Helper
|
|
3
|
+
* For more advanced social login, use SocialManager from auth/social
|
|
4
4
|
*/
|
|
5
|
-
|
|
6
|
-
export interface OAuthProvider {
|
|
7
|
-
name: string;
|
|
5
|
+
interface OAuthProviderConfig {
|
|
8
6
|
clientId: string;
|
|
9
7
|
clientSecret: string;
|
|
10
8
|
redirectUri: string;
|
|
11
|
-
scopes
|
|
12
|
-
authUrl: string;
|
|
13
|
-
tokenUrl: string;
|
|
14
|
-
userInfoUrl: string;
|
|
9
|
+
scopes?: string[];
|
|
15
10
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
email: string;
|
|
19
|
-
name: string;
|
|
20
|
-
avatar?: string;
|
|
21
|
-
provider: string;
|
|
22
|
-
accessToken: string;
|
|
23
|
-
refreshToken?: string;
|
|
24
|
-
raw: Record<string, unknown>;
|
|
25
|
-
}
|
|
26
|
-
export interface OAuthConfig {
|
|
27
|
-
providers: Record<string, Partial<OAuthProvider>>;
|
|
28
|
-
defaultScopes?: Record<string, string[]>;
|
|
11
|
+
interface OAuthConfig {
|
|
12
|
+
providers: Record<string, OAuthProviderConfig>;
|
|
29
13
|
}
|
|
30
14
|
export declare class OAuth {
|
|
31
|
-
private
|
|
15
|
+
private config;
|
|
32
16
|
private stateStore;
|
|
33
17
|
/**
|
|
34
18
|
* Configure OAuth providers
|
|
35
19
|
*/
|
|
36
|
-
configure(config: OAuthConfig):
|
|
20
|
+
configure(config: OAuthConfig): this;
|
|
21
|
+
/**
|
|
22
|
+
* Add a provider
|
|
23
|
+
*/
|
|
24
|
+
addProvider(name: string, config: OAuthProviderConfig): this;
|
|
25
|
+
/**
|
|
26
|
+
* Get provider config
|
|
27
|
+
*/
|
|
28
|
+
private getProvider;
|
|
37
29
|
/**
|
|
38
|
-
* Generate a
|
|
30
|
+
* Generate a random state string
|
|
39
31
|
*/
|
|
40
32
|
private generateState;
|
|
41
33
|
/**
|
|
42
|
-
*
|
|
34
|
+
* Store state for validation
|
|
43
35
|
*/
|
|
44
|
-
|
|
36
|
+
private storeState;
|
|
45
37
|
/**
|
|
46
|
-
*
|
|
38
|
+
* Validate state
|
|
47
39
|
*/
|
|
48
|
-
|
|
40
|
+
validateState(state: string, provider: string): boolean;
|
|
49
41
|
/**
|
|
50
|
-
*
|
|
42
|
+
* Get authorization URL for provider
|
|
51
43
|
*/
|
|
52
|
-
|
|
44
|
+
getAuthUrl(provider: string, customState?: string): string;
|
|
53
45
|
/**
|
|
54
|
-
*
|
|
46
|
+
* Exchange code for tokens
|
|
55
47
|
*/
|
|
56
|
-
|
|
48
|
+
getToken(provider: string, code: string): Promise<{
|
|
49
|
+
accessToken: string;
|
|
50
|
+
refreshToken?: string;
|
|
51
|
+
expiresIn?: number;
|
|
52
|
+
tokenType: string;
|
|
53
|
+
}>;
|
|
57
54
|
/**
|
|
58
|
-
*
|
|
55
|
+
* Get user info from provider
|
|
59
56
|
*/
|
|
60
|
-
|
|
57
|
+
getUser(provider: string, accessToken: string): Promise<{
|
|
58
|
+
id: string;
|
|
59
|
+
email?: string;
|
|
60
|
+
name?: string;
|
|
61
|
+
avatar?: string;
|
|
62
|
+
raw: any;
|
|
63
|
+
}>;
|
|
61
64
|
}
|
|
62
65
|
export declare const oauth: OAuth;
|
|
63
|
-
export
|
|
66
|
+
export {};
|
|
64
67
|
//# sourceMappingURL=OAuth.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OAuth.d.ts","sourceRoot":"","sources":["../../../src/auth/OAuth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,
|
|
1
|
+
{"version":3,"file":"OAuth.d.ts","sourceRoot":"","sources":["../../../src/auth/OAuth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,UAAU,mBAAmB;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,UAAU,WAAW;IACnB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;CAChD;AA6BD,qBAAa,KAAK;IAChB,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,UAAU,CACN;IAEZ;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAKpC;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,GAAG,IAAI;IAK5D;;OAEG;IACH,OAAO,CAAC,WAAW;IAQnB;;OAEG;IACH,OAAO,CAAC,aAAa;IAMrB;;OAEG;IACH,OAAO,CAAC,UAAU;IAYlB;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IASvD;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM;IAwB1D;;OAEG;IACG,QAAQ,CACZ,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;QACT,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IAsCF;;OAEG;IACG,OAAO,CACX,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;QACT,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,GAAG,EAAE,GAAG,CAAC;KACV,CAAC;CAwDH;AAGD,eAAO,MAAM,KAAK,OAAc,CAAC"}
|