@webwaka/core 1.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 (151) hide show
  1. package/CHANGELOG.md +70 -0
  2. package/dist/ai.d.ts +25 -0
  3. package/dist/ai.d.ts.map +1 -0
  4. package/dist/ai.js +53 -0
  5. package/dist/ai.js.map +1 -0
  6. package/dist/core/ai/AIEngine.d.ts +69 -0
  7. package/dist/core/ai/AIEngine.d.ts.map +1 -0
  8. package/dist/core/ai/AIEngine.js +185 -0
  9. package/dist/core/ai/AIEngine.js.map +1 -0
  10. package/dist/core/auth/index.d.ts +183 -0
  11. package/dist/core/auth/index.d.ts.map +1 -0
  12. package/dist/core/auth/index.js +369 -0
  13. package/dist/core/auth/index.js.map +1 -0
  14. package/dist/core/billing/index.d.ts +52 -0
  15. package/dist/core/billing/index.d.ts.map +1 -0
  16. package/dist/core/billing/index.js +91 -0
  17. package/dist/core/billing/index.js.map +1 -0
  18. package/dist/core/booking/index.d.ts +38 -0
  19. package/dist/core/booking/index.d.ts.map +1 -0
  20. package/dist/core/booking/index.js +60 -0
  21. package/dist/core/booking/index.js.map +1 -0
  22. package/dist/core/chat/index.d.ts +48 -0
  23. package/dist/core/chat/index.d.ts.map +1 -0
  24. package/dist/core/chat/index.js +83 -0
  25. package/dist/core/chat/index.js.map +1 -0
  26. package/dist/core/document/index.d.ts +41 -0
  27. package/dist/core/document/index.d.ts.map +1 -0
  28. package/dist/core/document/index.js +68 -0
  29. package/dist/core/document/index.js.map +1 -0
  30. package/dist/core/events/index.d.ts +64 -0
  31. package/dist/core/events/index.d.ts.map +1 -0
  32. package/dist/core/events/index.js +60 -0
  33. package/dist/core/events/index.js.map +1 -0
  34. package/dist/core/geolocation/index.d.ts +32 -0
  35. package/dist/core/geolocation/index.d.ts.map +1 -0
  36. package/dist/core/geolocation/index.js +50 -0
  37. package/dist/core/geolocation/index.js.map +1 -0
  38. package/dist/core/kyc/index.d.ts +37 -0
  39. package/dist/core/kyc/index.d.ts.map +1 -0
  40. package/dist/core/kyc/index.js +60 -0
  41. package/dist/core/kyc/index.js.map +1 -0
  42. package/dist/core/logger/index.d.ts +60 -0
  43. package/dist/core/logger/index.d.ts.map +1 -0
  44. package/dist/core/logger/index.js +91 -0
  45. package/dist/core/logger/index.js.map +1 -0
  46. package/dist/core/notifications/index.d.ts +41 -0
  47. package/dist/core/notifications/index.d.ts.map +1 -0
  48. package/dist/core/notifications/index.js +111 -0
  49. package/dist/core/notifications/index.js.map +1 -0
  50. package/dist/core/rbac/index.d.ts +43 -0
  51. package/dist/core/rbac/index.d.ts.map +1 -0
  52. package/dist/core/rbac/index.js +66 -0
  53. package/dist/core/rbac/index.js.map +1 -0
  54. package/dist/events.d.ts +23 -0
  55. package/dist/events.d.ts.map +1 -0
  56. package/dist/events.js +22 -0
  57. package/dist/events.js.map +1 -0
  58. package/dist/index.d.ts +33 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +56 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/kyc.d.ts +12 -0
  63. package/dist/kyc.d.ts.map +1 -0
  64. package/dist/kyc.js +2 -0
  65. package/dist/kyc.js.map +1 -0
  66. package/dist/nanoid.d.ts +8 -0
  67. package/dist/nanoid.d.ts.map +1 -0
  68. package/dist/nanoid.js +15 -0
  69. package/dist/nanoid.js.map +1 -0
  70. package/dist/ndpr.d.ts +13 -0
  71. package/dist/ndpr.d.ts.map +1 -0
  72. package/dist/ndpr.js +19 -0
  73. package/dist/ndpr.js.map +1 -0
  74. package/dist/optimistic-lock.d.ts +11 -0
  75. package/dist/optimistic-lock.d.ts.map +1 -0
  76. package/dist/optimistic-lock.js +24 -0
  77. package/dist/optimistic-lock.js.map +1 -0
  78. package/dist/payment.d.ts +41 -0
  79. package/dist/payment.d.ts.map +1 -0
  80. package/dist/payment.js +116 -0
  81. package/dist/payment.js.map +1 -0
  82. package/dist/pin.d.ts +6 -0
  83. package/dist/pin.d.ts.map +1 -0
  84. package/dist/pin.js +18 -0
  85. package/dist/pin.js.map +1 -0
  86. package/dist/query-helpers.d.ts +18 -0
  87. package/dist/query-helpers.d.ts.map +1 -0
  88. package/dist/query-helpers.js +22 -0
  89. package/dist/query-helpers.js.map +1 -0
  90. package/dist/rate-limit.d.ts +13 -0
  91. package/dist/rate-limit.d.ts.map +1 -0
  92. package/dist/rate-limit.js +16 -0
  93. package/dist/rate-limit.js.map +1 -0
  94. package/dist/sms.d.ts +23 -0
  95. package/dist/sms.d.ts.map +1 -0
  96. package/dist/sms.js +60 -0
  97. package/dist/sms.js.map +1 -0
  98. package/dist/tax.d.ts +25 -0
  99. package/dist/tax.d.ts.map +1 -0
  100. package/dist/tax.js +31 -0
  101. package/dist/tax.js.map +1 -0
  102. package/package.json +99 -0
  103. package/src/ai.test.ts +146 -0
  104. package/src/ai.ts +75 -0
  105. package/src/core/ai/AIEngine.test.ts +386 -0
  106. package/src/core/ai/AIEngine.ts +281 -0
  107. package/src/core/auth/index.test.ts +268 -0
  108. package/src/core/auth/index.ts +570 -0
  109. package/src/core/billing/index.test.ts +154 -0
  110. package/src/core/billing/index.ts +132 -0
  111. package/src/core/booking/index.test.ts +153 -0
  112. package/src/core/booking/index.ts +91 -0
  113. package/src/core/chat/index.test.ts +159 -0
  114. package/src/core/chat/index.ts +130 -0
  115. package/src/core/document/index.test.ts +106 -0
  116. package/src/core/document/index.ts +99 -0
  117. package/src/core/events/index.test.ts +91 -0
  118. package/src/core/events/index.ts +91 -0
  119. package/src/core/geolocation/index.test.ts +70 -0
  120. package/src/core/geolocation/index.ts +69 -0
  121. package/src/core/kyc/index.test.ts +105 -0
  122. package/src/core/kyc/index.ts +86 -0
  123. package/src/core/logger/index.test.ts +110 -0
  124. package/src/core/logger/index.ts +127 -0
  125. package/src/core/notifications/index.test.ts +85 -0
  126. package/src/core/notifications/index.ts +136 -0
  127. package/src/core/rbac/index.test.ts +81 -0
  128. package/src/core/rbac/index.ts +85 -0
  129. package/src/events.test.ts +43 -0
  130. package/src/events.ts +23 -0
  131. package/src/index.test.ts +123 -0
  132. package/src/index.ts +97 -0
  133. package/src/kyc.ts +23 -0
  134. package/src/nanoid.test.ts +43 -0
  135. package/src/nanoid.ts +16 -0
  136. package/src/ndpr.test.ts +68 -0
  137. package/src/ndpr.ts +49 -0
  138. package/src/optimistic-lock.test.ts +75 -0
  139. package/src/optimistic-lock.ts +36 -0
  140. package/src/payment.test.ts +152 -0
  141. package/src/payment.ts +163 -0
  142. package/src/pin.test.ts +57 -0
  143. package/src/pin.ts +38 -0
  144. package/src/query-helpers.test.ts +98 -0
  145. package/src/query-helpers.ts +36 -0
  146. package/src/rate-limit.test.ts +98 -0
  147. package/src/rate-limit.ts +33 -0
  148. package/src/sms.test.ts +112 -0
  149. package/src/sms.ts +85 -0
  150. package/src/tax.test.ts +85 -0
  151. package/src/tax.ts +57 -0
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Platform Logger Utility
3
+ *
4
+ * Enforces the "Zero Console Logs" invariant across the WebWaka platform.
5
+ * All logging must go through this module, never direct console.log/warn/error calls.
6
+ *
7
+ * Blueprint Reference: Part 9.3 — "Zero Console Logs: No console.log statements. Must use platform logger."
8
+ */
9
+ export interface LogContext {
10
+ tenantId?: string;
11
+ userId?: string;
12
+ requestId?: string;
13
+ [key: string]: any;
14
+ }
15
+ export interface SerializedError {
16
+ message: string;
17
+ stack?: string;
18
+ }
19
+ export interface LogEntry {
20
+ timestamp: string;
21
+ level: 'info' | 'warn' | 'error' | 'debug';
22
+ message: string;
23
+ context?: LogContext;
24
+ error?: SerializedError;
25
+ }
26
+ /**
27
+ * Platform Logger
28
+ *
29
+ * Usage:
30
+ * logger.info("User logged in", { tenantId: "tenant-123", userId: "user-456" });
31
+ * logger.warn("API rate limit approaching", { tenantId: "tenant-123" });
32
+ * logger.error("Database connection failed", { tenantId: "tenant-123" }, error);
33
+ * logger.debug("Cache hit", { tenantId: "tenant-123", key: "user-profile" });
34
+ */
35
+ declare class PlatformLogger {
36
+ private isDevelopment;
37
+ /**
38
+ * Log informational message
39
+ */
40
+ info(message: string, context?: LogContext): void;
41
+ /**
42
+ * Log warning message
43
+ */
44
+ warn(message: string, context?: LogContext): void;
45
+ /**
46
+ * Log error message
47
+ */
48
+ error(message: string, context?: LogContext | Error, error?: Error): void;
49
+ /**
50
+ * Log debug message (development only)
51
+ */
52
+ debug(message: string, context?: LogContext): void;
53
+ /**
54
+ * Internal logging implementation
55
+ */
56
+ private log;
57
+ }
58
+ export declare const logger: PlatformLogger;
59
+ export {};
60
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/logger/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,KAAK,CAAC,EAAE,eAAe,CAAC;CACzB;AAED;;;;;;;;GAQG;AACH,cAAM,cAAc;IAClB,OAAO,CAAC,aAAa,CAAgE;IAErF;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAIjD;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAIjD;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,KAAK,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI;IAazE;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAMlD;;OAEG;IACH,OAAO,CAAC,GAAG;CAwCZ;AAGD,eAAO,MAAM,MAAM,gBAAuB,CAAC"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Platform Logger Utility
3
+ *
4
+ * Enforces the "Zero Console Logs" invariant across the WebWaka platform.
5
+ * All logging must go through this module, never direct console.log/warn/error calls.
6
+ *
7
+ * Blueprint Reference: Part 9.3 — "Zero Console Logs: No console.log statements. Must use platform logger."
8
+ */
9
+ /**
10
+ * Platform Logger
11
+ *
12
+ * Usage:
13
+ * logger.info("User logged in", { tenantId: "tenant-123", userId: "user-456" });
14
+ * logger.warn("API rate limit approaching", { tenantId: "tenant-123" });
15
+ * logger.error("Database connection failed", { tenantId: "tenant-123" }, error);
16
+ * logger.debug("Cache hit", { tenantId: "tenant-123", key: "user-profile" });
17
+ */
18
+ class PlatformLogger {
19
+ isDevelopment = globalThis.process?.env?.NODE_ENV === 'development';
20
+ /**
21
+ * Log informational message
22
+ */
23
+ info(message, context) {
24
+ this.log('info', message, context);
25
+ }
26
+ /**
27
+ * Log warning message
28
+ */
29
+ warn(message, context) {
30
+ this.log('warn', message, context);
31
+ }
32
+ /**
33
+ * Log error message
34
+ */
35
+ error(message, context, error) {
36
+ let ctx = context;
37
+ let err = error;
38
+ // Handle overload: error(message, error) or error(message, context, error)
39
+ if (context instanceof Error) {
40
+ err = context;
41
+ ctx = undefined;
42
+ }
43
+ this.log('error', message, ctx, err);
44
+ }
45
+ /**
46
+ * Log debug message (development only)
47
+ */
48
+ debug(message, context) {
49
+ if (this.isDevelopment) {
50
+ this.log('debug', message, context);
51
+ }
52
+ }
53
+ /**
54
+ * Internal logging implementation
55
+ */
56
+ log(level, message, context, error) {
57
+ const serializedError = error !== undefined
58
+ ? { message: error.message, ...(error.stack !== undefined ? { stack: error.stack } : {}) }
59
+ : undefined;
60
+ const entry = {
61
+ timestamp: new Date().toISOString(),
62
+ level,
63
+ message,
64
+ ...(context !== undefined ? { context } : {}),
65
+ ...(serializedError !== undefined ? { error: serializedError } : {}),
66
+ };
67
+ // In production, this would send to a logging service (e.g., Datadog, Sentry)
68
+ // For now, we output to stderr to avoid stdout pollution
69
+ if (typeof console !== 'undefined') {
70
+ const output = JSON.stringify(entry);
71
+ switch (level) {
72
+ case 'error':
73
+ console.error(output);
74
+ break;
75
+ case 'warn':
76
+ console.warn(output);
77
+ break;
78
+ case 'debug':
79
+ console.debug(output);
80
+ break;
81
+ case 'info':
82
+ default:
83
+ console.info(output);
84
+ break;
85
+ }
86
+ }
87
+ }
88
+ }
89
+ // Export singleton instance
90
+ export const logger = new PlatformLogger();
91
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/logger/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAsBH;;;;;;;;GAQG;AACH,MAAM,cAAc;IACV,aAAa,GAAI,UAAkB,CAAC,OAAO,EAAE,GAAG,EAAE,QAAQ,KAAK,aAAa,CAAC;IAErF;;OAEG;IACH,IAAI,CAAC,OAAe,EAAE,OAAoB;QACxC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,OAAe,EAAE,OAAoB;QACxC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAe,EAAE,OAA4B,EAAE,KAAa;QAChE,IAAI,GAAG,GAAG,OAAiC,CAAC;QAC5C,IAAI,GAAG,GAAG,KAAK,CAAC;QAEhB,2EAA2E;QAC3E,IAAI,OAAO,YAAY,KAAK,EAAE,CAAC;YAC7B,GAAG,GAAG,OAAO,CAAC;YACd,GAAG,GAAG,SAAS,CAAC;QAClB,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAe,EAAE,OAAoB;QACzC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED;;OAEG;IACK,GAAG,CACT,KAA0C,EAC1C,OAAe,EACf,OAAoB,EACpB,KAAa;QAEb,MAAM,eAAe,GAAgC,KAAK,KAAK,SAAS;YACtE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;YAC1F,CAAC,CAAC,SAAS,CAAC;QAEd,MAAM,KAAK,GAAa;YACtB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,KAAK;YACL,OAAO;YACP,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7C,GAAG,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrE,CAAC;QAEF,8EAA8E;QAC9E,yDAAyD;QACzD,IAAI,OAAO,OAAO,KAAK,WAAW,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAErC,QAAQ,KAAK,EAAE,CAAC;gBACd,KAAK,OAAO;oBACV,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBACtB,MAAM;gBACR,KAAK,MAAM;oBACT,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACrB,MAAM;gBACR,KAAK,OAAO;oBACV,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBACtB,MAAM;gBACR,KAAK,MAAM,CAAC;gBACZ;oBACE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACrB,MAAM;YACV,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAED,4BAA4B;AAC5B,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * CORE-7: Unified Notification Service
3
+ * Blueprint Reference: Part 10.12 (Cross-Cutting Functional Modules)
4
+ * Blueprint Reference: Part 9.1 #5 (Nigeria First - Yournotify, Termii)
5
+ *
6
+ * Implements event-driven email, SMS, and push notification dispatchers.
7
+ */
8
+ export interface NotificationPayload {
9
+ tenantId: string;
10
+ userId: string;
11
+ type: 'email' | 'sms' | 'push';
12
+ recipient: string;
13
+ subject?: string;
14
+ body: string;
15
+ }
16
+ export interface NotificationConfig {
17
+ yournotifyApiKey?: string;
18
+ termiiApiKey?: string;
19
+ termiiSenderId?: string;
20
+ }
21
+ export declare class NotificationService {
22
+ private config;
23
+ constructor(config: NotificationConfig);
24
+ /**
25
+ * Dispatches a notification based on its type.
26
+ */
27
+ dispatch(payload: NotificationPayload): Promise<boolean>;
28
+ /**
29
+ * Sends an email using Yournotify (Nigeria-First Service)
30
+ */
31
+ private sendEmail;
32
+ /**
33
+ * Sends an SMS using Termii (Nigeria-First Service)
34
+ */
35
+ private sendSms;
36
+ /**
37
+ * Sends a push notification (Mock implementation for now)
38
+ */
39
+ private sendPush;
40
+ }
41
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/notifications/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAqB;gBAEvB,MAAM,EAAE,kBAAkB;IAItC;;OAEG;IACG,QAAQ,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC;IAa9D;;OAEG;YACW,SAAS;IAkCvB;;OAEG;YACW,OAAO;IAoCrB;;OAEG;YACW,QAAQ;CAQvB"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * CORE-7: Unified Notification Service
3
+ * Blueprint Reference: Part 10.12 (Cross-Cutting Functional Modules)
4
+ * Blueprint Reference: Part 9.1 #5 (Nigeria First - Yournotify, Termii)
5
+ *
6
+ * Implements event-driven email, SMS, and push notification dispatchers.
7
+ */
8
+ import { logger } from '../logger';
9
+ export class NotificationService {
10
+ config;
11
+ constructor(config) {
12
+ this.config = config;
13
+ }
14
+ /**
15
+ * Dispatches a notification based on its type.
16
+ */
17
+ async dispatch(payload) {
18
+ switch (payload.type) {
19
+ case 'email':
20
+ return this.sendEmail(payload);
21
+ case 'sms':
22
+ return this.sendSms(payload);
23
+ case 'push':
24
+ return this.sendPush(payload);
25
+ default:
26
+ throw new Error(`Unsupported notification type: ${payload.type}`);
27
+ }
28
+ }
29
+ /**
30
+ * Sends an email using Yournotify (Nigeria-First Service)
31
+ */
32
+ async sendEmail(payload) {
33
+ if (!this.config.yournotifyApiKey) {
34
+ logger.warn('Yournotify API key missing. Email not sent.', {
35
+ tenantId: payload.tenantId,
36
+ recipient: payload.recipient,
37
+ });
38
+ return false;
39
+ }
40
+ try {
41
+ const response = await fetch('https://api.yournotify.com/v1/campaigns/email', {
42
+ method: 'POST',
43
+ headers: {
44
+ 'Authorization': `Bearer ${this.config.yournotifyApiKey}`,
45
+ 'Content-Type': 'application/json'
46
+ },
47
+ body: JSON.stringify({
48
+ to: payload.recipient,
49
+ subject: payload.subject || 'Notification from WebWaka',
50
+ html: payload.body
51
+ })
52
+ });
53
+ if (!response.ok) {
54
+ throw new Error(`Yournotify API error: ${response.statusText}`);
55
+ }
56
+ return true;
57
+ }
58
+ catch (error) {
59
+ logger.error('Failed to send email via Yournotify', { tenantId: payload.tenantId }, error);
60
+ return false;
61
+ }
62
+ }
63
+ /**
64
+ * Sends an SMS using Termii (Nigeria-First Service)
65
+ */
66
+ async sendSms(payload) {
67
+ if (!this.config.termiiApiKey) {
68
+ logger.warn('Termii API key missing. SMS not sent.', {
69
+ tenantId: payload.tenantId,
70
+ recipient: payload.recipient,
71
+ });
72
+ return false;
73
+ }
74
+ try {
75
+ const response = await fetch('https://api.ng.termii.com/api/sms/send', {
76
+ method: 'POST',
77
+ headers: {
78
+ 'Content-Type': 'application/json'
79
+ },
80
+ body: JSON.stringify({
81
+ to: payload.recipient,
82
+ from: this.config.termiiSenderId || 'WebWaka',
83
+ sms: payload.body,
84
+ type: 'plain',
85
+ channel: 'generic',
86
+ api_key: this.config.termiiApiKey
87
+ })
88
+ });
89
+ if (!response.ok) {
90
+ throw new Error(`Termii API error: ${response.statusText}`);
91
+ }
92
+ return true;
93
+ }
94
+ catch (error) {
95
+ logger.error('Failed to send SMS via Termii', { tenantId: payload.tenantId }, error);
96
+ return false;
97
+ }
98
+ }
99
+ /**
100
+ * Sends a push notification (Mock implementation for now)
101
+ */
102
+ async sendPush(payload) {
103
+ logger.info('Push notification sent', {
104
+ tenantId: payload.tenantId,
105
+ recipient: payload.recipient,
106
+ body: payload.body,
107
+ });
108
+ return true;
109
+ }
110
+ }
111
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/notifications/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * CORE-6: Universal RBAC & Permissions Engine
3
+ * Blueprint Reference: Part 2 Layer 4 (Tenant Resolution & Auth)
4
+ *
5
+ * Implements granular role definitions and Hono middleware for route protection.
6
+ */
7
+ import { Context, Next } from 'hono';
8
+ export declare enum Role {
9
+ SUPER_ADMIN = "SUPER_ADMIN",
10
+ TENANT_ADMIN = "TENANT_ADMIN",
11
+ STAFF = "STAFF",
12
+ CUSTOMER = "CUSTOMER"
13
+ }
14
+ export interface UserSession {
15
+ userId: string;
16
+ tenantId: string;
17
+ role: Role;
18
+ permissions: string[];
19
+ }
20
+ /**
21
+ * Middleware to enforce role-based access control on routes.
22
+ * @param allowedRoles Array of roles permitted to access the route.
23
+ */
24
+ export declare const requireRole: (allowedRoles: Role[]) => (c: Context, next: Next) => Promise<(Response & import("hono").TypedResponse<{
25
+ error: string;
26
+ }, 401, "json">) | (Response & import("hono").TypedResponse<{
27
+ error: string;
28
+ }, 403, "json">) | undefined>;
29
+ /**
30
+ * Middleware to enforce specific permissions.
31
+ * @param requiredPermissions Array of permissions required to access the route.
32
+ */
33
+ export declare const requirePermissions: (requiredPermissions: string[]) => (c: Context, next: Next) => Promise<(Response & import("hono").TypedResponse<{
34
+ error: string;
35
+ }, 401, "json">) | (Response & import("hono").TypedResponse<{
36
+ error: string;
37
+ }, 403, "json">) | undefined>;
38
+ /**
39
+ * Utility to verify JWT and extract session (Mock implementation for now)
40
+ * In production, this would verify the JWT signature against Cloudflare Access or custom auth.
41
+ */
42
+ export declare const verifyJwt: (token: string) => Promise<UserSession | null>;
43
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/rbac/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAErC,oBAAY,IAAI;IACd,WAAW,gBAAgB;IAC3B,YAAY,iBAAiB;IAC7B,KAAK,UAAU;IACf,QAAQ,aAAa;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,IAAI,CAAC;IACX,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW,GAAI,cAAc,IAAI,EAAE,MAChC,GAAG,OAAO,EAAE,MAAM,IAAI;;;;6BAarC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAAI,qBAAqB,MAAM,EAAE,MAChD,GAAG,OAAO,EAAE,MAAM,IAAI;;;;6BAqBrC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,SAAS,GAAU,OAAO,MAAM,KAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CASzE,CAAC"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * CORE-6: Universal RBAC & Permissions Engine
3
+ * Blueprint Reference: Part 2 Layer 4 (Tenant Resolution & Auth)
4
+ *
5
+ * Implements granular role definitions and Hono middleware for route protection.
6
+ */
7
+ export var Role;
8
+ (function (Role) {
9
+ Role["SUPER_ADMIN"] = "SUPER_ADMIN";
10
+ Role["TENANT_ADMIN"] = "TENANT_ADMIN";
11
+ Role["STAFF"] = "STAFF";
12
+ Role["CUSTOMER"] = "CUSTOMER";
13
+ })(Role || (Role = {}));
14
+ /**
15
+ * Middleware to enforce role-based access control on routes.
16
+ * @param allowedRoles Array of roles permitted to access the route.
17
+ */
18
+ export const requireRole = (allowedRoles) => {
19
+ return async (c, next) => {
20
+ const session = c.get('session');
21
+ if (!session) {
22
+ return c.json({ error: 'Unauthorized: No session found' }, 401);
23
+ }
24
+ if (!allowedRoles.includes(session.role)) {
25
+ return c.json({ error: `Forbidden: Requires one of ${allowedRoles.join(', ')}` }, 403);
26
+ }
27
+ await next();
28
+ };
29
+ };
30
+ /**
31
+ * Middleware to enforce specific permissions.
32
+ * @param requiredPermissions Array of permissions required to access the route.
33
+ */
34
+ export const requirePermissions = (requiredPermissions) => {
35
+ return async (c, next) => {
36
+ const session = c.get('session');
37
+ if (!session) {
38
+ return c.json({ error: 'Unauthorized: No session found' }, 401);
39
+ }
40
+ // Super Admin bypasses permission checks
41
+ if (session.role === Role.SUPER_ADMIN) {
42
+ await next();
43
+ return;
44
+ }
45
+ const hasAllPermissions = requiredPermissions.every(p => session.permissions.includes(p));
46
+ if (!hasAllPermissions) {
47
+ return c.json({ error: `Forbidden: Missing required permissions` }, 403);
48
+ }
49
+ await next();
50
+ };
51
+ };
52
+ /**
53
+ * Utility to verify JWT and extract session (Mock implementation for now)
54
+ * In production, this would verify the JWT signature against Cloudflare Access or custom auth.
55
+ */
56
+ export const verifyJwt = async (token) => {
57
+ // Mock implementation
58
+ if (token === 'mock-super-admin-token') {
59
+ return { userId: 'sa-1', tenantId: 'platform', role: Role.SUPER_ADMIN, permissions: ['*'] };
60
+ }
61
+ if (token === 'mock-tenant-admin-token') {
62
+ return { userId: 'ta-1', tenantId: 'tenant-1', role: Role.TENANT_ADMIN, permissions: ['manage_users', 'view_reports'] };
63
+ }
64
+ return null;
65
+ };
66
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/rbac/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,CAAN,IAAY,IAKX;AALD,WAAY,IAAI;IACd,mCAA2B,CAAA;IAC3B,qCAA6B,CAAA;IAC7B,uBAAe,CAAA;IACf,6BAAqB,CAAA;AACvB,CAAC,EALW,IAAI,KAAJ,IAAI,QAKf;AASD;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,YAAoB,EAAE,EAAE;IAClD,OAAO,KAAK,EAAE,CAAU,EAAE,IAAU,EAAE,EAAE;QACtC,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAA4B,CAAC;QAE5D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gCAAgC,EAAE,EAAE,GAAG,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACzC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,8BAA8B,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;QACzF,CAAC;QAED,MAAM,IAAI,EAAE,CAAC;IACf,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,mBAA6B,EAAE,EAAE;IAClE,OAAO,KAAK,EAAE,CAAU,EAAE,IAAU,EAAE,EAAE;QACtC,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAA4B,CAAC;QAE5D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gCAAgC,EAAE,EAAE,GAAG,CAAC,CAAC;QAClE,CAAC;QAED,yCAAyC;QACzC,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;YACtC,MAAM,IAAI,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,MAAM,iBAAiB,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAE1F,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,yCAAyC,EAAE,EAAE,GAAG,CAAC,CAAC;QAC3E,CAAC;QAED,MAAM,IAAI,EAAE,CAAC;IACf,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAAE,KAAa,EAA+B,EAAE;IAC5E,sBAAsB;IACtB,IAAI,KAAK,KAAK,wBAAwB,EAAE,CAAC;QACvC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IAC9F,CAAC;IACD,IAAI,KAAK,KAAK,yBAAyB,EAAE,CAAC;QACxC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,EAAE,CAAC,cAAc,EAAE,cAAc,CAAC,EAAE,CAAC;IAC1H,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC"}
@@ -0,0 +1,23 @@
1
+ export declare const CommerceEvents: {
2
+ readonly INVENTORY_UPDATED: "inventory.updated";
3
+ readonly ORDER_CREATED: "order.created";
4
+ readonly ORDER_READY_DELIVERY: "order.ready_for_delivery";
5
+ readonly PAYMENT_COMPLETED: "payment.completed";
6
+ readonly PAYMENT_REFUNDED: "payment.refunded";
7
+ readonly SHIFT_CLOSED: "shift.closed";
8
+ readonly CART_ABANDONED: "cart.abandoned";
9
+ readonly SUBSCRIPTION_CHARGE: "subscription.charge_due";
10
+ readonly DELIVERY_QUOTE: "delivery.quote";
11
+ readonly DELIVERY_STATUS: "delivery.status_changed";
12
+ readonly VENDOR_KYC_SUBMITTED: "vendor.kyc_submitted";
13
+ readonly VENDOR_KYC_APPROVED: "vendor.kyc_approved";
14
+ readonly VENDOR_KYC_REJECTED: "vendor.kyc_rejected";
15
+ readonly STOCK_ADJUSTED: "stock.adjusted";
16
+ readonly DISPUTE_OPENED: "dispute.opened";
17
+ readonly DISPUTE_RESOLVED: "dispute.resolved";
18
+ readonly PURCHASE_ORDER_RECEIVED: "purchase_order.received";
19
+ readonly FLASH_SALE_STARTED: "flash_sale.started";
20
+ readonly FLASH_SALE_ENDED: "flash_sale.ended";
21
+ };
22
+ export type CommerceEventType = typeof CommerceEvents[keyof typeof CommerceEvents];
23
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;CAoBjB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,OAAO,cAAc,CAAC,MAAM,OAAO,cAAc,CAAC,CAAC"}
package/dist/events.js ADDED
@@ -0,0 +1,22 @@
1
+ export const CommerceEvents = {
2
+ INVENTORY_UPDATED: 'inventory.updated',
3
+ ORDER_CREATED: 'order.created',
4
+ ORDER_READY_DELIVERY: 'order.ready_for_delivery',
5
+ PAYMENT_COMPLETED: 'payment.completed',
6
+ PAYMENT_REFUNDED: 'payment.refunded',
7
+ SHIFT_CLOSED: 'shift.closed',
8
+ CART_ABANDONED: 'cart.abandoned',
9
+ SUBSCRIPTION_CHARGE: 'subscription.charge_due',
10
+ DELIVERY_QUOTE: 'delivery.quote',
11
+ DELIVERY_STATUS: 'delivery.status_changed',
12
+ VENDOR_KYC_SUBMITTED: 'vendor.kyc_submitted',
13
+ VENDOR_KYC_APPROVED: 'vendor.kyc_approved',
14
+ VENDOR_KYC_REJECTED: 'vendor.kyc_rejected',
15
+ STOCK_ADJUSTED: 'stock.adjusted',
16
+ DISPUTE_OPENED: 'dispute.opened',
17
+ DISPUTE_RESOLVED: 'dispute.resolved',
18
+ PURCHASE_ORDER_RECEIVED: 'purchase_order.received',
19
+ FLASH_SALE_STARTED: 'flash_sale.started',
20
+ FLASH_SALE_ENDED: 'flash_sale.ended',
21
+ };
22
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,iBAAiB,EAAE,mBAAmB;IACtC,aAAa,EAAE,eAAe;IAC9B,oBAAoB,EAAE,0BAA0B;IAChD,iBAAiB,EAAE,mBAAmB;IACtC,gBAAgB,EAAE,kBAAkB;IACpC,YAAY,EAAE,cAAc;IAC5B,cAAc,EAAE,gBAAgB;IAChC,mBAAmB,EAAE,yBAAyB;IAC9C,cAAc,EAAE,gBAAgB;IAChC,eAAe,EAAE,yBAAyB;IAC1C,oBAAoB,EAAE,sBAAsB;IAC5C,mBAAmB,EAAE,qBAAqB;IAC1C,mBAAmB,EAAE,qBAAqB;IAC1C,cAAc,EAAE,gBAAgB;IAChC,cAAc,EAAE,gBAAgB;IAChC,gBAAgB,EAAE,kBAAkB;IACpC,uBAAuB,EAAE,yBAAyB;IAClD,kBAAkB,EAAE,oBAAoB;IACxC,gBAAgB,EAAE,kBAAkB;CAC5B,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * @webwaka/core — Main Entry Point
3
+ * Blueprint Reference: Part 2 (Layer 4 — Tenant Resolution & Auth)
4
+ *
5
+ * Re-exports all platform primitives for consumers that import from '@webwaka/core'.
6
+ * For tree-shaking, consumers can also import from sub-paths:
7
+ * import { verifyJWT } from '@webwaka/core/auth'
8
+ * import { requireRole } from '@webwaka/core/rbac'
9
+ */
10
+ export { signJWT, verifyJWT, jwtAuthMiddleware, verifyApiKey, requireRole, requirePermissions, secureCORS, rateLimit, getTenantId, getAuthUser, type JWTPayload, type AuthUser, type WakaUser, type AuthEnv, type RateLimitEnv, type JwtAuthOptions, type SecureCORSOptions, type RateLimitOptions as AuthRateLimitOptions, } from './core/auth/index.js';
11
+ export * from './core/billing/index.js';
12
+ export * from './core/logger/index.js';
13
+ export * from './core/notifications/index.js';
14
+ export * from './core/ai/AIEngine.js';
15
+ export * from './core/kyc/index.js';
16
+ export * from './core/geolocation/index.js';
17
+ export * from './core/document/index.js';
18
+ export * from './core/chat/index.js';
19
+ export * from './core/booking/index.js';
20
+ export * from './core/events/index.js';
21
+ export * from './tax.js';
22
+ export * from './payment.js';
23
+ export * from './sms.js';
24
+ export * from './rate-limit.js';
25
+ export * from './optimistic-lock.js';
26
+ export * from './pin.js';
27
+ export * from './kyc.js';
28
+ export * from './ai.js';
29
+ export * from './events.js';
30
+ export * from './nanoid.js';
31
+ export * from './query-helpers.js';
32
+ export * from './ndpr.js';
33
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EACL,OAAO,EACP,SAAS,EACT,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACX,kBAAkB,EAClB,UAAU,EACV,SAAS,EACT,WAAW,EACX,WAAW,EACX,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,QAAQ,EACb,KAAK,OAAO,EACZ,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,IAAI,oBAAoB,GAC9C,MAAM,sBAAsB,CAAC;AAG9B,cAAc,yBAAyB,CAAC;AAGxC,cAAc,wBAAwB,CAAC;AAGvC,cAAc,+BAA+B,CAAC;AAG9C,cAAc,uBAAuB,CAAC;AAGtC,cAAc,qBAAqB,CAAC;AAGpC,cAAc,6BAA6B,CAAC;AAG5C,cAAc,0BAA0B,CAAC;AAGzC,cAAc,sBAAsB,CAAC;AAGrC,cAAc,yBAAyB,CAAC;AAGxC,cAAc,wBAAwB,CAAC;AAGvC,cAAc,UAAU,CAAC;AAGzB,cAAc,cAAc,CAAC;AAG7B,cAAc,UAAU,CAAC;AAGzB,cAAc,iBAAiB,CAAC;AAGhC,cAAc,sBAAsB,CAAC;AAGrC,cAAc,UAAU,CAAC;AAGzB,cAAc,UAAU,CAAC;AAGzB,cAAc,SAAS,CAAC;AAGxB,cAAc,aAAa,CAAC;AAG5B,cAAc,aAAa,CAAC;AAG5B,cAAc,oBAAoB,CAAC;AAGnC,cAAc,WAAW,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,56 @@
1
+ /**
2
+ * @webwaka/core — Main Entry Point
3
+ * Blueprint Reference: Part 2 (Layer 4 — Tenant Resolution & Auth)
4
+ *
5
+ * Re-exports all platform primitives for consumers that import from '@webwaka/core'.
6
+ * For tree-shaking, consumers can also import from sub-paths:
7
+ * import { verifyJWT } from '@webwaka/core/auth'
8
+ * import { requireRole } from '@webwaka/core/rbac'
9
+ */
10
+ // ─── Auth (NEW — canonical, replaces all per-repo implementations) ────────────
11
+ export { signJWT, verifyJWT, jwtAuthMiddleware, verifyApiKey, requireRole, requirePermissions, secureCORS, rateLimit, getTenantId, getAuthUser, } from './core/auth/index.js';
12
+ // ─── Billing ──────────────────────────────────────────────────────────────────
13
+ export * from './core/billing/index.js';
14
+ // ─── Logger ───────────────────────────────────────────────────────────────────
15
+ export * from './core/logger/index.js';
16
+ // ─── Notifications ────────────────────────────────────────────────────────────
17
+ export * from './core/notifications/index.js';
18
+ // ─── AI Engine ────────────────────────────────────────────────────────────────
19
+ export * from './core/ai/AIEngine.js';
20
+ // ─── KYC ─────────────────────────────────────────────────────────────────────
21
+ export * from './core/kyc/index.js';
22
+ // ─── Geolocation ─────────────────────────────────────────────────────────────
23
+ export * from './core/geolocation/index.js';
24
+ // ─── Document ────────────────────────────────────────────────────────────────
25
+ export * from './core/document/index.js';
26
+ // ─── Chat ────────────────────────────────────────────────────────────────────
27
+ export * from './core/chat/index.js';
28
+ // ─── Booking ─────────────────────────────────────────────────────────────────
29
+ export * from './core/booking/index.js';
30
+ // ─── Events ───────────────────────────────────────────────────────────────────
31
+ export * from './core/events/index.js';
32
+ // ─── Tax Engine ───────────────────────────────────────────────────────────────
33
+ export * from './tax.js';
34
+ // ─── Payment ──────────────────────────────────────────────────────────────────
35
+ export * from './payment.js';
36
+ // ─── SMS / OTP ────────────────────────────────────────────────────────────────
37
+ export * from './sms.js';
38
+ // ─── KV Rate Limiter ──────────────────────────────────────────────────────────
39
+ export * from './rate-limit.js';
40
+ // ─── Optimistic Lock ──────────────────────────────────────────────────────────
41
+ export * from './optimistic-lock.js';
42
+ // ─── PIN Hashing ──────────────────────────────────────────────────────────────
43
+ export * from './pin.js';
44
+ // ─── KYC Interface ────────────────────────────────────────────────────────────
45
+ export * from './kyc.js';
46
+ // ─── OpenRouter AI Client ────────────────────────────────────────────────────
47
+ export * from './ai.js';
48
+ // ─── Commerce Events ─────────────────────────────────────────────────────────
49
+ export * from './events.js';
50
+ // ─── Nanoid / ID Generation ───────────────────────────────────────────────────
51
+ export * from './nanoid.js';
52
+ // ─── Query Helpers ────────────────────────────────────────────────────────────
53
+ export * from './query-helpers.js';
54
+ // ─── NDPR Consent ─────────────────────────────────────────────────────────────
55
+ export * from './ndpr.js';
56
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,iFAAiF;AACjF,OAAO,EACL,OAAO,EACP,SAAS,EACT,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACX,kBAAkB,EAClB,UAAU,EACV,SAAS,EACT,WAAW,EACX,WAAW,GASZ,MAAM,sBAAsB,CAAC;AAE9B,iFAAiF;AACjF,cAAc,yBAAyB,CAAC;AAExC,iFAAiF;AACjF,cAAc,wBAAwB,CAAC;AAEvC,iFAAiF;AACjF,cAAc,+BAA+B,CAAC;AAE9C,iFAAiF;AACjF,cAAc,uBAAuB,CAAC;AAEtC,gFAAgF;AAChF,cAAc,qBAAqB,CAAC;AAEpC,gFAAgF;AAChF,cAAc,6BAA6B,CAAC;AAE5C,gFAAgF;AAChF,cAAc,0BAA0B,CAAC;AAEzC,gFAAgF;AAChF,cAAc,sBAAsB,CAAC;AAErC,gFAAgF;AAChF,cAAc,yBAAyB,CAAC;AAExC,iFAAiF;AACjF,cAAc,wBAAwB,CAAC;AAEvC,iFAAiF;AACjF,cAAc,UAAU,CAAC;AAEzB,iFAAiF;AACjF,cAAc,cAAc,CAAC;AAE7B,iFAAiF;AACjF,cAAc,UAAU,CAAC;AAEzB,iFAAiF;AACjF,cAAc,iBAAiB,CAAC;AAEhC,iFAAiF;AACjF,cAAc,sBAAsB,CAAC;AAErC,iFAAiF;AACjF,cAAc,UAAU,CAAC;AAEzB,iFAAiF;AACjF,cAAc,UAAU,CAAC;AAEzB,gFAAgF;AAChF,cAAc,SAAS,CAAC;AAExB,gFAAgF;AAChF,cAAc,aAAa,CAAC;AAE5B,iFAAiF;AACjF,cAAc,aAAa,CAAC;AAE5B,iFAAiF;AACjF,cAAc,oBAAoB,CAAC;AAEnC,iFAAiF;AACjF,cAAc,WAAW,CAAC"}
package/dist/kyc.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ export interface KycVerificationResult {
2
+ verified: boolean;
3
+ matchScore?: number;
4
+ reason?: string;
5
+ provider: string;
6
+ }
7
+ export interface IKycProvider {
8
+ verifyBvn(bvnHash: string, firstName: string, lastName: string, dob: string): Promise<KycVerificationResult>;
9
+ verifyNin(ninHash: string, firstName: string, lastName: string): Promise<KycVerificationResult>;
10
+ verifyCac(rcNumber: string, businessName: string): Promise<KycVerificationResult>;
11
+ }
12
+ //# sourceMappingURL=kyc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kyc.d.ts","sourceRoot":"","sources":["../src/kyc.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,CACP,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAElC,SAAS,CACP,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAElC,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;CACnF"}
package/dist/kyc.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=kyc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kyc.js","sourceRoot":"","sources":["../src/kyc.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Cloudflare Worker-compatible nanoid. Uses crypto.getRandomValues.
3
+ * prefix is prepended to the ID. Default length 21.
4
+ */
5
+ export declare function nanoid(prefix?: string, length?: number): string;
6
+ /** Alias for nanoid — allows repos to migrate without breaking during transition. */
7
+ export declare const genId: typeof nanoid;
8
+ //# sourceMappingURL=nanoid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nanoid.d.ts","sourceRoot":"","sources":["../src/nanoid.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,MAAM,CAAC,MAAM,SAAK,EAAE,MAAM,SAAK,GAAG,MAAM,CAMvD;AAED,qFAAqF;AACrF,eAAO,MAAM,KAAK,eAAS,CAAC"}