@happyvertical/smrt-types 0.37.0 → 0.37.2

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.
package/dist/index.d.ts CHANGED
@@ -1,3 +1,41 @@
1
+ /**
2
+ * Lifecycle status of an {@link AccessRequest} — the "request access / join the
3
+ * waitlist" identity primitive that captures a prospective user from a public
4
+ * form before they become a real `User`.
5
+ *
6
+ * Operators triage `REQUESTED` records, then either decline them or approve and
7
+ * **graduate** them into a `User` (optionally attached to a tenant).
8
+ *
9
+ * State machine:
10
+ * ```
11
+ * REQUESTED ──approve──> APPROVED ──graduate──> GRADUATED
12
+ * │ │
13
+ * ├──decline──> DECLINED ┘ (decline also valid from APPROVED)
14
+ * └──cancel───> CANCELED
15
+ * ```
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * if (request.status === AccessRequestStatus.APPROVED) {
20
+ * await service.graduateAccessRequest(request.id, { by: operatorId });
21
+ * }
22
+ * ```
23
+ *
24
+ * @see {@link UserStatus} for the account-level status set when a request graduates
25
+ */
26
+ export declare enum AccessRequestStatus {
27
+ /** Open request awaiting operator triage (the default on creation) */
28
+ REQUESTED = "requested",
29
+ /** Operator approved the request; ready to graduate into a User */
30
+ APPROVED = "approved",
31
+ /** Operator declined the request */
32
+ DECLINED = "declined",
33
+ /** Request was graduated into a real User (terminal) */
34
+ GRADUATED = "graduated",
35
+ /** Request was canceled before a decision (terminal) */
36
+ CANCELED = "canceled"
37
+ }
38
+
1
39
  /**
2
40
  * Shared AI usage tracking types for SMRT.
3
41
  *
package/dist/index.js CHANGED
@@ -18,6 +18,14 @@ var MembershipStatus = /* @__PURE__ */ ((MembershipStatus2) => {
18
18
  MembershipStatus2["PENDING"] = "pending";
19
19
  return MembershipStatus2;
20
20
  })(MembershipStatus || {});
21
+ var AccessRequestStatus = /* @__PURE__ */ ((AccessRequestStatus2) => {
22
+ AccessRequestStatus2["REQUESTED"] = "requested";
23
+ AccessRequestStatus2["APPROVED"] = "approved";
24
+ AccessRequestStatus2["DECLINED"] = "declined";
25
+ AccessRequestStatus2["GRADUATED"] = "graduated";
26
+ AccessRequestStatus2["CANCELED"] = "canceled";
27
+ return AccessRequestStatus2;
28
+ })(AccessRequestStatus || {});
21
29
  var SessionStatus = /* @__PURE__ */ ((SessionStatus2) => {
22
30
  SessionStatus2["ACTIVE"] = "active";
23
31
  SessionStatus2["EXPIRED"] = "expired";
@@ -36,6 +44,7 @@ var TenantPermissionEffect = /* @__PURE__ */ ((TenantPermissionEffect2) => {
36
44
  return TenantPermissionEffect2;
37
45
  })(TenantPermissionEffect || {});
38
46
  export {
47
+ AccessRequestStatus,
39
48
  MembershipStatus,
40
49
  OverrideEffect,
41
50
  SessionStatus,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/user.ts"],"sourcesContent":["/**\n * User-related type definitions\n *\n * These enums and types are exported from smrt-types to allow\n * browser-safe packages (like smrt-svelte) to import them without\n * pulling in server-side dependencies from smrt-users.\n */\n\n// ============= User Status =============\n\n/**\n * Lifecycle status of a user account.\n *\n * @example\n * ```typescript\n * if (user.status === UserStatus.SUSPENDED) {\n * throw new ForbiddenError('Account is suspended');\n * }\n * ```\n *\n * @see {@link MembershipStatus} for a user's status within a specific tenant\n * @see {@link SessionStatus} for the status of an active session\n */\nexport enum UserStatus {\n /** Active user account */\n ACTIVE = 'active',\n /** Inactive user account */\n INACTIVE = 'inactive',\n /** Suspended user account */\n SUSPENDED = 'suspended',\n /** Pending email verification */\n PENDING = 'pending',\n}\n\n// ============= Tenant Status =============\n\n/**\n * Lifecycle status of a tenant (organization) within the platform.\n *\n * @example\n * ```typescript\n * if (tenant.status === TenantStatus.ARCHIVED) {\n * return; // skip soft-deleted tenants\n * }\n * ```\n *\n * @see {@link MembershipStatus} for a user's membership status within a tenant\n * @see {@link TenantPermissionEffect} for permission inheritance across tenant hierarchies\n */\nexport enum TenantStatus {\n /** Active tenant */\n ACTIVE = 'active',\n /** Inactive tenant */\n INACTIVE = 'inactive',\n /** Suspended tenant */\n SUSPENDED = 'suspended',\n /** Archived tenant (soft-deleted) */\n ARCHIVED = 'archived',\n}\n\n// ============= Membership Status =============\n\n/**\n * Status of a user's membership within a specific tenant.\n *\n * A user may hold memberships in multiple tenants simultaneously, each with an\n * independent `MembershipStatus`.\n *\n * @example\n * ```typescript\n * const active = memberships.filter(m => m.status === MembershipStatus.ACTIVE);\n * ```\n *\n * @see {@link UserStatus} for the global account-level status\n * @see {@link TenantStatus} for the status of the tenant itself\n */\nexport enum MembershipStatus {\n /** Active membership */\n ACTIVE = 'active',\n /** Inactive membership */\n INACTIVE = 'inactive',\n /** Pending invitation acceptance */\n PENDING = 'pending',\n}\n\n// ============= Session Status =============\n\n/**\n * Status of an authenticated session.\n *\n * Sessions transition from `ACTIVE` to either `EXPIRED` (time-based) or\n * `REVOKED` (explicit action by the user or an administrator).\n *\n * @example\n * ```typescript\n * if (session.status !== SessionStatus.ACTIVE) {\n * redirect(302, '/login');\n * }\n * ```\n *\n * @see {@link UserStatus} for the account-level status checked before session creation\n */\nexport enum SessionStatus {\n /** Active session */\n ACTIVE = 'active',\n /** Expired session (past expiresAt) */\n EXPIRED = 'expired',\n /** Revoked by user or admin */\n REVOKED = 'revoked',\n}\n\n// ============= Permission Override =============\n\n/**\n * Effect applied by a user-level permission override.\n *\n * Overrides target a specific user + permission combination and always win\n * over role-based grants. `DENY` overrides are checked before `GRANT` in\n * the 4-level permission cascade.\n *\n * @example\n * ```typescript\n * await override.create({\n * userId,\n * permission: 'billing.view',\n * effect: OverrideEffect.DENY,\n * });\n * ```\n *\n * @see {@link TenantPermissionEffect} for the tenant-level equivalent that supports inheritance\n */\nexport enum OverrideEffect {\n /** Grant the permission */\n GRANT = 'grant',\n /** Deny the permission */\n DENY = 'deny',\n}\n\n// ============= Tenant Permission Override =============\n\n/**\n * Effect of a tenant-level permission setting in a hierarchical tenant tree.\n *\n * Unlike `OverrideEffect`, tenant-level effects support `INHERIT` — the default\n * behaviour where a child tenant walks up to its parent to resolve the permission.\n * `DENY` blocks inheritance, preventing child tenants from acquiring the permission\n * even if a grandparent grants it.\n *\n * @example\n * ```typescript\n * // Sub-tenant explicitly blocks billing access regardless of parent settings\n * await tenantPermission.create({\n * tenantId: subTenantId,\n * permission: 'billing.manage',\n * effect: TenantPermissionEffect.DENY,\n * });\n * ```\n *\n * @see {@link OverrideEffect} for user-level overrides (no inheritance step)\n * @see {@link TenantStatus} for the tenant lifecycle status\n */\nexport enum TenantPermissionEffect {\n /** Inherit from parent tenant (default behavior) */\n INHERIT = 'inherit',\n /** Explicitly grant at this tenant level */\n GRANT = 'grant',\n /** Explicitly deny at this tenant level (blocks inheritance) */\n DENY = 'deny',\n}\n"],"names":["UserStatus","TenantStatus","MembershipStatus","SessionStatus","OverrideEffect","TenantPermissionEffect"],"mappings":"AAuBO,IAAK,+BAAAA,gBAAL;AAELA,cAAA,QAAA,IAAS;AAETA,cAAA,UAAA,IAAW;AAEXA,cAAA,WAAA,IAAY;AAEZA,cAAA,SAAA,IAAU;AARA,SAAAA;AAAA,GAAA,cAAA,CAAA,CAAA;AA0BL,IAAK,iCAAAC,kBAAL;AAELA,gBAAA,QAAA,IAAS;AAETA,gBAAA,UAAA,IAAW;AAEXA,gBAAA,WAAA,IAAY;AAEZA,gBAAA,UAAA,IAAW;AARD,SAAAA;AAAA,GAAA,gBAAA,CAAA,CAAA;AA2BL,IAAK,qCAAAC,sBAAL;AAELA,oBAAA,QAAA,IAAS;AAETA,oBAAA,UAAA,IAAW;AAEXA,oBAAA,SAAA,IAAU;AANA,SAAAA;AAAA,GAAA,oBAAA,CAAA,CAAA;AA0BL,IAAK,kCAAAC,mBAAL;AAELA,iBAAA,QAAA,IAAS;AAETA,iBAAA,SAAA,IAAU;AAEVA,iBAAA,SAAA,IAAU;AANA,SAAAA;AAAA,GAAA,iBAAA,CAAA,CAAA;AA6BL,IAAK,mCAAAC,oBAAL;AAELA,kBAAA,OAAA,IAAQ;AAERA,kBAAA,MAAA,IAAO;AAJG,SAAAA;AAAA,GAAA,kBAAA,CAAA,CAAA;AA8BL,IAAK,2CAAAC,4BAAL;AAELA,0BAAA,SAAA,IAAU;AAEVA,0BAAA,OAAA,IAAQ;AAERA,0BAAA,MAAA,IAAO;AANG,SAAAA;AAAA,GAAA,0BAAA,CAAA,CAAA;"}
1
+ {"version":3,"file":"index.js","sources":["../src/user.ts"],"sourcesContent":["/**\n * User-related type definitions\n *\n * These enums and types are exported from smrt-types to allow\n * browser-safe packages (like smrt-svelte) to import them without\n * pulling in server-side dependencies from smrt-users.\n */\n\n// ============= User Status =============\n\n/**\n * Lifecycle status of a user account.\n *\n * @example\n * ```typescript\n * if (user.status === UserStatus.SUSPENDED) {\n * throw new ForbiddenError('Account is suspended');\n * }\n * ```\n *\n * @see {@link MembershipStatus} for a user's status within a specific tenant\n * @see {@link SessionStatus} for the status of an active session\n */\nexport enum UserStatus {\n /** Active user account */\n ACTIVE = 'active',\n /** Inactive user account */\n INACTIVE = 'inactive',\n /** Suspended user account */\n SUSPENDED = 'suspended',\n /** Pending email verification */\n PENDING = 'pending',\n}\n\n// ============= Tenant Status =============\n\n/**\n * Lifecycle status of a tenant (organization) within the platform.\n *\n * @example\n * ```typescript\n * if (tenant.status === TenantStatus.ARCHIVED) {\n * return; // skip soft-deleted tenants\n * }\n * ```\n *\n * @see {@link MembershipStatus} for a user's membership status within a tenant\n * @see {@link TenantPermissionEffect} for permission inheritance across tenant hierarchies\n */\nexport enum TenantStatus {\n /** Active tenant */\n ACTIVE = 'active',\n /** Inactive tenant */\n INACTIVE = 'inactive',\n /** Suspended tenant */\n SUSPENDED = 'suspended',\n /** Archived tenant (soft-deleted) */\n ARCHIVED = 'archived',\n}\n\n// ============= Membership Status =============\n\n/**\n * Status of a user's membership within a specific tenant.\n *\n * A user may hold memberships in multiple tenants simultaneously, each with an\n * independent `MembershipStatus`.\n *\n * @example\n * ```typescript\n * const active = memberships.filter(m => m.status === MembershipStatus.ACTIVE);\n * ```\n *\n * @see {@link UserStatus} for the global account-level status\n * @see {@link TenantStatus} for the status of the tenant itself\n */\nexport enum MembershipStatus {\n /** Active membership */\n ACTIVE = 'active',\n /** Inactive membership */\n INACTIVE = 'inactive',\n /** Pending invitation acceptance */\n PENDING = 'pending',\n}\n\n// ============= Access Request Status =============\n\n/**\n * Lifecycle status of an {@link AccessRequest} — the \"request access / join the\n * waitlist\" identity primitive that captures a prospective user from a public\n * form before they become a real `User`.\n *\n * Operators triage `REQUESTED` records, then either decline them or approve and\n * **graduate** them into a `User` (optionally attached to a tenant).\n *\n * State machine:\n * ```\n * REQUESTED ──approve──> APPROVED ──graduate──> GRADUATED\n * │ │\n * ├──decline──> DECLINED ┘ (decline also valid from APPROVED)\n * └──cancel───> CANCELED\n * ```\n *\n * @example\n * ```typescript\n * if (request.status === AccessRequestStatus.APPROVED) {\n * await service.graduateAccessRequest(request.id, { by: operatorId });\n * }\n * ```\n *\n * @see {@link UserStatus} for the account-level status set when a request graduates\n */\nexport enum AccessRequestStatus {\n /** Open request awaiting operator triage (the default on creation) */\n REQUESTED = 'requested',\n /** Operator approved the request; ready to graduate into a User */\n APPROVED = 'approved',\n /** Operator declined the request */\n DECLINED = 'declined',\n /** Request was graduated into a real User (terminal) */\n GRADUATED = 'graduated',\n /** Request was canceled before a decision (terminal) */\n CANCELED = 'canceled',\n}\n\n// ============= Session Status =============\n\n/**\n * Status of an authenticated session.\n *\n * Sessions transition from `ACTIVE` to either `EXPIRED` (time-based) or\n * `REVOKED` (explicit action by the user or an administrator).\n *\n * @example\n * ```typescript\n * if (session.status !== SessionStatus.ACTIVE) {\n * redirect(302, '/login');\n * }\n * ```\n *\n * @see {@link UserStatus} for the account-level status checked before session creation\n */\nexport enum SessionStatus {\n /** Active session */\n ACTIVE = 'active',\n /** Expired session (past expiresAt) */\n EXPIRED = 'expired',\n /** Revoked by user or admin */\n REVOKED = 'revoked',\n}\n\n// ============= Permission Override =============\n\n/**\n * Effect applied by a user-level permission override.\n *\n * Overrides target a specific user + permission combination and always win\n * over role-based grants. `DENY` overrides are checked before `GRANT` in\n * the 4-level permission cascade.\n *\n * @example\n * ```typescript\n * await override.create({\n * userId,\n * permission: 'billing.view',\n * effect: OverrideEffect.DENY,\n * });\n * ```\n *\n * @see {@link TenantPermissionEffect} for the tenant-level equivalent that supports inheritance\n */\nexport enum OverrideEffect {\n /** Grant the permission */\n GRANT = 'grant',\n /** Deny the permission */\n DENY = 'deny',\n}\n\n// ============= Tenant Permission Override =============\n\n/**\n * Effect of a tenant-level permission setting in a hierarchical tenant tree.\n *\n * Unlike `OverrideEffect`, tenant-level effects support `INHERIT` — the default\n * behaviour where a child tenant walks up to its parent to resolve the permission.\n * `DENY` blocks inheritance, preventing child tenants from acquiring the permission\n * even if a grandparent grants it.\n *\n * @example\n * ```typescript\n * // Sub-tenant explicitly blocks billing access regardless of parent settings\n * await tenantPermission.create({\n * tenantId: subTenantId,\n * permission: 'billing.manage',\n * effect: TenantPermissionEffect.DENY,\n * });\n * ```\n *\n * @see {@link OverrideEffect} for user-level overrides (no inheritance step)\n * @see {@link TenantStatus} for the tenant lifecycle status\n */\nexport enum TenantPermissionEffect {\n /** Inherit from parent tenant (default behavior) */\n INHERIT = 'inherit',\n /** Explicitly grant at this tenant level */\n GRANT = 'grant',\n /** Explicitly deny at this tenant level (blocks inheritance) */\n DENY = 'deny',\n}\n"],"names":["UserStatus","TenantStatus","MembershipStatus","AccessRequestStatus","SessionStatus","OverrideEffect","TenantPermissionEffect"],"mappings":"AAuBO,IAAK,+BAAAA,gBAAL;AAELA,cAAA,QAAA,IAAS;AAETA,cAAA,UAAA,IAAW;AAEXA,cAAA,WAAA,IAAY;AAEZA,cAAA,SAAA,IAAU;AARA,SAAAA;AAAA,GAAA,cAAA,CAAA,CAAA;AA0BL,IAAK,iCAAAC,kBAAL;AAELA,gBAAA,QAAA,IAAS;AAETA,gBAAA,UAAA,IAAW;AAEXA,gBAAA,WAAA,IAAY;AAEZA,gBAAA,UAAA,IAAW;AARD,SAAAA;AAAA,GAAA,gBAAA,CAAA,CAAA;AA2BL,IAAK,qCAAAC,sBAAL;AAELA,oBAAA,QAAA,IAAS;AAETA,oBAAA,UAAA,IAAW;AAEXA,oBAAA,SAAA,IAAU;AANA,SAAAA;AAAA,GAAA,oBAAA,CAAA,CAAA;AAoCL,IAAK,wCAAAC,yBAAL;AAELA,uBAAA,WAAA,IAAY;AAEZA,uBAAA,UAAA,IAAW;AAEXA,uBAAA,UAAA,IAAW;AAEXA,uBAAA,WAAA,IAAY;AAEZA,uBAAA,UAAA,IAAW;AAVD,SAAAA;AAAA,GAAA,uBAAA,CAAA,CAAA;AA8BL,IAAK,kCAAAC,mBAAL;AAELA,iBAAA,QAAA,IAAS;AAETA,iBAAA,SAAA,IAAU;AAEVA,iBAAA,SAAA,IAAU;AANA,SAAAA;AAAA,GAAA,iBAAA,CAAA,CAAA;AA6BL,IAAK,mCAAAC,oBAAL;AAELA,kBAAA,OAAA,IAAQ;AAERA,kBAAA,MAAA,IAAO;AAJG,SAAAA;AAAA,GAAA,kBAAA,CAAA,CAAA;AA8BL,IAAK,2CAAAC,4BAAL;AAELA,0BAAA,SAAA,IAAU;AAEVA,0BAAA,OAAA,IAAQ;AAERA,0BAAA,MAAA,IAAO;AANG,SAAAA;AAAA,GAAA,0BAAA,CAAA,CAAA;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@happyvertical/smrt-types",
3
- "version": "0.37.0",
3
+ "version": "0.37.2",
4
4
  "description": "Shared type definitions for the HAVE SDK",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -14,7 +14,7 @@
14
14
  "devDependencies": {
15
15
  "@types/node": "25.0.9",
16
16
  "typescript": "^5.9.3",
17
- "vite": "7.3.1",
17
+ "vite": "7.3.6",
18
18
  "vitest": "^4.0.17"
19
19
  },
20
20
  "files": [