@tyravel/core 0.1.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.
Files changed (121) hide show
  1. package/dist/adapters/node-server.d.ts +7 -0
  2. package/dist/adapters/node-server.d.ts.map +1 -0
  3. package/dist/adapters/node-server.js +78 -0
  4. package/dist/adapters/node-server.js.map +1 -0
  5. package/dist/application.d.ts +23 -0
  6. package/dist/application.d.ts.map +1 -0
  7. package/dist/application.js +65 -0
  8. package/dist/application.js.map +1 -0
  9. package/dist/application.test.d.ts +2 -0
  10. package/dist/application.test.d.ts.map +1 -0
  11. package/dist/application.test.js +29 -0
  12. package/dist/application.test.js.map +1 -0
  13. package/dist/auth-service-provider.d.ts +6 -0
  14. package/dist/auth-service-provider.d.ts.map +1 -0
  15. package/dist/auth-service-provider.js +71 -0
  16. package/dist/auth-service-provider.js.map +1 -0
  17. package/dist/auth.d.ts +14 -0
  18. package/dist/auth.d.ts.map +1 -0
  19. package/dist/auth.js +32 -0
  20. package/dist/auth.js.map +1 -0
  21. package/dist/cache-service-provider.d.ts +5 -0
  22. package/dist/cache-service-provider.d.ts.map +1 -0
  23. package/dist/cache-service-provider.js +14 -0
  24. package/dist/cache-service-provider.js.map +1 -0
  25. package/dist/cache.d.ts +12 -0
  26. package/dist/cache.d.ts.map +1 -0
  27. package/dist/cache.js +19 -0
  28. package/dist/cache.js.map +1 -0
  29. package/dist/config-service-provider.d.ts +5 -0
  30. package/dist/config-service-provider.d.ts.map +1 -0
  31. package/dist/config-service-provider.js +11 -0
  32. package/dist/config-service-provider.js.map +1 -0
  33. package/dist/config-service-provider.test.d.ts +2 -0
  34. package/dist/config-service-provider.test.d.ts.map +1 -0
  35. package/dist/config-service-provider.test.js +27 -0
  36. package/dist/config-service-provider.test.js.map +1 -0
  37. package/dist/controller.d.ts +8 -0
  38. package/dist/controller.d.ts.map +1 -0
  39. package/dist/controller.js +30 -0
  40. package/dist/controller.js.map +1 -0
  41. package/dist/controller.test.d.ts +2 -0
  42. package/dist/controller.test.d.ts.map +1 -0
  43. package/dist/controller.test.js +34 -0
  44. package/dist/controller.test.js.map +1 -0
  45. package/dist/database-service-provider.d.ts +5 -0
  46. package/dist/database-service-provider.d.ts.map +1 -0
  47. package/dist/database-service-provider.js +14 -0
  48. package/dist/database-service-provider.js.map +1 -0
  49. package/dist/event.d.ts +11 -0
  50. package/dist/event.d.ts.map +1 -0
  51. package/dist/event.js +22 -0
  52. package/dist/event.js.map +1 -0
  53. package/dist/events-service-provider.d.ts +8 -0
  54. package/dist/events-service-provider.d.ts.map +1 -0
  55. package/dist/events-service-provider.js +68 -0
  56. package/dist/events-service-provider.js.map +1 -0
  57. package/dist/events-service-provider.test.d.ts +2 -0
  58. package/dist/events-service-provider.test.d.ts.map +1 -0
  59. package/dist/events-service-provider.test.js +30 -0
  60. package/dist/events-service-provider.test.js.map +1 -0
  61. package/dist/gate.d.ts +10 -0
  62. package/dist/gate.d.ts.map +1 -0
  63. package/dist/gate.js +16 -0
  64. package/dist/gate.js.map +1 -0
  65. package/dist/http-kernel.d.ts +7 -0
  66. package/dist/http-kernel.d.ts.map +1 -0
  67. package/dist/http-kernel.js +45 -0
  68. package/dist/http-kernel.js.map +1 -0
  69. package/dist/index.d.ts +43 -0
  70. package/dist/index.d.ts.map +1 -0
  71. package/dist/index.js +29 -0
  72. package/dist/index.js.map +1 -0
  73. package/dist/mail-service-provider.d.ts +7 -0
  74. package/dist/mail-service-provider.d.ts.map +1 -0
  75. package/dist/mail-service-provider.js +49 -0
  76. package/dist/mail-service-provider.js.map +1 -0
  77. package/dist/mail.d.ts +10 -0
  78. package/dist/mail.d.ts.map +1 -0
  79. package/dist/mail.js +16 -0
  80. package/dist/mail.js.map +1 -0
  81. package/dist/notification-service-provider.d.ts +8 -0
  82. package/dist/notification-service-provider.d.ts.map +1 -0
  83. package/dist/notification-service-provider.js +71 -0
  84. package/dist/notification-service-provider.js.map +1 -0
  85. package/dist/notifications.d.ts +9 -0
  86. package/dist/notifications.d.ts.map +1 -0
  87. package/dist/notifications.js +9 -0
  88. package/dist/notifications.js.map +1 -0
  89. package/dist/password.d.ts +12 -0
  90. package/dist/password.d.ts.map +1 -0
  91. package/dist/password.js +15 -0
  92. package/dist/password.js.map +1 -0
  93. package/dist/queue-service-provider.d.ts +7 -0
  94. package/dist/queue-service-provider.d.ts.map +1 -0
  95. package/dist/queue-service-provider.js +49 -0
  96. package/dist/queue-service-provider.js.map +1 -0
  97. package/dist/queue.d.ts +15 -0
  98. package/dist/queue.d.ts.map +1 -0
  99. package/dist/queue.js +29 -0
  100. package/dist/queue.js.map +1 -0
  101. package/dist/route.d.ts +22 -0
  102. package/dist/route.d.ts.map +1 -0
  103. package/dist/route.js +28 -0
  104. package/dist/route.js.map +1 -0
  105. package/dist/server.d.ts +7 -0
  106. package/dist/server.d.ts.map +1 -0
  107. package/dist/server.js +18 -0
  108. package/dist/server.js.map +1 -0
  109. package/dist/service-provider.d.ts +8 -0
  110. package/dist/service-provider.d.ts.map +1 -0
  111. package/dist/service-provider.js +9 -0
  112. package/dist/service-provider.js.map +1 -0
  113. package/dist/view-service-provider.d.ts +5 -0
  114. package/dist/view-service-provider.d.ts.map +1 -0
  115. package/dist/view-service-provider.js +16 -0
  116. package/dist/view-service-provider.js.map +1 -0
  117. package/dist/view.d.ts +9 -0
  118. package/dist/view.d.ts.map +1 -0
  119. package/dist/view.js +15 -0
  120. package/dist/view.js.map +1 -0
  121. package/package.json +47 -0
@@ -0,0 +1,7 @@
1
+ import type { HttpKernel } from '../http-kernel.js';
2
+ export declare function serveWithNode(kernel: HttpKernel, hostname: string, port: number): Promise<{
3
+ hostname: string;
4
+ port: number;
5
+ close: () => Promise<void>;
6
+ }>;
7
+ //# sourceMappingURL=node-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-server.d.ts","sourceRoot":"","sources":["../../src/adapters/node-server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,wBAAsB,aAAa,CACjC,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC,CAEzE"}
@@ -0,0 +1,78 @@
1
+ export async function serveWithNode(kernel, hostname, port) {
2
+ return createNodeServer(kernel, hostname, port);
3
+ }
4
+ async function createNodeServer(kernel, hostname, port) {
5
+ const { createServer } = await import('node:http');
6
+ const server = createServer(async (incoming, outgoing) => {
7
+ try {
8
+ const request = await toFetchRequest(incoming);
9
+ const response = await kernel.handle(request);
10
+ await writeFetchResponse(outgoing, response);
11
+ }
12
+ catch (error) {
13
+ console.error(error);
14
+ outgoing.statusCode = 500;
15
+ outgoing.end('Server Error');
16
+ }
17
+ });
18
+ await new Promise((resolve, reject) => {
19
+ server.listen(port, hostname, () => resolve());
20
+ server.on('error', reject);
21
+ });
22
+ const address = server.address();
23
+ const resolvedHost = typeof address === 'object' && address ? address.address : hostname;
24
+ const resolvedPort = typeof address === 'object' && address ? address.port : port;
25
+ return {
26
+ hostname: resolvedHost,
27
+ port: resolvedPort,
28
+ close: () => new Promise((resolve, reject) => {
29
+ server.close((error) => (error ? reject(error) : resolve()));
30
+ }),
31
+ };
32
+ }
33
+ async function toFetchRequest(incoming) {
34
+ const host = incoming.headers.host ?? 'localhost';
35
+ const url = new URL(incoming.url ?? '/', `http://${host}`);
36
+ const method = incoming.method ?? 'GET';
37
+ const headers = new Headers();
38
+ for (const [key, value] of Object.entries(incoming.headers)) {
39
+ if (value === undefined) {
40
+ continue;
41
+ }
42
+ if (Array.isArray(value)) {
43
+ for (const item of value) {
44
+ headers.append(key, item);
45
+ }
46
+ continue;
47
+ }
48
+ headers.set(key, value);
49
+ }
50
+ const init = { method, headers };
51
+ if (method !== 'GET' && method !== 'HEAD') {
52
+ const body = await readIncomingBody(incoming);
53
+ if (body.length > 0) {
54
+ init.body = Buffer.from(body);
55
+ }
56
+ }
57
+ return new Request(url, init);
58
+ }
59
+ async function readIncomingBody(incoming) {
60
+ const chunks = [];
61
+ for await (const chunk of incoming) {
62
+ chunks.push(Buffer.from(chunk));
63
+ }
64
+ return Buffer.concat(chunks);
65
+ }
66
+ async function writeFetchResponse(outgoing, response) {
67
+ outgoing.statusCode = response.status;
68
+ response.headers.forEach((value, key) => {
69
+ outgoing.setHeader(key, value);
70
+ });
71
+ if (response.body) {
72
+ const buffer = Buffer.from(await response.arrayBuffer());
73
+ outgoing.end(buffer);
74
+ return;
75
+ }
76
+ outgoing.end();
77
+ }
78
+ //# sourceMappingURL=node-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-server.js","sourceRoot":"","sources":["../../src/adapters/node-server.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAkB,EAClB,QAAgB,EAChB,IAAY;IAEZ,OAAO,gBAAgB,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;AAClD,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,MAAkB,EAClB,QAAgB,EAChB,IAAY;IAEZ,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;IAEnD,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE;QACvD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;YAC/C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC9C,MAAM,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACrB,QAAQ,CAAC,UAAU,GAAG,GAAG,CAAC;YAC1B,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/C,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IACjC,MAAM,YAAY,GAAG,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;IACzF,MAAM,YAAY,GAAG,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAElF,OAAO;QACL,QAAQ,EAAE,YAAY;QACtB,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,GAAG,EAAE,CACV,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACpC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC/D,CAAC,CAAC;KACL,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,QAAyB;IACrD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,WAAW,CAAC;IAClD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,IAAI,GAAG,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,KAAK,CAAC;IACxC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,SAAS;QACX,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC5B,CAAC;YACD,SAAS;QACX,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,IAAI,GAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAE9C,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAChC,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,QAAyB;IACvD,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAClC,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,QAAwB,EACxB,QAAkB;IAElB,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC;IAEtC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtC,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QACzD,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,QAAQ,CAAC,GAAG,EAAE,CAAC;AACjB,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { Container } from '@tyravel/container';
2
+ import type { Abstract, Constructor, Factory } from '@tyravel/container';
3
+ import { MiddlewareRegistry, type MiddlewareInput, type Router } from '@tyravel/http';
4
+ import { ServiceProvider } from './service-provider.js';
5
+ type ProviderConstructor = new (app: Application) => ServiceProvider;
6
+ export declare class Application extends Container {
7
+ readonly basePath: string;
8
+ private providers;
9
+ private booted;
10
+ private readonly middlewareRegistry;
11
+ constructor(basePath?: string);
12
+ middleware(name: string, middleware: Parameters<MiddlewareRegistry['alias']>[1]): this;
13
+ use(...middleware: MiddlewareInput[]): this;
14
+ private normalizeRouteHandler;
15
+ register(provider: ProviderConstructor): this;
16
+ boot(): Promise<void>;
17
+ router(): Router;
18
+ bind<T>(abstract: Abstract<T>, factory: Factory<T> | Constructor<T>): this;
19
+ singleton<T>(abstract: Abstract<T>, factory: Factory<T> | Constructor<T>): this;
20
+ instance<T>(abstract: Abstract<T>, instance: T): this;
21
+ }
22
+ export {};
23
+ //# sourceMappingURL=application.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"application.d.ts","sourceRoot":"","sources":["../src/application.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAEL,kBAAkB,EAClB,KAAK,eAAe,EAEpB,KAAK,MAAM,EACZ,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,KAAK,mBAAmB,GAAG,KAAK,GAAG,EAAE,WAAW,KAAK,eAAe,CAAC;AAErE,qBAAa,WAAY,SAAQ,SAAS;aAKZ,QAAQ,EAAE,MAAM;IAJ5C,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA4B;gBAEnC,QAAQ,GAAE,MAAsB;IAW5D,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;IAKtF,GAAG,CAAC,GAAG,UAAU,EAAE,eAAe,EAAE,GAAG,IAAI;IAK3C,OAAO,CAAC,qBAAqB;IAO7B,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI;IAKvC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB3B,MAAM,IAAI,MAAM;IAIP,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI;IAI1E,SAAS,CAAC,CAAC,EAClB,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,EACrB,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,GACnC,IAAI;IAIE,QAAQ,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI;CAG/D"}
@@ -0,0 +1,65 @@
1
+ import { Container } from '@tyravel/container';
2
+ import { createRouter, MiddlewareRegistry, } from '@tyravel/http';
3
+ import { createControllerHandler, isControllerAction } from './controller.js';
4
+ export class Application extends Container {
5
+ basePath;
6
+ providers = [];
7
+ booted = false;
8
+ middlewareRegistry = new MiddlewareRegistry();
9
+ constructor(basePath = process.cwd()) {
10
+ super();
11
+ this.basePath = basePath;
12
+ this.singleton('app', () => this);
13
+ this.singleton('middleware', () => this.middlewareRegistry);
14
+ this.singleton('router', () => {
15
+ const router = createRouter(this.middlewareRegistry);
16
+ router.setHandlerNormalizer((handler) => this.normalizeRouteHandler(handler));
17
+ return router;
18
+ });
19
+ }
20
+ middleware(name, middleware) {
21
+ this.middlewareRegistry.alias(name, middleware);
22
+ return this;
23
+ }
24
+ use(...middleware) {
25
+ this.router().use(...middleware);
26
+ return this;
27
+ }
28
+ normalizeRouteHandler(handler) {
29
+ if (isControllerAction(handler)) {
30
+ return createControllerHandler(this, handler);
31
+ }
32
+ return handler;
33
+ }
34
+ register(provider) {
35
+ this.providers.push(provider);
36
+ return this;
37
+ }
38
+ async boot() {
39
+ if (this.booted) {
40
+ return;
41
+ }
42
+ for (const Provider of this.providers) {
43
+ const provider = new Provider(this);
44
+ await provider.register();
45
+ }
46
+ for (const Provider of this.providers) {
47
+ const provider = new Provider(this);
48
+ await provider.boot();
49
+ }
50
+ this.booted = true;
51
+ }
52
+ router() {
53
+ return this.make('router');
54
+ }
55
+ bind(abstract, factory) {
56
+ return super.bind(abstract, factory);
57
+ }
58
+ singleton(abstract, factory) {
59
+ return super.singleton(abstract, factory);
60
+ }
61
+ instance(abstract, instance) {
62
+ return super.instance(abstract, instance);
63
+ }
64
+ }
65
+ //# sourceMappingURL=application.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"application.js","sourceRoot":"","sources":["../src/application.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=application.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"application.test.d.ts","sourceRoot":"","sources":["../src/application.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,29 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { Response } from '@tyravel/http';
3
+ import { Application } from './application.js';
4
+ import { HttpKernel } from './http-kernel.js';
5
+ import { Route, setRouteApplication } from './route.js';
6
+ import { ServiceProvider } from './service-provider.js';
7
+ class AppServiceProvider extends ServiceProvider {
8
+ register() {
9
+ this.app.instance('greeting', 'Hello from Tyravel');
10
+ }
11
+ }
12
+ describe('Application', () => {
13
+ it('boots providers and resolves the router', async () => {
14
+ const app = new Application();
15
+ app.register(AppServiceProvider);
16
+ await app.boot();
17
+ expect(app.make('greeting')).toBe('Hello from Tyravel');
18
+ expect(app.router()).toBe(app.router());
19
+ });
20
+ it('dispatches requests through the kernel and route facade', async () => {
21
+ const app = new Application();
22
+ setRouteApplication(app);
23
+ Route.get('/', () => Response.json({ ok: true }));
24
+ const kernel = new HttpKernel(app);
25
+ const response = await kernel.handle(new Request('http://localhost/'));
26
+ expect(await response.json()).toEqual({ ok: true });
27
+ });
28
+ });
29
+ //# sourceMappingURL=application.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"application.test.js","sourceRoot":"","sources":["../src/application.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,kBAAmB,SAAQ,eAAe;IACrC,QAAQ;QACf,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,EAAE,oBAAoB,CAAC,CAAC;IACtD,CAAC;CACF;AAED,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,GAAG,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;QAEjC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAEjB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAS,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAChE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAEzB,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAElD,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAEvE,MAAM,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { ServiceProvider } from './service-provider.js';
2
+ export declare class AuthServiceProvider extends ServiceProvider {
3
+ register(): void;
4
+ boot(): void;
5
+ }
6
+ //# sourceMappingURL=auth-service-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-service-provider.d.ts","sourceRoot":"","sources":["../src/auth-service-provider.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,qBAAa,mBAAoB,SAAQ,eAAe;IAC7C,QAAQ;IA+FR,IAAI;CAQd"}
@@ -0,0 +1,71 @@
1
+ import { AuthManager, SessionGuard, TokenGuard, Gate, OAuthManager, PasswordResetBroker, PersonalAccessTokenRepository, createAuthMiddleware, createGuestMiddleware, createStartSessionMiddleware, DatabaseSessionStore, EloquentUserProvider, } from '@tyravel/auth';
2
+ import { ServiceProvider } from './service-provider.js';
3
+ export class AuthServiceProvider extends ServiceProvider {
4
+ register() {
5
+ const config = this.app.make('config');
6
+ const authConfig = config.get('auth');
7
+ const database = this.app.make('db');
8
+ const sessionConnection = database.connection(authConfig.session.connection);
9
+ const sessionStore = new DatabaseSessionStore(sessionConnection, authConfig.session.table);
10
+ const providers = new Map();
11
+ for (const [name, providerConfig] of Object.entries(authConfig.providers)) {
12
+ providers.set(name, new EloquentUserProvider(providerConfig.model));
13
+ }
14
+ let sessionGuardName = authConfig.defaults.guard;
15
+ const guardFactories = {};
16
+ const tokenTable = authConfig.tokens?.table ?? 'personal_access_tokens';
17
+ const tokenConnection = database.connection(authConfig.tokens?.connection);
18
+ const tokenRepository = new PersonalAccessTokenRepository(tokenConnection, tokenTable);
19
+ this.app.instance('auth.tokens', tokenRepository);
20
+ this.app.singleton(PersonalAccessTokenRepository, () => tokenRepository);
21
+ for (const [guardName, guardConfig] of Object.entries(authConfig.guards)) {
22
+ const provider = providers.get(guardConfig.provider);
23
+ if (!provider) {
24
+ throw new Error(`Auth provider not configured: ${guardConfig.provider}`);
25
+ }
26
+ if (guardConfig.driver === 'session') {
27
+ sessionGuardName = guardName;
28
+ guardFactories[guardName] = () => new SessionGuard(guardName, provider, sessionStore, authConfig.session);
29
+ }
30
+ else if (guardConfig.driver === 'token') {
31
+ guardFactories[guardName] = () => new TokenGuard(guardName, provider, tokenRepository);
32
+ }
33
+ }
34
+ const auth = new AuthManager(authConfig, guardFactories, sessionGuardName);
35
+ this.app.instance('auth', auth);
36
+ this.app.singleton(AuthManager, () => auth);
37
+ const gate = new Gate(this.app, authConfig.policies ?? {});
38
+ this.app.instance('gate', gate);
39
+ this.app.singleton(Gate, () => gate);
40
+ const defaultProviderConfig = authConfig.providers.users ?? Object.values(authConfig.providers)[0];
41
+ const defaultUserModel = defaultProviderConfig?.model;
42
+ if (authConfig.passwords && defaultUserModel) {
43
+ for (const [brokerName, brokerConfig] of Object.entries(authConfig.passwords)) {
44
+ const provider = providers.get(brokerConfig.provider);
45
+ if (!provider) {
46
+ continue;
47
+ }
48
+ const connection = database.connection(brokerConfig.connection);
49
+ const broker = new PasswordResetBroker(connection, brokerConfig, provider);
50
+ this.app.instance(`auth.password.${brokerName}`, broker);
51
+ if (brokerName === 'users') {
52
+ this.app.instance('auth.password', broker);
53
+ }
54
+ }
55
+ }
56
+ if (authConfig.oauth?.providers && defaultUserModel) {
57
+ const oauthConnection = database.connection(authConfig.oauth.connection);
58
+ const oauth = new OAuthManager(authConfig.oauth.providers, oauthConnection, authConfig.oauth.accountsTable ?? 'oauth_accounts', defaultUserModel);
59
+ this.app.instance('oauth', oauth);
60
+ this.app.singleton(OAuthManager, () => oauth);
61
+ }
62
+ }
63
+ boot() {
64
+ const auth = this.app.make('auth');
65
+ this.app.use(createStartSessionMiddleware(auth));
66
+ this.app.middleware('auth', createAuthMiddleware(auth));
67
+ this.app.middleware('auth:api', createAuthMiddleware(auth, 'api'));
68
+ this.app.middleware('guest', createGuestMiddleware(auth));
69
+ }
70
+ }
71
+ //# sourceMappingURL=auth-service-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-service-provider.js","sourceRoot":"","sources":["../src/auth-service-provider.ts"],"names":[],"mappings":"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"}
package/dist/auth.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ import type { Application } from './application.js';
2
+ import type { Authenticatable, NewAccessToken } from '@tyravel/auth';
3
+ export declare function setAuthApplication(app: Application): void;
4
+ export interface AuthFacade {
5
+ user(guard?: string): Authenticatable | null;
6
+ id(guard?: string): string | number | null;
7
+ check(guard?: string): Promise<boolean>;
8
+ attempt(credentials: Record<string, string>): Promise<boolean>;
9
+ login(user: Authenticatable): Promise<void>;
10
+ logout(): Promise<void>;
11
+ createToken(name: string, abilities?: string[]): Promise<NewAccessToken>;
12
+ }
13
+ export declare const Auth: AuthFacade;
14
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAKrE,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAEzD;AAoBD,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAAC;IAC7C,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC3C,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACxC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/D,KAAK,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CAC1E;AAED,eAAO,MAAM,IAAI,EAAE,UAelB,CAAC"}
package/dist/auth.js ADDED
@@ -0,0 +1,32 @@
1
+ let authApplication;
2
+ export function setAuthApplication(app) {
3
+ authApplication = app;
4
+ }
5
+ function resolveAuth() {
6
+ if (!authApplication) {
7
+ throw new Error('Auth facade requires an application. Call setAuthApplication(app) during bootstrap.');
8
+ }
9
+ return authApplication.make('auth');
10
+ }
11
+ function resolveTokens() {
12
+ if (!authApplication) {
13
+ throw new Error('Auth tokens require setAuthApplication(app) during bootstrap.');
14
+ }
15
+ return authApplication.make('auth.tokens');
16
+ }
17
+ export const Auth = {
18
+ user: (guard) => resolveAuth().user(guard),
19
+ id: (guard) => resolveAuth().id(guard),
20
+ check: (guard) => resolveAuth().check(guard),
21
+ attempt: (credentials) => resolveAuth().attempt(credentials),
22
+ login: (user) => resolveAuth().login(user),
23
+ logout: () => resolveAuth().logout(),
24
+ createToken: async (name, abilities) => {
25
+ const user = resolveAuth().user('api') ?? resolveAuth().user();
26
+ if (!user) {
27
+ throw new Error('Cannot create API token without an authenticated user.');
28
+ }
29
+ return resolveTokens().createToken(user, name, abilities);
30
+ },
31
+ };
32
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAKA,IAAI,eAAwC,CAAC;AAE7C,MAAM,UAAU,kBAAkB,CAAC,GAAgB;IACjD,eAAe,GAAG,GAAG,CAAC;AACxB,CAAC;AAED,SAAS,WAAW;IAClB,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CACb,qFAAqF,CACtF,CAAC;IACJ,CAAC;IAED,OAAO,eAAe,CAAC,IAAI,CAAc,MAAM,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,aAAa;IACpB,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;IACnF,CAAC;IAED,OAAO,eAAe,CAAC,IAAI,CAAgC,aAAa,CAAC,CAAC;AAC5E,CAAC;AAYD,MAAM,CAAC,MAAM,IAAI,GAAe;IAC9B,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;IAC1C,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;IACtC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;IAC5C,OAAO,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC;IAC5D,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;IAC1C,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE;IACpC,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;QACrC,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;QAC/D,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC5E,CAAC;QAED,OAAO,aAAa,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IAC5D,CAAC;CACF,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { ServiceProvider } from './service-provider.js';
2
+ export declare class CacheServiceProvider extends ServiceProvider {
3
+ register(): void;
4
+ }
5
+ //# sourceMappingURL=cache-service-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-service-provider.d.ts","sourceRoot":"","sources":["../src/cache-service-provider.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,qBAAa,oBAAqB,SAAQ,eAAe;IAC9C,QAAQ;CAUlB"}
@@ -0,0 +1,14 @@
1
+ import { CacheManager, CacheRepository } from '@tyravel/cache';
2
+ import { ServiceProvider } from './service-provider.js';
3
+ export class CacheServiceProvider extends ServiceProvider {
4
+ register() {
5
+ const config = this.app.make('config');
6
+ const cacheConfig = config.get('cache');
7
+ const manager = new CacheManager(cacheConfig);
8
+ const repository = new CacheRepository(manager);
9
+ this.app.instance('cache', repository);
10
+ this.app.singleton(CacheManager, () => manager);
11
+ this.app.singleton(CacheRepository, () => repository);
12
+ }
13
+ }
14
+ //# sourceMappingURL=cache-service-provider.js.map
@@ -0,0 +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;AACjF,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;QAC9C,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;CACF"}
@@ -0,0 +1,12 @@
1
+ import type { Application } from './application.js';
2
+ export declare function setCacheApplication(app: Application): void;
3
+ export interface CacheFacade {
4
+ get<T = unknown>(key: string): Promise<T | null>;
5
+ put(key: string, value: unknown, ttlSeconds?: number): Promise<void>;
6
+ forget(key: string): Promise<boolean>;
7
+ has(key: string): Promise<boolean>;
8
+ remember<T>(key: string, ttlSeconds: number, callback: () => T | Promise<T>): Promise<T>;
9
+ flush(): Promise<void>;
10
+ }
11
+ export declare const Cache: CacheFacade;
12
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAIpD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAE1D;AASD,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACjD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACzF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,eAAO,MAAM,KAAK,EAAE,WAOnB,CAAC"}
package/dist/cache.js ADDED
@@ -0,0 +1,19 @@
1
+ let cacheApplication;
2
+ export function setCacheApplication(app) {
3
+ cacheApplication = app;
4
+ }
5
+ function resolveCache() {
6
+ if (!cacheApplication) {
7
+ throw new Error('Cache facade is not ready. Boot the application first.');
8
+ }
9
+ return cacheApplication.make('cache');
10
+ }
11
+ export const Cache = {
12
+ get: (key) => resolveCache().get(key),
13
+ put: (key, value, ttl) => resolveCache().put(key, value, ttl),
14
+ forget: (key) => resolveCache().forget(key),
15
+ has: (key) => resolveCache().has(key),
16
+ remember: (key, ttl, callback) => resolveCache().remember(key, ttl, callback),
17
+ flush: () => resolveCache().flush(),
18
+ };
19
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAGA,IAAI,gBAAyC,CAAC;AAE9C,MAAM,UAAU,mBAAmB,CAAC,GAAgB;IAClD,gBAAgB,GAAG,GAAG,CAAC;AACzB,CAAC;AAED,SAAS,YAAY;IACnB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,gBAAgB,CAAC,IAAI,CAAkB,OAAO,CAAC,CAAC;AACzD,CAAC;AAWD,MAAM,CAAC,MAAM,KAAK,GAAgB;IAChC,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC;IACrC,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC;IAC7D,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC;IAC3C,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC;IACrC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC;IAC7E,KAAK,EAAE,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE;CACpC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { ServiceProvider } from './service-provider.js';
2
+ export declare class ConfigServiceProvider extends ServiceProvider {
3
+ register(): Promise<void>;
4
+ }
5
+ //# sourceMappingURL=config-service-provider.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,11 @@
1
+ import { ConfigRepository, loadConfig } from '@tyravel/config';
2
+ import { ServiceProvider } from './service-provider.js';
3
+ export class ConfigServiceProvider extends ServiceProvider {
4
+ async register() {
5
+ const config = await loadConfig(this.app.basePath);
6
+ const repository = new ConfigRepository(config);
7
+ this.app.instance('config', repository);
8
+ this.app.singleton(ConfigRepository, () => repository);
9
+ }
10
+ }
11
+ //# sourceMappingURL=config-service-provider.js.map
@@ -0,0 +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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config-service-provider.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-service-provider.test.d.ts","sourceRoot":"","sources":["../src/config-service-provider.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,27 @@
1
+ import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';
2
+ import { tmpdir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import { afterEach, describe, expect, it } from 'vitest';
5
+ import { Application } from './application.js';
6
+ import { ConfigServiceProvider } from './config-service-provider.js';
7
+ describe('ConfigServiceProvider', () => {
8
+ let tempDir = '';
9
+ afterEach(() => {
10
+ if (tempDir) {
11
+ rmSync(tempDir, { recursive: true, force: true });
12
+ tempDir = '';
13
+ }
14
+ });
15
+ it('loads typed config files into the container', async () => {
16
+ tempDir = mkdtempSync(join(tmpdir(), 'tyravel-config-'));
17
+ mkdirSync(join(tempDir, 'config'), { recursive: true });
18
+ writeFileSync(join(tempDir, 'config', 'app.js'), 'export default { name: "Tyravel", debug: true };');
19
+ const app = new Application(tempDir);
20
+ app.register(ConfigServiceProvider);
21
+ await app.boot();
22
+ const config = app.make('config');
23
+ expect(config.get('app.name')).toBe('Tyravel');
24
+ expect(config.get('app.debug')).toBe(true);
25
+ });
26
+ });
27
+ //# sourceMappingURL=config-service-provider.test.js.map
@@ -0,0 +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"}
@@ -0,0 +1,8 @@
1
+ import type { Constructor } from '@tyravel/container';
2
+ import type { RouteHandler } from '@tyravel/http';
3
+ import type { Application } from './application.js';
4
+ export type ControllerConstructor = Constructor<object>;
5
+ export type ControllerAction = [ControllerConstructor, string];
6
+ export declare function isControllerAction(handler: unknown): handler is ControllerAction;
7
+ export declare function createControllerHandler(app: Application, action: ControllerAction): RouteHandler;
8
+ //# sourceMappingURL=controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../src/controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,eAAe,CAAC;AAElE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,MAAM,qBAAqB,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;AACxD,MAAM,MAAM,gBAAgB,GAAG,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAE/D,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,gBAAgB,CAOhF;AAED,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,gBAAgB,GACvB,YAAY,CAiBd"}
@@ -0,0 +1,30 @@
1
+ import { Response } from '@tyravel/http';
2
+ export function isControllerAction(handler) {
3
+ return (Array.isArray(handler) &&
4
+ handler.length === 2 &&
5
+ typeof handler[0] === 'function' &&
6
+ typeof handler[1] === 'string');
7
+ }
8
+ export function createControllerHandler(app, action) {
9
+ const [Controller, method] = action;
10
+ return async (request) => {
11
+ const controller = app.make(Controller);
12
+ const handler = controller[method];
13
+ if (typeof handler !== 'function') {
14
+ throw new Error(`Controller action not found: ${Controller.name}@${method}`);
15
+ }
16
+ const result = await handler.call(controller, request);
17
+ return normalizeControllerResult(result);
18
+ };
19
+ }
20
+ const WebResponse = globalThis.Response;
21
+ function normalizeControllerResult(result) {
22
+ if (result instanceof WebResponse) {
23
+ return result;
24
+ }
25
+ if (result === undefined || result === null) {
26
+ return Response.noContent();
27
+ }
28
+ return Response.json(result);
29
+ }
30
+ //# sourceMappingURL=controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller.js","sourceRoot":"","sources":["../src/controller.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAMzC,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,OAAO,CACL,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QACtB,OAAO,CAAC,MAAM,KAAK,CAAC;QACpB,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,UAAU;QAChC,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,QAAQ,CAC/B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,GAAgB,EAChB,MAAwB;IAExB,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC;IAEpC,OAAO,KAAK,EAAE,OAAuB,EAAE,EAAE;QACvC,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxC,MAAM,OAAO,GAAI,UAAsC,CAAC,MAAM,CAAC,CAAC;QAEhE,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,gCAAgC,UAAU,CAAC,IAAI,IAAI,MAAM,EAAE,CAAC,CAAC;QAC/E,CAAC;QAED,MAAM,MAAM,GAAG,MAAO,OAAgD,CAAC,IAAI,CACzE,UAAU,EACV,OAAO,CACR,CAAC;QACF,OAAO,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC;AAExC,SAAS,yBAAyB,CAAC,MAAe;IAChD,IAAI,MAAM,YAAY,WAAW,EAAE,CAAC;QAClC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QAC5C,OAAO,QAAQ,CAAC,SAAS,EAAE,CAAC;IAC9B,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=controller.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller.test.d.ts","sourceRoot":"","sources":["../src/controller.test.ts"],"names":[],"mappings":""}