@panguard-ai/panguard-auth 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/dist/auth.d.ts +32 -0
  2. package/dist/auth.d.ts.map +1 -0
  3. package/dist/auth.js +68 -0
  4. package/dist/auth.js.map +1 -0
  5. package/dist/crypto.d.ts +21 -0
  6. package/dist/crypto.d.ts.map +1 -0
  7. package/dist/crypto.js +60 -0
  8. package/dist/crypto.js.map +1 -0
  9. package/dist/database.d.ts +266 -0
  10. package/dist/database.d.ts.map +1 -0
  11. package/dist/database.js +936 -0
  12. package/dist/database.js.map +1 -0
  13. package/dist/email-verify.d.ts +31 -0
  14. package/dist/email-verify.d.ts.map +1 -0
  15. package/dist/email-verify.js +506 -0
  16. package/dist/email-verify.js.map +1 -0
  17. package/dist/error-tracker.d.ts +24 -0
  18. package/dist/error-tracker.d.ts.map +1 -0
  19. package/dist/error-tracker.js +80 -0
  20. package/dist/error-tracker.js.map +1 -0
  21. package/dist/google-oauth.d.ts +40 -0
  22. package/dist/google-oauth.d.ts.map +1 -0
  23. package/dist/google-oauth.js +77 -0
  24. package/dist/google-oauth.js.map +1 -0
  25. package/dist/google-sheets.d.ts +35 -0
  26. package/dist/google-sheets.d.ts.map +1 -0
  27. package/dist/google-sheets.js +128 -0
  28. package/dist/google-sheets.js.map +1 -0
  29. package/dist/index.d.ts +27 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +18 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/lemonsqueezy.d.ts +61 -0
  34. package/dist/lemonsqueezy.d.ts.map +1 -0
  35. package/dist/lemonsqueezy.js +254 -0
  36. package/dist/lemonsqueezy.js.map +1 -0
  37. package/dist/middleware.d.ts +22 -0
  38. package/dist/middleware.d.ts.map +1 -0
  39. package/dist/middleware.js +40 -0
  40. package/dist/middleware.js.map +1 -0
  41. package/dist/openapi.d.ts +17 -0
  42. package/dist/openapi.d.ts.map +1 -0
  43. package/dist/openapi.js +683 -0
  44. package/dist/openapi.js.map +1 -0
  45. package/dist/rate-limiter.d.ts +46 -0
  46. package/dist/rate-limiter.d.ts.map +1 -0
  47. package/dist/rate-limiter.js +64 -0
  48. package/dist/rate-limiter.js.map +1 -0
  49. package/dist/routes/admin.d.ts +30 -0
  50. package/dist/routes/admin.d.ts.map +1 -0
  51. package/dist/routes/admin.js +490 -0
  52. package/dist/routes/admin.js.map +1 -0
  53. package/dist/routes/auth.d.ts +18 -0
  54. package/dist/routes/auth.d.ts.map +1 -0
  55. package/dist/routes/auth.js +426 -0
  56. package/dist/routes/auth.js.map +1 -0
  57. package/dist/routes/billing.d.ts +14 -0
  58. package/dist/routes/billing.d.ts.map +1 -0
  59. package/dist/routes/billing.js +176 -0
  60. package/dist/routes/billing.js.map +1 -0
  61. package/dist/routes/index.d.ts +60 -0
  62. package/dist/routes/index.d.ts.map +1 -0
  63. package/dist/routes/index.js +133 -0
  64. package/dist/routes/index.js.map +1 -0
  65. package/dist/routes/oauth.d.ts +15 -0
  66. package/dist/routes/oauth.d.ts.map +1 -0
  67. package/dist/routes/oauth.js +215 -0
  68. package/dist/routes/oauth.js.map +1 -0
  69. package/dist/routes/shared.d.ts +71 -0
  70. package/dist/routes/shared.d.ts.map +1 -0
  71. package/dist/routes/shared.js +100 -0
  72. package/dist/routes/shared.js.map +1 -0
  73. package/dist/routes/totp.d.ts +14 -0
  74. package/dist/routes/totp.d.ts.map +1 -0
  75. package/dist/routes/totp.js +166 -0
  76. package/dist/routes/totp.js.map +1 -0
  77. package/dist/routes/usage.d.ts +14 -0
  78. package/dist/routes/usage.d.ts.map +1 -0
  79. package/dist/routes/usage.js +127 -0
  80. package/dist/routes/usage.js.map +1 -0
  81. package/dist/routes/waitlist.d.ts +16 -0
  82. package/dist/routes/waitlist.d.ts.map +1 -0
  83. package/dist/routes/waitlist.js +171 -0
  84. package/dist/routes/waitlist.js.map +1 -0
  85. package/dist/routes.d.ts +72 -0
  86. package/dist/routes.d.ts.map +1 -0
  87. package/dist/routes.js +1806 -0
  88. package/dist/routes.js.map +1 -0
  89. package/dist/totp.d.ts +41 -0
  90. package/dist/totp.d.ts.map +1 -0
  91. package/dist/totp.js +129 -0
  92. package/dist/totp.js.map +1 -0
  93. package/dist/types.d.ts +155 -0
  94. package/dist/types.d.ts.map +1 -0
  95. package/dist/types.js +6 -0
  96. package/dist/types.js.map +1 -0
  97. package/dist/usage-meter.d.ts +49 -0
  98. package/dist/usage-meter.d.ts.map +1 -0
  99. package/dist/usage-meter.js +123 -0
  100. package/dist/usage-meter.js.map +1 -0
  101. package/package.json +33 -0
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Usage metering and quota enforcement for tier-based limits.
3
+ * Tracks monthly usage per resource per user.
4
+ *
5
+ * @module @panguard-ai/panguard-auth/usage-meter
6
+ */
7
+ /** Quota limits per tier. -1 means unlimited. */
8
+ const TIER_QUOTAS = {
9
+ community: {
10
+ scan: 100,
11
+ guard_endpoints: 1,
12
+ reports: 0,
13
+ api_calls: 1000,
14
+ notifications: 0,
15
+ trap_instances: 0,
16
+ },
17
+ solo: {
18
+ scan: -1,
19
+ guard_endpoints: 3,
20
+ reports: 0,
21
+ api_calls: 10000,
22
+ notifications: 1,
23
+ trap_instances: 1,
24
+ },
25
+ pro: {
26
+ scan: -1,
27
+ guard_endpoints: 10,
28
+ reports: 5,
29
+ api_calls: 50000,
30
+ notifications: 3,
31
+ trap_instances: 3,
32
+ },
33
+ business: {
34
+ scan: -1,
35
+ guard_endpoints: 25,
36
+ reports: 20,
37
+ api_calls: -1,
38
+ notifications: -1,
39
+ trap_instances: 8,
40
+ },
41
+ enterprise: {
42
+ scan: -1,
43
+ guard_endpoints: -1,
44
+ reports: -1,
45
+ api_calls: -1,
46
+ notifications: -1,
47
+ trap_instances: -1,
48
+ },
49
+ };
50
+ /** Monthly resources that reset each calendar month. */
51
+ const MONTHLY_RESOURCES = new Set(['scan', 'reports', 'api_calls']);
52
+ /** Get the current month period string, e.g. '2026-02'. */
53
+ export function currentPeriod() {
54
+ const now = new Date();
55
+ const y = now.getUTCFullYear();
56
+ const m = String(now.getUTCMonth() + 1).padStart(2, '0');
57
+ return `${y}-${m}`;
58
+ }
59
+ /** Get the period string for a resource (monthly vs lifetime). */
60
+ function getPeriod(resource) {
61
+ return MONTHLY_RESOURCES.has(resource) ? currentPeriod() : 'lifetime';
62
+ }
63
+ /**
64
+ * Check if a user has quota remaining for a given resource.
65
+ */
66
+ export function checkQuota(db, userId, tier, resource) {
67
+ const quotas = TIER_QUOTAS[tier] ?? TIER_QUOTAS['community'];
68
+ const limit = quotas[resource] ?? 0;
69
+ const period = getPeriod(resource);
70
+ const current = db.getUsage(userId, resource, period);
71
+ if (limit === -1) {
72
+ return { allowed: true, current, limit: -1, remaining: -1, resource };
73
+ }
74
+ const remaining = Math.max(0, limit - current);
75
+ return {
76
+ allowed: current < limit,
77
+ current,
78
+ limit,
79
+ remaining,
80
+ resource,
81
+ };
82
+ }
83
+ /**
84
+ * Record usage for a resource. Call after the operation succeeds.
85
+ */
86
+ export function recordUsage(db, userId, resource, count = 1) {
87
+ const period = getPeriod(resource);
88
+ db.incrementUsage(userId, resource, period, count);
89
+ }
90
+ /**
91
+ * Set absolute usage for count-based resources (e.g. guard_endpoints).
92
+ */
93
+ export function setUsage(db, userId, resource, count) {
94
+ const period = getPeriod(resource);
95
+ db.setUsage(userId, resource, period, count);
96
+ }
97
+ /**
98
+ * Get usage summary for all resources for a user.
99
+ */
100
+ export function getUsageSummary(db, userId, tier) {
101
+ const quotas = TIER_QUOTAS[tier] ?? TIER_QUOTAS['community'];
102
+ const resources = Object.keys(quotas);
103
+ return resources.map((resource) => {
104
+ const limit = quotas[resource] ?? 0;
105
+ const period = getPeriod(resource);
106
+ const current = db.getUsage(userId, resource, period);
107
+ const percentage = limit === -1
108
+ ? 0
109
+ : limit === 0
110
+ ? current > 0
111
+ ? 100
112
+ : 0
113
+ : Math.min(100, Math.round((current / limit) * 100));
114
+ return { resource, current, limit, percentage };
115
+ });
116
+ }
117
+ /**
118
+ * Get quota limits for a tier (for display purposes).
119
+ */
120
+ export function getQuotaLimits(tier) {
121
+ return { ...(TIER_QUOTAS[tier] ?? TIER_QUOTAS['community']) };
122
+ }
123
+ //# sourceMappingURL=usage-meter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-meter.js","sourceRoot":"","sources":["../src/usage-meter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgCH,iDAAiD;AACjD,MAAM,WAAW,GAAsD;IACrE,SAAS,EAAE;QACT,IAAI,EAAE,GAAG;QACT,eAAe,EAAE,CAAC;QAClB,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,IAAI;QACf,aAAa,EAAE,CAAC;QAChB,cAAc,EAAE,CAAC;KAClB;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,CAAC,CAAC;QACR,eAAe,EAAE,CAAC;QAClB,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,KAAK;QAChB,aAAa,EAAE,CAAC;QAChB,cAAc,EAAE,CAAC;KAClB;IACD,GAAG,EAAE;QACH,IAAI,EAAE,CAAC,CAAC;QACR,eAAe,EAAE,EAAE;QACnB,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,KAAK;QAChB,aAAa,EAAE,CAAC;QAChB,cAAc,EAAE,CAAC;KAClB;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,CAAC,CAAC;QACR,eAAe,EAAE,EAAE;QACnB,OAAO,EAAE,EAAE;QACX,SAAS,EAAE,CAAC,CAAC;QACb,aAAa,EAAE,CAAC,CAAC;QACjB,cAAc,EAAE,CAAC;KAClB;IACD,UAAU,EAAE;QACV,IAAI,EAAE,CAAC,CAAC;QACR,eAAe,EAAE,CAAC,CAAC;QACnB,OAAO,EAAE,CAAC,CAAC;QACX,SAAS,EAAE,CAAC,CAAC;QACb,aAAa,EAAE,CAAC,CAAC;QACjB,cAAc,EAAE,CAAC,CAAC;KACnB;CACF,CAAC;AAEF,wDAAwD;AACxD,MAAM,iBAAiB,GAA2B,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;AAE5F,2DAA2D;AAC3D,MAAM,UAAU,aAAa;IAC3B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,CAAC,GAAG,GAAG,CAAC,cAAc,EAAE,CAAC;IAC/B,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACzD,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;AACrB,CAAC;AAED,kEAAkE;AAClE,SAAS,SAAS,CAAC,QAA2B;IAC5C,OAAO,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;AACxE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,EAAU,EACV,MAAc,EACd,IAAY,EACZ,QAA2B;IAE3B,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,WAAW,CAAE,CAAC;IAC9D,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAEtD,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QACjB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;IACxE,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,CAAC;IAC/C,OAAO;QACL,OAAO,EAAE,OAAO,GAAG,KAAK;QACxB,OAAO;QACP,KAAK;QACL,SAAS;QACT,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CACzB,EAAU,EACV,MAAc,EACd,QAA2B,EAC3B,QAAgB,CAAC;IAEjB,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IACnC,EAAE,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CACtB,EAAU,EACV,MAAc,EACd,QAA2B,EAC3B,KAAa;IAEb,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IACnC,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,EAAU,EAAE,MAAc,EAAE,IAAY;IACtE,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,WAAW,CAAE,CAAC;IAC9D,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAwB,CAAC;IAE7D,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;QAChC,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QACtD,MAAM,UAAU,GACd,KAAK,KAAK,CAAC,CAAC;YACV,CAAC,CAAC,CAAC;YACH,CAAC,CAAC,KAAK,KAAK,CAAC;gBACX,CAAC,CAAC,OAAO,GAAG,CAAC;oBACX,CAAC,CAAC,GAAG;oBACL,CAAC,CAAC,CAAC;gBACL,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAE3D,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,EAAE,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,WAAW,CAAE,CAAC,EAAE,CAAC;AACjE,CAAC"}
package/package.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "@panguard-ai/panguard-auth",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "description": "Authentication and waitlist system for Panguard AI",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "publishConfig": {
9
+ "access": "public"
10
+ },
11
+ "files": [
12
+ "dist",
13
+ "package.json",
14
+ "README.md"
15
+ ],
16
+ "scripts": {
17
+ "build": "tsc --build",
18
+ "clean": "rm -rf dist tsconfig.tsbuildinfo",
19
+ "typecheck": "tsc --noEmit",
20
+ "test": "vitest run",
21
+ "dev": "tsc --build --watch",
22
+ "prepublishOnly": "pnpm run build"
23
+ },
24
+ "dependencies": {
25
+ "@panguard-ai/security-hardening": "workspace:*",
26
+ "better-sqlite3": "^11.0.0"
27
+ },
28
+ "devDependencies": {
29
+ "@types/better-sqlite3": "^7.6.8",
30
+ "@types/node": "^22.14.0",
31
+ "typescript": "~5.7.3"
32
+ }
33
+ }