@tyravel/core 0.1.0 → 0.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/dist/cache-service-provider.d.ts +1 -0
- package/dist/cache-service-provider.d.ts.map +1 -1
- package/dist/cache-service-provider.js +9 -1
- package/dist/cache-service-provider.js.map +1 -1
- package/dist/config-service-provider.d.ts.map +1 -1
- package/dist/config-service-provider.js +2 -1
- package/dist/config-service-provider.js.map +1 -1
- package/dist/config-service-provider.test.js +12 -0
- package/dist/config-service-provider.test.js.map +1 -1
- package/dist/exception-handler.d.ts +39 -0
- package/dist/exception-handler.d.ts.map +1 -0
- package/dist/exception-handler.js +302 -0
- package/dist/exception-handler.js.map +1 -0
- package/dist/exception-handler.test.d.ts +2 -0
- package/dist/exception-handler.test.d.ts.map +1 -0
- package/dist/exception-handler.test.js +130 -0
- package/dist/exception-handler.test.js.map +1 -0
- package/dist/http-kernel.d.ts +1 -0
- package/dist/http-kernel.d.ts.map +1 -1
- package/dist/http-kernel.js +4 -31
- package/dist/http-kernel.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/queue-service-provider.d.ts +1 -0
- package/dist/queue-service-provider.d.ts.map +1 -1
- package/dist/queue-service-provider.js +9 -1
- package/dist/queue-service-provider.js.map +1 -1
- package/dist/redis-service-provider.d.ts +5 -0
- package/dist/redis-service-provider.d.ts.map +1 -0
- package/dist/redis-service-provider.js +12 -0
- package/dist/redis-service-provider.js.map +1 -0
- package/package.json +14 -13
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-service-provider.d.ts","sourceRoot":"","sources":["../src/cache-service-provider.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cache-service-provider.d.ts","sourceRoot":"","sources":["../src/cache-service-provider.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,qBAAa,oBAAqB,SAAQ,eAAe;IAC9C,QAAQ;IAWjB,OAAO,CAAC,mBAAmB;CAO5B"}
|
|
@@ -4,11 +4,19 @@ export class CacheServiceProvider extends ServiceProvider {
|
|
|
4
4
|
register() {
|
|
5
5
|
const config = this.app.make('config');
|
|
6
6
|
const cacheConfig = config.get('cache');
|
|
7
|
-
const manager = new CacheManager(cacheConfig);
|
|
7
|
+
const manager = new CacheManager(cacheConfig, this.resolveRedisManager());
|
|
8
8
|
const repository = new CacheRepository(manager);
|
|
9
9
|
this.app.instance('cache', repository);
|
|
10
10
|
this.app.singleton(CacheManager, () => manager);
|
|
11
11
|
this.app.singleton(CacheRepository, () => repository);
|
|
12
12
|
}
|
|
13
|
+
resolveRedisManager() {
|
|
14
|
+
try {
|
|
15
|
+
return this.app.make('redis');
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
13
21
|
}
|
|
14
22
|
//# sourceMappingURL=cache-service-provider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-service-provider.js","sourceRoot":"","sources":["../src/cache-service-provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAoB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"cache-service-provider.js","sourceRoot":"","sources":["../src/cache-service-provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAoB,MAAM,gBAAgB,CAAC;AAEjF,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,OAAO,oBAAqB,SAAQ,eAAe;IAC9C,QAAQ;QACf,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAmB,QAAQ,CAAC,CAAC;QACzD,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAc,OAAO,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,WAAW,EAAE,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC;QAC1E,MAAM,UAAU,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;QAEhD,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACvC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC;IACxD,CAAC;IAEO,mBAAmB;QACzB,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAe,OAAO,CAAC,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-service-provider.d.ts","sourceRoot":"","sources":["../src/config-service-provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,qBAAa,qBAAsB,SAAQ,eAAe;IACzC,QAAQ;
|
|
1
|
+
{"version":3,"file":"config-service-provider.d.ts","sourceRoot":"","sources":["../src/config-service-provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,qBAAa,qBAAsB,SAAQ,eAAe;IACzC,QAAQ;CAQxB"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { ConfigRepository, loadConfig } from '@tyravel/config';
|
|
1
|
+
import { ConfigRepository, loadConfig, loadEnv } from '@tyravel/config';
|
|
2
2
|
import { ServiceProvider } from './service-provider.js';
|
|
3
3
|
export class ConfigServiceProvider extends ServiceProvider {
|
|
4
4
|
async register() {
|
|
5
|
+
loadEnv(this.app.basePath);
|
|
5
6
|
const config = await loadConfig(this.app.basePath);
|
|
6
7
|
const repository = new ConfigRepository(config);
|
|
7
8
|
this.app.instance('config', repository);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-service-provider.js","sourceRoot":"","sources":["../src/config-service-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"config-service-provider.js","sourceRoot":"","sources":["../src/config-service-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,OAAO,qBAAsB,SAAQ,eAAe;IAC/C,KAAK,CAAC,QAAQ;QACrB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC3B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAEhD,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACxC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC;IACzD,CAAC;CACF"}
|
|
@@ -23,5 +23,17 @@ describe('ConfigServiceProvider', () => {
|
|
|
23
23
|
expect(config.get('app.name')).toBe('Tyravel');
|
|
24
24
|
expect(config.get('app.debug')).toBe(true);
|
|
25
25
|
});
|
|
26
|
+
it('loads .env before importing config modules', async () => {
|
|
27
|
+
tempDir = mkdtempSync(join(tmpdir(), 'tyravel-config-'));
|
|
28
|
+
mkdirSync(join(tempDir, 'config'), { recursive: true });
|
|
29
|
+
writeFileSync(join(tempDir, '.env'), 'APP_NAME=FromDotEnv\n');
|
|
30
|
+
writeFileSync(join(tempDir, 'config', 'app.js'), `import { env } from '@tyravel/config';
|
|
31
|
+
export default { name: env('APP_NAME', 'fallback') };`);
|
|
32
|
+
const app = new Application(tempDir);
|
|
33
|
+
app.register(ConfigServiceProvider);
|
|
34
|
+
await app.boot();
|
|
35
|
+
const config = app.make('config');
|
|
36
|
+
expect(config.get('app.name')).toBe('FromDotEnv');
|
|
37
|
+
});
|
|
26
38
|
});
|
|
27
39
|
//# sourceMappingURL=config-service-provider.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-service-provider.test.js","sourceRoot":"","sources":["../src/config-service-provider.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAEzD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAErE,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,IAAI,OAAO,GAAG,EAAE,CAAC;IAEjB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAClD,OAAO,GAAG,EAAE,CAAC;QACf,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;QACzD,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,aAAa,CACX,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,EACjC,kDAAkD,CACnD,CAAC;QAEF,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;QACrC,GAAG,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;QACpC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAEjB,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAmB,QAAQ,CAAC,CAAC;QACpD,MAAM,CAAC,MAAM,CAAC,GAAG,CAAS,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,GAAG,CAAU,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"config-service-provider.test.js","sourceRoot":"","sources":["../src/config-service-provider.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAEzD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAErE,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,IAAI,OAAO,GAAG,EAAE,CAAC;IAEjB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAClD,OAAO,GAAG,EAAE,CAAC;QACf,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;QACzD,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,aAAa,CACX,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,EACjC,kDAAkD,CACnD,CAAC;QAEF,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;QACrC,GAAG,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;QACpC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAEjB,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAmB,QAAQ,CAAC,CAAC;QACpD,MAAM,CAAC,MAAM,CAAC,GAAG,CAAS,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,GAAG,CAAU,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;QACzD,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,uBAAuB,CAAC,CAAC;QAC9D,aAAa,CACX,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,EACjC;sDACgD,CACjD,CAAC;QAEF,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;QACrC,GAAG,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;QACpC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAEjB,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAmB,QAAQ,CAAC,CAAC;QACpD,MAAM,CAAC,MAAM,CAAC,GAAG,CAAS,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { Application } from './application.js';
|
|
2
|
+
/**
|
|
3
|
+
* Maps thrown errors to HTTP responses.
|
|
4
|
+
*
|
|
5
|
+
* - **API requests** (Accept: application/json) get a consistent JSON body:
|
|
6
|
+
* `{ message, status, errors?, exception?, file?, line?, trace? }`
|
|
7
|
+
* The debug fields are only included when `app.debug` is true.
|
|
8
|
+
*
|
|
9
|
+
* - **Web requests** get an HTML error page:
|
|
10
|
+
* - Debug mode: full stack trace with file/line highlighting
|
|
11
|
+
* - Production: a clean, generic error page
|
|
12
|
+
*
|
|
13
|
+
* Known exception types are mapped to their correct status codes
|
|
14
|
+
* (404, 401, 403, 405, 422). Unknown errors produce 500.
|
|
15
|
+
*/
|
|
16
|
+
export declare class ExceptionHandler {
|
|
17
|
+
private readonly app;
|
|
18
|
+
constructor(app: Application);
|
|
19
|
+
report(error: unknown): void;
|
|
20
|
+
render(error: unknown, request: Request): Promise<Response>;
|
|
21
|
+
private mapError;
|
|
22
|
+
private renderJson;
|
|
23
|
+
private renderHtml;
|
|
24
|
+
private debugPage;
|
|
25
|
+
private productionPage;
|
|
26
|
+
private isDebug;
|
|
27
|
+
private wantsJson;
|
|
28
|
+
private statusText;
|
|
29
|
+
private extractFile;
|
|
30
|
+
private extractLine;
|
|
31
|
+
private formatTrace;
|
|
32
|
+
private parseStack;
|
|
33
|
+
private escape;
|
|
34
|
+
private isAuthException;
|
|
35
|
+
private isAuthorizationException;
|
|
36
|
+
private isResetTokenException;
|
|
37
|
+
private isValidationException;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=exception-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exception-handler.d.ts","sourceRoot":"","sources":["../src/exception-handler.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD;;;;;;;;;;;;;GAaG;AACH,qBAAa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,EAAE,WAAW;IAE7C,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAItB,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;IAoBjE,OAAO,CAAC,QAAQ;IA4DhB,OAAO,CAAC,UAAU;IA0BlB,OAAO,CAAC,UAAU;IA2BlB,OAAO,CAAC,SAAS;IAqEjB,OAAO,CAAC,cAAc;IAiCtB,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,SAAS;IAajB,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,UAAU;IAwBlB,OAAO,CAAC,MAAM;IAUd,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,wBAAwB;IAIhC,OAAO,CAAC,qBAAqB;IAI7B,OAAO,CAAC,qBAAqB;CAG9B"}
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
import { HttpException, MethodNotAllowedException, NotFoundHttpException, Response as ResponseFactory, RouteNotFoundException, } from '@tyravel/http';
|
|
2
|
+
/**
|
|
3
|
+
* Maps thrown errors to HTTP responses.
|
|
4
|
+
*
|
|
5
|
+
* - **API requests** (Accept: application/json) get a consistent JSON body:
|
|
6
|
+
* `{ message, status, errors?, exception?, file?, line?, trace? }`
|
|
7
|
+
* The debug fields are only included when `app.debug` is true.
|
|
8
|
+
*
|
|
9
|
+
* - **Web requests** get an HTML error page:
|
|
10
|
+
* - Debug mode: full stack trace with file/line highlighting
|
|
11
|
+
* - Production: a clean, generic error page
|
|
12
|
+
*
|
|
13
|
+
* Known exception types are mapped to their correct status codes
|
|
14
|
+
* (404, 401, 403, 405, 422). Unknown errors produce 500.
|
|
15
|
+
*/
|
|
16
|
+
export class ExceptionHandler {
|
|
17
|
+
app;
|
|
18
|
+
constructor(app) {
|
|
19
|
+
this.app = app;
|
|
20
|
+
}
|
|
21
|
+
report(error) {
|
|
22
|
+
console.error(error);
|
|
23
|
+
}
|
|
24
|
+
async render(error, request) {
|
|
25
|
+
const { status, message, errors } = this.mapError(error);
|
|
26
|
+
const debug = this.isDebug();
|
|
27
|
+
const wantsJson = this.wantsJson(request);
|
|
28
|
+
// Forward Allow header for 405
|
|
29
|
+
const headers = {};
|
|
30
|
+
if (error instanceof MethodNotAllowedException) {
|
|
31
|
+
headers.allow = error.allowedMethods.join(', ');
|
|
32
|
+
}
|
|
33
|
+
if (wantsJson) {
|
|
34
|
+
return this.renderJson(error, message, status, errors, debug, headers);
|
|
35
|
+
}
|
|
36
|
+
return this.renderHtml(error, message, status, debug, headers);
|
|
37
|
+
}
|
|
38
|
+
// ── Error mapping ──────────────────────────────────────────
|
|
39
|
+
mapError(error) {
|
|
40
|
+
if (error instanceof HttpException) {
|
|
41
|
+
return { status: error.status, message: error.message };
|
|
42
|
+
}
|
|
43
|
+
if (error instanceof RouteNotFoundException) {
|
|
44
|
+
return { status: 404, message: error.message };
|
|
45
|
+
}
|
|
46
|
+
if (error instanceof NotFoundHttpException) {
|
|
47
|
+
return { status: 404, message: error.message };
|
|
48
|
+
}
|
|
49
|
+
if (error instanceof MethodNotAllowedException) {
|
|
50
|
+
return { status: 405, message: error.message };
|
|
51
|
+
}
|
|
52
|
+
// Auth exceptions — lazy import to avoid circular dep
|
|
53
|
+
if (this.isAuthException(error)) {
|
|
54
|
+
const authError = error;
|
|
55
|
+
return { status: 401, message: authError.message };
|
|
56
|
+
}
|
|
57
|
+
if (this.isAuthorizationException(error)) {
|
|
58
|
+
const authzError = error;
|
|
59
|
+
return { status: 403, message: authzError.message };
|
|
60
|
+
}
|
|
61
|
+
if (this.isResetTokenException(error)) {
|
|
62
|
+
const resetError = error;
|
|
63
|
+
return { status: 422, message: resetError.message };
|
|
64
|
+
}
|
|
65
|
+
// Validation
|
|
66
|
+
if (this.isValidationException(error)) {
|
|
67
|
+
const validationError = error;
|
|
68
|
+
return {
|
|
69
|
+
status: 422,
|
|
70
|
+
message: validationError.message,
|
|
71
|
+
errors: validationError.errors,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
// Unknown
|
|
75
|
+
if (error instanceof Error) {
|
|
76
|
+
return {
|
|
77
|
+
status: 500,
|
|
78
|
+
message: this.isDebug() ? error.message : 'Server Error',
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
return { status: 500, message: 'Server Error' };
|
|
82
|
+
}
|
|
83
|
+
// ── JSON rendering ─────────────────────────────────────────
|
|
84
|
+
renderJson(error, message, status, errors, debug, headers) {
|
|
85
|
+
const body = { message, status };
|
|
86
|
+
if (errors) {
|
|
87
|
+
body.errors = errors;
|
|
88
|
+
}
|
|
89
|
+
if (debug && error instanceof Error) {
|
|
90
|
+
body.exception = error.name;
|
|
91
|
+
body.file = this.extractFile(error.stack);
|
|
92
|
+
body.line = this.extractLine(error.stack);
|
|
93
|
+
body.trace = this.formatTrace(error.stack);
|
|
94
|
+
}
|
|
95
|
+
return ResponseFactory.json(body, { status, headers });
|
|
96
|
+
}
|
|
97
|
+
// ── HTML rendering ─────────────────────────────────────────
|
|
98
|
+
renderHtml(error, message, status, debug, headers) {
|
|
99
|
+
const title = `${status} ${this.statusText(status)}`;
|
|
100
|
+
if (!debug) {
|
|
101
|
+
return ResponseFactory.html(this.productionPage(title, message), { status, headers });
|
|
102
|
+
}
|
|
103
|
+
const stack = error instanceof Error ? error.stack ?? '' : String(error);
|
|
104
|
+
const exceptionName = error instanceof Error ? error.name : 'Error';
|
|
105
|
+
return ResponseFactory.html(this.debugPage(title, message, exceptionName, stack), { status, headers });
|
|
106
|
+
}
|
|
107
|
+
// ── Debug HTML page ────────────────────────────────────────
|
|
108
|
+
debugPage(title, message, exceptionName, stack) {
|
|
109
|
+
const frames = this.parseStack(stack);
|
|
110
|
+
const traceHtml = frames
|
|
111
|
+
.map((frame, i) => `
|
|
112
|
+
<div class="frame">
|
|
113
|
+
<div class="frame-header">
|
|
114
|
+
<span class="frame-num">#${i}</span>
|
|
115
|
+
<span class="frame-fn">${this.escape(frame.fn)}</span>
|
|
116
|
+
<span class="frame-loc">${this.escape(frame.file)}:${frame.line}</span>
|
|
117
|
+
</div>
|
|
118
|
+
</div>`)
|
|
119
|
+
.join('');
|
|
120
|
+
return `<!DOCTYPE html>
|
|
121
|
+
<html lang="en">
|
|
122
|
+
<head>
|
|
123
|
+
<meta charset="utf-8">
|
|
124
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
125
|
+
<title>${this.escape(title)}</title>
|
|
126
|
+
<style>
|
|
127
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
128
|
+
body {
|
|
129
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
|
130
|
+
background: #1a1a2e; color: #e0e0e0; padding: 2rem; line-height: 1.6;
|
|
131
|
+
}
|
|
132
|
+
.header { margin-bottom: 1.5rem; }
|
|
133
|
+
.status { font-size: 2.5rem; font-weight: 700; color: #ff6b6b; }
|
|
134
|
+
.message { font-size: 1.2rem; color: #ccc; margin-top: 0.5rem; }
|
|
135
|
+
.exception {
|
|
136
|
+
display: inline-block; background: #2d2d44; color: #ff9f43;
|
|
137
|
+
padding: 0.25rem 0.75rem; border-radius: 4px; font-family: monospace;
|
|
138
|
+
font-size: 0.9rem; margin-top: 0.75rem;
|
|
139
|
+
}
|
|
140
|
+
.trace { margin-top: 2rem; }
|
|
141
|
+
.trace h2 { font-size: 1rem; color: #aaa; text-transform: uppercase; letter-spacing: 1px; margin-bottom: 0.75rem; }
|
|
142
|
+
.frame {
|
|
143
|
+
background: #16213e; border-radius: 6px; margin-bottom: 0.5rem;
|
|
144
|
+
overflow: hidden; border: 1px solid #2d2d44;
|
|
145
|
+
}
|
|
146
|
+
.frame-header { padding: 0.75rem 1rem; display: flex; align-items: center; gap: 0.75rem; }
|
|
147
|
+
.frame-num { color: #54a0ff; font-family: monospace; font-weight: 600; min-width: 2rem; }
|
|
148
|
+
.frame-fn { color: #5eead4; font-family: monospace; font-weight: 500; }
|
|
149
|
+
.frame-loc { color: #6b7280; font-family: monospace; font-size: 0.85rem; margin-left: auto; }
|
|
150
|
+
.raw { margin-top: 1.5rem; background: #0f0f23; border-radius: 6px; padding: 1rem; overflow-x: auto; }
|
|
151
|
+
.raw pre { font-family: 'SF Mono', Monaco, monospace; font-size: 0.85rem; color: #a0a0a0; white-space: pre-wrap; }
|
|
152
|
+
</style>
|
|
153
|
+
</head>
|
|
154
|
+
<body>
|
|
155
|
+
<div class="header">
|
|
156
|
+
<div class="status">${this.escape(title)}</div>
|
|
157
|
+
<div class="message">${this.escape(message)}</div>
|
|
158
|
+
<span class="exception">${this.escape(exceptionName)}</span>
|
|
159
|
+
</div>
|
|
160
|
+
<div class="trace">
|
|
161
|
+
<h2>Stack Trace</h2>
|
|
162
|
+
${traceHtml || '<p style="color:#666">No stack trace available.</p>'}
|
|
163
|
+
</div>
|
|
164
|
+
<div class="raw">
|
|
165
|
+
<pre>${this.escape(stack)}</pre>
|
|
166
|
+
</div>
|
|
167
|
+
</body>
|
|
168
|
+
</html>`;
|
|
169
|
+
}
|
|
170
|
+
productionPage(title, message) {
|
|
171
|
+
return `<!DOCTYPE html>
|
|
172
|
+
<html lang="en">
|
|
173
|
+
<head>
|
|
174
|
+
<meta charset="utf-8">
|
|
175
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
176
|
+
<title>${this.escape(title)}</title>
|
|
177
|
+
<style>
|
|
178
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
179
|
+
body {
|
|
180
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
|
181
|
+
background: #f5f5f5; color: #333; display: flex;
|
|
182
|
+
align-items: center; justify-content: center; min-height: 100vh;
|
|
183
|
+
}
|
|
184
|
+
.card {
|
|
185
|
+
background: #fff; border-radius: 12px; padding: 3rem;
|
|
186
|
+
box-shadow: 0 2px 10px rgba(0,0,0,0.08); text-align: center; max-width: 480px;
|
|
187
|
+
}
|
|
188
|
+
.status { font-size: 3rem; font-weight: 700; color: #e74c3c; }
|
|
189
|
+
.message { font-size: 1.1rem; color: #666; margin-top: 0.5rem; }
|
|
190
|
+
</style>
|
|
191
|
+
</head>
|
|
192
|
+
<body>
|
|
193
|
+
<div class="card">
|
|
194
|
+
<div class="status">${this.escape(title)}</div>
|
|
195
|
+
<div class="message">${this.escape(message)}</div>
|
|
196
|
+
</div>
|
|
197
|
+
</body>
|
|
198
|
+
</html>`;
|
|
199
|
+
}
|
|
200
|
+
// ── Helpers ────────────────────────────────────────────────
|
|
201
|
+
isDebug() {
|
|
202
|
+
try {
|
|
203
|
+
const config = this.app.make('config');
|
|
204
|
+
return config.get('app.debug', false);
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
return false;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
wantsJson(request) {
|
|
211
|
+
const accept = request.headers.get('accept') ?? '';
|
|
212
|
+
const contentType = request.headers.get('content-type') ?? '';
|
|
213
|
+
// Prefer Accept header, fall back to content-type
|
|
214
|
+
if (accept.includes('application/json') || accept.includes('application/vnd.api+json')) {
|
|
215
|
+
return true;
|
|
216
|
+
}
|
|
217
|
+
if (accept.includes('text/html')) {
|
|
218
|
+
return false;
|
|
219
|
+
}
|
|
220
|
+
return contentType.includes('application/json');
|
|
221
|
+
}
|
|
222
|
+
statusText(status) {
|
|
223
|
+
const texts = {
|
|
224
|
+
400: 'Bad Request',
|
|
225
|
+
401: 'Unauthorized',
|
|
226
|
+
403: 'Forbidden',
|
|
227
|
+
404: 'Not Found',
|
|
228
|
+
405: 'Method Not Allowed',
|
|
229
|
+
422: 'Unprocessable Entity',
|
|
230
|
+
500: 'Internal Server Error',
|
|
231
|
+
};
|
|
232
|
+
return texts[status] ?? 'Error';
|
|
233
|
+
}
|
|
234
|
+
extractFile(stack) {
|
|
235
|
+
if (!stack)
|
|
236
|
+
return undefined;
|
|
237
|
+
const match = stack.split('\n')[1]?.match(/\((.+?):\d+:\d+\)/);
|
|
238
|
+
return match?.[1];
|
|
239
|
+
}
|
|
240
|
+
extractLine(stack) {
|
|
241
|
+
if (!stack)
|
|
242
|
+
return undefined;
|
|
243
|
+
const match = stack.split('\n')[1]?.match(/:(\d+):\d+\)/);
|
|
244
|
+
return match?.[1] ? Number(match[1]) : undefined;
|
|
245
|
+
}
|
|
246
|
+
formatTrace(stack) {
|
|
247
|
+
if (!stack)
|
|
248
|
+
return [];
|
|
249
|
+
return stack
|
|
250
|
+
.split('\n')
|
|
251
|
+
.slice(1)
|
|
252
|
+
.map((line) => line.trim())
|
|
253
|
+
.filter(Boolean);
|
|
254
|
+
}
|
|
255
|
+
parseStack(stack) {
|
|
256
|
+
const frames = [];
|
|
257
|
+
for (const line of stack.split('\n').slice(1)) {
|
|
258
|
+
const match = line.trim().match(/at (.+?) \((.+?):(\d+):\d+\)/);
|
|
259
|
+
if (match) {
|
|
260
|
+
frames.push({
|
|
261
|
+
fn: match[1] ?? '<anonymous>',
|
|
262
|
+
file: match[2] ?? '',
|
|
263
|
+
line: Number(match[3] ?? 0),
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
const simple = line.trim().match(/at (.+?):(\d+):\d+/);
|
|
268
|
+
if (simple) {
|
|
269
|
+
frames.push({
|
|
270
|
+
fn: '<anonymous>',
|
|
271
|
+
file: simple[1] ?? '',
|
|
272
|
+
line: Number(simple[2] ?? 0),
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return frames;
|
|
278
|
+
}
|
|
279
|
+
escape(text) {
|
|
280
|
+
return text
|
|
281
|
+
.replace(/&/g, '&')
|
|
282
|
+
.replace(/</g, '<')
|
|
283
|
+
.replace(/>/g, '>')
|
|
284
|
+
.replace(/"/g, '"');
|
|
285
|
+
}
|
|
286
|
+
// ── Type guards (avoids importing auth/validation at module level) ──
|
|
287
|
+
isAuthException(error) {
|
|
288
|
+
return (error instanceof Error &&
|
|
289
|
+
(error.name === 'AuthenticationException' ||
|
|
290
|
+
error.name === 'InvalidCredentialsException'));
|
|
291
|
+
}
|
|
292
|
+
isAuthorizationException(error) {
|
|
293
|
+
return error instanceof Error && error.name === 'AuthorizationException';
|
|
294
|
+
}
|
|
295
|
+
isResetTokenException(error) {
|
|
296
|
+
return error instanceof Error && error.name === 'InvalidResetTokenException';
|
|
297
|
+
}
|
|
298
|
+
isValidationException(error) {
|
|
299
|
+
return error instanceof Error && error.name === 'ValidationException';
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
//# sourceMappingURL=exception-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exception-handler.js","sourceRoot":"","sources":["../src/exception-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exception-handler.test.d.ts","sourceRoot":"","sources":["../src/exception-handler.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { Application } from './application.js';
|
|
3
|
+
import { ConfigRepository } from '@tyravel/config';
|
|
4
|
+
import { ExceptionHandler } from './exception-handler.js';
|
|
5
|
+
import { HttpException, MethodNotAllowedException, RouteNotFoundException, } from '@tyravel/http';
|
|
6
|
+
import { ValidationException } from '@tyravel/validation';
|
|
7
|
+
function makeApp(debug) {
|
|
8
|
+
const app = new Application();
|
|
9
|
+
app.instance('config', new ConfigRepository({ app: { debug } }));
|
|
10
|
+
return app;
|
|
11
|
+
}
|
|
12
|
+
function jsonRequest() {
|
|
13
|
+
return new Request('https://example.com/test', {
|
|
14
|
+
headers: { accept: 'application/json' },
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
function htmlRequest() {
|
|
18
|
+
return new Request('https://example.com/test', {
|
|
19
|
+
headers: { accept: 'text/html' },
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
describe('ExceptionHandler', () => {
|
|
23
|
+
describe('status code mapping', () => {
|
|
24
|
+
it('maps RouteNotFoundException to 404', async () => {
|
|
25
|
+
const handler = new ExceptionHandler(makeApp(false));
|
|
26
|
+
const res = await handler.render(new RouteNotFoundException('GET', '/missing'), jsonRequest());
|
|
27
|
+
expect(res.status).toBe(404);
|
|
28
|
+
const body = await res.json();
|
|
29
|
+
expect(body.message).toContain('Route not found');
|
|
30
|
+
expect(body.status).toBe(404);
|
|
31
|
+
});
|
|
32
|
+
it('maps MethodNotAllowedException to 405 with Allow header', async () => {
|
|
33
|
+
const handler = new ExceptionHandler(makeApp(false));
|
|
34
|
+
const res = await handler.render(new MethodNotAllowedException('POST', '/users', ['GET']), jsonRequest());
|
|
35
|
+
expect(res.status).toBe(405);
|
|
36
|
+
expect(res.headers.get('allow')).toBe('GET');
|
|
37
|
+
});
|
|
38
|
+
it('maps HttpException to its status code', async () => {
|
|
39
|
+
const handler = new ExceptionHandler(makeApp(false));
|
|
40
|
+
const res = await handler.render(new HttpException('Teapot', 418), jsonRequest());
|
|
41
|
+
expect(res.status).toBe(418);
|
|
42
|
+
const body = await res.json();
|
|
43
|
+
expect(body.message).toBe('Teapot');
|
|
44
|
+
});
|
|
45
|
+
it('maps ValidationException to 422 with errors', async () => {
|
|
46
|
+
const handler = new ExceptionHandler(makeApp(false));
|
|
47
|
+
const res = await handler.render(new ValidationException({ email: ['Invalid email'] }), jsonRequest());
|
|
48
|
+
expect(res.status).toBe(422);
|
|
49
|
+
const body = await res.json();
|
|
50
|
+
expect(body.errors).toEqual({ email: ['Invalid email'] });
|
|
51
|
+
});
|
|
52
|
+
it('maps unknown errors to 500', async () => {
|
|
53
|
+
const handler = new ExceptionHandler(makeApp(false));
|
|
54
|
+
const res = await handler.render(new Error('Something went wrong'), jsonRequest());
|
|
55
|
+
expect(res.status).toBe(500);
|
|
56
|
+
const body = await res.json();
|
|
57
|
+
expect(body.message).toBe('Server Error');
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
describe('debug mode', () => {
|
|
61
|
+
it('includes exception details in JSON when debug is true', async () => {
|
|
62
|
+
const handler = new ExceptionHandler(makeApp(true));
|
|
63
|
+
const res = await handler.render(new Error('Database exploded'), jsonRequest());
|
|
64
|
+
const body = await res.json();
|
|
65
|
+
expect(body.message).toBe('Database exploded');
|
|
66
|
+
expect(body.exception).toBe('Error');
|
|
67
|
+
expect(body.trace).toBeDefined();
|
|
68
|
+
expect(Array.isArray(body.trace)).toBe(true);
|
|
69
|
+
});
|
|
70
|
+
it('hides exception details when debug is false', async () => {
|
|
71
|
+
const handler = new ExceptionHandler(makeApp(false));
|
|
72
|
+
const res = await handler.render(new Error('Database exploded'), jsonRequest());
|
|
73
|
+
const body = await res.json();
|
|
74
|
+
expect(body.message).toBe('Server Error');
|
|
75
|
+
expect(body.exception).toBeUndefined();
|
|
76
|
+
expect(body.trace).toBeUndefined();
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
describe('response format negotiation', () => {
|
|
80
|
+
it('returns JSON for API requests', async () => {
|
|
81
|
+
const handler = new ExceptionHandler(makeApp(false));
|
|
82
|
+
const res = await handler.render(new HttpException('Not found', 404), jsonRequest());
|
|
83
|
+
expect(res.headers.get('content-type')).toContain('application/json');
|
|
84
|
+
const body = await res.json();
|
|
85
|
+
expect(body.message).toBe('Not found');
|
|
86
|
+
expect(body.status).toBe(404);
|
|
87
|
+
});
|
|
88
|
+
it('returns HTML for web requests', async () => {
|
|
89
|
+
const handler = new ExceptionHandler(makeApp(false));
|
|
90
|
+
const res = await handler.render(new HttpException('Not found', 404), htmlRequest());
|
|
91
|
+
expect(res.headers.get('content-type')).toContain('text/html');
|
|
92
|
+
const body = await res.text();
|
|
93
|
+
expect(body).toContain('404');
|
|
94
|
+
expect(body).toContain('<!DOCTYPE html>');
|
|
95
|
+
});
|
|
96
|
+
it('includes stack trace in HTML debug page', async () => {
|
|
97
|
+
const handler = new ExceptionHandler(makeApp(true));
|
|
98
|
+
const error = new Error('boom');
|
|
99
|
+
const res = await handler.render(error, htmlRequest());
|
|
100
|
+
const body = await res.text();
|
|
101
|
+
expect(body).toContain('Stack Trace');
|
|
102
|
+
expect(body).toContain('Error');
|
|
103
|
+
expect(body).toContain('exception-handler');
|
|
104
|
+
});
|
|
105
|
+
it('renders a clean production page without trace', async () => {
|
|
106
|
+
const handler = new ExceptionHandler(makeApp(false));
|
|
107
|
+
const res = await handler.render(new Error('secret'), htmlRequest());
|
|
108
|
+
const body = await res.text();
|
|
109
|
+
expect(body).not.toContain('Stack Trace');
|
|
110
|
+
expect(body).not.toContain('secret');
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
describe('auth exceptions (name-based detection)', () => {
|
|
114
|
+
it('maps AuthenticationException to 401', async () => {
|
|
115
|
+
const handler = new ExceptionHandler(makeApp(false));
|
|
116
|
+
const error = new Error('Unauthenticated.');
|
|
117
|
+
error.name = 'AuthenticationException';
|
|
118
|
+
const res = await handler.render(error, jsonRequest());
|
|
119
|
+
expect(res.status).toBe(401);
|
|
120
|
+
});
|
|
121
|
+
it('maps AuthorizationException to 403', async () => {
|
|
122
|
+
const handler = new ExceptionHandler(makeApp(false));
|
|
123
|
+
const error = new Error('Unauthorized.');
|
|
124
|
+
error.name = 'AuthorizationException';
|
|
125
|
+
const res = await handler.render(error, jsonRequest());
|
|
126
|
+
expect(res.status).toBe(403);
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
//# sourceMappingURL=exception-handler.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exception-handler.test.js","sourceRoot":"","sources":["../src/exception-handler.test.ts"],"names":[],"mappings":"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"}
|
package/dist/http-kernel.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-kernel.d.ts","sourceRoot":"","sources":["../src/http-kernel.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"http-kernel.d.ts","sourceRoot":"","sources":["../src/http-kernel.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,qBAAa,UAAU;IAGT,OAAO,CAAC,QAAQ,CAAC,GAAG;IAFhC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;gBAEd,GAAG,EAAE,WAAW;IAIvC,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;CAOlD"}
|
package/dist/http-kernel.js
CHANGED
|
@@ -1,44 +1,17 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Response } from '@tyravel/http';
|
|
3
|
-
import { ValidationException } from '@tyravel/validation';
|
|
4
|
-
import { AuthenticationException } from '@tyravel/auth';
|
|
5
|
-
import { InvalidCredentialsException } from '@tyravel/auth';
|
|
6
|
-
import { AuthorizationException } from '@tyravel/auth';
|
|
7
|
-
import { InvalidResetTokenException } from '@tyravel/auth';
|
|
1
|
+
import { ExceptionHandler } from './exception-handler.js';
|
|
8
2
|
export class HttpKernel {
|
|
9
3
|
app;
|
|
4
|
+
handler;
|
|
10
5
|
constructor(app) {
|
|
11
6
|
this.app = app;
|
|
7
|
+
this.handler = new ExceptionHandler(app);
|
|
12
8
|
}
|
|
13
9
|
async handle(request) {
|
|
14
10
|
try {
|
|
15
11
|
return await this.app.router().dispatch(request);
|
|
16
12
|
}
|
|
17
13
|
catch (error) {
|
|
18
|
-
|
|
19
|
-
return Response.json({ message: error.message }, { status: 404 });
|
|
20
|
-
}
|
|
21
|
-
if (error instanceof ValidationException) {
|
|
22
|
-
const validationError = error;
|
|
23
|
-
return Response.json({
|
|
24
|
-
message: validationError.message,
|
|
25
|
-
errors: validationError.errors,
|
|
26
|
-
}, { status: 422 });
|
|
27
|
-
}
|
|
28
|
-
if (error instanceof AuthenticationException) {
|
|
29
|
-
return Response.json({ message: error.message }, { status: 401 });
|
|
30
|
-
}
|
|
31
|
-
if (error instanceof InvalidCredentialsException) {
|
|
32
|
-
return Response.json({ message: error.message }, { status: 401 });
|
|
33
|
-
}
|
|
34
|
-
if (error instanceof AuthorizationException) {
|
|
35
|
-
return Response.json({ message: error.message }, { status: 403 });
|
|
36
|
-
}
|
|
37
|
-
if (error instanceof InvalidResetTokenException) {
|
|
38
|
-
return Response.json({ message: error.message }, { status: 422 });
|
|
39
|
-
}
|
|
40
|
-
console.error(error);
|
|
41
|
-
return Response.json({ message: 'Server Error' }, { status: 500 });
|
|
14
|
+
return this.handler.render(error, request);
|
|
42
15
|
}
|
|
43
16
|
}
|
|
44
17
|
}
|
package/dist/http-kernel.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-kernel.js","sourceRoot":"","sources":["../src/http-kernel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"http-kernel.js","sourceRoot":"","sources":["../src/http-kernel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG1D,MAAM,OAAO,UAAU;IAGQ;IAFZ,OAAO,CAAmB;IAE3C,YAA6B,GAAgB;QAAhB,QAAG,GAAH,GAAG,CAAa;QAC3C,IAAI,CAAC,OAAO,GAAG,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAgB;QAC3B,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;CACF"}
|
package/dist/index.d.ts
CHANGED
|
@@ -7,12 +7,14 @@ export { ConfigServiceProvider } from './config-service-provider.js';
|
|
|
7
7
|
export { DatabaseServiceProvider } from './database-service-provider.js';
|
|
8
8
|
export { EventServiceProvider } from './events-service-provider.js';
|
|
9
9
|
export { QueueServiceProvider } from './queue-service-provider.js';
|
|
10
|
+
export { RedisServiceProvider } from './redis-service-provider.js';
|
|
10
11
|
export { ViewServiceProvider } from './view-service-provider.js';
|
|
11
12
|
export { View, setViewApplication } from './view.js';
|
|
12
13
|
export type { ViewFacade } from './view.js';
|
|
13
14
|
export { createControllerHandler, isControllerAction, } from './controller.js';
|
|
14
15
|
export type { ControllerAction, ControllerConstructor } from './controller.js';
|
|
15
16
|
export { HttpKernel } from './http-kernel.js';
|
|
17
|
+
export { ExceptionHandler } from './exception-handler.js';
|
|
16
18
|
export { Route, setRouteApplication } from './route.js';
|
|
17
19
|
export type { RouteFacade } from './route.js';
|
|
18
20
|
export { Auth, setAuthApplication } from './auth.js';
|
|
@@ -38,6 +40,7 @@ export { Event, EventSubscriber, Listener, EventDispatcher, QueuedListener } fro
|
|
|
38
40
|
export type { EventConstructor, EventListenerRegistration, EventSubscriberConstructor, EventsConfig, ListenerCallback, ListenerConstructor, ListenerHandler, } from '@tyravel/events';
|
|
39
41
|
export type { Authenticatable, AuthConfig, NewAccessToken } from '@tyravel/auth';
|
|
40
42
|
export { AuthenticationException, InvalidCredentialsException, AuthorizationException, InvalidResetTokenException, Policy, OAuthManager, PasswordResetBroker, PersonalAccessTokenRepository, Gate as AuthorizationGate, } from '@tyravel/auth';
|
|
43
|
+
export { env, envBool, envInt, loadEnv } from '@tyravel/config';
|
|
41
44
|
export { Mailable, SendMailable } from '@tyravel/mail';
|
|
42
45
|
export { Notification, type Notifiable, NotificationRegistry } from '@tyravel/notifications';
|
|
43
46
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -7,10 +7,12 @@ export { ConfigServiceProvider } from './config-service-provider.js';
|
|
|
7
7
|
export { DatabaseServiceProvider } from './database-service-provider.js';
|
|
8
8
|
export { EventServiceProvider } from './events-service-provider.js';
|
|
9
9
|
export { QueueServiceProvider } from './queue-service-provider.js';
|
|
10
|
+
export { RedisServiceProvider } from './redis-service-provider.js';
|
|
10
11
|
export { ViewServiceProvider } from './view-service-provider.js';
|
|
11
12
|
export { View, setViewApplication } from './view.js';
|
|
12
13
|
export { createControllerHandler, isControllerAction, } from './controller.js';
|
|
13
14
|
export { HttpKernel } from './http-kernel.js';
|
|
15
|
+
export { ExceptionHandler } from './exception-handler.js';
|
|
14
16
|
export { Route, setRouteApplication } from './route.js';
|
|
15
17
|
export { Auth, setAuthApplication } from './auth.js';
|
|
16
18
|
export { Gate, setGateApplication } from './gate.js';
|
|
@@ -24,6 +26,7 @@ export { serve } from './server.js';
|
|
|
24
26
|
export { ServiceProvider } from './service-provider.js';
|
|
25
27
|
export { Event, EventSubscriber, Listener, EventDispatcher, QueuedListener } from '@tyravel/events';
|
|
26
28
|
export { AuthenticationException, InvalidCredentialsException, AuthorizationException, InvalidResetTokenException, Policy, OAuthManager, PasswordResetBroker, PersonalAccessTokenRepository, Gate as AuthorizationGate, } from '@tyravel/auth';
|
|
29
|
+
export { env, envBool, envInt, loadEnv } from '@tyravel/config';
|
|
27
30
|
export { Mailable, SendMailable } from '@tyravel/mail';
|
|
28
31
|
export { Notification, NotificationRegistry } from '@tyravel/notifications';
|
|
29
32
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAErD,OAAO,EACL,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAExD,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAErD,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAErD,OAAO,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAEjE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAE/D,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAElE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAExD,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAErD,OAAO,EAAE,aAAa,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAE/E,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAWpG,OAAO,EACL,uBAAuB,EACvB,2BAA2B,EAC3B,sBAAsB,EACtB,0BAA0B,EAC1B,MAAM,EACN,YAAY,EACZ,mBAAmB,EACnB,6BAA6B,EAC7B,IAAI,IAAI,iBAAiB,GAC1B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,YAAY,EAAmB,oBAAoB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAErD,OAAO,EACL,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAExD,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAErD,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAErD,OAAO,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAEjE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAE/D,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAElE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAExD,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAErD,OAAO,EAAE,aAAa,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAE/E,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAWpG,OAAO,EACL,uBAAuB,EACvB,2BAA2B,EAC3B,sBAAsB,EACtB,0BAA0B,EAC1B,MAAM,EACN,YAAY,EACZ,mBAAmB,EACnB,6BAA6B,EAC7B,IAAI,IAAI,iBAAiB,GAC1B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,YAAY,EAAmB,oBAAoB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue-service-provider.d.ts","sourceRoot":"","sources":["../src/queue-service-provider.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"queue-service-provider.d.ts","sourceRoot":"","sources":["../src/queue-service-provider.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,qBAAa,oBAAqB,SAAQ,eAAe;IAC9C,QAAQ;IA4BjB,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,sBAAsB;IAQ9B,OAAO,CAAC,yBAAyB;CAmBlC"}
|
|
@@ -9,7 +9,7 @@ export class QueueServiceProvider extends ServiceProvider {
|
|
|
9
9
|
this.app.singleton(JobRegistry, () => registry);
|
|
10
10
|
const database = this.resolveDatabaseManager();
|
|
11
11
|
const worker = new QueueWorker(registry, this.app);
|
|
12
|
-
const manager = new QueueManager(queueConfig, worker, database);
|
|
12
|
+
const manager = new QueueManager(queueConfig, worker, database, this.resolveRedisManager());
|
|
13
13
|
const dispatcher = new Dispatcher(manager.connection());
|
|
14
14
|
const failedJobs = this.createFailedJobRepository(database, queueConfig);
|
|
15
15
|
const processor = new QueueProcessor(manager, registry, worker, { failedJobs });
|
|
@@ -24,6 +24,14 @@ export class QueueServiceProvider extends ServiceProvider {
|
|
|
24
24
|
this.app.instance('queue.processor', processor);
|
|
25
25
|
this.app.singleton(QueueProcessor, () => processor);
|
|
26
26
|
}
|
|
27
|
+
resolveRedisManager() {
|
|
28
|
+
try {
|
|
29
|
+
return this.app.make('redis');
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
27
35
|
resolveDatabaseManager() {
|
|
28
36
|
try {
|
|
29
37
|
return this.app.make('db');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue-service-provider.js","sourceRoot":"","sources":["../src/queue-service-provider.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"queue-service-provider.js","sourceRoot":"","sources":["../src/queue-service-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-service-provider.d.ts","sourceRoot":"","sources":["../src/redis-service-provider.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,qBAAa,oBAAqB,SAAQ,eAAe;IAC9C,QAAQ;CAQlB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { RedisManager } from '@tyravel/redis';
|
|
2
|
+
import { ServiceProvider } from './service-provider.js';
|
|
3
|
+
export class RedisServiceProvider extends ServiceProvider {
|
|
4
|
+
register() {
|
|
5
|
+
const config = this.app.make('config');
|
|
6
|
+
const redisConfig = config.get('redis');
|
|
7
|
+
const manager = new RedisManager(redisConfig);
|
|
8
|
+
this.app.instance('redis', manager);
|
|
9
|
+
this.app.singleton(RedisManager, () => manager);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=redis-service-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-service-provider.js","sourceRoot":"","sources":["../src/redis-service-provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAoB,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,OAAO,oBAAqB,SAAQ,eAAe;IAC9C,QAAQ;QACf,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAmB,QAAQ,CAAC,CAAC;QACzD,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAc,OAAO,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,WAAW,CAAC,CAAC;QAE9C,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;IAClD,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tyravel/core",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -15,18 +15,19 @@
|
|
|
15
15
|
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
16
16
|
},
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@tyravel/auth": "0.1
|
|
19
|
-
"@tyravel/cache": "0.1
|
|
20
|
-
"@tyravel/config": "0.1
|
|
21
|
-
"@tyravel/database": "0.1
|
|
22
|
-
"@tyravel/events": "0.1
|
|
23
|
-
"@tyravel/container": "0.1
|
|
24
|
-
"@tyravel/http": "0.1
|
|
25
|
-
"@tyravel/mail": "0.1
|
|
26
|
-
"@tyravel/notifications": "0.1
|
|
27
|
-
"@tyravel/queue": "0.1
|
|
28
|
-
"@tyravel/
|
|
29
|
-
"@tyravel/
|
|
18
|
+
"@tyravel/auth": "0.2.1",
|
|
19
|
+
"@tyravel/cache": "0.2.1",
|
|
20
|
+
"@tyravel/config": "0.2.1",
|
|
21
|
+
"@tyravel/database": "0.2.1",
|
|
22
|
+
"@tyravel/events": "0.2.1",
|
|
23
|
+
"@tyravel/container": "0.2.1",
|
|
24
|
+
"@tyravel/http": "0.2.1",
|
|
25
|
+
"@tyravel/mail": "0.2.1",
|
|
26
|
+
"@tyravel/notifications": "0.2.1",
|
|
27
|
+
"@tyravel/queue": "0.2.1",
|
|
28
|
+
"@tyravel/redis": "0.2.1",
|
|
29
|
+
"@tyravel/validation": "0.2.1",
|
|
30
|
+
"@tyravel/views": "0.2.1"
|
|
30
31
|
},
|
|
31
32
|
"files": [
|
|
32
33
|
"dist"
|