@shohaghinfo/aerojs 0.2.0 → 0.3.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 (73) hide show
  1. package/README.md +110 -0
  2. package/dist/auth/index.d.ts +1 -0
  3. package/dist/auth/index.d.ts.map +1 -1
  4. package/dist/auth/index.js +1 -0
  5. package/dist/auth/index.js.map +1 -1
  6. package/dist/auth/oauth/github-driver.d.ts +16 -0
  7. package/dist/auth/oauth/github-driver.d.ts.map +1 -0
  8. package/dist/auth/oauth/github-driver.js +79 -0
  9. package/dist/auth/oauth/github-driver.js.map +1 -0
  10. package/dist/auth/oauth/google-driver.d.ts +16 -0
  11. package/dist/auth/oauth/google-driver.d.ts.map +1 -0
  12. package/dist/auth/oauth/google-driver.js +63 -0
  13. package/dist/auth/oauth/google-driver.js.map +1 -0
  14. package/dist/auth/oauth/index.d.ts +9 -0
  15. package/dist/auth/oauth/index.d.ts.map +1 -0
  16. package/dist/auth/oauth/index.js +9 -0
  17. package/dist/auth/oauth/index.js.map +1 -0
  18. package/dist/auth/oauth/oauth-driver.d.ts +35 -0
  19. package/dist/auth/oauth/oauth-driver.d.ts.map +1 -0
  20. package/dist/auth/oauth/oauth-driver.js +6 -0
  21. package/dist/auth/oauth/oauth-driver.js.map +1 -0
  22. package/dist/auth/oauth/oauth-manager.d.ts +26 -0
  23. package/dist/auth/oauth/oauth-manager.d.ts.map +1 -0
  24. package/dist/auth/oauth/oauth-manager.js +86 -0
  25. package/dist/auth/oauth/oauth-manager.js.map +1 -0
  26. package/dist/cli/commands/make.d.ts +5 -0
  27. package/dist/cli/commands/make.d.ts.map +1 -1
  28. package/dist/cli/commands/make.js +119 -0
  29. package/dist/cli/commands/make.js.map +1 -1
  30. package/dist/cli/runner.d.ts.map +1 -1
  31. package/dist/cli/runner.js +56 -1
  32. package/dist/cli/runner.js.map +1 -1
  33. package/dist/core/application.d.ts +5 -0
  34. package/dist/core/application.d.ts.map +1 -1
  35. package/dist/core/application.js +12 -0
  36. package/dist/core/application.js.map +1 -1
  37. package/dist/core/context.d.ts +4 -0
  38. package/dist/core/context.d.ts.map +1 -1
  39. package/dist/core/context.js +8 -0
  40. package/dist/core/context.js.map +1 -1
  41. package/dist/index.d.ts +1 -0
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +1 -0
  44. package/dist/index.js.map +1 -1
  45. package/dist/notifications/index.d.ts +7 -0
  46. package/dist/notifications/index.d.ts.map +1 -0
  47. package/dist/notifications/index.js +7 -0
  48. package/dist/notifications/index.js.map +1 -0
  49. package/dist/notifications/notification-manager.d.ts +39 -0
  50. package/dist/notifications/notification-manager.d.ts.map +1 -0
  51. package/dist/notifications/notification-manager.js +130 -0
  52. package/dist/notifications/notification-manager.js.map +1 -0
  53. package/dist/notifications/notification.d.ts +48 -0
  54. package/dist/notifications/notification.d.ts.map +1 -0
  55. package/dist/notifications/notification.js +9 -0
  56. package/dist/notifications/notification.js.map +1 -0
  57. package/dist/security/index.d.ts +1 -0
  58. package/dist/security/index.d.ts.map +1 -1
  59. package/dist/security/index.js +1 -0
  60. package/dist/security/index.js.map +1 -1
  61. package/dist/security/signed-url.d.ts +29 -0
  62. package/dist/security/signed-url.d.ts.map +1 -0
  63. package/dist/security/signed-url.js +86 -0
  64. package/dist/security/signed-url.js.map +1 -0
  65. package/dist/storage/drivers/local-driver.d.ts +1 -0
  66. package/dist/storage/drivers/local-driver.d.ts.map +1 -1
  67. package/dist/storage/drivers/local-driver.js +5 -0
  68. package/dist/storage/drivers/local-driver.js.map +1 -1
  69. package/dist/storage/drivers/memory-driver.d.ts +1 -0
  70. package/dist/storage/drivers/memory-driver.d.ts.map +1 -1
  71. package/dist/storage/drivers/memory-driver.js +5 -0
  72. package/dist/storage/drivers/memory-driver.js.map +1 -1
  73. package/package.json +9 -1
@@ -0,0 +1,130 @@
1
+ /**
2
+ * @file notification-manager.ts
3
+ * @description Central Notification Dispatcher and Facade for AeroJS.
4
+ * Dispatches notifications across multiple channels (mail, database, broadcast, sms, custom).
5
+ */
6
+ import * as crypto from 'node:crypto';
7
+ import { Mail } from '../mail/mailer.js';
8
+ import { DB } from '../database/connection.js';
9
+ export class NotificationManager {
10
+ channels = new Map();
11
+ isFaked = false;
12
+ sentRecords = [];
13
+ constructor() {
14
+ this.registerDefaultChannels();
15
+ }
16
+ registerDefaultChannels() {
17
+ // 1. Mail Channel
18
+ this.channels.set('mail', async (notifiable, notification) => {
19
+ if (typeof notification.toMail !== 'function')
20
+ return;
21
+ const mailMessage = await notification.toMail(notifiable);
22
+ // If no explicit recipient on message, infer from notifiable
23
+ if (mailMessage.toAddresses.length === 0) {
24
+ const email = notifiable.email || notifiable.emailAddress;
25
+ if (email) {
26
+ mailMessage.to(email);
27
+ }
28
+ }
29
+ return await Mail.send(mailMessage);
30
+ });
31
+ // 2. Database Channel
32
+ this.channels.set('database', async (notifiable, notification) => {
33
+ if (typeof notification.toDatabase !== 'function')
34
+ return;
35
+ const data = await notification.toDatabase(notifiable);
36
+ const id = notification.id || crypto.randomUUID();
37
+ const record = {
38
+ id,
39
+ type: notification.constructor.name,
40
+ notifiableType: notifiable.constructor?.name || 'User',
41
+ notifiableId: notifiable.id,
42
+ data,
43
+ readAt: null,
44
+ createdAt: new Date(),
45
+ };
46
+ try {
47
+ await DB.table('notifications').insert(record);
48
+ }
49
+ catch {
50
+ // Fallback if table doesn't exist yet in tests
51
+ }
52
+ return record;
53
+ });
54
+ // 3. Broadcast Channel
55
+ this.channels.set('broadcast', async (notifiable, notification) => {
56
+ if (typeof notification.toBroadcast !== 'function')
57
+ return;
58
+ const broadcastData = await notification.toBroadcast(notifiable);
59
+ return broadcastData;
60
+ });
61
+ }
62
+ extend(channelName, handler) {
63
+ this.channels.set(channelName.toLowerCase(), handler);
64
+ return this;
65
+ }
66
+ /**
67
+ * Dispatches a notification to one or multiple notifiable recipients.
68
+ */
69
+ async send(notifiables, notification) {
70
+ const list = Array.isArray(notifiables) ? notifiables : [notifiables];
71
+ for (const notifiable of list) {
72
+ const channels = await notification.via(notifiable);
73
+ if (this.isFaked) {
74
+ this.sentRecords.push({ notifiable, notification, channels });
75
+ continue;
76
+ }
77
+ for (const channel of channels) {
78
+ const handler = this.channels.get(channel.toLowerCase());
79
+ if (handler) {
80
+ await handler(notifiable, notification);
81
+ }
82
+ }
83
+ }
84
+ }
85
+ /**
86
+ * Enables mock recording for testing assertions.
87
+ */
88
+ fake() {
89
+ this.isFaked = true;
90
+ this.sentRecords = [];
91
+ }
92
+ restore() {
93
+ this.isFaked = false;
94
+ this.sentRecords = [];
95
+ }
96
+ getSent() {
97
+ return this.sentRecords;
98
+ }
99
+ assertSentTo(notifiable, notificationClass, callback) {
100
+ const found = this.sentRecords.some((record) => {
101
+ const matchesNotifiable = record.notifiable === notifiable || record.notifiable.id === notifiable.id;
102
+ const matchesClass = record.notification instanceof notificationClass || record.notification.constructor.name === notificationClass.name;
103
+ if (!matchesNotifiable || !matchesClass)
104
+ return false;
105
+ return callback ? callback(record.notification) : true;
106
+ });
107
+ if (!found) {
108
+ throw new Error(`Expected notification ${notificationClass.name} was not sent to notifiable.`);
109
+ }
110
+ }
111
+ assertNotSentTo(notifiable, notificationClass) {
112
+ const found = this.sentRecords.some((record) => {
113
+ const matchesNotifiable = record.notifiable === notifiable || record.notifiable.id === notifiable.id;
114
+ const matchesClass = record.notification instanceof notificationClass || record.notification.constructor.name === notificationClass.name;
115
+ return matchesNotifiable && matchesClass;
116
+ });
117
+ if (found) {
118
+ throw new Error(`Unexpected notification ${notificationClass.name} was sent to notifiable.`);
119
+ }
120
+ }
121
+ }
122
+ export const Notifications = new NotificationManager();
123
+ /**
124
+ * Mixin / Helper function to send notification from a user/patient model.
125
+ * Example: notify(user, new InvoiceNotification(inv));
126
+ */
127
+ export async function notify(notifiable, notification) {
128
+ return await Notifications.send(notifiable, notification);
129
+ }
130
+ //# sourceMappingURL=notification-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification-manager.js","sourceRoot":"","sources":["../../src/notifications/notification-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * @file notification.ts
3
+ * @description Base Notification class for AeroJS multi-channel dispatch.
4
+ */
5
+ import { MailMessage } from '../mail/message.js';
6
+ export interface DatabaseNotificationRecord {
7
+ id: string;
8
+ type: string;
9
+ notifiableType?: string;
10
+ notifiableId?: string | number;
11
+ data: Record<string, any>;
12
+ readAt?: Date | null;
13
+ createdAt: Date;
14
+ }
15
+ export interface BroadcastNotificationData {
16
+ channel: string;
17
+ event: string;
18
+ data: Record<string, any>;
19
+ }
20
+ export interface SmsNotificationData {
21
+ to: string;
22
+ message: string;
23
+ }
24
+ export declare abstract class Notification {
25
+ id?: string;
26
+ /**
27
+ * Defines which channels this notification should be sent through.
28
+ * E.g. ['mail', 'database', 'broadcast', 'sms']
29
+ */
30
+ abstract via(notifiable: any): string[] | Promise<string[]>;
31
+ /**
32
+ * Builds the email representation of the notification.
33
+ */
34
+ toMail?(notifiable: any): MailMessage | Promise<MailMessage>;
35
+ /**
36
+ * Builds the database representation of the notification.
37
+ */
38
+ toDatabase?(notifiable: any): Record<string, any> | Promise<Record<string, any>>;
39
+ /**
40
+ * Builds the realtime broadcast payload.
41
+ */
42
+ toBroadcast?(notifiable: any): BroadcastNotificationData | Promise<BroadcastNotificationData>;
43
+ /**
44
+ * Builds the SMS payload.
45
+ */
46
+ toSms?(notifiable: any): SmsNotificationData | Promise<SmsNotificationData>;
47
+ }
48
+ //# sourceMappingURL=notification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification.d.ts","sourceRoot":"","sources":["../../src/notifications/notification.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1B,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,8BAAsB,YAAY;IACzB,EAAE,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;aACa,GAAG,CAAC,UAAU,EAAE,GAAG,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAElE;;OAEG;IACI,MAAM,CAAC,CAAC,UAAU,EAAE,GAAG,GAAG,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IAEnE;;OAEG;IACI,UAAU,CAAC,CAAC,UAAU,EAAE,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEvF;;OAEG;IACI,WAAW,CAAC,CAAC,UAAU,EAAE,GAAG,GAAG,yBAAyB,GAAG,OAAO,CAAC,yBAAyB,CAAC;IAEpG;;OAEG;IACI,KAAK,CAAC,CAAC,UAAU,EAAE,GAAG,GAAG,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC;CACnF"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @file notification.ts
3
+ * @description Base Notification class for AeroJS multi-channel dispatch.
4
+ */
5
+ import { MailMessage } from '../mail/message.js';
6
+ export class Notification {
7
+ id;
8
+ }
9
+ //# sourceMappingURL=notification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification.js","sourceRoot":"","sources":["../../src/notifications/notification.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAuBjD,MAAM,OAAgB,YAAY;IACzB,EAAE,CAAU;CA2BpB"}
@@ -10,4 +10,5 @@ export { Hash, hash, hashVerify, type ScryptOptions, } from './hash.js';
10
10
  export { cors, type CorsOptions, } from '../middleware/cors.js';
11
11
  export * from './totp.js';
12
12
  export * from './vault.js';
13
+ export * from './signed-url.js';
13
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/security/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,GAAG,EACH,IAAI,EACJ,MAAM,EACN,MAAM,EACN,OAAO,EACP,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,cAAc,GACpB,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,SAAS,EACT,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,0BAA0B,GAChC,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,eAAe,EACf,KAAK,sBAAsB,EAC3B,KAAK,WAAW,EAChB,KAAK,+BAA+B,GACrC,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,IAAI,EACJ,KAAK,WAAW,GACjB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,IAAI,EACJ,IAAI,EACJ,UAAU,EACV,KAAK,aAAa,GACnB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,IAAI,EACJ,KAAK,WAAW,GACjB,MAAM,uBAAuB,CAAC;AAE/B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/security/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,GAAG,EACH,IAAI,EACJ,MAAM,EACN,MAAM,EACN,OAAO,EACP,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,cAAc,GACpB,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,SAAS,EACT,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,0BAA0B,GAChC,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,eAAe,EACf,KAAK,sBAAsB,EAC3B,KAAK,WAAW,EAChB,KAAK,+BAA+B,GACrC,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,IAAI,EACJ,KAAK,WAAW,GACjB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,IAAI,EACJ,IAAI,EACJ,UAAU,EACV,KAAK,aAAa,GACnB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,IAAI,EACJ,KAAK,WAAW,GACjB,MAAM,uBAAuB,CAAC;AAE/B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC"}
@@ -10,4 +10,5 @@ export { Hash, hash, hashVerify, } from './hash.js';
10
10
  export { cors, } from '../middleware/cors.js';
11
11
  export * from './totp.js';
12
12
  export * from './vault.js';
13
+ export * from './signed-url.js';
13
14
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/security/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,GAAG,EACH,IAAI,EACJ,MAAM,EACN,MAAM,EACN,OAAO,EACP,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,GAOf,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,SAAS,EACT,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,GAKrB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,eAAe,GAIhB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,IAAI,GAEL,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,IAAI,EACJ,IAAI,EACJ,UAAU,GAEX,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,IAAI,GAEL,MAAM,uBAAuB,CAAC;AAE/B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/security/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,GAAG,EACH,IAAI,EACJ,MAAM,EACN,MAAM,EACN,OAAO,EACP,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,GAOf,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,SAAS,EACT,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,GAKrB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,eAAe,GAIhB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,IAAI,GAEL,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,IAAI,EACJ,IAAI,EACJ,UAAU,GAEX,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,IAAI,GAEL,MAAM,uBAAuB,CAAC;AAE/B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * @file signed-url.ts
3
+ * @description Tamper-proof HMAC URL Signing & Validation for AeroJS.
4
+ * Supports temporary expiring signed URLs for private downloads, password resets, and webhooks.
5
+ */
6
+ import type { Middleware } from '../core/types.js';
7
+ export interface SignUrlOptions {
8
+ expiresIn?: number;
9
+ key?: string;
10
+ }
11
+ export declare class UrlSigner {
12
+ private static defaultKey;
13
+ static setDefaultKey(key: string): void;
14
+ static getDefaultKey(): string;
15
+ /**
16
+ * Generates a signed URL with timestamp and HMAC signature.
17
+ */
18
+ static sign(url: string, options?: SignUrlOptions): string;
19
+ /**
20
+ * Verifies if a given URL has a valid and unexpired HMAC signature.
21
+ */
22
+ static hasValidSignature(url: string, key?: string): boolean;
23
+ private static getPayload;
24
+ }
25
+ /**
26
+ * Middleware that validates the incoming request has a valid, non-expired signed URL.
27
+ */
28
+ export declare function validateSignedUrl(key?: string): Middleware;
29
+ //# sourceMappingURL=signed-url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signed-url.d.ts","sourceRoot":"","sources":["../../src/security/signed-url.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAgB,MAAM,kBAAkB,CAAC;AAIjE,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAC,UAAU,CAAoG;WAE/G,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;WAIhC,aAAa,IAAI,MAAM;IAIrC;;OAEG;WACW,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,MAAM;IAsBrE;;OAEG;WACW,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO;IAmCnE,OAAO,CAAC,MAAM,CAAC,UAAU;CAM1B;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,UAAU,CAW1D"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * @file signed-url.ts
3
+ * @description Tamper-proof HMAC URL Signing & Validation for AeroJS.
4
+ * Supports temporary expiring signed URLs for private downloads, password resets, and webhooks.
5
+ */
6
+ import * as crypto from 'node:crypto';
7
+ import { ForbiddenError } from '../core/errors.js';
8
+ export class UrlSigner {
9
+ static defaultKey = process.env.APP_KEY || process.env.AERO_KEY || 'aero-default-signing-secret-key-32chars';
10
+ static setDefaultKey(key) {
11
+ this.defaultKey = key;
12
+ }
13
+ static getDefaultKey() {
14
+ return this.defaultKey;
15
+ }
16
+ /**
17
+ * Generates a signed URL with timestamp and HMAC signature.
18
+ */
19
+ static sign(url, options = {}) {
20
+ const key = options.key || this.defaultKey;
21
+ const urlObj = new URL(url, 'http://localhost');
22
+ const expiresIn = options.expiresIn ?? 3600; // Default: 1 hour
23
+ const expiresAt = Math.floor(Date.now() / 1000) + expiresIn;
24
+ urlObj.searchParams.set('expires', String(expiresAt));
25
+ // Remove old signature if present
26
+ urlObj.searchParams.delete('signature');
27
+ // Create signature payload: pathname + sorted query string
28
+ const payload = this.getPayload(urlObj);
29
+ const signature = crypto.createHmac('sha256', key).update(payload).digest('hex');
30
+ urlObj.searchParams.set('signature', signature);
31
+ if (url.startsWith('http://') || url.startsWith('https://')) {
32
+ return urlObj.toString();
33
+ }
34
+ return `${urlObj.pathname}${urlObj.search}`;
35
+ }
36
+ /**
37
+ * Verifies if a given URL has a valid and unexpired HMAC signature.
38
+ */
39
+ static hasValidSignature(url, key) {
40
+ const secret = key || this.defaultKey;
41
+ const urlObj = new URL(url, 'http://localhost');
42
+ const signature = urlObj.searchParams.get('signature');
43
+ const expiresStr = urlObj.searchParams.get('expires');
44
+ if (!signature || !expiresStr) {
45
+ return false;
46
+ }
47
+ const expires = parseInt(expiresStr, 10);
48
+ if (isNaN(expires)) {
49
+ return false;
50
+ }
51
+ // Check expiration
52
+ const now = Math.floor(Date.now() / 1000);
53
+ if (now > expires) {
54
+ return false;
55
+ }
56
+ // Remove signature to compute expected signature
57
+ urlObj.searchParams.delete('signature');
58
+ const payload = this.getPayload(urlObj);
59
+ const expectedSignature = crypto.createHmac('sha256', secret).update(payload).digest('hex');
60
+ // Constant-time comparison to prevent timing attacks
61
+ if (signature.length !== expectedSignature.length) {
62
+ return false;
63
+ }
64
+ return crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expectedSignature));
65
+ }
66
+ static getPayload(urlObj) {
67
+ // Sort query keys for consistent hashing
68
+ const params = Array.from(urlObj.searchParams.entries()).sort(([a], [b]) => a.localeCompare(b));
69
+ const sortedQuery = params.map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`).join('&');
70
+ return `${urlObj.pathname}?${sortedQuery}`;
71
+ }
72
+ }
73
+ /**
74
+ * Middleware that validates the incoming request has a valid, non-expired signed URL.
75
+ */
76
+ export function validateSignedUrl(key) {
77
+ return async (ctx, next) => {
78
+ const fullUrl = ctx.req.url || '/';
79
+ const isValid = UrlSigner.hasValidSignature(fullUrl, key);
80
+ if (!isValid) {
81
+ throw new ForbiddenError('Invalid or expired URL signature.');
82
+ }
83
+ await next();
84
+ };
85
+ }
86
+ //# sourceMappingURL=signed-url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signed-url.js","sourceRoot":"","sources":["../../src/security/signed-url.ts"],"names":[],"mappings":"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"}
@@ -19,6 +19,7 @@ export declare class LocalStorageDriver implements StorageDriver {
19
19
  delete(path: string): Promise<boolean>;
20
20
  size(path: string): Promise<number>;
21
21
  url(path: string): string;
22
+ temporaryUrl(path: string, expiresInSeconds?: number): Promise<string>;
22
23
  resolveSafePath(path: string): string;
23
24
  private normalizeRelative;
24
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"local-driver.d.ts","sourceRoot":"","sources":["../../../src/storage/drivers/local-driver.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,kBAAmB,YAAW,aAAa;IACtD,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,EAAE,mBAAmB;IAK3B,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAczE,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKlC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,cAAwB,GAAG,OAAO,CAAC,MAAM,CAAC;IAK1E,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUtC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUtC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAMzC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAKzB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAS5C,OAAO,CAAC,iBAAiB;CAG1B"}
1
+ {"version":3,"file":"local-driver.d.ts","sourceRoot":"","sources":["../../../src/storage/drivers/local-driver.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,kBAAmB,YAAW,aAAa;IACtD,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,EAAE,mBAAmB;IAK3B,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAczE,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKlC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,cAAwB,GAAG,OAAO,CAAC,MAAM,CAAC;IAK1E,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUtC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUtC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAMzC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAKnB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,gBAAgB,SAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAK1E,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAS5C,OAAO,CAAC,iBAAiB;CAG1B"}
@@ -5,6 +5,7 @@
5
5
  */
6
6
  import { readFile, writeFile, unlink, stat, mkdir } from 'node:fs/promises';
7
7
  import { resolve, dirname, normalize } from 'node:path';
8
+ import { UrlSigner } from '../../security/signed-url.js';
8
9
  export class LocalStorageDriver {
9
10
  root;
10
11
  baseUrl;
@@ -60,6 +61,10 @@ export class LocalStorageDriver {
60
61
  const rel = this.normalizeRelative(path);
61
62
  return `${this.baseUrl}/${rel}`.replace(/\/+/g, '/');
62
63
  }
64
+ async temporaryUrl(path, expiresInSeconds = 3600) {
65
+ const rawUrl = this.url(path);
66
+ return UrlSigner.sign(rawUrl, { expiresIn: expiresInSeconds });
67
+ }
63
68
  resolveSafePath(path) {
64
69
  const cleanRel = path.replace(/^[\\/]+/, '');
65
70
  const target = resolve(this.root, cleanRel);
@@ -1 +1 @@
1
- {"version":3,"file":"local-driver.js","sourceRoot":"","sources":["../../../src/storage/drivers/local-driver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"local-driver.js","sourceRoot":"","sources":["../../../src/storage/drivers/local-driver.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,7 @@ export declare class MemoryStorageDriver implements StorageDriver {
17
17
  delete(path: string): Promise<boolean>;
18
18
  size(path: string): Promise<number>;
19
19
  url(path: string): string;
20
+ temporaryUrl(path: string, expiresInSeconds?: number): Promise<string>;
20
21
  clear(): void;
21
22
  private normalize;
22
23
  }
@@ -1 +1 @@
1
- {"version":3,"file":"memory-driver.d.ts","sourceRoot":"","sources":["../../../src/storage/drivers/memory-driver.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,qBAAa,mBAAoB,YAAW,aAAa;IACvD,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAO;IAIjC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAYzE,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IASlC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,cAAwB,GAAG,OAAO,CAAC,MAAM,CAAC;IAK1E,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAItC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAItC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKzC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAKzB,KAAK,IAAI,IAAI;IAIpB,OAAO,CAAC,SAAS;CAGlB"}
1
+ {"version":3,"file":"memory-driver.d.ts","sourceRoot":"","sources":["../../../src/storage/drivers/memory-driver.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD,qBAAa,mBAAoB,YAAW,aAAa;IACvD,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAO;IAIjC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAYzE,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IASlC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,cAAwB,GAAG,OAAO,CAAC,MAAM,CAAC;IAK1E,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAItC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAItC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKzC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAKnB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,gBAAgB,SAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAK1E,KAAK,IAAI,IAAI;IAIpB,OAAO,CAAC,SAAS;CAGlB"}
@@ -3,6 +3,7 @@
3
3
  * @description In-memory storage driver for AeroJS.
4
4
  * Perfect for ephemeral cache, fast testing, and non-persistent uploads.
5
5
  */
6
+ import { UrlSigner } from '../../security/signed-url.js';
6
7
  export class MemoryStorageDriver {
7
8
  files = new Map();
8
9
  baseUrl;
@@ -45,6 +46,10 @@ export class MemoryStorageDriver {
45
46
  const norm = this.normalize(path);
46
47
  return `${this.baseUrl}/${norm}`.replace(/\/+/g, '/');
47
48
  }
49
+ async temporaryUrl(path, expiresInSeconds = 3600) {
50
+ const rawUrl = this.url(path);
51
+ return UrlSigner.sign(rawUrl, { expiresIn: expiresInSeconds });
52
+ }
48
53
  clear() {
49
54
  this.files.clear();
50
55
  }
@@ -1 +1 @@
1
- {"version":3,"file":"memory-driver.js","sourceRoot":"","sources":["../../../src/storage/drivers/memory-driver.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,OAAO,mBAAmB;IACtB,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IAClC,OAAO,CAAS;IAExB,YAAY,UAAgC,EAAE;QAC5C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,UAAU,CAAC;IAC/C,CAAC;IAEM,KAAK,CAAC,GAAG,CAAC,IAAY,EAAE,OAAqC;QAClE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;YAClC,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,OAAO,OAAO,KAAK,QAAQ;gBAC7B,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC;gBAC/B,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEzB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,KAAK,CAAC,GAAG,CAAC,IAAY;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,WAA2B,OAAO;QACnE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjC,OAAO,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,IAAY;QAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9C,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,IAAY;QAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACjD,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,IAAY;QAC5B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjC,OAAO,GAAG,CAAC,MAAM,CAAC;IACpB,CAAC;IAEM,GAAG,CAAC,IAAY;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAClC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACxD,CAAC;IAEM,KAAK;QACV,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAEO,SAAS,CAAC,IAAY;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACzD,CAAC;CACF"}
1
+ {"version":3,"file":"memory-driver.js","sourceRoot":"","sources":["../../../src/storage/drivers/memory-driver.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAEzD,MAAM,OAAO,mBAAmB;IACtB,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IAClC,OAAO,CAAS;IAExB,YAAY,UAAgC,EAAE;QAC5C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,UAAU,CAAC;IAC/C,CAAC;IAEM,KAAK,CAAC,GAAG,CAAC,IAAY,EAAE,OAAqC;QAClE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;YAClC,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,OAAO,OAAO,KAAK,QAAQ;gBAC7B,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC;gBAC/B,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEzB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,KAAK,CAAC,GAAG,CAAC,IAAY;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,WAA2B,OAAO;QACnE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjC,OAAO,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,IAAY;QAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9C,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,IAAY;QAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACjD,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,IAAY;QAC5B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjC,OAAO,GAAG,CAAC,MAAM,CAAC;IACpB,CAAC;IAEM,GAAG,CAAC,IAAY;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAClC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACxD,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,IAAY,EAAE,gBAAgB,GAAG,IAAI;QAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACjE,CAAC;IAEM,KAAK;QACV,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAEO,SAAS,CAAC,IAAY;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACzD,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shohaghinfo/aerojs",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "A minimal, blazing-fast, zero-dependency full-stack web framework for Node.js — supporting React, Vue 3, Inertia.js, and SSR monoliths.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -86,6 +86,14 @@
86
86
  "./http": {
87
87
  "types": "./dist/http/index.d.ts",
88
88
  "import": "./dist/http/index.js"
89
+ },
90
+ "./notifications": {
91
+ "types": "./dist/notifications/index.d.ts",
92
+ "import": "./dist/notifications/index.js"
93
+ },
94
+ "./auth": {
95
+ "types": "./dist/auth/index.d.ts",
96
+ "import": "./dist/auth/index.js"
89
97
  }
90
98
  },
91
99
  "files": [