@mappoh/nova 0.1.16

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 (383) hide show
  1. package/dist/animation/parallax.d.ts +23 -0
  2. package/dist/animation/parallax.d.ts.map +1 -0
  3. package/dist/animation/parallax.js +96 -0
  4. package/dist/animation/parallax.js.map +1 -0
  5. package/dist/animation/scroll-animate.d.ts +30 -0
  6. package/dist/animation/scroll-animate.d.ts.map +1 -0
  7. package/dist/animation/scroll-animate.js +65 -0
  8. package/dist/animation/scroll-animate.js.map +1 -0
  9. package/dist/animation/scroll-observer.d.ts +32 -0
  10. package/dist/animation/scroll-observer.d.ts.map +1 -0
  11. package/dist/animation/scroll-observer.js +63 -0
  12. package/dist/animation/scroll-observer.js.map +1 -0
  13. package/dist/animation/smooth-scroll.d.ts +47 -0
  14. package/dist/animation/smooth-scroll.d.ts.map +1 -0
  15. package/dist/animation/smooth-scroll.js +169 -0
  16. package/dist/animation/smooth-scroll.js.map +1 -0
  17. package/dist/animation/text-reveal.d.ts +30 -0
  18. package/dist/animation/text-reveal.d.ts.map +1 -0
  19. package/dist/animation/text-reveal.js +164 -0
  20. package/dist/animation/text-reveal.js.map +1 -0
  21. package/dist/animation/ticker.d.ts +32 -0
  22. package/dist/animation/ticker.d.ts.map +1 -0
  23. package/dist/animation/ticker.js +62 -0
  24. package/dist/animation/ticker.js.map +1 -0
  25. package/dist/canvas/dot-grid.d.ts +50 -0
  26. package/dist/canvas/dot-grid.d.ts.map +1 -0
  27. package/dist/canvas/dot-grid.js +123 -0
  28. package/dist/canvas/dot-grid.js.map +1 -0
  29. package/dist/canvas/noise.d.ts +33 -0
  30. package/dist/canvas/noise.d.ts.map +1 -0
  31. package/dist/canvas/noise.js +241 -0
  32. package/dist/canvas/noise.js.map +1 -0
  33. package/dist/canvas/particles.d.ts +44 -0
  34. package/dist/canvas/particles.d.ts.map +1 -0
  35. package/dist/canvas/particles.js +138 -0
  36. package/dist/canvas/particles.js.map +1 -0
  37. package/dist/canvas/sequence.d.ts +43 -0
  38. package/dist/canvas/sequence.d.ts.map +1 -0
  39. package/dist/canvas/sequence.js +162 -0
  40. package/dist/canvas/sequence.js.map +1 -0
  41. package/dist/component/bind.d.ts +25 -0
  42. package/dist/component/bind.d.ts.map +1 -0
  43. package/dist/component/bind.js +28 -0
  44. package/dist/component/bind.js.map +1 -0
  45. package/dist/component/component.d.ts +76 -0
  46. package/dist/component/component.d.ts.map +1 -0
  47. package/dist/component/component.js +219 -0
  48. package/dist/component/component.js.map +1 -0
  49. package/dist/component/connect.d.ts +60 -0
  50. package/dist/component/connect.d.ts.map +1 -0
  51. package/dist/component/connect.js +115 -0
  52. package/dist/component/connect.js.map +1 -0
  53. package/dist/component/html.d.ts +35 -0
  54. package/dist/component/html.d.ts.map +1 -0
  55. package/dist/component/html.js +51 -0
  56. package/dist/component/html.js.map +1 -0
  57. package/dist/component/hydrate.d.ts +37 -0
  58. package/dist/component/hydrate.d.ts.map +1 -0
  59. package/dist/component/hydrate.js +242 -0
  60. package/dist/component/hydrate.js.map +1 -0
  61. package/dist/component/index.d.ts +9 -0
  62. package/dist/component/index.d.ts.map +1 -0
  63. package/dist/component/index.js +6 -0
  64. package/dist/component/index.js.map +1 -0
  65. package/dist/component/template.d.ts +30 -0
  66. package/dist/component/template.d.ts.map +1 -0
  67. package/dist/component/template.js +469 -0
  68. package/dist/component/template.js.map +1 -0
  69. package/dist/css/gradient-text.d.ts +40 -0
  70. package/dist/css/gradient-text.d.ts.map +1 -0
  71. package/dist/css/gradient-text.js +90 -0
  72. package/dist/css/gradient-text.js.map +1 -0
  73. package/dist/css/index.d.ts +3 -0
  74. package/dist/css/index.d.ts.map +1 -0
  75. package/dist/css/index.js +2 -0
  76. package/dist/css/index.js.map +1 -0
  77. package/dist/devtools/devtools.d.ts +27 -0
  78. package/dist/devtools/devtools.d.ts.map +1 -0
  79. package/dist/devtools/devtools.js +237 -0
  80. package/dist/devtools/devtools.js.map +1 -0
  81. package/dist/devtools/index.d.ts +3 -0
  82. package/dist/devtools/index.d.ts.map +1 -0
  83. package/dist/devtools/index.js +2 -0
  84. package/dist/devtools/index.js.map +1 -0
  85. package/dist/drag/drag.d.ts +38 -0
  86. package/dist/drag/drag.d.ts.map +1 -0
  87. package/dist/drag/drag.js +181 -0
  88. package/dist/drag/drag.js.map +1 -0
  89. package/dist/drag/index.d.ts +3 -0
  90. package/dist/drag/index.d.ts.map +1 -0
  91. package/dist/drag/index.js +2 -0
  92. package/dist/drag/index.js.map +1 -0
  93. package/dist/dropdown/dropdown.d.ts +55 -0
  94. package/dist/dropdown/dropdown.d.ts.map +1 -0
  95. package/dist/dropdown/dropdown.js +314 -0
  96. package/dist/dropdown/dropdown.js.map +1 -0
  97. package/dist/dropdown/group.d.ts +18 -0
  98. package/dist/dropdown/group.d.ts.map +1 -0
  99. package/dist/dropdown/group.js +119 -0
  100. package/dist/dropdown/group.js.map +1 -0
  101. package/dist/dropdown/index.d.ts +5 -0
  102. package/dist/dropdown/index.d.ts.map +1 -0
  103. package/dist/dropdown/index.js +3 -0
  104. package/dist/dropdown/index.js.map +1 -0
  105. package/dist/forms/form-engine.d.ts +91 -0
  106. package/dist/forms/form-engine.d.ts.map +1 -0
  107. package/dist/forms/form-engine.js +228 -0
  108. package/dist/forms/form-engine.js.map +1 -0
  109. package/dist/forms/index.d.ts +3 -0
  110. package/dist/forms/index.d.ts.map +1 -0
  111. package/dist/forms/index.js +2 -0
  112. package/dist/forms/index.js.map +1 -0
  113. package/dist/forms/validators.d.ts +20 -0
  114. package/dist/forms/validators.d.ts.map +1 -0
  115. package/dist/forms/validators.js +82 -0
  116. package/dist/forms/validators.js.map +1 -0
  117. package/dist/gallery/gallery.d.ts +66 -0
  118. package/dist/gallery/gallery.d.ts.map +1 -0
  119. package/dist/gallery/gallery.js +347 -0
  120. package/dist/gallery/gallery.js.map +1 -0
  121. package/dist/gallery/index.d.ts +3 -0
  122. package/dist/gallery/index.d.ts.map +1 -0
  123. package/dist/gallery/index.js +2 -0
  124. package/dist/gallery/index.js.map +1 -0
  125. package/dist/gesture/gesture.d.ts +44 -0
  126. package/dist/gesture/gesture.d.ts.map +1 -0
  127. package/dist/gesture/gesture.js +152 -0
  128. package/dist/gesture/gesture.js.map +1 -0
  129. package/dist/gesture/index.d.ts +3 -0
  130. package/dist/gesture/index.d.ts.map +1 -0
  131. package/dist/gesture/index.js +2 -0
  132. package/dist/gesture/index.js.map +1 -0
  133. package/dist/http/http.d.ts +44 -0
  134. package/dist/http/http.d.ts.map +1 -0
  135. package/dist/http/http.js +135 -0
  136. package/dist/http/http.js.map +1 -0
  137. package/dist/http/index.d.ts +3 -0
  138. package/dist/http/index.d.ts.map +1 -0
  139. package/dist/http/index.js +2 -0
  140. package/dist/http/index.js.map +1 -0
  141. package/dist/i18n/i18n.d.ts +28 -0
  142. package/dist/i18n/i18n.d.ts.map +1 -0
  143. package/dist/i18n/i18n.js +84 -0
  144. package/dist/i18n/i18n.js.map +1 -0
  145. package/dist/i18n/index.d.ts +3 -0
  146. package/dist/i18n/index.d.ts.map +1 -0
  147. package/dist/i18n/index.js +2 -0
  148. package/dist/i18n/index.js.map +1 -0
  149. package/dist/image/effects.d.ts +33 -0
  150. package/dist/image/effects.d.ts.map +1 -0
  151. package/dist/image/effects.js +236 -0
  152. package/dist/image/effects.js.map +1 -0
  153. package/dist/image/image.d.ts +83 -0
  154. package/dist/image/image.d.ts.map +1 -0
  155. package/dist/image/image.js +236 -0
  156. package/dist/image/image.js.map +1 -0
  157. package/dist/image/index.d.ts +5 -0
  158. package/dist/image/index.d.ts.map +1 -0
  159. package/dist/image/index.js +3 -0
  160. package/dist/image/index.js.map +1 -0
  161. package/dist/interaction/index.d.ts +3 -0
  162. package/dist/interaction/index.d.ts.map +1 -0
  163. package/dist/interaction/index.js +2 -0
  164. package/dist/interaction/index.js.map +1 -0
  165. package/dist/interaction/tilt.d.ts +30 -0
  166. package/dist/interaction/tilt.d.ts.map +1 -0
  167. package/dist/interaction/tilt.js +131 -0
  168. package/dist/interaction/tilt.js.map +1 -0
  169. package/dist/lazy/index.d.ts +3 -0
  170. package/dist/lazy/index.d.ts.map +1 -0
  171. package/dist/lazy/index.js +2 -0
  172. package/dist/lazy/index.js.map +1 -0
  173. package/dist/lazy/lazy.d.ts +42 -0
  174. package/dist/lazy/lazy.d.ts.map +1 -0
  175. package/dist/lazy/lazy.js +80 -0
  176. package/dist/lazy/lazy.js.map +1 -0
  177. package/dist/modal/index.d.ts +3 -0
  178. package/dist/modal/index.d.ts.map +1 -0
  179. package/dist/modal/index.js +2 -0
  180. package/dist/modal/index.js.map +1 -0
  181. package/dist/modal/modal.d.ts +39 -0
  182. package/dist/modal/modal.d.ts.map +1 -0
  183. package/dist/modal/modal.js +174 -0
  184. package/dist/modal/modal.js.map +1 -0
  185. package/dist/router/index.d.ts +3 -0
  186. package/dist/router/index.d.ts.map +1 -0
  187. package/dist/router/index.js +2 -0
  188. package/dist/router/index.js.map +1 -0
  189. package/dist/router/router.d.ts +80 -0
  190. package/dist/router/router.d.ts.map +1 -0
  191. package/dist/router/router.js +256 -0
  192. package/dist/router/router.js.map +1 -0
  193. package/dist/router/speculate.d.ts +28 -0
  194. package/dist/router/speculate.d.ts.map +1 -0
  195. package/dist/router/speculate.js +36 -0
  196. package/dist/router/speculate.js.map +1 -0
  197. package/dist/search/fuzzy.d.ts +16 -0
  198. package/dist/search/fuzzy.d.ts.map +1 -0
  199. package/dist/search/fuzzy.js +77 -0
  200. package/dist/search/fuzzy.js.map +1 -0
  201. package/dist/search/index.d.ts +5 -0
  202. package/dist/search/index.d.ts.map +1 -0
  203. package/dist/search/index.js +3 -0
  204. package/dist/search/index.js.map +1 -0
  205. package/dist/search/search.d.ts +56 -0
  206. package/dist/search/search.d.ts.map +1 -0
  207. package/dist/search/search.js +540 -0
  208. package/dist/search/search.js.map +1 -0
  209. package/dist/search/wasm.d.ts +35 -0
  210. package/dist/search/wasm.d.ts.map +1 -0
  211. package/dist/search/wasm.js +51 -0
  212. package/dist/search/wasm.js.map +1 -0
  213. package/dist/security/cors.d.ts +61 -0
  214. package/dist/security/cors.d.ts.map +1 -0
  215. package/dist/security/cors.js +174 -0
  216. package/dist/security/cors.js.map +1 -0
  217. package/dist/security/csp.d.ts +49 -0
  218. package/dist/security/csp.d.ts.map +1 -0
  219. package/dist/security/csp.js +143 -0
  220. package/dist/security/csp.js.map +1 -0
  221. package/dist/security/csrf.d.ts +47 -0
  222. package/dist/security/csrf.d.ts.map +1 -0
  223. package/dist/security/csrf.js +122 -0
  224. package/dist/security/csrf.js.map +1 -0
  225. package/dist/security/encrypt.d.ts +64 -0
  226. package/dist/security/encrypt.d.ts.map +1 -0
  227. package/dist/security/encrypt.js +129 -0
  228. package/dist/security/encrypt.js.map +1 -0
  229. package/dist/security/index.d.ts +21 -0
  230. package/dist/security/index.d.ts.map +1 -0
  231. package/dist/security/index.js +11 -0
  232. package/dist/security/index.js.map +1 -0
  233. package/dist/security/rate-limit.d.ts +57 -0
  234. package/dist/security/rate-limit.d.ts.map +1 -0
  235. package/dist/security/rate-limit.js +222 -0
  236. package/dist/security/rate-limit.js.map +1 -0
  237. package/dist/security/rbac.d.ts +84 -0
  238. package/dist/security/rbac.d.ts.map +1 -0
  239. package/dist/security/rbac.js +164 -0
  240. package/dist/security/rbac.js.map +1 -0
  241. package/dist/security/sanitize.d.ts +44 -0
  242. package/dist/security/sanitize.d.ts.map +1 -0
  243. package/dist/security/sanitize.js +230 -0
  244. package/dist/security/sanitize.js.map +1 -0
  245. package/dist/security/secure-store.d.ts +44 -0
  246. package/dist/security/secure-store.d.ts.map +1 -0
  247. package/dist/security/secure-store.js +164 -0
  248. package/dist/security/secure-store.js.map +1 -0
  249. package/dist/security/session.d.ts +76 -0
  250. package/dist/security/session.d.ts.map +1 -0
  251. package/dist/security/session.js +251 -0
  252. package/dist/security/session.js.map +1 -0
  253. package/dist/security/sri.d.ts +66 -0
  254. package/dist/security/sri.d.ts.map +1 -0
  255. package/dist/security/sri.js +159 -0
  256. package/dist/security/sri.js.map +1 -0
  257. package/dist/shortcuts/index.d.ts +3 -0
  258. package/dist/shortcuts/index.d.ts.map +1 -0
  259. package/dist/shortcuts/index.js +2 -0
  260. package/dist/shortcuts/index.js.map +1 -0
  261. package/dist/shortcuts/shortcuts.d.ts +43 -0
  262. package/dist/shortcuts/shortcuts.d.ts.map +1 -0
  263. package/dist/shortcuts/shortcuts.js +141 -0
  264. package/dist/shortcuts/shortcuts.js.map +1 -0
  265. package/dist/ssr/index.d.ts +3 -0
  266. package/dist/ssr/index.d.ts.map +1 -0
  267. package/dist/ssr/index.js +2 -0
  268. package/dist/ssr/index.js.map +1 -0
  269. package/dist/ssr/ssr.d.ts +62 -0
  270. package/dist/ssr/ssr.d.ts.map +1 -0
  271. package/dist/ssr/ssr.js +132 -0
  272. package/dist/ssr/ssr.js.map +1 -0
  273. package/dist/state/index.d.ts +5 -0
  274. package/dist/state/index.d.ts.map +1 -0
  275. package/dist/state/index.js +3 -0
  276. package/dist/state/index.js.map +1 -0
  277. package/dist/state/persistent.d.ts +31 -0
  278. package/dist/state/persistent.d.ts.map +1 -0
  279. package/dist/state/persistent.js +132 -0
  280. package/dist/state/persistent.js.map +1 -0
  281. package/dist/state/store.d.ts +31 -0
  282. package/dist/state/store.d.ts.map +1 -0
  283. package/dist/state/store.js +107 -0
  284. package/dist/state/store.js.map +1 -0
  285. package/dist/store/index.d.ts +3 -0
  286. package/dist/store/index.d.ts.map +1 -0
  287. package/dist/store/index.js +2 -0
  288. package/dist/store/index.js.map +1 -0
  289. package/dist/store/store.d.ts +36 -0
  290. package/dist/store/store.d.ts.map +1 -0
  291. package/dist/store/store.js +175 -0
  292. package/dist/store/store.js.map +1 -0
  293. package/dist/supabase/auth.d.ts +28 -0
  294. package/dist/supabase/auth.d.ts.map +1 -0
  295. package/dist/supabase/auth.js +47 -0
  296. package/dist/supabase/auth.js.map +1 -0
  297. package/dist/supabase/client.d.ts +18 -0
  298. package/dist/supabase/client.d.ts.map +1 -0
  299. package/dist/supabase/client.js +36 -0
  300. package/dist/supabase/client.js.map +1 -0
  301. package/dist/supabase/realtime.d.ts +22 -0
  302. package/dist/supabase/realtime.d.ts.map +1 -0
  303. package/dist/supabase/realtime.js +51 -0
  304. package/dist/supabase/realtime.js.map +1 -0
  305. package/dist/sw/index.d.ts +3 -0
  306. package/dist/sw/index.d.ts.map +1 -0
  307. package/dist/sw/index.js +2 -0
  308. package/dist/sw/index.js.map +1 -0
  309. package/dist/sw/sw.d.ts +49 -0
  310. package/dist/sw/sw.d.ts.map +1 -0
  311. package/dist/sw/sw.js +125 -0
  312. package/dist/sw/sw.js.map +1 -0
  313. package/dist/tabs/index.d.ts +3 -0
  314. package/dist/tabs/index.d.ts.map +1 -0
  315. package/dist/tabs/index.js +2 -0
  316. package/dist/tabs/index.js.map +1 -0
  317. package/dist/tabs/tabs.d.ts +34 -0
  318. package/dist/tabs/tabs.d.ts.map +1 -0
  319. package/dist/tabs/tabs.js +173 -0
  320. package/dist/tabs/tabs.js.map +1 -0
  321. package/dist/test/index.d.ts +3 -0
  322. package/dist/test/index.d.ts.map +1 -0
  323. package/dist/test/index.js +2 -0
  324. package/dist/test/index.js.map +1 -0
  325. package/dist/test/test.d.ts +37 -0
  326. package/dist/test/test.d.ts.map +1 -0
  327. package/dist/test/test.js +108 -0
  328. package/dist/test/test.js.map +1 -0
  329. package/dist/theme/index.d.ts +3 -0
  330. package/dist/theme/index.d.ts.map +1 -0
  331. package/dist/theme/index.js +2 -0
  332. package/dist/theme/index.js.map +1 -0
  333. package/dist/theme/theme.d.ts +40 -0
  334. package/dist/theme/theme.d.ts.map +1 -0
  335. package/dist/theme/theme.js +142 -0
  336. package/dist/theme/theme.js.map +1 -0
  337. package/dist/timeline/index.d.ts +3 -0
  338. package/dist/timeline/index.d.ts.map +1 -0
  339. package/dist/timeline/index.js +2 -0
  340. package/dist/timeline/index.js.map +1 -0
  341. package/dist/timeline/timeline.d.ts +44 -0
  342. package/dist/timeline/timeline.d.ts.map +1 -0
  343. package/dist/timeline/timeline.js +196 -0
  344. package/dist/timeline/timeline.js.map +1 -0
  345. package/dist/toast/index.d.ts +3 -0
  346. package/dist/toast/index.d.ts.map +1 -0
  347. package/dist/toast/index.js +2 -0
  348. package/dist/toast/index.js.map +1 -0
  349. package/dist/toast/toast.d.ts +31 -0
  350. package/dist/toast/toast.d.ts.map +1 -0
  351. package/dist/toast/toast.js +198 -0
  352. package/dist/toast/toast.js.map +1 -0
  353. package/dist/tooltip/index.d.ts +3 -0
  354. package/dist/tooltip/index.d.ts.map +1 -0
  355. package/dist/tooltip/index.js +2 -0
  356. package/dist/tooltip/index.js.map +1 -0
  357. package/dist/tooltip/tooltip.d.ts +27 -0
  358. package/dist/tooltip/tooltip.d.ts.map +1 -0
  359. package/dist/tooltip/tooltip.js +229 -0
  360. package/dist/tooltip/tooltip.js.map +1 -0
  361. package/dist/transition/index.d.ts +3 -0
  362. package/dist/transition/index.d.ts.map +1 -0
  363. package/dist/transition/index.js +2 -0
  364. package/dist/transition/index.js.map +1 -0
  365. package/dist/transition/transition.d.ts +31 -0
  366. package/dist/transition/transition.d.ts.map +1 -0
  367. package/dist/transition/transition.js +95 -0
  368. package/dist/transition/transition.js.map +1 -0
  369. package/dist/webgl/index.d.ts +3 -0
  370. package/dist/webgl/index.d.ts.map +1 -0
  371. package/dist/webgl/index.js +2 -0
  372. package/dist/webgl/index.js.map +1 -0
  373. package/dist/webgl/webgl.d.ts +49 -0
  374. package/dist/webgl/webgl.d.ts.map +1 -0
  375. package/dist/webgl/webgl.js +401 -0
  376. package/dist/webgl/webgl.js.map +1 -0
  377. package/package.json +269 -0
  378. package/styles/base/global.css +47 -0
  379. package/styles/base/reset.css +73 -0
  380. package/styles/tokens/colors.css +50 -0
  381. package/styles/tokens/spacing.css +46 -0
  382. package/styles/tokens/typography.css +37 -0
  383. package/styles/utilities/layout.css +46 -0
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Nova Engine — Encryption
3
+ *
4
+ * Web Crypto API wrappers for AES-GCM encryption/decryption,
5
+ * SHA hashing, HMAC signing, key derivation (PBKDF2),
6
+ * and secure random generation.
7
+ */
8
+ export interface EncryptedPayload {
9
+ /** Base64-encoded ciphertext */
10
+ ciphertext: string;
11
+ /** Base64-encoded initialization vector */
12
+ iv: string;
13
+ /** Algorithm used */
14
+ algorithm: string;
15
+ }
16
+ export interface KeyPair {
17
+ /** Exported public key (JWK) */
18
+ publicKey: JsonWebKey;
19
+ /** Exported private key (JWK) */
20
+ privateKey: JsonWebKey;
21
+ }
22
+ /** Generate a random AES-GCM key. */
23
+ export declare function generateKey(length?: 128 | 192 | 256): Promise<CryptoKey>;
24
+ /** Export a CryptoKey to a JSON Web Key. */
25
+ export declare function exportKey(key: CryptoKey): Promise<JsonWebKey>;
26
+ /** Import a JSON Web Key as a CryptoKey. */
27
+ export declare function importKey(jwk: JsonWebKey, usages?: KeyUsage[]): Promise<CryptoKey>;
28
+ /** Encrypt plaintext with AES-GCM. */
29
+ export declare function encrypt(plaintext: string, key: CryptoKey): Promise<EncryptedPayload>;
30
+ /** Decrypt an AES-GCM encrypted payload. */
31
+ export declare function decrypt(payload: EncryptedPayload, key: CryptoKey): Promise<string>;
32
+ /** Derive an AES key from a password using PBKDF2. */
33
+ export declare function deriveKey(password: string, salt?: string, iterations?: number, keyLength?: 128 | 192 | 256): Promise<{
34
+ key: CryptoKey;
35
+ salt: string;
36
+ }>;
37
+ export type HashAlgorithm = 'SHA-1' | 'SHA-256' | 'SHA-384' | 'SHA-512';
38
+ /** Hash a string using the specified algorithm. Returns hex string. */
39
+ export declare function hash(data: string, algorithm?: HashAlgorithm): Promise<string>;
40
+ /** Hash an ArrayBuffer. Returns hex string. */
41
+ export declare function hashBuffer(data: ArrayBuffer, algorithm?: HashAlgorithm): Promise<string>;
42
+ /** Hash a string and return Base64. Useful for SRI/CSP hashes. */
43
+ export declare function hashBase64(data: string, algorithm?: HashAlgorithm): Promise<string>;
44
+ /** Generate an HMAC key. */
45
+ export declare function generateHMACKey(algorithm?: HashAlgorithm): Promise<CryptoKey>;
46
+ /** Sign data with HMAC. Returns base64 signature. */
47
+ export declare function sign(data: string, key: CryptoKey): Promise<string>;
48
+ /** Verify an HMAC signature. */
49
+ export declare function verify(data: string, signature: string, key: CryptoKey): Promise<boolean>;
50
+ /** Generate a cryptographically secure random hex string. */
51
+ export declare function randomHex(bytes?: number): string;
52
+ /** Generate a cryptographically secure random base64 string. */
53
+ export declare function randomBase64(bytes?: number): string;
54
+ /** Generate a UUID v4. */
55
+ export declare function uuid(): string;
56
+ /**
57
+ * Pre-hash a password before sending to server.
58
+ * This doesn't replace server-side hashing (bcrypt/argon2)
59
+ * but prevents the plaintext password from ever hitting the wire.
60
+ */
61
+ export declare function prehashPassword(password: string, salt: string): Promise<string>;
62
+ /** Constant-time string comparison to prevent timing attacks. */
63
+ export declare function timingSafeEqual(a: string, b: string): boolean;
64
+ //# sourceMappingURL=encrypt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encrypt.d.ts","sourceRoot":"","sources":["../../src/security/encrypt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Nova Engine — Encryption
3
+ *
4
+ * Web Crypto API wrappers for AES-GCM encryption/decryption,
5
+ * SHA hashing, HMAC signing, key derivation (PBKDF2),
6
+ * and secure random generation.
7
+ */
8
+ // --- Helpers ---
9
+ function toBase64(buffer) {
10
+ return btoa(String.fromCharCode(...new Uint8Array(buffer)));
11
+ }
12
+ function fromBase64(base64) {
13
+ const binary = atob(base64);
14
+ const bytes = new Uint8Array(binary.length);
15
+ for (let i = 0; i < binary.length; i++)
16
+ bytes[i] = binary.charCodeAt(i);
17
+ return bytes.buffer;
18
+ }
19
+ function encode(text) {
20
+ return new TextEncoder().encode(text);
21
+ }
22
+ function decode(buffer) {
23
+ return new TextDecoder().decode(buffer);
24
+ }
25
+ // --- AES-GCM Symmetric Encryption ---
26
+ /** Generate a random AES-GCM key. */
27
+ export async function generateKey(length = 256) {
28
+ return crypto.subtle.generateKey({ name: 'AES-GCM', length }, true, ['encrypt', 'decrypt']);
29
+ }
30
+ /** Export a CryptoKey to a JSON Web Key. */
31
+ export async function exportKey(key) {
32
+ return crypto.subtle.exportKey('jwk', key);
33
+ }
34
+ /** Import a JSON Web Key as a CryptoKey. */
35
+ export async function importKey(jwk, usages = ['encrypt', 'decrypt']) {
36
+ return crypto.subtle.importKey('jwk', jwk, { name: 'AES-GCM' }, true, usages);
37
+ }
38
+ /** Encrypt plaintext with AES-GCM. */
39
+ export async function encrypt(plaintext, key) {
40
+ const iv = crypto.getRandomValues(new Uint8Array(12));
41
+ const ciphertext = await crypto.subtle.encrypt({ name: 'AES-GCM', iv: iv }, key, encode(plaintext));
42
+ return {
43
+ ciphertext: toBase64(ciphertext),
44
+ iv: toBase64(iv.buffer),
45
+ algorithm: 'AES-GCM',
46
+ };
47
+ }
48
+ /** Decrypt an AES-GCM encrypted payload. */
49
+ export async function decrypt(payload, key) {
50
+ const plaintext = await crypto.subtle.decrypt({ name: 'AES-GCM', iv: new Uint8Array(fromBase64(payload.iv)) }, key, fromBase64(payload.ciphertext));
51
+ return decode(plaintext);
52
+ }
53
+ // --- Key Derivation (PBKDF2) ---
54
+ /** Derive an AES key from a password using PBKDF2. */
55
+ export async function deriveKey(password, salt, iterations = 100_000, keyLength = 256) {
56
+ const saltBytes = salt
57
+ ? new Uint8Array(fromBase64(salt))
58
+ : crypto.getRandomValues(new Uint8Array(16));
59
+ const baseKey = await crypto.subtle.importKey('raw', encode(password), 'PBKDF2', false, ['deriveKey']);
60
+ const derivedKey = await crypto.subtle.deriveKey({ name: 'PBKDF2', salt: saltBytes, iterations, hash: 'SHA-256' }, baseKey, { name: 'AES-GCM', length: keyLength }, true, ['encrypt', 'decrypt']);
61
+ return { key: derivedKey, salt: toBase64(saltBytes.buffer) };
62
+ }
63
+ /** Hash a string using the specified algorithm. Returns hex string. */
64
+ export async function hash(data, algorithm = 'SHA-256') {
65
+ const digest = await crypto.subtle.digest(algorithm, encode(data));
66
+ return Array.from(new Uint8Array(digest), b => b.toString(16).padStart(2, '0')).join('');
67
+ }
68
+ /** Hash an ArrayBuffer. Returns hex string. */
69
+ export async function hashBuffer(data, algorithm = 'SHA-256') {
70
+ const digest = await crypto.subtle.digest(algorithm, data);
71
+ return Array.from(new Uint8Array(digest), b => b.toString(16).padStart(2, '0')).join('');
72
+ }
73
+ /** Hash a string and return Base64. Useful for SRI/CSP hashes. */
74
+ export async function hashBase64(data, algorithm = 'SHA-256') {
75
+ const digest = await crypto.subtle.digest(algorithm, encode(data));
76
+ return toBase64(digest);
77
+ }
78
+ // --- HMAC ---
79
+ /** Generate an HMAC key. */
80
+ export async function generateHMACKey(algorithm = 'SHA-256') {
81
+ return crypto.subtle.generateKey({ name: 'HMAC', hash: algorithm }, true, ['sign', 'verify']);
82
+ }
83
+ /** Sign data with HMAC. Returns base64 signature. */
84
+ export async function sign(data, key) {
85
+ const signature = await crypto.subtle.sign('HMAC', key, encode(data));
86
+ return toBase64(signature);
87
+ }
88
+ /** Verify an HMAC signature. */
89
+ export async function verify(data, signature, key) {
90
+ return crypto.subtle.verify('HMAC', key, fromBase64(signature), encode(data));
91
+ }
92
+ // --- Random Generation ---
93
+ /** Generate a cryptographically secure random hex string. */
94
+ export function randomHex(bytes = 32) {
95
+ const buf = new Uint8Array(bytes);
96
+ crypto.getRandomValues(buf);
97
+ return Array.from(buf, b => b.toString(16).padStart(2, '0')).join('');
98
+ }
99
+ /** Generate a cryptographically secure random base64 string. */
100
+ export function randomBase64(bytes = 32) {
101
+ const buf = new Uint8Array(bytes);
102
+ crypto.getRandomValues(buf);
103
+ return toBase64(buf.buffer);
104
+ }
105
+ /** Generate a UUID v4. */
106
+ export function uuid() {
107
+ return crypto.randomUUID();
108
+ }
109
+ // --- Password Hashing (client-side pre-hash) ---
110
+ /**
111
+ * Pre-hash a password before sending to server.
112
+ * This doesn't replace server-side hashing (bcrypt/argon2)
113
+ * but prevents the plaintext password from ever hitting the wire.
114
+ */
115
+ export async function prehashPassword(password, salt) {
116
+ return hash(`${salt}:${password}`, 'SHA-256');
117
+ }
118
+ // --- Constant-Time Comparison ---
119
+ /** Constant-time string comparison to prevent timing attacks. */
120
+ export function timingSafeEqual(a, b) {
121
+ if (a.length !== b.length)
122
+ return false;
123
+ let result = 0;
124
+ for (let i = 0; i < a.length; i++) {
125
+ result |= a.charCodeAt(i) ^ b.charCodeAt(i);
126
+ }
127
+ return result === 0;
128
+ }
129
+ //# sourceMappingURL=encrypt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encrypt.js","sourceRoot":"","sources":["../../src/security/encrypt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export { createCSRF } from './csrf';
2
+ export type { CSRFOptions, CSRFInstance } from './csrf';
3
+ export { createCSP, CSPPresets } from './csp';
4
+ export type { CSPDirective, CSPValue, CSPBuilder } from './csp';
5
+ export { createRateLimiter, createRateLimitGroup, RateLimitError } from './rate-limit';
6
+ export type { RateLimitOptions, RateLimitStrategy, RateLimiter, RateLimitGroup } from './rate-limit';
7
+ export { generateKey, exportKey, importKey, encrypt, decrypt, deriveKey, hash, hashBuffer, hashBase64, generateHMACKey, sign, verify, randomHex, randomBase64, uuid, prehashPassword, timingSafeEqual, } from './encrypt';
8
+ export type { EncryptedPayload, KeyPair, HashAlgorithm } from './encrypt';
9
+ export { sanitize, stripTags, escapeHTML, sanitizeURL, cleanInput, sanitizeFilename, detectXSS } from './sanitize';
10
+ export type { SanitizeOptions } from './sanitize';
11
+ export { createSession } from './session';
12
+ export type { SessionOptions, SessionData, SessionInstance } from './session';
13
+ export { createRBAC, parsePermission, defineSimpleRole } from './rbac';
14
+ export type { Permission, Role, RBACOptions, RBACInstance } from './rbac';
15
+ export { createSecureStore } from './secure-store';
16
+ export type { SecureStoreOptions, SecureStoreInstance } from './secure-store';
17
+ export { generateSRI, generateSRIFromBuffer, generateSRIFromURL, createSecureScript, createSecureStylesheet, verifySRI, enforceAllSRI, } from './sri';
18
+ export type { SRIAlgorithm, SRIOptions, SRIHash } from './sri';
19
+ export { createCORS, wouldPreflight, parseOrigin } from './cors';
20
+ export type { CORSOptions, CORSInstance, CORSValidation } from './cors';
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/security/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAExD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAC9C,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAEhE,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACvF,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAErG,OAAO,EACL,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EACnD,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EACvC,eAAe,EAAE,IAAI,EAAE,MAAM,EAC7B,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,eAAe,GAChE,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,gBAAgB,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1E,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACnH,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE9E,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AACvE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAE1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE9E,OAAO,EACL,WAAW,EAAE,qBAAqB,EAAE,kBAAkB,EACtD,kBAAkB,EAAE,sBAAsB,EAC1C,SAAS,EAAE,aAAa,GACzB,MAAM,OAAO,CAAC;AACf,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAE/D,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACjE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC"}
@@ -0,0 +1,11 @@
1
+ export { createCSRF } from './csrf';
2
+ export { createCSP, CSPPresets } from './csp';
3
+ export { createRateLimiter, createRateLimitGroup, RateLimitError } from './rate-limit';
4
+ export { generateKey, exportKey, importKey, encrypt, decrypt, deriveKey, hash, hashBuffer, hashBase64, generateHMACKey, sign, verify, randomHex, randomBase64, uuid, prehashPassword, timingSafeEqual, } from './encrypt';
5
+ export { sanitize, stripTags, escapeHTML, sanitizeURL, cleanInput, sanitizeFilename, detectXSS } from './sanitize';
6
+ export { createSession } from './session';
7
+ export { createRBAC, parsePermission, defineSimpleRole } from './rbac';
8
+ export { createSecureStore } from './secure-store';
9
+ export { generateSRI, generateSRIFromBuffer, generateSRIFromURL, createSecureScript, createSecureStylesheet, verifySRI, enforceAllSRI, } from './sri';
10
+ export { createCORS, wouldPreflight, parseOrigin } from './cors';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/security/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAGpC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAG9C,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAGvF,OAAO,EACL,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EACnD,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EACvC,eAAe,EAAE,IAAI,EAAE,MAAM,EAC7B,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,eAAe,GAChE,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGnH,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAG1C,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAGvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGnD,OAAO,EACL,WAAW,EAAE,qBAAqB,EAAE,kBAAkB,EACtD,kBAAkB,EAAE,sBAAsB,EAC1C,SAAS,EAAE,aAAa,GACzB,MAAM,OAAO,CAAC;AAGf,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Nova Engine — Client-Side Rate Limiting
3
+ *
4
+ * Token bucket, sliding window, and fixed window algorithms
5
+ * for throttling API calls, form submissions, and user actions.
6
+ */
7
+ export type RateLimitStrategy = 'token-bucket' | 'sliding-window' | 'fixed-window';
8
+ export interface RateLimitOptions {
9
+ /** Max requests allowed in the window. Default: 10 */
10
+ limit: number;
11
+ /** Window duration in milliseconds. Default: 60000 (1 minute) */
12
+ window?: number;
13
+ /** Strategy to use. Default: 'sliding-window' */
14
+ strategy?: RateLimitStrategy;
15
+ /** Token bucket refill rate (tokens per second). Default: limit / (window / 1000) */
16
+ refillRate?: number;
17
+ /** Called when rate limit is exceeded */
18
+ onLimited?: (retryAfter: number) => void;
19
+ /** Key for per-action rate limiting */
20
+ key?: string;
21
+ }
22
+ export interface RateLimiter {
23
+ /** Check if action is allowed without consuming a token */
24
+ canProceed(): boolean;
25
+ /** Attempt to consume a token. Returns true if allowed, false if limited */
26
+ attempt(): boolean;
27
+ /** Get remaining attempts in current window */
28
+ remaining(): number;
29
+ /** Get milliseconds until next token/window reset */
30
+ retryAfter(): number;
31
+ /** Reset the limiter */
32
+ reset(): void;
33
+ /** Wrap an async function with rate limiting */
34
+ wrap<T>(fn: () => Promise<T>): Promise<T>;
35
+ /** Destroy the limiter and clear timers */
36
+ destroy(): void;
37
+ }
38
+ export interface RateLimitGroup {
39
+ /** Get or create a limiter for a key */
40
+ get(key: string): RateLimiter;
41
+ /** Check if a key is currently limited */
42
+ isLimited(key: string): boolean;
43
+ /** Reset all limiters */
44
+ resetAll(): void;
45
+ /** Destroy all limiters */
46
+ destroy(): void;
47
+ }
48
+ /** Error thrown when rate limit is exceeded. */
49
+ export declare class RateLimitError extends Error {
50
+ readonly retryAfter: number;
51
+ constructor(retryAfter: number);
52
+ }
53
+ /** Create a rate limiter instance. */
54
+ export declare function createRateLimiter(options: RateLimitOptions): RateLimiter;
55
+ /** Create a group of rate limiters keyed by action/resource. */
56
+ export declare function createRateLimitGroup(defaults: Omit<RateLimitOptions, 'key'>): RateLimitGroup;
57
+ //# sourceMappingURL=rate-limit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../src/security/rate-limit.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,iBAAiB,GAAG,cAAc,GAAG,gBAAgB,GAAG,cAAc,CAAC;AAEnF,MAAM,WAAW,gBAAgB;IAC/B,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,qFAAqF;IACrF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yCAAyC;IACzC,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,uCAAuC;IACvC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,2DAA2D;IAC3D,UAAU,IAAI,OAAO,CAAC;IACtB,4EAA4E;IAC5E,OAAO,IAAI,OAAO,CAAC;IACnB,+CAA+C;IAC/C,SAAS,IAAI,MAAM,CAAC;IACpB,qDAAqD;IACrD,UAAU,IAAI,MAAM,CAAC;IACrB,wBAAwB;IACxB,KAAK,IAAI,IAAI,CAAC;IACd,gDAAgD;IAChD,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC1C,2CAA2C;IAC3C,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,wCAAwC;IACxC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAAC;IAC9B,0CAA0C;IAC1C,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,yBAAyB;IACzB,QAAQ,IAAI,IAAI,CAAC;IACjB,2BAA2B;IAC3B,OAAO,IAAI,IAAI,CAAC;CACjB;AAmMD,gDAAgD;AAChD,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;gBAChB,UAAU,EAAE,MAAM;CAK/B;AAED,sCAAsC;AACtC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,gBAAgB,GAAG,WAAW,CAkBxE;AAED,gEAAgE;AAChE,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,GACtC,cAAc,CA2BhB"}
@@ -0,0 +1,222 @@
1
+ /**
2
+ * Nova Engine — Client-Side Rate Limiting
3
+ *
4
+ * Token bucket, sliding window, and fixed window algorithms
5
+ * for throttling API calls, form submissions, and user actions.
6
+ */
7
+ class TokenBucketLimiter {
8
+ tokens;
9
+ lastRefill;
10
+ maxTokens;
11
+ refillRate;
12
+ onLimited;
13
+ constructor(limit, refillRate, onLimited) {
14
+ this.maxTokens = limit;
15
+ this.tokens = limit;
16
+ this.refillRate = refillRate;
17
+ this.lastRefill = Date.now();
18
+ this.onLimited = onLimited;
19
+ }
20
+ refill() {
21
+ const now = Date.now();
22
+ const elapsed = (now - this.lastRefill) / 1000;
23
+ this.tokens = Math.min(this.maxTokens, this.tokens + elapsed * this.refillRate);
24
+ this.lastRefill = now;
25
+ }
26
+ canProceed() {
27
+ this.refill();
28
+ return this.tokens >= 1;
29
+ }
30
+ attempt() {
31
+ this.refill();
32
+ if (this.tokens >= 1) {
33
+ this.tokens -= 1;
34
+ return true;
35
+ }
36
+ const retry = this.retryAfter();
37
+ this.onLimited?.(retry);
38
+ return false;
39
+ }
40
+ remaining() {
41
+ this.refill();
42
+ return Math.floor(this.tokens);
43
+ }
44
+ retryAfter() {
45
+ if (this.tokens >= 1)
46
+ return 0;
47
+ return Math.ceil((1 - this.tokens) / this.refillRate * 1000);
48
+ }
49
+ reset() {
50
+ this.tokens = this.maxTokens;
51
+ this.lastRefill = Date.now();
52
+ }
53
+ async wrap(fn) {
54
+ if (!this.attempt()) {
55
+ throw new RateLimitError(this.retryAfter());
56
+ }
57
+ return fn();
58
+ }
59
+ destroy() {
60
+ this.reset();
61
+ }
62
+ }
63
+ class SlidingWindowLimiter {
64
+ timestamps = [];
65
+ limit;
66
+ window;
67
+ onLimited;
68
+ constructor(limit, windowMs, onLimited) {
69
+ this.limit = limit;
70
+ this.window = windowMs;
71
+ this.onLimited = onLimited;
72
+ }
73
+ prune() {
74
+ const cutoff = Date.now() - this.window;
75
+ while (this.timestamps.length > 0 && this.timestamps[0] < cutoff) {
76
+ this.timestamps.shift();
77
+ }
78
+ }
79
+ canProceed() {
80
+ this.prune();
81
+ return this.timestamps.length < this.limit;
82
+ }
83
+ attempt() {
84
+ this.prune();
85
+ if (this.timestamps.length < this.limit) {
86
+ this.timestamps.push(Date.now());
87
+ return true;
88
+ }
89
+ const retry = this.retryAfter();
90
+ this.onLimited?.(retry);
91
+ return false;
92
+ }
93
+ remaining() {
94
+ this.prune();
95
+ return Math.max(0, this.limit - this.timestamps.length);
96
+ }
97
+ retryAfter() {
98
+ this.prune();
99
+ if (this.timestamps.length < this.limit)
100
+ return 0;
101
+ return Math.max(0, this.timestamps[0] + this.window - Date.now());
102
+ }
103
+ reset() {
104
+ this.timestamps = [];
105
+ }
106
+ async wrap(fn) {
107
+ if (!this.attempt()) {
108
+ throw new RateLimitError(this.retryAfter());
109
+ }
110
+ return fn();
111
+ }
112
+ destroy() {
113
+ this.reset();
114
+ }
115
+ }
116
+ class FixedWindowLimiter {
117
+ count = 0;
118
+ windowStart;
119
+ limit;
120
+ window;
121
+ onLimited;
122
+ constructor(limit, windowMs, onLimited) {
123
+ this.limit = limit;
124
+ this.window = windowMs;
125
+ this.windowStart = Date.now();
126
+ this.onLimited = onLimited;
127
+ }
128
+ checkWindow() {
129
+ const now = Date.now();
130
+ if (now - this.windowStart >= this.window) {
131
+ this.count = 0;
132
+ this.windowStart = now;
133
+ }
134
+ }
135
+ canProceed() {
136
+ this.checkWindow();
137
+ return this.count < this.limit;
138
+ }
139
+ attempt() {
140
+ this.checkWindow();
141
+ if (this.count < this.limit) {
142
+ this.count++;
143
+ return true;
144
+ }
145
+ const retry = this.retryAfter();
146
+ this.onLimited?.(retry);
147
+ return false;
148
+ }
149
+ remaining() {
150
+ this.checkWindow();
151
+ return Math.max(0, this.limit - this.count);
152
+ }
153
+ retryAfter() {
154
+ this.checkWindow();
155
+ if (this.count < this.limit)
156
+ return 0;
157
+ return Math.max(0, this.windowStart + this.window - Date.now());
158
+ }
159
+ reset() {
160
+ this.count = 0;
161
+ this.windowStart = Date.now();
162
+ }
163
+ async wrap(fn) {
164
+ if (!this.attempt()) {
165
+ throw new RateLimitError(this.retryAfter());
166
+ }
167
+ return fn();
168
+ }
169
+ destroy() {
170
+ this.reset();
171
+ }
172
+ }
173
+ /** Error thrown when rate limit is exceeded. */
174
+ export class RateLimitError extends Error {
175
+ retryAfter;
176
+ constructor(retryAfter) {
177
+ super(`Rate limit exceeded. Retry after ${retryAfter}ms`);
178
+ this.name = 'RateLimitError';
179
+ this.retryAfter = retryAfter;
180
+ }
181
+ }
182
+ /** Create a rate limiter instance. */
183
+ export function createRateLimiter(options) {
184
+ const { limit, window: windowMs = 60_000, strategy = 'sliding-window', refillRate, onLimited, } = options;
185
+ switch (strategy) {
186
+ case 'token-bucket':
187
+ return new TokenBucketLimiter(limit, refillRate ?? limit / (windowMs / 1000), onLimited);
188
+ case 'fixed-window':
189
+ return new FixedWindowLimiter(limit, windowMs, onLimited);
190
+ case 'sliding-window':
191
+ default:
192
+ return new SlidingWindowLimiter(limit, windowMs, onLimited);
193
+ }
194
+ }
195
+ /** Create a group of rate limiters keyed by action/resource. */
196
+ export function createRateLimitGroup(defaults) {
197
+ const limiters = new Map();
198
+ return {
199
+ get(key) {
200
+ let limiter = limiters.get(key);
201
+ if (!limiter) {
202
+ limiter = createRateLimiter({ ...defaults, key });
203
+ limiters.set(key, limiter);
204
+ }
205
+ return limiter;
206
+ },
207
+ isLimited(key) {
208
+ const limiter = limiters.get(key);
209
+ return limiter ? !limiter.canProceed() : false;
210
+ },
211
+ resetAll() {
212
+ for (const limiter of limiters.values())
213
+ limiter.reset();
214
+ },
215
+ destroy() {
216
+ for (const limiter of limiters.values())
217
+ limiter.destroy();
218
+ limiters.clear();
219
+ },
220
+ };
221
+ }
222
+ //# sourceMappingURL=rate-limit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../src/security/rate-limit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Nova Engine — Role-Based Access Control (RBAC)
3
+ *
4
+ * Permissions, roles, role hierarchies, resource-level guards,
5
+ * and UI visibility control. Works standalone or with the
6
+ * Nova router for route-level access control.
7
+ */
8
+ export interface Permission {
9
+ /** Resource identifier (e.g., 'users', 'posts', 'admin.settings') */
10
+ resource: string;
11
+ /** Action (e.g., 'read', 'write', 'delete', '*') */
12
+ action: string;
13
+ /** Optional condition function for dynamic checks */
14
+ condition?: (context: Record<string, unknown>) => boolean;
15
+ }
16
+ export interface Role {
17
+ /** Role identifier */
18
+ name: string;
19
+ /** Permissions granted to this role */
20
+ permissions: Permission[];
21
+ /** Parent roles to inherit from */
22
+ inherits?: string[];
23
+ }
24
+ export interface RBACOptions {
25
+ /** Role definitions */
26
+ roles: Role[];
27
+ /** Current user's role(s) */
28
+ userRoles?: string[];
29
+ /** Deny-first: deny unless explicitly allowed. Default: true */
30
+ denyByDefault?: boolean;
31
+ /** Called when permission is denied */
32
+ onDenied?: (resource: string, action: string) => void;
33
+ }
34
+ export interface RBACInstance {
35
+ /** Check if current user can perform action on resource */
36
+ can(resource: string, action: string, context?: Record<string, unknown>): boolean;
37
+ /** Check multiple permissions (all must pass) */
38
+ canAll(checks: Array<{
39
+ resource: string;
40
+ action: string;
41
+ }>): boolean;
42
+ /** Check multiple permissions (any must pass) */
43
+ canAny(checks: Array<{
44
+ resource: string;
45
+ action: string;
46
+ }>): boolean;
47
+ /** Set the current user's roles */
48
+ setRoles(roles: string[]): void;
49
+ /** Add a role to the current user */
50
+ addRole(role: string): void;
51
+ /** Remove a role from the current user */
52
+ removeRole(role: string): void;
53
+ /** Get the current user's roles */
54
+ getRoles(): string[];
55
+ /** Get all permissions for the current user (resolved with inheritance) */
56
+ getPermissions(): Permission[];
57
+ /** Add a new role definition */
58
+ defineRole(role: Role): void;
59
+ /** Remove a role definition */
60
+ removeRoleDefinition(name: string): void;
61
+ /** Guard a function — only executes if permitted */
62
+ guard<T>(resource: string, action: string, fn: () => T): T | undefined;
63
+ /** Guard an async function */
64
+ guardAsync<T>(resource: string, action: string, fn: () => Promise<T>): Promise<T | undefined>;
65
+ /** Create a route guard function compatible with Nova Router */
66
+ routeGuard(resource: string, action: string): () => boolean;
67
+ /** Subscribe to role/permission changes */
68
+ onChange(handler: () => void): () => void;
69
+ /** Show/hide DOM elements based on permission */
70
+ bindVisibility(element: Element, resource: string, action: string): () => void;
71
+ }
72
+ /** Create an RBAC instance. */
73
+ export declare function createRBAC(options: RBACOptions): RBACInstance;
74
+ /**
75
+ * Parse a permission string like "posts:write" or "admin.*:*"
76
+ * into a Permission object.
77
+ */
78
+ export declare function parsePermission(str: string): Permission;
79
+ /**
80
+ * Create a role from a simple list of permission strings.
81
+ * e.g., defineSimpleRole('editor', ['posts:read', 'posts:write', 'comments:*'])
82
+ */
83
+ export declare function defineSimpleRole(name: string, permissions: string[], inherits?: string[]): Role;
84
+ //# sourceMappingURL=rbac.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rbac.d.ts","sourceRoot":"","sources":["../../src/security/rbac.ts"],"names":[],"mappings":"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"}