@happyvertical/smrt-users 0.30.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 (150) hide show
  1. package/AGENTS.md +85 -0
  2. package/CLAUDE.md +1 -0
  3. package/LICENSE +7 -0
  4. package/README.md +459 -0
  5. package/dist/__smrt-register__.d.ts +2 -0
  6. package/dist/__smrt-register__.d.ts.map +1 -0
  7. package/dist/chunks/TerminalAuthService-DoAMQ_yn.js +5118 -0
  8. package/dist/chunks/TerminalAuthService-DoAMQ_yn.js.map +1 -0
  9. package/dist/chunks/index-DkoYIvIu.js +169 -0
  10. package/dist/chunks/index-DkoYIvIu.js.map +1 -0
  11. package/dist/collections/CliAuthRequestCollection.d.ts +19 -0
  12. package/dist/collections/CliAuthRequestCollection.d.ts.map +1 -0
  13. package/dist/collections/GroupCollection.d.ts +17 -0
  14. package/dist/collections/GroupCollection.d.ts.map +1 -0
  15. package/dist/collections/GroupMemberCollection.d.ts +43 -0
  16. package/dist/collections/GroupMemberCollection.d.ts.map +1 -0
  17. package/dist/collections/GroupRoleCollection.d.ts +33 -0
  18. package/dist/collections/GroupRoleCollection.d.ts.map +1 -0
  19. package/dist/collections/MagicLinkTokenCollection.d.ts +26 -0
  20. package/dist/collections/MagicLinkTokenCollection.d.ts.map +1 -0
  21. package/dist/collections/MembershipCollection.d.ts +38 -0
  22. package/dist/collections/MembershipCollection.d.ts.map +1 -0
  23. package/dist/collections/MembershipOverrideCollection.d.ts +55 -0
  24. package/dist/collections/MembershipOverrideCollection.d.ts.map +1 -0
  25. package/dist/collections/PermissionCollection.d.ts +34 -0
  26. package/dist/collections/PermissionCollection.d.ts.map +1 -0
  27. package/dist/collections/RoleCollection.d.ts +29 -0
  28. package/dist/collections/RoleCollection.d.ts.map +1 -0
  29. package/dist/collections/RolePermissionCollection.d.ts +33 -0
  30. package/dist/collections/RolePermissionCollection.d.ts.map +1 -0
  31. package/dist/collections/SessionCollection.d.ts +82 -0
  32. package/dist/collections/SessionCollection.d.ts.map +1 -0
  33. package/dist/collections/TenantCollection.d.ts +119 -0
  34. package/dist/collections/TenantCollection.d.ts.map +1 -0
  35. package/dist/collections/TenantPermissionOverrideCollection.d.ts +111 -0
  36. package/dist/collections/TenantPermissionOverrideCollection.d.ts.map +1 -0
  37. package/dist/collections/UserCollection.d.ts +116 -0
  38. package/dist/collections/UserCollection.d.ts.map +1 -0
  39. package/dist/collections/index.d.ts +19 -0
  40. package/dist/collections/index.d.ts.map +1 -0
  41. package/dist/index.d.ts +5 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +1482 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/manifest.json +5216 -0
  46. package/dist/models/CliAuthRequest.d.ts +25 -0
  47. package/dist/models/CliAuthRequest.d.ts.map +1 -0
  48. package/dist/models/Group.d.ts +34 -0
  49. package/dist/models/Group.d.ts.map +1 -0
  50. package/dist/models/GroupMember.d.ts +29 -0
  51. package/dist/models/GroupMember.d.ts.map +1 -0
  52. package/dist/models/GroupRole.d.ts +29 -0
  53. package/dist/models/GroupRole.d.ts.map +1 -0
  54. package/dist/models/MagicLinkToken.d.ts +22 -0
  55. package/dist/models/MagicLinkToken.d.ts.map +1 -0
  56. package/dist/models/Membership.d.ts +48 -0
  57. package/dist/models/Membership.d.ts.map +1 -0
  58. package/dist/models/MembershipOverride.d.ts +50 -0
  59. package/dist/models/MembershipOverride.d.ts.map +1 -0
  60. package/dist/models/Permission.d.ts +79 -0
  61. package/dist/models/Permission.d.ts.map +1 -0
  62. package/dist/models/Role.d.ts +67 -0
  63. package/dist/models/Role.d.ts.map +1 -0
  64. package/dist/models/RolePermission.d.ts +29 -0
  65. package/dist/models/RolePermission.d.ts.map +1 -0
  66. package/dist/models/Session.d.ts +105 -0
  67. package/dist/models/Session.d.ts.map +1 -0
  68. package/dist/models/Tenant.d.ts +138 -0
  69. package/dist/models/Tenant.d.ts.map +1 -0
  70. package/dist/models/TenantPermissionOverride.d.ts +74 -0
  71. package/dist/models/TenantPermissionOverride.d.ts.map +1 -0
  72. package/dist/models/User.d.ts +72 -0
  73. package/dist/models/User.d.ts.map +1 -0
  74. package/dist/models/index.d.ts +19 -0
  75. package/dist/models/index.d.ts.map +1 -0
  76. package/dist/playground.d.ts +2 -0
  77. package/dist/playground.d.ts.map +1 -0
  78. package/dist/playground.js +139 -0
  79. package/dist/playground.js.map +1 -0
  80. package/dist/services/MagicLinkService.d.ts +84 -0
  81. package/dist/services/MagicLinkService.d.ts.map +1 -0
  82. package/dist/services/OidcLoginService.d.ts +134 -0
  83. package/dist/services/OidcLoginService.d.ts.map +1 -0
  84. package/dist/services/PermissionCatalogService.d.ts +62 -0
  85. package/dist/services/PermissionCatalogService.d.ts.map +1 -0
  86. package/dist/services/PermissionResolver.d.ts +150 -0
  87. package/dist/services/PermissionResolver.d.ts.map +1 -0
  88. package/dist/services/PostgresPermissionPolicies.d.ts +29 -0
  89. package/dist/services/PostgresPermissionPolicies.d.ts.map +1 -0
  90. package/dist/services/SessionPermissionContext.d.ts +43 -0
  91. package/dist/services/SessionPermissionContext.d.ts.map +1 -0
  92. package/dist/services/SessionService.d.ts +139 -0
  93. package/dist/services/SessionService.d.ts.map +1 -0
  94. package/dist/services/TenantService.d.ts +135 -0
  95. package/dist/services/TenantService.d.ts.map +1 -0
  96. package/dist/services/TerminalAuthService.d.ts +189 -0
  97. package/dist/services/TerminalAuthService.d.ts.map +1 -0
  98. package/dist/services/index.d.ts +14 -0
  99. package/dist/services/index.d.ts.map +1 -0
  100. package/dist/smrt-knowledge.json +2744 -0
  101. package/dist/svelte/components/InviteUserModal.svelte +351 -0
  102. package/dist/svelte/components/InviteUserModal.svelte.d.ts +17 -0
  103. package/dist/svelte/components/InviteUserModal.svelte.d.ts.map +1 -0
  104. package/dist/svelte/components/UserAvatar.svelte +105 -0
  105. package/dist/svelte/components/UserAvatar.svelte.d.ts +10 -0
  106. package/dist/svelte/components/UserAvatar.svelte.d.ts.map +1 -0
  107. package/dist/svelte/components/UserCard.svelte +179 -0
  108. package/dist/svelte/components/UserCard.svelte.d.ts +18 -0
  109. package/dist/svelte/components/UserCard.svelte.d.ts.map +1 -0
  110. package/dist/svelte/components/UserForm.svelte +194 -0
  111. package/dist/svelte/components/UserForm.svelte.d.ts +18 -0
  112. package/dist/svelte/components/UserForm.svelte.d.ts.map +1 -0
  113. package/dist/svelte/components/UserList.svelte +107 -0
  114. package/dist/svelte/components/UserList.svelte.d.ts +20 -0
  115. package/dist/svelte/components/UserList.svelte.d.ts.map +1 -0
  116. package/dist/svelte/components/UserMenu.svelte +326 -0
  117. package/dist/svelte/components/UserMenu.svelte.d.ts +33 -0
  118. package/dist/svelte/components/UserMenu.svelte.d.ts.map +1 -0
  119. package/dist/svelte/components/__tests__/InviteUserModal.test.js +54 -0
  120. package/dist/svelte/components/__tests__/UserAvatar.test.js +31 -0
  121. package/dist/svelte/components/__tests__/UserCard.test.js +39 -0
  122. package/dist/svelte/components/__tests__/UserForm.test.js +50 -0
  123. package/dist/svelte/components/__tests__/UserList.test.js +48 -0
  124. package/dist/svelte/components/__tests__/UserMenu.test.js +38 -0
  125. package/dist/svelte/i18n.d.ts +15 -0
  126. package/dist/svelte/i18n.d.ts.map +1 -0
  127. package/dist/svelte/i18n.js +15 -0
  128. package/dist/svelte/index.d.ts +23 -0
  129. package/dist/svelte/index.d.ts.map +1 -0
  130. package/dist/svelte/index.js +27 -0
  131. package/dist/svelte/playground.d.ts +151 -0
  132. package/dist/svelte/playground.d.ts.map +1 -0
  133. package/dist/svelte/playground.js +134 -0
  134. package/dist/sveltekit/index.d.ts +379 -0
  135. package/dist/sveltekit/index.d.ts.map +1 -0
  136. package/dist/sveltekit/resource-list-handler.d.ts +127 -0
  137. package/dist/sveltekit/resource-list-handler.d.ts.map +1 -0
  138. package/dist/sveltekit/types.d.ts +31 -0
  139. package/dist/sveltekit/types.d.ts.map +1 -0
  140. package/dist/sveltekit.d.ts +2 -0
  141. package/dist/sveltekit.d.ts.map +1 -0
  142. package/dist/sveltekit.js +978 -0
  143. package/dist/sveltekit.js.map +1 -0
  144. package/dist/types/index.d.ts +61 -0
  145. package/dist/types/index.d.ts.map +1 -0
  146. package/dist/ui.d.ts +10 -0
  147. package/dist/ui.d.ts.map +1 -0
  148. package/dist/ui.js +75 -0
  149. package/dist/ui.js.map +1 -0
  150. package/package.json +97 -0
@@ -0,0 +1,169 @@
1
+ import { Y as getSigKey, Z as checkKeyLength, _ as subtleAlgorithm, $ as JWSInvalid, a0 as isDisjoint, a1 as validateCrit, a2 as checkKeyType, a3 as encode, a4 as encode$1, a5 as concat, a6 as normalizeKey, a7 as JWTClaimsBuilder, a8 as JWTInvalid, a9 as errors, aa as jwtVerify } from "./TerminalAuthService-DoAMQ_yn.js";
2
+ import { ab, ac, ad, ae, af, ag, ah } from "./TerminalAuthService-DoAMQ_yn.js";
3
+ async function sign(alg, key, data) {
4
+ const cryptoKey = await getSigKey(alg, key, "sign");
5
+ checkKeyLength(alg, cryptoKey);
6
+ const signature = await crypto.subtle.sign(subtleAlgorithm(alg, cryptoKey.algorithm), cryptoKey, data);
7
+ return new Uint8Array(signature);
8
+ }
9
+ class FlattenedSign {
10
+ #payload;
11
+ #protectedHeader;
12
+ #unprotectedHeader;
13
+ constructor(payload) {
14
+ if (!(payload instanceof Uint8Array)) {
15
+ throw new TypeError("payload must be an instance of Uint8Array");
16
+ }
17
+ this.#payload = payload;
18
+ }
19
+ setProtectedHeader(protectedHeader) {
20
+ if (this.#protectedHeader) {
21
+ throw new TypeError("setProtectedHeader can only be called once");
22
+ }
23
+ this.#protectedHeader = protectedHeader;
24
+ return this;
25
+ }
26
+ setUnprotectedHeader(unprotectedHeader) {
27
+ if (this.#unprotectedHeader) {
28
+ throw new TypeError("setUnprotectedHeader can only be called once");
29
+ }
30
+ this.#unprotectedHeader = unprotectedHeader;
31
+ return this;
32
+ }
33
+ async sign(key, options) {
34
+ if (!this.#protectedHeader && !this.#unprotectedHeader) {
35
+ throw new JWSInvalid("either setProtectedHeader or setUnprotectedHeader must be called before #sign()");
36
+ }
37
+ if (!isDisjoint(this.#protectedHeader, this.#unprotectedHeader)) {
38
+ throw new JWSInvalid("JWS Protected and JWS Unprotected Header Parameter names must be disjoint");
39
+ }
40
+ const joseHeader = {
41
+ ...this.#protectedHeader,
42
+ ...this.#unprotectedHeader
43
+ };
44
+ const extensions = validateCrit(JWSInvalid, /* @__PURE__ */ new Map([["b64", true]]), options?.crit, this.#protectedHeader, joseHeader);
45
+ let b64 = true;
46
+ if (extensions.has("b64")) {
47
+ b64 = this.#protectedHeader.b64;
48
+ if (typeof b64 !== "boolean") {
49
+ throw new JWSInvalid('The "b64" (base64url-encode payload) Header Parameter must be a boolean');
50
+ }
51
+ }
52
+ const { alg } = joseHeader;
53
+ if (typeof alg !== "string" || !alg) {
54
+ throw new JWSInvalid('JWS "alg" (Algorithm) Header Parameter missing or invalid');
55
+ }
56
+ checkKeyType(alg, key, "sign");
57
+ let payloadS;
58
+ let payloadB;
59
+ if (b64) {
60
+ payloadS = encode(this.#payload);
61
+ payloadB = encode$1(payloadS);
62
+ } else {
63
+ payloadB = this.#payload;
64
+ payloadS = "";
65
+ }
66
+ let protectedHeaderString;
67
+ let protectedHeaderBytes;
68
+ if (this.#protectedHeader) {
69
+ protectedHeaderString = encode(JSON.stringify(this.#protectedHeader));
70
+ protectedHeaderBytes = encode$1(protectedHeaderString);
71
+ } else {
72
+ protectedHeaderString = "";
73
+ protectedHeaderBytes = new Uint8Array();
74
+ }
75
+ const data = concat(protectedHeaderBytes, encode$1("."), payloadB);
76
+ const k = await normalizeKey(key, alg);
77
+ const signature = await sign(alg, k, data);
78
+ const jws = {
79
+ signature: encode(signature),
80
+ payload: payloadS
81
+ };
82
+ if (this.#unprotectedHeader) {
83
+ jws.header = this.#unprotectedHeader;
84
+ }
85
+ if (this.#protectedHeader) {
86
+ jws.protected = protectedHeaderString;
87
+ }
88
+ return jws;
89
+ }
90
+ }
91
+ class CompactSign {
92
+ #flattened;
93
+ constructor(payload) {
94
+ this.#flattened = new FlattenedSign(payload);
95
+ }
96
+ setProtectedHeader(protectedHeader) {
97
+ this.#flattened.setProtectedHeader(protectedHeader);
98
+ return this;
99
+ }
100
+ async sign(key, options) {
101
+ const jws = await this.#flattened.sign(key, options);
102
+ if (jws.payload === void 0) {
103
+ throw new TypeError("use the flattened module for creating JWS with b64: false");
104
+ }
105
+ return `${jws.protected}.${jws.payload}.${jws.signature}`;
106
+ }
107
+ }
108
+ class SignJWT {
109
+ #protectedHeader;
110
+ #jwt;
111
+ constructor(payload = {}) {
112
+ this.#jwt = new JWTClaimsBuilder(payload);
113
+ }
114
+ setIssuer(issuer) {
115
+ this.#jwt.iss = issuer;
116
+ return this;
117
+ }
118
+ setSubject(subject) {
119
+ this.#jwt.sub = subject;
120
+ return this;
121
+ }
122
+ setAudience(audience) {
123
+ this.#jwt.aud = audience;
124
+ return this;
125
+ }
126
+ setJti(jwtId) {
127
+ this.#jwt.jti = jwtId;
128
+ return this;
129
+ }
130
+ setNotBefore(input) {
131
+ this.#jwt.nbf = input;
132
+ return this;
133
+ }
134
+ setExpirationTime(input) {
135
+ this.#jwt.exp = input;
136
+ return this;
137
+ }
138
+ setIssuedAt(input) {
139
+ this.#jwt.iat = input;
140
+ return this;
141
+ }
142
+ setProtectedHeader(protectedHeader) {
143
+ this.#protectedHeader = protectedHeader;
144
+ return this;
145
+ }
146
+ async sign(key, options) {
147
+ const sig = new CompactSign(this.#jwt.data());
148
+ sig.setProtectedHeader(this.#protectedHeader);
149
+ if (Array.isArray(this.#protectedHeader?.crit) && this.#protectedHeader.crit.includes("b64") && this.#protectedHeader.b64 === false) {
150
+ throw new JWTInvalid("JWTs MUST NOT use unencoded payload");
151
+ }
152
+ return sig.sign(key, options);
153
+ }
154
+ }
155
+ export {
156
+ CompactSign,
157
+ FlattenedSign,
158
+ SignJWT,
159
+ ab as compactVerify,
160
+ ac as createLocalJWKSet,
161
+ ad as createRemoteJWKSet,
162
+ ae as customFetch,
163
+ errors,
164
+ af as flattenedVerify,
165
+ ag as importJWK,
166
+ ah as jwksCache,
167
+ jwtVerify
168
+ };
169
+ //# sourceMappingURL=index-DkoYIvIu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-DkoYIvIu.js","sources":["../../../../node_modules/.pnpm/jose@6.1.3/node_modules/jose/dist/webapi/lib/sign.js","../../../../node_modules/.pnpm/jose@6.1.3/node_modules/jose/dist/webapi/jws/flattened/sign.js","../../../../node_modules/.pnpm/jose@6.1.3/node_modules/jose/dist/webapi/jws/compact/sign.js","../../../../node_modules/.pnpm/jose@6.1.3/node_modules/jose/dist/webapi/jwt/sign.js"],"sourcesContent":["import { subtleAlgorithm } from './subtle_dsa.js';\nimport { checkKeyLength } from './check_key_length.js';\nimport { getSigKey } from './get_sign_verify_key.js';\nexport async function sign(alg, key, data) {\n const cryptoKey = await getSigKey(alg, key, 'sign');\n checkKeyLength(alg, cryptoKey);\n const signature = await crypto.subtle.sign(subtleAlgorithm(alg, cryptoKey.algorithm), cryptoKey, data);\n return new Uint8Array(signature);\n}\n","import { encode as b64u } from '../../util/base64url.js';\nimport { sign } from '../../lib/sign.js';\nimport { isDisjoint } from '../../lib/is_disjoint.js';\nimport { JWSInvalid } from '../../util/errors.js';\nimport { concat, encode } from '../../lib/buffer_utils.js';\nimport { checkKeyType } from '../../lib/check_key_type.js';\nimport { validateCrit } from '../../lib/validate_crit.js';\nimport { normalizeKey } from '../../lib/normalize_key.js';\nexport class FlattenedSign {\n #payload;\n #protectedHeader;\n #unprotectedHeader;\n constructor(payload) {\n if (!(payload instanceof Uint8Array)) {\n throw new TypeError('payload must be an instance of Uint8Array');\n }\n this.#payload = payload;\n }\n setProtectedHeader(protectedHeader) {\n if (this.#protectedHeader) {\n throw new TypeError('setProtectedHeader can only be called once');\n }\n this.#protectedHeader = protectedHeader;\n return this;\n }\n setUnprotectedHeader(unprotectedHeader) {\n if (this.#unprotectedHeader) {\n throw new TypeError('setUnprotectedHeader can only be called once');\n }\n this.#unprotectedHeader = unprotectedHeader;\n return this;\n }\n async sign(key, options) {\n if (!this.#protectedHeader && !this.#unprotectedHeader) {\n throw new JWSInvalid('either setProtectedHeader or setUnprotectedHeader must be called before #sign()');\n }\n if (!isDisjoint(this.#protectedHeader, this.#unprotectedHeader)) {\n throw new JWSInvalid('JWS Protected and JWS Unprotected Header Parameter names must be disjoint');\n }\n const joseHeader = {\n ...this.#protectedHeader,\n ...this.#unprotectedHeader,\n };\n const extensions = validateCrit(JWSInvalid, new Map([['b64', true]]), options?.crit, this.#protectedHeader, joseHeader);\n let b64 = true;\n if (extensions.has('b64')) {\n b64 = this.#protectedHeader.b64;\n if (typeof b64 !== 'boolean') {\n throw new JWSInvalid('The \"b64\" (base64url-encode payload) Header Parameter must be a boolean');\n }\n }\n const { alg } = joseHeader;\n if (typeof alg !== 'string' || !alg) {\n throw new JWSInvalid('JWS \"alg\" (Algorithm) Header Parameter missing or invalid');\n }\n checkKeyType(alg, key, 'sign');\n let payloadS;\n let payloadB;\n if (b64) {\n payloadS = b64u(this.#payload);\n payloadB = encode(payloadS);\n }\n else {\n payloadB = this.#payload;\n payloadS = '';\n }\n let protectedHeaderString;\n let protectedHeaderBytes;\n if (this.#protectedHeader) {\n protectedHeaderString = b64u(JSON.stringify(this.#protectedHeader));\n protectedHeaderBytes = encode(protectedHeaderString);\n }\n else {\n protectedHeaderString = '';\n protectedHeaderBytes = new Uint8Array();\n }\n const data = concat(protectedHeaderBytes, encode('.'), payloadB);\n const k = await normalizeKey(key, alg);\n const signature = await sign(alg, k, data);\n const jws = {\n signature: b64u(signature),\n payload: payloadS,\n };\n if (this.#unprotectedHeader) {\n jws.header = this.#unprotectedHeader;\n }\n if (this.#protectedHeader) {\n jws.protected = protectedHeaderString;\n }\n return jws;\n }\n}\n","import { FlattenedSign } from '../flattened/sign.js';\nexport class CompactSign {\n #flattened;\n constructor(payload) {\n this.#flattened = new FlattenedSign(payload);\n }\n setProtectedHeader(protectedHeader) {\n this.#flattened.setProtectedHeader(protectedHeader);\n return this;\n }\n async sign(key, options) {\n const jws = await this.#flattened.sign(key, options);\n if (jws.payload === undefined) {\n throw new TypeError('use the flattened module for creating JWS with b64: false');\n }\n return `${jws.protected}.${jws.payload}.${jws.signature}`;\n }\n}\n","import { CompactSign } from '../jws/compact/sign.js';\nimport { JWTInvalid } from '../util/errors.js';\nimport { JWTClaimsBuilder } from '../lib/jwt_claims_set.js';\nexport class SignJWT {\n #protectedHeader;\n #jwt;\n constructor(payload = {}) {\n this.#jwt = new JWTClaimsBuilder(payload);\n }\n setIssuer(issuer) {\n this.#jwt.iss = issuer;\n return this;\n }\n setSubject(subject) {\n this.#jwt.sub = subject;\n return this;\n }\n setAudience(audience) {\n this.#jwt.aud = audience;\n return this;\n }\n setJti(jwtId) {\n this.#jwt.jti = jwtId;\n return this;\n }\n setNotBefore(input) {\n this.#jwt.nbf = input;\n return this;\n }\n setExpirationTime(input) {\n this.#jwt.exp = input;\n return this;\n }\n setIssuedAt(input) {\n this.#jwt.iat = input;\n return this;\n }\n setProtectedHeader(protectedHeader) {\n this.#protectedHeader = protectedHeader;\n return this;\n }\n async sign(key, options) {\n const sig = new CompactSign(this.#jwt.data());\n sig.setProtectedHeader(this.#protectedHeader);\n if (Array.isArray(this.#protectedHeader?.crit) &&\n this.#protectedHeader.crit.includes('b64') &&\n this.#protectedHeader.b64 === false) {\n throw new JWTInvalid('JWTs MUST NOT use unencoded payload');\n }\n return sig.sign(key, options);\n }\n}\n"],"names":["b64u","encode"],"mappings":"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","x_google_ignoreList":[0,1,2,3]}
@@ -0,0 +1,19 @@
1
+ import { SmrtCollection } from '@happyvertical/smrt-core';
2
+ import { UsersCliAuthRequest } from '../models/CliAuthRequest.js';
3
+ export declare class UsersCliAuthRequestCollection extends SmrtCollection<UsersCliAuthRequest> {
4
+ static readonly _itemClass: typeof UsersCliAuthRequest;
5
+ /**
6
+ * Look up a pending or completed request by the short user code shown in the CLI.
7
+ */
8
+ findByUserCode(userCode: string): Promise<UsersCliAuthRequest | null>;
9
+ /**
10
+ * Look up a request by the hash of its device code (the CLI's polling key).
11
+ */
12
+ findByDeviceCodeHash(deviceCodeHash: string): Promise<UsersCliAuthRequest | null>;
13
+ /**
14
+ * Delete expired pending requests (cleanup job).
15
+ */
16
+ deleteExpired(): Promise<number>;
17
+ }
18
+ export { UsersCliAuthRequestCollection as CliAuthRequestCollection };
19
+ //# sourceMappingURL=CliAuthRequestCollection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CliAuthRequestCollection.d.ts","sourceRoot":"","sources":["../../src/collections/CliAuthRequestCollection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAElE,qBAAa,6BAA8B,SAAQ,cAAc,CAAC,mBAAmB,CAAC;IACpF,MAAM,CAAC,QAAQ,CAAC,UAAU,6BAAuB;IAEjD;;OAEG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAQ3E;;OAEG;IACG,oBAAoB,CACxB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAQtC;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;CAevC;AAED,OAAO,EAAE,6BAA6B,IAAI,wBAAwB,EAAE,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { SmrtCollection } from '@happyvertical/smrt-core';
2
+ import { Group } from '../models/Group.js';
3
+ /**
4
+ * Collection for managing Group objects
5
+ */
6
+ export declare class GroupCollection extends SmrtCollection<Group> {
7
+ static readonly _itemClass: typeof Group;
8
+ /**
9
+ * Find all groups in a tenant
10
+ */
11
+ findByTenant(tenantId: string): Promise<Group[]>;
12
+ /**
13
+ * Find group by slug within a tenant
14
+ */
15
+ findBySlug(slug: string, tenantId: string): Promise<Group | null>;
16
+ }
17
+ //# sourceMappingURL=GroupCollection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GroupCollection.d.ts","sourceRoot":"","sources":["../../src/collections/GroupCollection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C;;GAEG;AACH,qBAAa,eAAgB,SAAQ,cAAc,CAAC,KAAK,CAAC;IACxD,MAAM,CAAC,QAAQ,CAAC,UAAU,eAAS;IAEnC;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAOtD;;OAEG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;CAOxE"}
@@ -0,0 +1,43 @@
1
+ import { SmrtCollection } from '@happyvertical/smrt-core';
2
+ import { GroupMember } from '../models/GroupMember.js';
3
+ /**
4
+ * Collection for managing GroupMember objects
5
+ */
6
+ export declare class GroupMemberCollection extends SmrtCollection<GroupMember> {
7
+ static readonly _itemClass: typeof GroupMember;
8
+ /**
9
+ * Find all members of a group
10
+ */
11
+ findByGroup(groupId: string): Promise<GroupMember[]>;
12
+ /**
13
+ * Find all groups a user belongs to
14
+ */
15
+ findByUser(userId: string): Promise<GroupMember[]>;
16
+ /**
17
+ * Check if a user is in a group
18
+ */
19
+ isMember(groupId: string, userId: string): Promise<boolean>;
20
+ /**
21
+ * Add user to a group
22
+ */
23
+ addMember(groupId: string, userId: string): Promise<GroupMember>;
24
+ /**
25
+ * Remove user from a group
26
+ */
27
+ removeMember(groupId: string, userId: string): Promise<boolean>;
28
+ /**
29
+ * Get group IDs for a user
30
+ * @deprecated Use getGroupIdsForTenant to prevent cross-tenant leakage
31
+ */
32
+ getGroupIds(userId: string): Promise<string[]>;
33
+ /**
34
+ * Get group IDs for a user within a specific tenant
35
+ * This prevents cross-tenant permission leakage by filtering groups by tenant
36
+ */
37
+ getGroupIdsForTenant(userId: string, tenantId: string): Promise<string[]>;
38
+ /**
39
+ * Get user IDs in a group
40
+ */
41
+ getUserIds(groupId: string): Promise<string[]>;
42
+ }
43
+ //# sourceMappingURL=GroupMemberCollection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GroupMemberCollection.d.ts","sourceRoot":"","sources":["../../src/collections/GroupMemberCollection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,cAAc,CAAC,WAAW,CAAC;IACpE,MAAM,CAAC,QAAQ,CAAC,UAAU,qBAAe;IAEzC;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAM1D;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAMxD;;OAEG;IACG,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQjE;;OAEG;IACG,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAetE;;OAEG;IACG,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAarE;;;OAGG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAKpD;;;OAGG;IACG,oBAAoB,CACxB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,EAAE,CAAC;IAapB;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAIrD"}
@@ -0,0 +1,33 @@
1
+ import { SmrtCollection } from '@happyvertical/smrt-core';
2
+ import { GroupRole } from '../models/GroupRole.js';
3
+ /**
4
+ * Collection for managing GroupRole objects
5
+ */
6
+ export declare class GroupRoleCollection extends SmrtCollection<GroupRole> {
7
+ static readonly _itemClass: typeof GroupRole;
8
+ /**
9
+ * Find all roles for a group
10
+ */
11
+ findByGroup(groupId: string): Promise<GroupRole[]>;
12
+ /**
13
+ * Find all groups that have a role
14
+ */
15
+ findByRole(roleId: string): Promise<GroupRole[]>;
16
+ /**
17
+ * Check if a group has a role
18
+ */
19
+ hasRole(groupId: string, roleId: string): Promise<boolean>;
20
+ /**
21
+ * Add role to a group
22
+ */
23
+ addRole(groupId: string, roleId: string): Promise<GroupRole>;
24
+ /**
25
+ * Remove role from a group
26
+ */
27
+ removeRole(groupId: string, roleId: string): Promise<boolean>;
28
+ /**
29
+ * Get role IDs for a group
30
+ */
31
+ getRoleIds(groupId: string): Promise<string[]>;
32
+ }
33
+ //# sourceMappingURL=GroupRoleCollection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GroupRoleCollection.d.ts","sourceRoot":"","sources":["../../src/collections/GroupRoleCollection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,cAAc,CAAC,SAAS,CAAC;IAChE,MAAM,CAAC,QAAQ,CAAC,UAAU,mBAAa;IAEvC;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAMxD;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAMtD;;OAEG;IACG,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQhE;;OAEG;IACG,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAelE;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAanE;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAIrD"}
@@ -0,0 +1,26 @@
1
+ import { SmrtCollection } from '@happyvertical/smrt-core';
2
+ import { UsersMagicLinkToken } from '../models/MagicLinkToken.js';
3
+ /**
4
+ * Collection for managing smrt-users magic link token records
5
+ */
6
+ export declare class UsersMagicLinkTokenCollection extends SmrtCollection<UsersMagicLinkToken> {
7
+ static readonly _itemClass: typeof UsersMagicLinkToken;
8
+ /**
9
+ * Find a token by its nonce
10
+ */
11
+ findByNonce(nonce: string): Promise<UsersMagicLinkToken | null>;
12
+ /**
13
+ * Atomically mark a token as used (single-use enforcement).
14
+ *
15
+ * Returns true if the nonce was successfully claimed (transitioned from
16
+ * unused to used). Returns false if the nonce was already used, expired,
17
+ * or doesn't exist — preventing race conditions in concurrent verify() calls.
18
+ */
19
+ markUsed(nonce: string): Promise<boolean>;
20
+ /**
21
+ * Delete expired tokens (cleanup job)
22
+ */
23
+ deleteExpired(): Promise<number>;
24
+ }
25
+ export { UsersMagicLinkTokenCollection as MagicLinkTokenCollection };
26
+ //# sourceMappingURL=MagicLinkTokenCollection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MagicLinkTokenCollection.d.ts","sourceRoot":"","sources":["../../src/collections/MagicLinkTokenCollection.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAElE;;GAEG;AACH,qBAAa,6BAA8B,SAAQ,cAAc,CAAC,mBAAmB,CAAC;IACpF,MAAM,CAAC,QAAQ,CAAC,UAAU,6BAAuB;IAEjD;;OAEG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAMrE;;;;;;OAMG;IACG,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgB/C;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;CAgBvC;AAED,OAAO,EAAE,6BAA6B,IAAI,wBAAwB,EAAE,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { SmrtCollection } from '@happyvertical/smrt-core';
2
+ import { Membership } from '../models/Membership.js';
3
+ import { MembershipStatus } from '../types/index.js';
4
+ /**
5
+ * Collection for managing Membership objects
6
+ */
7
+ export declare class MembershipCollection extends SmrtCollection<Membership> {
8
+ static readonly _itemClass: typeof Membership;
9
+ /**
10
+ * Find all memberships for a user
11
+ */
12
+ findByUser(userId: string): Promise<Membership[]>;
13
+ /**
14
+ * Find all active memberships for a user
15
+ */
16
+ findActiveByUser(userId: string): Promise<Membership[]>;
17
+ /**
18
+ * Find all memberships in a tenant
19
+ */
20
+ findByTenant(tenantId: string): Promise<Membership[]>;
21
+ /**
22
+ * Find active memberships in a tenant
23
+ */
24
+ findActiveByTenant(tenantId: string): Promise<Membership[]>;
25
+ /**
26
+ * Find a specific user's membership in a tenant
27
+ */
28
+ findByUserAndTenant(userId: string, tenantId: string): Promise<Membership | null>;
29
+ /**
30
+ * Find memberships by role
31
+ */
32
+ findByRole(roleId: string): Promise<Membership[]>;
33
+ /**
34
+ * Find memberships by status
35
+ */
36
+ findByStatus(status: MembershipStatus): Promise<Membership[]>;
37
+ }
38
+ //# sourceMappingURL=MembershipCollection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MembershipCollection.d.ts","sourceRoot":"","sources":["../../src/collections/MembershipCollection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,cAAc,CAAC,UAAU,CAAC;IAClE,MAAM,CAAC,QAAQ,CAAC,UAAU,oBAAc;IAExC;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAOvD;;OAEG;IACG,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAO7D;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAO3D;;OAEG;IACG,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAOjE;;OAEG;IACG,mBAAmB,CACvB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAQ7B;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAOvD;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;CAMpE"}
@@ -0,0 +1,55 @@
1
+ import { SmrtCollection } from '@happyvertical/smrt-core';
2
+ import { MembershipOverride } from '../models/MembershipOverride.js';
3
+ import { OverrideEffect } from '../types/index.js';
4
+ /**
5
+ * Collection for managing MembershipOverride objects
6
+ */
7
+ export declare class MembershipOverrideCollection extends SmrtCollection<MembershipOverride> {
8
+ static readonly _itemClass: typeof MembershipOverride;
9
+ /**
10
+ * Find all overrides for a membership
11
+ */
12
+ findByMembership(membershipId: string): Promise<MembershipOverride[]>;
13
+ /**
14
+ * Find grant overrides for a membership.
15
+ *
16
+ * Filters in memory because the `effect` column is JSON-typed and
17
+ * Postgres rejects bare `json = text` comparisons. A single
18
+ * `findByMembership` call is reused for both grant and deny lookups
19
+ * within the same request (see `_overridesByMembership` cache).
20
+ */
21
+ findGrants(membershipId: string): Promise<MembershipOverride[]>;
22
+ /**
23
+ * Find deny overrides for a membership.
24
+ *
25
+ * See `findGrants` for rationale on in-memory filtering.
26
+ */
27
+ findDenies(membershipId: string): Promise<MembershipOverride[]>;
28
+ /**
29
+ * Get grant permission IDs for a membership
30
+ */
31
+ getGrantedPermissionIds(membershipId: string): Promise<string[]>;
32
+ /**
33
+ * Get denied permission IDs for a membership
34
+ */
35
+ getDeniedPermissionIds(membershipId: string): Promise<string[]>;
36
+ /**
37
+ * Set an override for a membership
38
+ */
39
+ setOverride(membershipId: string, permissionId: string, effect: OverrideEffect): Promise<MembershipOverride>;
40
+ /**
41
+ * Remove an override
42
+ */
43
+ removeOverride(membershipId: string, permissionId: string): Promise<boolean>;
44
+ /**
45
+ * Grant a permission to a membership
46
+ * Convenience method for setOverride with GRANT effect
47
+ */
48
+ grantPermission(membershipId: string, permissionId: string): Promise<MembershipOverride>;
49
+ /**
50
+ * Deny a permission for a membership
51
+ * Convenience method for setOverride with DENY effect
52
+ */
53
+ denyPermission(membershipId: string, permissionId: string): Promise<MembershipOverride>;
54
+ }
55
+ //# sourceMappingURL=MembershipOverrideCollection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MembershipOverrideCollection.d.ts","sourceRoot":"","sources":["../../src/collections/MembershipOverrideCollection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD;;GAEG;AACH,qBAAa,4BAA6B,SAAQ,cAAc,CAAC,kBAAkB,CAAC;IAClF,MAAM,CAAC,QAAQ,CAAC,UAAU,4BAAsB;IAEhD;;OAEG;IACG,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAM3E;;;;;;;OAOG;IACG,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAKrE;;;;OAIG;IACG,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAKrE;;OAEG;IACG,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAKtE;;OAEG;IACG,sBAAsB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAKrE;;OAEG;IACG,WAAW,CACf,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,kBAAkB,CAAC;IAoB9B;;OAEG;IACG,cAAc,CAClB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,OAAO,CAAC;IAcnB;;;OAGG;IACG,eAAe,CACnB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,kBAAkB,CAAC;IAQ9B;;;OAGG;IACG,cAAc,CAClB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,kBAAkB,CAAC;CAO/B"}
@@ -0,0 +1,34 @@
1
+ import { SmrtCollection } from '@happyvertical/smrt-core';
2
+ import { Permission } from '../models/Permission.js';
3
+ /**
4
+ * Collection for managing Permission objects
5
+ */
6
+ export declare class PermissionCollection extends SmrtCollection<Permission> {
7
+ static readonly _itemClass: typeof Permission;
8
+ /**
9
+ * Find permissions by category
10
+ */
11
+ findByCategory(category: string): Promise<Permission[]>;
12
+ /**
13
+ * Find permission by slug
14
+ */
15
+ findBySlug(slug: string): Promise<Permission | null>;
16
+ /**
17
+ * Batch fetch permissions by IDs
18
+ * Returns a Map of id -> Permission for efficient lookup
19
+ */
20
+ findByIds(ids: string[]): Promise<Map<string, Permission>>;
21
+ /**
22
+ * Get all unique categories
23
+ */
24
+ getCategories(): Promise<string[]>;
25
+ /**
26
+ * Find or create a permission by slug
27
+ */
28
+ findOrCreate(slug: string, defaults?: Partial<{
29
+ name: string;
30
+ description: string;
31
+ category: string;
32
+ }>): Promise<Permission>;
33
+ }
34
+ //# sourceMappingURL=PermissionCollection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PermissionCollection.d.ts","sourceRoot":"","sources":["../../src/collections/PermissionCollection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,cAAc,CAAC,UAAU,CAAC;IAClE,MAAM,CAAC,QAAQ,CAAC,UAAU,oBAAc;IAExC;;OAEG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAO7D;;OAEG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAQ1D;;;OAGG;IACG,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAwBhE;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAOxC;;OAEG;IACG,YAAY,CAChB,IAAI,EAAE,MAAM,EACZ,QAAQ,GAAE,OAAO,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAM,GACN,OAAO,CAAC,UAAU,CAAC;CAevB"}
@@ -0,0 +1,29 @@
1
+ import { SmrtCollection } from '@happyvertical/smrt-core';
2
+ import { Role } from '../models/Role.js';
3
+ /**
4
+ * Collection for managing Role objects
5
+ */
6
+ export declare class RoleCollection extends SmrtCollection<Role> {
7
+ static readonly _itemClass: typeof Role;
8
+ /**
9
+ * Find all system roles (tenantId is null)
10
+ */
11
+ findSystemRoles(): Promise<Role[]>;
12
+ /**
13
+ * Find roles available for a tenant (system + tenant-specific)
14
+ */
15
+ findByTenant(tenantId: string): Promise<Role[]>;
16
+ /**
17
+ * Find tenant-specific roles only
18
+ */
19
+ findTenantRoles(tenantId: string): Promise<Role[]>;
20
+ /**
21
+ * Find role by slug within a tenant context
22
+ */
23
+ findBySlug(slug: string, tenantId?: string): Promise<Role | null>;
24
+ /**
25
+ * Seed default system roles
26
+ */
27
+ seedSystemRoles(): Promise<Role[]>;
28
+ }
29
+ //# sourceMappingURL=RoleCollection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RoleCollection.d.ts","sourceRoot":"","sources":["../../src/collections/RoleCollection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAGzC;;GAEG;AACH,qBAAa,cAAe,SAAQ,cAAc,CAAC,IAAI,CAAC;IACtD,MAAM,CAAC,QAAQ,CAAC,UAAU,cAAQ;IAElC;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IAOxC;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IASrD;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAOxD;;OAEG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAoBvE;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;CAyBzC"}
@@ -0,0 +1,33 @@
1
+ import { SmrtCollection } from '@happyvertical/smrt-core';
2
+ import { RolePermission } from '../models/RolePermission.js';
3
+ /**
4
+ * Collection for managing RolePermission objects
5
+ */
6
+ export declare class RolePermissionCollection extends SmrtCollection<RolePermission> {
7
+ static readonly _itemClass: typeof RolePermission;
8
+ /**
9
+ * Find all permissions for a role
10
+ */
11
+ findByRole(roleId: string): Promise<RolePermission[]>;
12
+ /**
13
+ * Find all roles that have a permission
14
+ */
15
+ findByPermission(permissionId: string): Promise<RolePermission[]>;
16
+ /**
17
+ * Check if a role has a specific permission
18
+ */
19
+ hasPermission(roleId: string, permissionId: string): Promise<boolean>;
20
+ /**
21
+ * Add a permission to a role
22
+ */
23
+ addPermission(roleId: string, permissionId: string): Promise<RolePermission>;
24
+ /**
25
+ * Remove a permission from a role
26
+ */
27
+ removePermission(roleId: string, permissionId: string): Promise<boolean>;
28
+ /**
29
+ * Get permission IDs for a role
30
+ */
31
+ getPermissionIds(roleId: string): Promise<string[]>;
32
+ }
33
+ //# sourceMappingURL=RolePermissionCollection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RolePermissionCollection.d.ts","sourceRoot":"","sources":["../../src/collections/RolePermissionCollection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D;;GAEG;AACH,qBAAa,wBAAyB,SAAQ,cAAc,CAAC,cAAc,CAAC;IAC1E,MAAM,CAAC,QAAQ,CAAC,UAAU,wBAAkB;IAE5C;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAM3D;;OAEG;IACG,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAMvE;;OAEG;IACG,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ3E;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,cAAc,CAAC;IAe1B;;OAEG;IACG,gBAAgB,CACpB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,OAAO,CAAC;IAanB;;OAEG;IACG,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAI1D"}
@@ -0,0 +1,82 @@
1
+ import { SmrtCollection } from '@happyvertical/smrt-core';
2
+ import { Session } from '../models/Session.js';
3
+ /**
4
+ * Options for creating a new session
5
+ */
6
+ export interface CreateSessionOptions {
7
+ /** User ID for the session */
8
+ userId: string;
9
+ /** Optional tenant ID for multi-tenant context */
10
+ tenantId?: string;
11
+ /** Session TTL in seconds (default: 7 days) */
12
+ ttl?: number;
13
+ /** User agent string */
14
+ userAgent?: string;
15
+ /** Client IP address */
16
+ ipAddress?: string;
17
+ /** Custom session data */
18
+ data?: Record<string, unknown>;
19
+ }
20
+ /**
21
+ * Collection for managing Session objects
22
+ */
23
+ export declare class SessionCollection extends SmrtCollection<Session> {
24
+ static readonly _itemClass: typeof Session;
25
+ /**
26
+ * Create a new session with a secure ID
27
+ */
28
+ createSession(options: CreateSessionOptions): Promise<Session>;
29
+ /**
30
+ * Find a valid session by ID
31
+ * Returns null if session doesn't exist, is expired, or is revoked
32
+ */
33
+ findValidSession(sessionId: string): Promise<Session | null>;
34
+ /**
35
+ * Update last accessed time and optionally extend session
36
+ */
37
+ touch(sessionId: string, extendTtl?: boolean, ttl?: number): Promise<boolean>;
38
+ /**
39
+ * Find all active sessions for a user
40
+ */
41
+ findByUser(userId: string): Promise<Session[]>;
42
+ /**
43
+ * Delete all sessions for a user (logout from all devices)
44
+ */
45
+ deleteUserSessions(userId: string): Promise<number>;
46
+ /**
47
+ * Revoke all sessions for a user (soft delete)
48
+ */
49
+ revokeUserSessions(userId: string): Promise<number>;
50
+ /**
51
+ * Revoke a specific session
52
+ */
53
+ revokeSession(sessionId: string): Promise<boolean>;
54
+ /**
55
+ * Delete expired sessions (cleanup job)
56
+ * Returns the number of deleted sessions
57
+ */
58
+ deleteExpired(): Promise<number>;
59
+ /**
60
+ * Count active sessions for a user
61
+ */
62
+ countUserSessions(userId: string): Promise<number>;
63
+ /**
64
+ * Update tenant context for a session (low-level primitive).
65
+ *
66
+ * SECURITY (#1400): this does NOT verify that the session's user is a member
67
+ * of `tenantId` — it is the unguarded storage primitive. Application/route
68
+ * code must go through {@link SessionService.switchTenant}, which fail-closes
69
+ * on a missing/inactive membership before calling this. Calling it directly
70
+ * with an untrusted `tenantId` reintroduces the cross-tenant access bug.
71
+ */
72
+ setSessionTenant(sessionId: string, tenantId: string | null): Promise<boolean>;
73
+ /**
74
+ * Set custom session data
75
+ */
76
+ setSessionData(sessionId: string, key: string, value: unknown): Promise<boolean>;
77
+ /**
78
+ * Get custom session data
79
+ */
80
+ getSessionData<T>(sessionId: string, key: string): Promise<T | undefined>;
81
+ }
82
+ //# sourceMappingURL=SessionCollection.d.ts.map