@tyravel/core 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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;CAOxB"}
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;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,OAAO,qBAAsB,SAAQ,eAAe;IAC/C,KAAK,CAAC,QAAQ;QACrB,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"}
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, '&amp;')
282
+ .replace(/</g, '&lt;')
283
+ .replace(/>/g, '&gt;')
284
+ .replace(/"/g, '&quot;');
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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=exception-handler.test.d.ts.map
@@ -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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"}
@@ -1,6 +1,7 @@
1
1
  import type { Application } from './application.js';
2
2
  export declare class HttpKernel {
3
3
  private readonly app;
4
+ private readonly handler;
4
5
  constructor(app: Application);
5
6
  handle(request: Request): Promise<Response>;
6
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"http-kernel.d.ts","sourceRoot":"","sources":["../src/http-kernel.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,qBAAa,UAAU;IACT,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,EAAE,WAAW;IAEvC,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;CAuClD"}
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"}
@@ -1,44 +1,17 @@
1
- import { RouteNotFoundException } from '@tyravel/http';
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
- if (error instanceof RouteNotFoundException) {
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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"http-kernel.js","sourceRoot":"","sources":["../src/http-kernel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAG3D,MAAM,OAAO,UAAU;IACQ;IAA7B,YAA6B,GAAgB;QAAhB,QAAG,GAAH,GAAG,CAAa;IAAG,CAAC;IAEjD,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,IAAI,KAAK,YAAY,sBAAsB,EAAE,CAAC;gBAC5C,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YACpE,CAAC;YAED,IAAI,KAAK,YAAY,mBAAmB,EAAE,CAAC;gBACzC,MAAM,eAAe,GAAG,KAA4B,CAAC;gBACrD,OAAO,QAAQ,CAAC,IAAI,CAClB;oBACE,OAAO,EAAE,eAAe,CAAC,OAAO;oBAChC,MAAM,EAAE,eAAe,CAAC,MAAM;iBAC/B,EACD,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB,CAAC;YACJ,CAAC;YAED,IAAI,KAAK,YAAY,uBAAuB,EAAE,CAAC;gBAC7C,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YACpE,CAAC;YAED,IAAI,KAAK,YAAY,2BAA2B,EAAE,CAAC;gBACjD,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YACpE,CAAC;YAED,IAAI,KAAK,YAAY,sBAAsB,EAAE,CAAC;gBAC5C,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YACpE,CAAC;YAED,IAAI,KAAK,YAAY,0BAA0B,EAAE,CAAC;gBAChD,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YACpE,CAAC;YAED,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACrB,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;CACF"}
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
@@ -13,6 +13,7 @@ export type { ViewFacade } from './view.js';
13
13
  export { createControllerHandler, isControllerAction, } from './controller.js';
14
14
  export type { ControllerAction, ControllerConstructor } from './controller.js';
15
15
  export { HttpKernel } from './http-kernel.js';
16
+ export { ExceptionHandler } from './exception-handler.js';
16
17
  export { Route, setRouteApplication } from './route.js';
17
18
  export type { RouteFacade } from './route.js';
18
19
  export { Auth, setAuthApplication } from './auth.js';
@@ -38,6 +39,7 @@ export { Event, EventSubscriber, Listener, EventDispatcher, QueuedListener } fro
38
39
  export type { EventConstructor, EventListenerRegistration, EventSubscriberConstructor, EventsConfig, ListenerCallback, ListenerConstructor, ListenerHandler, } from '@tyravel/events';
39
40
  export type { Authenticatable, AuthConfig, NewAccessToken } from '@tyravel/auth';
40
41
  export { AuthenticationException, InvalidCredentialsException, AuthorizationException, InvalidResetTokenException, Policy, OAuthManager, PasswordResetBroker, PersonalAccessTokenRepository, Gate as AuthorizationGate, } from '@tyravel/auth';
42
+ export { env, envBool, envInt, loadEnv } from '@tyravel/config';
41
43
  export { Mailable, SendMailable } from '@tyravel/mail';
42
44
  export { Notification, type Notifiable, NotificationRegistry } from '@tyravel/notifications';
43
45
  //# sourceMappingURL=index.d.ts.map
@@ -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
@@ -11,6 +11,7 @@ export { ViewServiceProvider } from './view-service-provider.js';
11
11
  export { View, setViewApplication } from './view.js';
12
12
  export { createControllerHandler, isControllerAction, } from './controller.js';
13
13
  export { HttpKernel } from './http-kernel.js';
14
+ export { ExceptionHandler } from './exception-handler.js';
14
15
  export { Route, setRouteApplication } from './route.js';
15
16
  export { Auth, setAuthApplication } from './auth.js';
16
17
  export { Gate, setGateApplication } from './gate.js';
@@ -24,6 +25,7 @@ export { serve } from './server.js';
24
25
  export { ServiceProvider } from './service-provider.js';
25
26
  export { Event, EventSubscriber, Listener, EventDispatcher, QueuedListener } from '@tyravel/events';
26
27
  export { AuthenticationException, InvalidCredentialsException, AuthorizationException, InvalidResetTokenException, Policy, OAuthManager, PasswordResetBroker, PersonalAccessTokenRepository, Gate as AuthorizationGate, } from '@tyravel/auth';
28
+ export { env, envBool, envInt, loadEnv } from '@tyravel/config';
27
29
  export { Mailable, SendMailable } from '@tyravel/mail';
28
30
  export { Notification, NotificationRegistry } from '@tyravel/notifications';
29
31
  //# 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,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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tyravel/core",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -15,18 +15,18 @@
15
15
  "typecheck": "tsc -p tsconfig.json --noEmit"
16
16
  },
17
17
  "dependencies": {
18
- "@tyravel/auth": "0.1.0",
19
- "@tyravel/cache": "0.1.0",
20
- "@tyravel/config": "0.1.0",
21
- "@tyravel/database": "0.1.0",
22
- "@tyravel/events": "0.1.0",
23
- "@tyravel/container": "0.1.0",
24
- "@tyravel/http": "0.1.0",
25
- "@tyravel/mail": "0.1.0",
26
- "@tyravel/notifications": "0.1.0",
27
- "@tyravel/queue": "0.1.0",
28
- "@tyravel/validation": "0.1.0",
29
- "@tyravel/views": "0.1.0"
18
+ "@tyravel/auth": "0.2.0",
19
+ "@tyravel/cache": "0.2.0",
20
+ "@tyravel/config": "0.2.0",
21
+ "@tyravel/database": "0.2.0",
22
+ "@tyravel/events": "0.2.0",
23
+ "@tyravel/container": "0.2.0",
24
+ "@tyravel/http": "0.2.0",
25
+ "@tyravel/mail": "0.2.0",
26
+ "@tyravel/notifications": "0.2.0",
27
+ "@tyravel/queue": "0.2.0",
28
+ "@tyravel/validation": "0.2.0",
29
+ "@tyravel/views": "0.2.0"
30
30
  },
31
31
  "files": [
32
32
  "dist"