@spfn/auth 0.2.1 → 0.3.0-beta.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.
Files changed (61) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +1091 -2385
  3. package/dist/authenticate-55LeXHqZ.d.ts +1447 -0
  4. package/dist/client-proof.d.ts +606 -0
  5. package/dist/client-proof.js +1842 -0
  6. package/dist/client-proof.js.map +1 -0
  7. package/dist/config.d.ts +319 -3
  8. package/dist/config.js +155 -5
  9. package/dist/config.js.map +1 -1
  10. package/dist/crypto.d.ts +61 -0
  11. package/dist/crypto.js +108 -0
  12. package/dist/crypto.js.map +1 -0
  13. package/dist/errors.d.ts +180 -3
  14. package/dist/errors.js +116 -1
  15. package/dist/errors.js.map +1 -1
  16. package/dist/index.d.ts +166 -18
  17. package/dist/index.js +132 -8
  18. package/dist/index.js.map +1 -1
  19. package/dist/nextjs/api.js +404 -96
  20. package/dist/nextjs/api.js.map +1 -1
  21. package/dist/nextjs/server.d.ts +5 -4
  22. package/dist/nextjs/server.js +165 -26
  23. package/dist/nextjs/server.js.map +1 -1
  24. package/dist/server.d.ts +2356 -1053
  25. package/dist/server.js +5153 -736
  26. package/dist/server.js.map +1 -1
  27. package/dist/session-DTHahDQ9.d.ts +53 -0
  28. package/dist/types-DYyhze28.d.ts +98 -0
  29. package/dist/wire-version-CtzMKvBB.d.ts +134 -0
  30. package/migrations/20251125021229_premium_famine/snapshot.json +2641 -0
  31. package/migrations/20260225130050_smooth_the_fury/snapshot.json +2686 -0
  32. package/migrations/20260308141417_deep_iceman/snapshot.json +2686 -0
  33. package/migrations/20260308151309_perfect_deathbird/snapshot.json +2731 -0
  34. package/migrations/20260308201135_concerned_rawhide_kid/snapshot.json +2786 -0
  35. package/migrations/20260629103209_lethal_lifeguard/migration.sql +32 -0
  36. package/migrations/20260629103209_lethal_lifeguard/snapshot.json +2786 -0
  37. package/migrations/20260709073531_easy_hardball/migration.sql +24 -0
  38. package/migrations/20260709073531_easy_hardball/snapshot.json +3119 -0
  39. package/migrations/20260714081434_glossy_major_mapleleaf/migration.sql +1 -0
  40. package/migrations/20260714081434_glossy_major_mapleleaf/snapshot.json +3112 -0
  41. package/migrations/20260804105939_amazing_bushwacker/migration.sql +3 -0
  42. package/migrations/20260804105939_amazing_bushwacker/snapshot.json +3112 -0
  43. package/migrations/20260804110033_fat_piledriver/migration.sql +2 -0
  44. package/migrations/20260804110033_fat_piledriver/snapshot.json +3138 -0
  45. package/migrations/20260805143152_vengeful_ravenous/migration.sql +4 -0
  46. package/migrations/20260805143152_vengeful_ravenous/snapshot.json +3190 -0
  47. package/migrations/20260807145911_mixed_invisible_woman/migration.sql +11 -0
  48. package/migrations/20260807145911_mixed_invisible_woman/snapshot.json +3334 -0
  49. package/package.json +59 -40
  50. package/dist/authenticate-eucncHxN.d.ts +0 -940
  51. package/migrations/meta/0000_snapshot.json +0 -1632
  52. package/migrations/meta/0001_snapshot.json +0 -1660
  53. package/migrations/meta/0002_snapshot.json +0 -1660
  54. package/migrations/meta/0003_snapshot.json +0 -1689
  55. package/migrations/meta/0004_snapshot.json +0 -1721
  56. package/migrations/meta/_journal.json +0 -41
  57. /package/migrations/{0000_premium_famine.sql → 20251125021229_premium_famine/migration.sql} +0 -0
  58. /package/migrations/{0001_smooth_the_fury.sql → 20260225130050_smooth_the_fury/migration.sql} +0 -0
  59. /package/migrations/{0002_deep_iceman.sql → 20260308141417_deep_iceman/migration.sql} +0 -0
  60. /package/migrations/{0003_perfect_deathbird.sql → 20260308151309_perfect_deathbird/migration.sql} +0 -0
  61. /package/migrations/{0004_concerned_rawhide_kid.sql → 20260308201135_concerned_rawhide_kid/migration.sql} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors/index.ts","../src/errors/auth-errors.ts"],"sourcesContent":["/**\n * Auth Error Exports\n */\n\nimport { ErrorRegistry } from \"@spfn/core/errors\";\n\nimport {\n InvalidCredentialsError,\n InvalidTokenError,\n TokenExpiredError,\n KeyExpiredError,\n AccountDisabledError,\n AccountAlreadyExistsError,\n ReservedUsernameError,\n UsernameAlreadyTakenError,\n InvalidVerificationCodeError,\n InvalidVerificationTokenError,\n InvalidKeyFingerprintError,\n VerificationTokenPurposeMismatchError,\n VerificationTokenTargetMismatchError,\n InsufficientPermissionsError,\n InsufficientRoleError,\n} from './auth-errors';\n\nexport {\n InvalidCredentialsError,\n InvalidTokenError,\n TokenExpiredError,\n KeyExpiredError,\n AccountDisabledError,\n AccountAlreadyExistsError,\n ReservedUsernameError,\n UsernameAlreadyTakenError,\n InvalidVerificationCodeError,\n InvalidVerificationTokenError,\n InvalidKeyFingerprintError,\n VerificationTokenPurposeMismatchError,\n VerificationTokenTargetMismatchError,\n InsufficientPermissionsError,\n InsufficientRoleError,\n} from './auth-errors';\n\nexport const authErrorRegistry = new ErrorRegistry();\nauthErrorRegistry.append([\n InvalidCredentialsError,\n InvalidTokenError,\n TokenExpiredError,\n KeyExpiredError,\n AccountDisabledError,\n AccountAlreadyExistsError,\n ReservedUsernameError,\n UsernameAlreadyTakenError,\n InvalidVerificationCodeError,\n InvalidVerificationTokenError,\n InvalidKeyFingerprintError,\n VerificationTokenPurposeMismatchError,\n VerificationTokenTargetMismatchError,\n InsufficientPermissionsError,\n InsufficientRoleError,\n]);\n\nexport * as AuthError from './auth-errors';","/**\n * Authentication & Authorization Error Classes\n *\n * Custom error classes for auth-specific scenarios\n */\n\nimport {\n ValidationError,\n UnauthorizedError,\n ForbiddenError,\n ConflictError\n} from '@spfn/core/errors';\n\n/**\n * Invalid Credentials Error (401)\n *\n * Thrown when login credentials are incorrect\n */\nexport class InvalidCredentialsError extends UnauthorizedError\n{\n constructor(data: { message?: string; details?: Record<string, any> } = {})\n {\n super({ message: data.message || 'Invalid credentials', details: data.details });\n this.name = 'InvalidCredentialsError';\n }\n}\n\n/**\n * Invalid Token Error (401)\n *\n * Thrown when authentication token is invalid or malformed\n */\nexport class InvalidTokenError extends UnauthorizedError\n{\n constructor(data: { message?: string; details?: Record<string, any> } = {})\n {\n super({ message: data.message || 'Invalid authentication token', details: data.details });\n this.name = 'InvalidTokenError';\n }\n}\n\n/**\n * Token Expired Error (401)\n *\n * Thrown when authentication token has expired\n */\nexport class TokenExpiredError extends UnauthorizedError\n{\n constructor(data: { message?: string; details?: Record<string, any> } = {})\n {\n super({ message: data.message || 'Authentication token has expired', details: data.details });\n this.name = 'TokenExpiredError';\n }\n}\n\n/**\n * Key Expired Error (401)\n *\n * Thrown when public key has expired\n */\nexport class KeyExpiredError extends UnauthorizedError\n{\n constructor(data: { message?: string; details?: Record<string, any> } = {})\n {\n super({ message: data.message || 'Public key has expired', details: data.details });\n this.name = 'KeyExpiredError';\n }\n}\n\n/**\n * Account Disabled Error (403)\n *\n * Thrown when user account is disabled or inactive\n */\nexport class AccountDisabledError extends ForbiddenError\n{\n constructor(data: { status?: string; message?: string; details?: Record<string, any> } = {})\n {\n const status = data.status || 'disabled';\n super({\n message: data.message || `Account is ${status}`,\n details: { status, ...data.details }\n });\n this.name = 'AccountDisabledError';\n }\n}\n\n/**\n * Account Already Exists Error (409)\n *\n * Thrown when trying to register with existing email/phone\n */\nexport class AccountAlreadyExistsError extends ConflictError\n{\n constructor(data: { identifier?: string; identifierType?: 'email' | 'phone'; message?: string; details?: Record<string, any> } = {})\n {\n super({\n message: data.message || 'Account already exists',\n details: {\n identifier: data.identifier,\n identifierType: data.identifierType,\n ...data.details\n }\n });\n this.name = 'AccountAlreadyExistsError';\n }\n}\n\n/**\n * Invalid Verification Code Error (400)\n *\n * Thrown when verification code is invalid, expired, or already used\n */\nexport class InvalidVerificationCodeError extends ValidationError\n{\n constructor(data: { message?: string; details?: Record<string, any> } = {})\n {\n super({ message: data.message || 'Invalid verification code', details: data.details });\n this.name = 'InvalidVerificationCodeError';\n }\n}\n\n/**\n * Invalid Verification Token Error (400)\n *\n * Thrown when verification token is invalid or expired\n */\nexport class InvalidVerificationTokenError extends ValidationError\n{\n constructor(data: { message?: string; details?: Record<string, any> } = {})\n {\n super({ message: data.message || 'Invalid or expired verification token', details: data.details });\n this.name = 'InvalidVerificationTokenError';\n }\n}\n\n/**\n * Invalid Key Fingerprint Error (400)\n *\n * Thrown when public key fingerprint doesn't match the public key\n */\nexport class InvalidKeyFingerprintError extends ValidationError\n{\n constructor(data: { message?: string; details?: Record<string, any> } = {})\n {\n super({ message: data.message || 'Invalid key fingerprint', details: data.details });\n this.name = 'InvalidKeyFingerprintError';\n }\n}\n\n/**\n * Verification Token Purpose Mismatch Error (400)\n *\n * Thrown when verification token purpose doesn't match expected purpose\n */\nexport class VerificationTokenPurposeMismatchError extends ValidationError\n{\n constructor(data: { expected?: string; actual?: string; message?: string; details?: Record<string, any> } = {})\n {\n const expected = data.expected || 'unknown';\n const actual = data.actual || 'unknown';\n super({\n message: data.message || `Verification token is for ${actual}, but ${expected} was expected`,\n details: { expected, actual, ...data.details }\n });\n this.name = 'VerificationTokenPurposeMismatchError';\n }\n}\n\n/**\n * Verification Token Target Mismatch Error (400)\n *\n * Thrown when verification token target doesn't match provided email/phone\n */\nexport class VerificationTokenTargetMismatchError extends ValidationError\n{\n constructor(data: { message?: string; details?: Record<string, any> } = {})\n {\n super({\n message: data.message || 'Verification token does not match provided email/phone',\n details: data.details\n });\n this.name = 'VerificationTokenTargetMismatchError';\n }\n}\n\n/**\n * Reserved Username Error (400)\n *\n * Thrown when trying to use a reserved/prohibited username\n */\nexport class ReservedUsernameError extends ValidationError\n{\n constructor(data: { username?: string; message?: string; details?: Record<string, any> } = {})\n {\n super({\n message: data.message || 'This username is reserved',\n details: { username: data.username, ...data.details }\n });\n this.name = 'ReservedUsernameError';\n }\n}\n\n/**\n * Username Already Taken Error (409)\n *\n * Thrown when trying to set a username that is already in use\n */\nexport class UsernameAlreadyTakenError extends ConflictError\n{\n constructor(data: { username?: string; message?: string; details?: Record<string, any> } = {})\n {\n super({\n message: data.message || 'Username is already taken',\n details: { username: data.username, ...data.details }\n });\n this.name = 'UsernameAlreadyTakenError';\n }\n}\n\n/**\n * Insufficient Permissions Error (403)\n *\n * Thrown when user lacks required permissions for the operation\n */\nexport class InsufficientPermissionsError extends ForbiddenError\n{\n constructor(data: { requiredPermissions?: string[]; message?: string; details?: Record<string, any> } = {})\n {\n const requiredPermissions = data.requiredPermissions || [];\n super({\n message: data.message || `Missing required permissions: ${requiredPermissions.join(', ')}`,\n details: { requiredPermissions, ...data.details }\n });\n this.name = 'InsufficientPermissionsError';\n }\n}\n\n/**\n * Insufficient Role Error (403)\n *\n * Thrown when user lacks required role for the operation\n */\nexport class InsufficientRoleError extends ForbiddenError\n{\n constructor(data: { requiredRoles?: string[]; message?: string; details?: Record<string, any> } = {})\n {\n const requiredRoles = data.requiredRoles || [];\n super({\n message: data.message || `Required roles: ${requiredRoles.join(', ')}`,\n details: { requiredRoles, ...data.details }\n });\n this.name = 'InsufficientRoleError';\n }\n}"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/errors/index.ts","../src/errors/auth-errors.ts"],"sourcesContent":["/**\n * Auth Error Exports\n */\n\nimport { ErrorRegistry } from '@spfn/core/errors';\n\nimport {\n InvalidCredentialsError,\n InvalidTokenError,\n InvalidSocialTokenError,\n TokenExpiredError,\n KeyExpiredError,\n AccountDisabledError,\n AccountPendingDeletionError,\n DeletionAlreadyRequestedError,\n DeletionNotRequestedError,\n ImmediateDeletionNotAllowedError,\n AccountAlreadyExistsError,\n RegistrationRejectedError,\n ReservedUsernameError,\n UsernameAlreadyTakenError,\n InvalidVerificationCodeError,\n InvalidVerificationTokenError,\n InvalidKeyFingerprintError,\n NonceKeyBindingError,\n NativeSignInUnsupportedError,\n UnverifiedEmailLinkError,\n KeyNotFoundError,\n KeyIdAlreadyRegisteredError,\n VerificationTokenPurposeMismatchError,\n VerificationTokenTargetMismatchError,\n InsufficientPermissionsError,\n InsufficientRoleError,\n} from './auth-errors';\n\nexport {\n InvalidCredentialsError,\n InvalidTokenError,\n InvalidSocialTokenError,\n TokenExpiredError,\n KeyExpiredError,\n AccountDisabledError,\n AccountPendingDeletionError,\n DeletionAlreadyRequestedError,\n DeletionNotRequestedError,\n ImmediateDeletionNotAllowedError,\n AccountAlreadyExistsError,\n RegistrationRejectedError,\n ReservedUsernameError,\n UsernameAlreadyTakenError,\n InvalidVerificationCodeError,\n InvalidVerificationTokenError,\n InvalidKeyFingerprintError,\n NonceKeyBindingError,\n NativeSignInUnsupportedError,\n UnverifiedEmailLinkError,\n KeyNotFoundError,\n KeyIdAlreadyRegisteredError,\n VerificationTokenPurposeMismatchError,\n VerificationTokenTargetMismatchError,\n InsufficientPermissionsError,\n InsufficientRoleError,\n} from './auth-errors';\n\nexport const authErrorRegistry = new ErrorRegistry();\nauthErrorRegistry.append([\n InvalidCredentialsError,\n InvalidTokenError,\n InvalidSocialTokenError,\n TokenExpiredError,\n KeyExpiredError,\n AccountDisabledError,\n AccountPendingDeletionError,\n DeletionAlreadyRequestedError,\n DeletionNotRequestedError,\n ImmediateDeletionNotAllowedError,\n AccountAlreadyExistsError,\n RegistrationRejectedError,\n ReservedUsernameError,\n UsernameAlreadyTakenError,\n InvalidVerificationCodeError,\n InvalidVerificationTokenError,\n InvalidKeyFingerprintError,\n NonceKeyBindingError,\n NativeSignInUnsupportedError,\n UnverifiedEmailLinkError,\n KeyNotFoundError,\n KeyIdAlreadyRegisteredError,\n VerificationTokenPurposeMismatchError,\n VerificationTokenTargetMismatchError,\n InsufficientPermissionsError,\n InsufficientRoleError,\n]);\n\nexport * as AuthError from './auth-errors';\n","/**\n * Authentication & Authorization Error Classes\n *\n * Custom error classes for auth-specific scenarios\n */\n\nimport {\n ValidationError,\n UnauthorizedError,\n ForbiddenError,\n ConflictError,\n NotFoundError,\n} from '@spfn/core/errors';\n\n/**\n * Invalid Credentials Error (401)\n *\n * Thrown when login credentials are incorrect\n */\nexport class InvalidCredentialsError extends UnauthorizedError\n{\n constructor(data: { message?: string; details?: Record<string, any> } = {})\n {\n super({ message: data.message || 'Invalid credentials', details: data.details });\n this.name = 'InvalidCredentialsError';\n }\n}\n\n/**\n * Invalid Token Error (401)\n *\n * Thrown when authentication token is invalid or malformed\n */\nexport class InvalidTokenError extends UnauthorizedError\n{\n constructor(data: { message?: string; details?: Record<string, any> } = {})\n {\n super({ message: data.message || 'Invalid authentication token', details: data.details });\n this.name = 'InvalidTokenError';\n }\n}\n\n/**\n * Invalid Social Token Error (401)\n *\n * Thrown when a social provider id_token fails verification\n * (bad signature, wrong issuer/audience, expired, or nonce mismatch).\n */\nexport class InvalidSocialTokenError extends UnauthorizedError\n{\n constructor(data: { message?: string; details?: Record<string, any> } = {})\n {\n super({ message: data.message || 'Invalid social id_token', details: data.details });\n this.name = 'InvalidSocialTokenError';\n }\n}\n\n/**\n * Token Expired Error (401)\n *\n * Thrown when authentication token has expired\n */\nexport class TokenExpiredError extends UnauthorizedError\n{\n constructor(data: { message?: string; details?: Record<string, any> } = {})\n {\n super({ message: data.message || 'Authentication token has expired', details: data.details });\n this.name = 'TokenExpiredError';\n }\n}\n\n/**\n * Key Expired Error (401)\n *\n * Thrown when public key has expired\n */\nexport class KeyExpiredError extends UnauthorizedError\n{\n constructor(data: { message?: string; details?: Record<string, any> } = {})\n {\n super({ message: data.message || 'Public key has expired', details: data.details });\n this.name = 'KeyExpiredError';\n }\n}\n\n/**\n * Account Disabled Error (403)\n *\n * Thrown when user account is disabled or inactive\n */\nexport class AccountDisabledError extends ForbiddenError\n{\n constructor(data: { status?: string; message?: string; details?: Record<string, any> } = {})\n {\n const status = data.status || 'disabled';\n super({\n message: data.message || `Account is ${status}`,\n details: { status, ...data.details },\n });\n this.name = 'AccountDisabledError';\n }\n}\n\n/**\n * Account Pending Deletion Error (403)\n *\n * Thrown on login (password/OAuth/authenticate) when the account is within its\n * deletion grace period. Carries `purgeScheduledAt` so the client can offer a\n * recovery flow instead of a generic \"disabled\" message.\n */\nexport class AccountPendingDeletionError extends ForbiddenError\n{\n constructor(data: { purgeScheduledAt?: string; message?: string; details?: Record<string, any> } = {})\n {\n super({\n message: data.message || 'Account is scheduled for deletion',\n details: { status: 'pending_deletion', purgeScheduledAt: data.purgeScheduledAt, ...data.details },\n });\n this.name = 'AccountPendingDeletionError';\n }\n}\n\n/**\n * Deletion Already Requested Error (409)\n *\n * Thrown when requesting deletion for an account that already has a pending\n * deletion request (or has already been purged).\n */\nexport class DeletionAlreadyRequestedError extends ConflictError\n{\n constructor(data: { message?: string; details?: Record<string, any> } = {})\n {\n super({ message: data.message || 'Account deletion has already been requested', details: data.details });\n this.name = 'DeletionAlreadyRequestedError';\n }\n}\n\n/**\n * Deletion Not Requested Error (404)\n *\n * Thrown when trying to cancel/purge a deletion for an account that has no\n * pending deletion request.\n */\nexport class DeletionNotRequestedError extends NotFoundError\n{\n constructor(data: { message?: string; details?: Record<string, any> } = {})\n {\n super({ message: data.message || 'No pending account deletion request found', details: data.details });\n this.name = 'DeletionNotRequestedError';\n }\n}\n\n/**\n * Immediate Deletion Not Allowed Error (403)\n *\n * Thrown when a self-service caller requests `immediate: true` but the server\n * has not enabled `deletion.allowSelfImmediate`.\n */\nexport class ImmediateDeletionNotAllowedError extends ForbiddenError\n{\n constructor(data: { message?: string; details?: Record<string, any> } = {})\n {\n super({ message: data.message || 'Immediate self-service deletion is not enabled', details: data.details });\n this.name = 'ImmediateDeletionNotAllowedError';\n }\n}\n\n/**\n * Account Already Exists Error (409)\n *\n * Thrown when trying to register with existing email/phone\n */\nexport class AccountAlreadyExistsError extends ConflictError\n{\n constructor(data: { identifier?: string; identifierType?: 'email' | 'phone'; message?: string; details?: Record<string, any> } = {})\n {\n super({\n message: data.message || 'Account already exists',\n details: {\n identifier: data.identifier,\n identifierType: data.identifierType,\n ...data.details,\n },\n });\n this.name = 'AccountAlreadyExistsError';\n }\n}\n\n/**\n * Registration Rejected Error (403)\n *\n * Thrown by the app-injected beforeRegister hook to reject a registration\n * (age gate, domain restriction, block list, ...)\n */\nexport class RegistrationRejectedError extends ForbiddenError\n{\n constructor(data: { message?: string; details?: Record<string, any> } = {})\n {\n super({ message: data.message || 'Registration rejected', details: data.details });\n this.name = 'RegistrationRejectedError';\n }\n}\n\n/**\n * Invalid Verification Code Error (400)\n *\n * Thrown when verification code is invalid, expired, or already used\n */\nexport class InvalidVerificationCodeError extends ValidationError\n{\n constructor(data: { message?: string; details?: Record<string, any> } = {})\n {\n super({ message: data.message || 'Invalid verification code', details: data.details });\n this.name = 'InvalidVerificationCodeError';\n }\n}\n\n/**\n * Invalid Verification Token Error (400)\n *\n * Thrown when verification token is invalid or expired\n */\nexport class InvalidVerificationTokenError extends ValidationError\n{\n constructor(data: { message?: string; details?: Record<string, any> } = {})\n {\n super({ message: data.message || 'Invalid or expired verification token', details: data.details });\n this.name = 'InvalidVerificationTokenError';\n }\n}\n\n/**\n * Key ID Already Registered Error (409)\n *\n * Thrown when a sign-in submits a keyId that is already taken — the client's own\n * revoked keyId, or a keyId belonging to another user. `keyId` is unique across\n * all users, so either case would collide on insert.\n *\n * The same error covers both cases on purpose: a distinguishable response would\n * let a caller probe whether an arbitrary keyId exists. Revoked stays revoked —\n * the client must generate a fresh keyId and retry.\n */\nexport class KeyIdAlreadyRegisteredError extends ConflictError\n{\n constructor(data: { message?: string; details?: Record<string, any> } = {})\n {\n super({\n message: data.message || 'This keyId is already registered. Generate a new keyId and retry.',\n details: data.details,\n });\n this.name = 'KeyIdAlreadyRegisteredError';\n }\n}\n\n/**\n * Invalid Key Fingerprint Error (400)\n *\n * Thrown when public key fingerprint doesn't match the public key\n */\nexport class InvalidKeyFingerprintError extends ValidationError\n{\n constructor(data: { message?: string; details?: Record<string, any> } = {})\n {\n super({ message: data.message || 'Invalid key fingerprint', details: data.details });\n this.name = 'InvalidKeyFingerprintError';\n }\n}\n\n/**\n * Key Not Found Error (404)\n *\n * Thrown when a key operation names a keyId the caller does not own. It says\n * nothing about whether that keyId exists on another account — the repository\n * scopes every lookup by userId, so the answer is only ever \"not yours\".\n */\nexport class KeyNotFoundError extends NotFoundError\n{\n constructor(data: { message?: string; details?: Record<string, any> } = {})\n {\n super({ message: data.message || 'Key not found', details: data.details });\n this.name = 'KeyNotFoundError';\n }\n}\n\n/**\n * Nonce Key Binding Error (400)\n *\n * Thrown when a native id_token sign-in submits a nonce that is not the public\n * key's fingerprint. The nonce is what the provider echoed back inside the\n * id_token, so tying it to the key is what proves the id_token and the key came\n * from the same device — see the native section of the README.\n */\nexport class NonceKeyBindingError extends ValidationError\n{\n constructor(data: { message?: string; details?: Record<string, any> } = {})\n {\n super({\n message: data.message || 'nonce must be the fingerprint of the submitted public key',\n details: data.details,\n });\n this.name = 'NonceKeyBindingError';\n }\n}\n\n/**\n * Native Sign-In Unsupported Error (400)\n *\n * Thrown when a provider is asked for native id_token sign-in and has no\n * implementation for it — a server configuration fact, not something the user\n * did. A client reading this hides that provider's native button instead of\n * asking the user to try again.\n *\n * Split out of ValidationError because the other native-enrollment refusal\n * (linking to an account whose email the provider never verified) needs a\n * different response from the app, and one code cannot ask for two.\n */\nexport class NativeSignInUnsupportedError extends ValidationError\n{\n constructor(data: { message?: string; details?: Record<string, any> } = {})\n {\n super({\n message: data.message || 'This provider does not support native id_token sign-in.',\n details: data.details,\n });\n this.name = 'NativeSignInUnsupportedError';\n }\n}\n\n/**\n * Unverified Email Link Error (400)\n *\n * Thrown when a social identity carries an email that already belongs to an\n * account, but the provider never verified it. Linking on an unverified email\n * is account takeover, so the refusal stands and the user is sent to a path\n * that proves the address.\n *\n * This says an account exists for that address. It is not a leak introduced\n * here: the message this replaces already stated the same fact in prose, and\n * the paths that must not disclose account existence (password login, deletion\n * re-auth, verification issuance) answer uniformly and are untouched.\n */\nexport class UnverifiedEmailLinkError extends ValidationError\n{\n constructor(data: { message?: string; details?: Record<string, any> } = {})\n {\n super({\n message: data.message\n || 'Cannot link to existing account with unverified email. Please verify your email with the provider first.',\n details: data.details,\n });\n this.name = 'UnverifiedEmailLinkError';\n }\n}\n\n/**\n * Verification Token Purpose Mismatch Error (400)\n *\n * Thrown when verification token purpose doesn't match expected purpose\n */\nexport class VerificationTokenPurposeMismatchError extends ValidationError\n{\n constructor(data: { expected?: string; actual?: string; message?: string; details?: Record<string, any> } = {})\n {\n const expected = data.expected || 'unknown';\n const actual = data.actual || 'unknown';\n super({\n message: data.message || `Verification token is for ${actual}, but ${expected} was expected`,\n details: { expected, actual, ...data.details },\n });\n this.name = 'VerificationTokenPurposeMismatchError';\n }\n}\n\n/**\n * Verification Token Target Mismatch Error (400)\n *\n * Thrown when verification token target doesn't match provided email/phone\n */\nexport class VerificationTokenTargetMismatchError extends ValidationError\n{\n constructor(data: { message?: string; details?: Record<string, any> } = {})\n {\n super({\n message: data.message || 'Verification token does not match provided email/phone',\n details: data.details,\n });\n this.name = 'VerificationTokenTargetMismatchError';\n }\n}\n\n/**\n * Reserved Username Error (400)\n *\n * Thrown when trying to use a reserved/prohibited username\n */\nexport class ReservedUsernameError extends ValidationError\n{\n constructor(data: { username?: string; message?: string; details?: Record<string, any> } = {})\n {\n super({\n message: data.message || 'This username is reserved',\n details: { username: data.username, ...data.details },\n });\n this.name = 'ReservedUsernameError';\n }\n}\n\n/**\n * Username Already Taken Error (409)\n *\n * Thrown when trying to set a username that is already in use\n */\nexport class UsernameAlreadyTakenError extends ConflictError\n{\n constructor(data: { username?: string; message?: string; details?: Record<string, any> } = {})\n {\n super({\n message: data.message || 'Username is already taken',\n details: { username: data.username, ...data.details },\n });\n this.name = 'UsernameAlreadyTakenError';\n }\n}\n\n/**\n * Insufficient Permissions Error (403)\n *\n * Thrown when user lacks required permissions for the operation\n */\nexport class InsufficientPermissionsError extends ForbiddenError\n{\n constructor(data: { requiredPermissions?: string[]; message?: string; details?: Record<string, any> } = {})\n {\n const requiredPermissions = data.requiredPermissions || [];\n super({\n message: data.message || `Missing required permissions: ${requiredPermissions.join(', ')}`,\n details: { requiredPermissions, ...data.details },\n });\n this.name = 'InsufficientPermissionsError';\n }\n}\n\n/**\n * Insufficient Role Error (403)\n *\n * Thrown when user lacks required role for the operation\n */\nexport class InsufficientRoleError extends ForbiddenError\n{\n constructor(data: { requiredRoles?: string[]; message?: string; details?: Record<string, any> } = {})\n {\n const requiredRoles = data.requiredRoles || [];\n super({\n message: data.message || `Required roles: ${requiredRoles.join(', ')}`,\n details: { requiredRoles, ...data.details },\n });\n this.name = 'InsufficientRoleError';\n }\n}\n"],"mappings":"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","names":[]}
package/dist/index.d.ts CHANGED
@@ -1,9 +1,11 @@
1
1
  import * as _spfn_core_nextjs from '@spfn/core/nextjs';
2
- import { R as RoleConfig, P as PermissionConfig, C as CheckAccountExistsResult, S as SendVerificationCodeResult, a as RegisterResult, L as LoginResult, b as RotateKeyResult, I as IssueOneTimeTokenResult, O as OAuthStartResult, U as UserProfile, c as ProfileInfo, m as mainAuthRouter } from './authenticate-eucncHxN.js';
3
- export { l as AuthInitOptions, A as AuthSession, d as INVITATION_STATUSES, o as InvitationStatus, K as KEY_ALGORITHM, n as KeyAlgorithmType, j as PERMISSION_CATEGORIES, k as PermissionCategory, f as SOCIAL_PROVIDERS, q as SocialProvider, e as USER_STATUSES, p as UserStatus, i as VERIFICATION_PURPOSES, h as VERIFICATION_TARGET_TYPES, g as VerificationPurpose, V as VerificationTargetType } from './authenticate-eucncHxN.js';
2
+ import { P as PermissionConfig, R as RoleConfig, m as mainAuthRouter, S as SendVerificationCodeResult, a as RegisterResult, L as LoginResult, b as RotateKeyResult, K as KeySummary, c as RevokeAllKeysResult, I as IssueOneTimeTokenResult, O as OAuthStartResult, d as OAuthNativeResult, U as UserProfile, e as ProfileInfo } from './authenticate-55LeXHqZ.js';
3
+ export { A as AuthInitOptions, f as AuthSession, g as PERMISSION_CATEGORIES, h as PermissionCategory, V as VERIFICATION_PURPOSES, i as VERIFICATION_TARGET_TYPES, j as VerificationPurpose, k as VerificationTargetType } from './authenticate-55LeXHqZ.js';
4
4
  import * as _spfn_core_route from '@spfn/core/route';
5
5
  import { HttpMethod } from '@spfn/core/route';
6
+ export { A as ACCOUNT_DELETION_REQUESTED_BY, a as ACCOUNT_DELETION_REQUEST_STATUSES, b as AccountDeletionRequestStatus, c as AccountDeletionRequestedBy, I as INVITATION_STATUSES, d as InvitationStatus, e as KEY_ALGORITHM, f as KEY_DEVICE_NAME_MAX_LENGTH, g as KEY_PLATFORM, K as KeyAlgorithmType, h as KeyPlatformType, P as PURGE_STRATEGIES, i as PurgeStrategy, S as SOCIAL_PROVIDERS, j as SocialProvider, U as USER_STATUSES, k as UserStatus } from './types-DYyhze28.js';
6
7
  import * as _sinclair_typebox from '@sinclair/typebox';
8
+ import 'hono';
7
9
  import '@spfn/auth/server';
8
10
 
9
11
  /**
@@ -87,18 +89,11 @@ declare const routeMap: Record<string, RouteInfo>;
87
89
  * ```
88
90
  */
89
91
  declare const authApi: _spfn_core_nextjs.Client<_spfn_core_route.Router<{
90
- checkAccountExists: _spfn_core_route.RouteDef<{
91
- body: _sinclair_typebox.TUnion<[_sinclair_typebox.TObject<{
92
- email: _sinclair_typebox.TString;
93
- }>, _sinclair_typebox.TObject<{
94
- phone: _sinclair_typebox.TString;
95
- }>]>;
96
- }, {}, CheckAccountExistsResult>;
97
92
  sendVerificationCode: _spfn_core_route.RouteDef<{
98
93
  body: _sinclair_typebox.TObject<{
99
94
  target: _sinclair_typebox.TString;
100
95
  targetType: _sinclair_typebox.TUnion<[_sinclair_typebox.TLiteral<"email">, _sinclair_typebox.TLiteral<"phone">]>;
101
- purpose: _sinclair_typebox.TUnion<[_sinclair_typebox.TLiteral<"registration">, _sinclair_typebox.TLiteral<"login">, _sinclair_typebox.TLiteral<"password_reset">, _sinclair_typebox.TLiteral<"email_change">, _sinclair_typebox.TLiteral<"phone_change">]>;
96
+ purpose: _sinclair_typebox.TUnion<[_sinclair_typebox.TLiteral<"registration">, _sinclair_typebox.TLiteral<"login">, _sinclair_typebox.TLiteral<"password_reset">, _sinclair_typebox.TLiteral<"email_change">, _sinclair_typebox.TLiteral<"phone_change">, _sinclair_typebox.TLiteral<"account_deletion">]>;
102
97
  }>;
103
98
  }, {}, SendVerificationCodeResult>;
104
99
  verifyCode: _spfn_core_route.RouteDef<{
@@ -106,7 +101,7 @@ declare const authApi: _spfn_core_nextjs.Client<_spfn_core_route.Router<{
106
101
  target: _sinclair_typebox.TString;
107
102
  targetType: _sinclair_typebox.TUnion<[_sinclair_typebox.TLiteral<"email">, _sinclair_typebox.TLiteral<"phone">]>;
108
103
  code: _sinclair_typebox.TString;
109
- purpose: _sinclair_typebox.TUnion<[_sinclair_typebox.TLiteral<"registration">, _sinclair_typebox.TLiteral<"login">, _sinclair_typebox.TLiteral<"password_reset">, _sinclair_typebox.TLiteral<"email_change">, _sinclair_typebox.TLiteral<"phone_change">]>;
104
+ purpose: _sinclair_typebox.TUnion<[_sinclair_typebox.TLiteral<"registration">, _sinclair_typebox.TLiteral<"login">, _sinclair_typebox.TLiteral<"password_reset">, _sinclair_typebox.TLiteral<"email_change">, _sinclair_typebox.TLiteral<"phone_change">, _sinclair_typebox.TLiteral<"account_deletion">]>;
110
105
  }>;
111
106
  }, {}, {
112
107
  valid: boolean;
@@ -126,6 +121,8 @@ declare const authApi: _spfn_core_nextjs.Client<_spfn_core_route.Router<{
126
121
  keyId: _sinclair_typebox.TString;
127
122
  fingerprint: _sinclair_typebox.TString;
128
123
  algorithm: _sinclair_typebox.TUnion<_sinclair_typebox.TLiteral<"ES256" | "RS256">[]>;
124
+ deviceName: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
125
+ platform: _sinclair_typebox.TOptional<_sinclair_typebox.TUnion<_sinclair_typebox.TLiteral<"ios" | "android" | "web" | "desktop">[]>>;
129
126
  }>;
130
127
  }, RegisterResult>;
131
128
  login: _spfn_core_route.RouteDef<{
@@ -141,6 +138,8 @@ declare const authApi: _spfn_core_nextjs.Client<_spfn_core_route.Router<{
141
138
  fingerprint: _sinclair_typebox.TString;
142
139
  algorithm: _sinclair_typebox.TUnion<_sinclair_typebox.TLiteral<"ES256" | "RS256">[]>;
143
140
  oldKeyId: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
141
+ deviceName: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
142
+ platform: _sinclair_typebox.TOptional<_sinclair_typebox.TUnion<_sinclair_typebox.TLiteral<"ios" | "android" | "web" | "desktop">[]>>;
144
143
  }>;
145
144
  }, LoginResult>;
146
145
  logout: _spfn_core_route.RouteDef<{}, {}, void>;
@@ -150,11 +149,33 @@ declare const authApi: _spfn_core_nextjs.Client<_spfn_core_route.Router<{
150
149
  keyId: _sinclair_typebox.TString;
151
150
  fingerprint: _sinclair_typebox.TString;
152
151
  algorithm: _sinclair_typebox.TUnion<_sinclair_typebox.TLiteral<"ES256" | "RS256">[]>;
152
+ deviceName: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
153
+ platform: _sinclair_typebox.TOptional<_sinclair_typebox.TUnion<_sinclair_typebox.TLiteral<"ios" | "android" | "web" | "desktop">[]>>;
153
154
  }>;
154
155
  }, RotateKeyResult>;
156
+ listKeys: _spfn_core_route.RouteDef<{
157
+ body: _sinclair_typebox.TObject<{
158
+ includeRevoked: _sinclair_typebox.TOptional<_sinclair_typebox.TBoolean>;
159
+ }>;
160
+ }, {}, {
161
+ keys: KeySummary[];
162
+ }>;
163
+ revokeKey: _spfn_core_route.RouteDef<{
164
+ body: _sinclair_typebox.TObject<{
165
+ keyId: _sinclair_typebox.TString;
166
+ }>;
167
+ }, {}, {
168
+ keyId: string;
169
+ selfRevoked: boolean;
170
+ }>;
171
+ revokeAllKeys: _spfn_core_route.RouteDef<{
172
+ body: _sinclair_typebox.TObject<{
173
+ includeCurrent: _sinclair_typebox.TOptional<_sinclair_typebox.TBoolean>;
174
+ }>;
175
+ }, {}, RevokeAllKeysResult>;
155
176
  changePassword: _spfn_core_route.RouteDef<{
156
177
  body: _sinclair_typebox.TObject<{
157
- currentPassword: _sinclair_typebox.TString;
178
+ currentPassword: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
158
179
  newPassword: _sinclair_typebox.TString;
159
180
  }>;
160
181
  }, {}, void>;
@@ -176,8 +197,27 @@ declare const authApi: _spfn_core_nextjs.Client<_spfn_core_route.Router<{
176
197
  email: string | null;
177
198
  emailVerified: boolean;
178
199
  phoneVerified: boolean;
200
+ hasPassword: boolean;
179
201
  }>;
180
202
  issueOneTimeToken: _spfn_core_route.RouteDef<{}, {}, IssueOneTimeTokenResult>;
203
+ requestAccountDeletion: _spfn_core_route.RouteDef<{
204
+ body: _sinclair_typebox.TObject<{
205
+ password: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
206
+ verificationToken: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
207
+ reason: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
208
+ immediate: _sinclair_typebox.TOptional<_sinclair_typebox.TBoolean>;
209
+ }>;
210
+ }, {}, {
211
+ purgeScheduledAt: string;
212
+ }>;
213
+ cancelAccountDeletion: _spfn_core_route.RouteDef<{
214
+ body: _sinclair_typebox.TObject<{
215
+ email: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
216
+ phone: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
217
+ password: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
218
+ verificationToken: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
219
+ }>;
220
+ }, {}, void>;
181
221
  oauthGoogleStart: _spfn_core_route.RouteDef<{
182
222
  query: _sinclair_typebox.TObject<{
183
223
  state: _sinclair_typebox.TString;
@@ -193,7 +233,7 @@ declare const authApi: _spfn_core_nextjs.Client<_spfn_core_route.Router<{
193
233
  }, {}, Response>;
194
234
  oauthStart: _spfn_core_route.RouteDef<{
195
235
  body: _sinclair_typebox.TObject<{
196
- provider: _sinclair_typebox.TUnion<_sinclair_typebox.TLiteral<"google" | "github" | "kakao" | "naver">[]>;
236
+ provider: _sinclair_typebox.TUnion<_sinclair_typebox.TLiteral<"google" | "apple" | "github" | "kakao" | "naver" | "superself">[]>;
197
237
  returnUrl: _sinclair_typebox.TString;
198
238
  publicKey: _sinclair_typebox.TString;
199
239
  keyId: _sinclair_typebox.TString;
@@ -203,11 +243,12 @@ declare const authApi: _spfn_core_nextjs.Client<_spfn_core_route.Router<{
203
243
  }>;
204
244
  }, {}, OAuthStartResult>;
205
245
  oauthProviders: _spfn_core_route.RouteDef<{}, {}, {
206
- providers: ("google" | "github" | "kakao" | "naver")[];
246
+ providers: ("google" | "apple" | "github" | "kakao" | "naver" | "superself")[];
207
247
  }>;
208
248
  getGoogleOAuthUrl: _spfn_core_route.RouteDef<{
209
249
  body: _sinclair_typebox.TObject<{
210
250
  returnUrl: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
251
+ metadata: _sinclair_typebox.TOptional<_sinclair_typebox.TRecord<_sinclair_typebox.TString, _sinclair_typebox.TUnknown>>;
211
252
  state: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
212
253
  }>;
213
254
  }, {}, {
@@ -225,6 +266,67 @@ declare const authApi: _spfn_core_nextjs.Client<_spfn_core_route.Router<{
225
266
  keyId: string;
226
267
  returnUrl: string;
227
268
  }>;
269
+ oauthProviderStart: _spfn_core_route.RouteDef<{
270
+ params: _sinclair_typebox.TObject<{
271
+ provider: _sinclair_typebox.TUnion<_sinclair_typebox.TLiteral<"google" | "apple" | "github" | "kakao" | "naver" | "superself">[]>;
272
+ }>;
273
+ query: _sinclair_typebox.TObject<{
274
+ state: _sinclair_typebox.TString;
275
+ }>;
276
+ }, {}, Response>;
277
+ oauthProviderCallback: _spfn_core_route.RouteDef<{
278
+ params: _sinclair_typebox.TObject<{
279
+ provider: _sinclair_typebox.TUnion<_sinclair_typebox.TLiteral<"google" | "apple" | "github" | "kakao" | "naver" | "superself">[]>;
280
+ }>;
281
+ query: _sinclair_typebox.TObject<{
282
+ code: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
283
+ state: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
284
+ error: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
285
+ error_description: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
286
+ }>;
287
+ }, {}, Response>;
288
+ getProviderOAuthUrl: _spfn_core_route.RouteDef<{
289
+ params: _sinclair_typebox.TObject<{
290
+ provider: _sinclair_typebox.TUnion<_sinclair_typebox.TLiteral<"google" | "apple" | "github" | "kakao" | "naver" | "superself">[]>;
291
+ }>;
292
+ body: _sinclair_typebox.TObject<{
293
+ returnUrl: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
294
+ metadata: _sinclair_typebox.TOptional<_sinclair_typebox.TRecord<_sinclair_typebox.TString, _sinclair_typebox.TUnknown>>;
295
+ state: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
296
+ }>;
297
+ }, {}, {
298
+ authUrl: string;
299
+ }>;
300
+ oauthNative: _spfn_core_route.RouteDef<{
301
+ params: _sinclair_typebox.TObject<{
302
+ provider: _sinclair_typebox.TUnion<_sinclair_typebox.TLiteral<"google" | "apple" | "github" | "kakao" | "naver" | "superself">[]>;
303
+ }>;
304
+ body: _sinclair_typebox.TObject<{
305
+ idToken: _sinclair_typebox.TString;
306
+ nonce: _sinclair_typebox.TString;
307
+ accessToken: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
308
+ publicKey: _sinclair_typebox.TString;
309
+ keyId: _sinclair_typebox.TString;
310
+ fingerprint: _sinclair_typebox.TString;
311
+ algorithm: _sinclair_typebox.TUnion<_sinclair_typebox.TLiteral<"ES256" | "RS256">[]>;
312
+ deviceName: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
313
+ platform: _sinclair_typebox.TOptional<_sinclair_typebox.TUnion<_sinclair_typebox.TLiteral<"ios" | "android" | "web" | "desktop">[]>>;
314
+ profile: _sinclair_typebox.TOptional<_sinclair_typebox.TObject<{
315
+ name: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
316
+ }>>;
317
+ metadata: _sinclair_typebox.TOptional<_sinclair_typebox.TRecord<_sinclair_typebox.TString, _sinclair_typebox.TUnknown>>;
318
+ }>;
319
+ }, {}, OAuthNativeResult>;
320
+ oauthUnlinkNotify: _spfn_core_route.RouteDef<{
321
+ params: _sinclair_typebox.TObject<{
322
+ provider: _sinclair_typebox.TUnion<_sinclair_typebox.TLiteral<"google" | "apple" | "github" | "kakao" | "naver" | "superself">[]>;
323
+ }>;
324
+ }, {}, void | Response>;
325
+ oauthUnlinkNotifyGet: _spfn_core_route.RouteDef<{
326
+ params: _sinclair_typebox.TObject<{
327
+ provider: _sinclair_typebox.TUnion<_sinclair_typebox.TLiteral<"google" | "apple" | "github" | "kakao" | "naver" | "superself">[]>;
328
+ }>;
329
+ }, {}, void | Response>;
228
330
  getInvitation: _spfn_core_route.RouteDef<{
229
331
  params: _sinclair_typebox.TObject<{
230
332
  token: _sinclair_typebox.TString;
@@ -357,6 +459,8 @@ declare const authApi: _spfn_core_nextjs.Client<_spfn_core_route.Router<{
357
459
  username: _sinclair_typebox.TUnion<[_sinclair_typebox.TString, _sinclair_typebox.TNull]>;
358
460
  }>;
359
461
  }, {}, {
462
+ deletedAt: Date | null;
463
+ deletedBy: string | null;
360
464
  createdAt: Date;
361
465
  updatedAt: Date;
362
466
  id: number;
@@ -367,7 +471,7 @@ declare const authApi: _spfn_core_nextjs.Client<_spfn_core_route.Router<{
367
471
  passwordHash: string | null;
368
472
  passwordChangeRequired: boolean;
369
473
  roleId: number;
370
- status: "active" | "inactive" | "suspended";
474
+ status: "active" | "inactive" | "suspended" | "pending_deletion" | "deleted";
371
475
  emailVerifiedAt: Date | null;
372
476
  phoneVerifiedAt: Date | null;
373
477
  lastLoginAt: Date | null;
@@ -386,8 +490,8 @@ declare const authApi: _spfn_core_nextjs.Client<_spfn_core_route.Router<{
386
490
  }, {}, {
387
491
  roles: {
388
492
  description: string | null;
389
- id: number;
390
493
  name: string;
494
+ id: number;
391
495
  displayName: string;
392
496
  isBuiltin: boolean;
393
497
  isSystem: boolean;
@@ -408,8 +512,8 @@ declare const authApi: _spfn_core_nextjs.Client<_spfn_core_route.Router<{
408
512
  }, {}, {
409
513
  role: {
410
514
  description: string | null;
411
- id: number;
412
515
  name: string;
516
+ id: number;
413
517
  displayName: string;
414
518
  isBuiltin: boolean;
415
519
  isSystem: boolean;
@@ -432,8 +536,8 @@ declare const authApi: _spfn_core_nextjs.Client<_spfn_core_route.Router<{
432
536
  }, {}, {
433
537
  role: {
434
538
  description: string | null;
435
- id: number;
436
539
  name: string;
540
+ id: number;
437
541
  displayName: string;
438
542
  isBuiltin: boolean;
439
543
  isSystem: boolean;
@@ -459,6 +563,50 @@ declare const authApi: _spfn_core_nextjs.Client<_spfn_core_route.Router<{
459
563
  userId: number;
460
564
  roleId: number;
461
565
  }>;
566
+ issueOpsToken: _spfn_core_route.RouteDef<{
567
+ body: _sinclair_typebox.TObject<{
568
+ name: _sinclair_typebox.TString;
569
+ scopes: _sinclair_typebox.TArray<_sinclair_typebox.TString>;
570
+ expiresInDays: _sinclair_typebox.TOptional<_sinclair_typebox.TUnion<[_sinclair_typebox.TNumber, _sinclair_typebox.TNull]>>;
571
+ }>;
572
+ }, {}, {
573
+ token: string;
574
+ opsToken: {
575
+ id: number;
576
+ name: string;
577
+ scopes: string[];
578
+ expiresAt: string | null;
579
+ revokedAt: string | null;
580
+ lastUsedAt: string | null;
581
+ createdAt: string | null;
582
+ };
583
+ }>;
584
+ listOpsTokens: _spfn_core_route.RouteDef<{}, {}, {
585
+ opsTokens: {
586
+ id: number;
587
+ name: string;
588
+ scopes: string[];
589
+ expiresAt: string | null;
590
+ revokedAt: string | null;
591
+ lastUsedAt: string | null;
592
+ createdAt: string | null;
593
+ }[];
594
+ }>;
595
+ revokeOpsToken: _spfn_core_route.RouteDef<{
596
+ params: _sinclair_typebox.TObject<{
597
+ id: _sinclair_typebox.TNumber;
598
+ }>;
599
+ }, {}, {
600
+ opsToken: {
601
+ id: number;
602
+ name: string;
603
+ scopes: string[];
604
+ expiresAt: string | null;
605
+ revokedAt: string | null;
606
+ lastUsedAt: string | null;
607
+ createdAt: string | null;
608
+ };
609
+ }>;
462
610
  }>>;
463
611
  type AuthRouter = typeof mainAuthRouter;
464
612
 
package/dist/index.js CHANGED
@@ -15,7 +15,8 @@ import {
15
15
  ValidationError,
16
16
  UnauthorizedError,
17
17
  ForbiddenError,
18
- ConflictError
18
+ ConflictError,
19
+ NotFoundError
19
20
  } from "@spfn/core/errors";
20
21
  var InvalidCredentialsError = class extends UnauthorizedError {
21
22
  constructor(data = {}) {
@@ -29,6 +30,12 @@ var InvalidTokenError = class extends UnauthorizedError {
29
30
  this.name = "InvalidTokenError";
30
31
  }
31
32
  };
33
+ var InvalidSocialTokenError = class extends UnauthorizedError {
34
+ constructor(data = {}) {
35
+ super({ message: data.message || "Invalid social id_token", details: data.details });
36
+ this.name = "InvalidSocialTokenError";
37
+ }
38
+ };
32
39
  var TokenExpiredError = class extends UnauthorizedError {
33
40
  constructor(data = {}) {
34
41
  super({ message: data.message || "Authentication token has expired", details: data.details });
@@ -51,6 +58,33 @@ var AccountDisabledError = class extends ForbiddenError {
51
58
  this.name = "AccountDisabledError";
52
59
  }
53
60
  };
61
+ var AccountPendingDeletionError = class extends ForbiddenError {
62
+ constructor(data = {}) {
63
+ super({
64
+ message: data.message || "Account is scheduled for deletion",
65
+ details: { status: "pending_deletion", purgeScheduledAt: data.purgeScheduledAt, ...data.details }
66
+ });
67
+ this.name = "AccountPendingDeletionError";
68
+ }
69
+ };
70
+ var DeletionAlreadyRequestedError = class extends ConflictError {
71
+ constructor(data = {}) {
72
+ super({ message: data.message || "Account deletion has already been requested", details: data.details });
73
+ this.name = "DeletionAlreadyRequestedError";
74
+ }
75
+ };
76
+ var DeletionNotRequestedError = class extends NotFoundError {
77
+ constructor(data = {}) {
78
+ super({ message: data.message || "No pending account deletion request found", details: data.details });
79
+ this.name = "DeletionNotRequestedError";
80
+ }
81
+ };
82
+ var ImmediateDeletionNotAllowedError = class extends ForbiddenError {
83
+ constructor(data = {}) {
84
+ super({ message: data.message || "Immediate self-service deletion is not enabled", details: data.details });
85
+ this.name = "ImmediateDeletionNotAllowedError";
86
+ }
87
+ };
54
88
  var AccountAlreadyExistsError = class extends ConflictError {
55
89
  constructor(data = {}) {
56
90
  super({
@@ -64,6 +98,12 @@ var AccountAlreadyExistsError = class extends ConflictError {
64
98
  this.name = "AccountAlreadyExistsError";
65
99
  }
66
100
  };
101
+ var RegistrationRejectedError = class extends ForbiddenError {
102
+ constructor(data = {}) {
103
+ super({ message: data.message || "Registration rejected", details: data.details });
104
+ this.name = "RegistrationRejectedError";
105
+ }
106
+ };
67
107
  var InvalidVerificationCodeError = class extends ValidationError {
68
108
  constructor(data = {}) {
69
109
  super({ message: data.message || "Invalid verification code", details: data.details });
@@ -76,12 +116,54 @@ var InvalidVerificationTokenError = class extends ValidationError {
76
116
  this.name = "InvalidVerificationTokenError";
77
117
  }
78
118
  };
119
+ var KeyIdAlreadyRegisteredError = class extends ConflictError {
120
+ constructor(data = {}) {
121
+ super({
122
+ message: data.message || "This keyId is already registered. Generate a new keyId and retry.",
123
+ details: data.details
124
+ });
125
+ this.name = "KeyIdAlreadyRegisteredError";
126
+ }
127
+ };
79
128
  var InvalidKeyFingerprintError = class extends ValidationError {
80
129
  constructor(data = {}) {
81
130
  super({ message: data.message || "Invalid key fingerprint", details: data.details });
82
131
  this.name = "InvalidKeyFingerprintError";
83
132
  }
84
133
  };
134
+ var KeyNotFoundError = class extends NotFoundError {
135
+ constructor(data = {}) {
136
+ super({ message: data.message || "Key not found", details: data.details });
137
+ this.name = "KeyNotFoundError";
138
+ }
139
+ };
140
+ var NonceKeyBindingError = class extends ValidationError {
141
+ constructor(data = {}) {
142
+ super({
143
+ message: data.message || "nonce must be the fingerprint of the submitted public key",
144
+ details: data.details
145
+ });
146
+ this.name = "NonceKeyBindingError";
147
+ }
148
+ };
149
+ var NativeSignInUnsupportedError = class extends ValidationError {
150
+ constructor(data = {}) {
151
+ super({
152
+ message: data.message || "This provider does not support native id_token sign-in.",
153
+ details: data.details
154
+ });
155
+ this.name = "NativeSignInUnsupportedError";
156
+ }
157
+ };
158
+ var UnverifiedEmailLinkError = class extends ValidationError {
159
+ constructor(data = {}) {
160
+ super({
161
+ message: data.message || "Cannot link to existing account with unverified email. Please verify your email with the provider first.",
162
+ details: data.details
163
+ });
164
+ this.name = "UnverifiedEmailLinkError";
165
+ }
166
+ };
85
167
  var VerificationTokenPurposeMismatchError = class extends ValidationError {
86
168
  constructor(data = {}) {
87
169
  const expected = data.expected || "unknown";
@@ -146,15 +228,26 @@ var authErrorRegistry = new ErrorRegistry();
146
228
  authErrorRegistry.append([
147
229
  InvalidCredentialsError,
148
230
  InvalidTokenError,
231
+ InvalidSocialTokenError,
149
232
  TokenExpiredError,
150
233
  KeyExpiredError,
151
234
  AccountDisabledError,
235
+ AccountPendingDeletionError,
236
+ DeletionAlreadyRequestedError,
237
+ DeletionNotRequestedError,
238
+ ImmediateDeletionNotAllowedError,
152
239
  AccountAlreadyExistsError,
240
+ RegistrationRejectedError,
153
241
  ReservedUsernameError,
154
242
  UsernameAlreadyTakenError,
155
243
  InvalidVerificationCodeError,
156
244
  InvalidVerificationTokenError,
157
245
  InvalidKeyFingerprintError,
246
+ NonceKeyBindingError,
247
+ NativeSignInUnsupportedError,
248
+ UnverifiedEmailLinkError,
249
+ KeyNotFoundError,
250
+ KeyIdAlreadyRegisteredError,
158
251
  VerificationTokenPurposeMismatchError,
159
252
  VerificationTokenTargetMismatchError,
160
253
  InsufficientPermissionsError,
@@ -163,13 +256,15 @@ authErrorRegistry.append([
163
256
 
164
257
  // src/generated/route-map.ts
165
258
  var routeMap = {
166
- checkAccountExists: { method: "POST", path: "/_auth/exists" },
167
259
  sendVerificationCode: { method: "POST", path: "/_auth/codes" },
168
260
  verifyCode: { method: "POST", path: "/_auth/codes/verify" },
169
261
  register: { method: "POST", path: "/_auth/register" },
170
262
  login: { method: "POST", path: "/_auth/login" },
171
263
  logout: { method: "POST", path: "/_auth/logout" },
172
264
  rotateKey: { method: "POST", path: "/_auth/keys/rotate" },
265
+ listKeys: { method: "POST", path: "/_auth/keys/list" },
266
+ revokeKey: { method: "POST", path: "/_auth/keys/revoke" },
267
+ revokeAllKeys: { method: "POST", path: "/_auth/keys/revoke-all" },
173
268
  changePassword: { method: "PUT", path: "/_auth/password" },
174
269
  getAuthSession: { method: "GET", path: "/_auth/session" },
175
270
  issueOneTimeToken: { method: "POST", path: "/_auth/tokens" },
@@ -191,11 +286,22 @@ var routeMap = {
191
286
  oauthProviders: { method: "GET", path: "/_auth/oauth/providers" },
192
287
  getGoogleOAuthUrl: { method: "POST", path: "/_auth/oauth/google/url" },
193
288
  oauthFinalize: { method: "POST", path: "/_auth/oauth/finalize" },
289
+ oauthProviderStart: { method: "GET", path: "/_auth/oauth/:provider" },
290
+ oauthProviderCallback: { method: "GET", path: "/_auth/oauth/:provider/callback" },
291
+ getProviderOAuthUrl: { method: "POST", path: "/_auth/oauth/:provider/url" },
292
+ oauthNative: { method: "POST", path: "/_auth/oauth/:provider/native" },
293
+ oauthUnlinkNotify: { method: "POST", path: "/_auth/oauth/:provider/unlink-notify" },
294
+ oauthUnlinkNotifyGet: { method: "GET", path: "/_auth/oauth/:provider/unlink-notify" },
194
295
  listRoles: { method: "GET", path: "/_auth/admin/roles" },
195
296
  createAdminRole: { method: "POST", path: "/_auth/admin/roles" },
196
297
  updateAdminRole: { method: "PATCH", path: "/_auth/admin/roles/:id" },
197
298
  deleteAdminRole: { method: "DELETE", path: "/_auth/admin/roles/:id" },
198
- updateUserRole: { method: "PATCH", path: "/_auth/admin/users/:userId/role" }
299
+ updateUserRole: { method: "PATCH", path: "/_auth/admin/users/:userId/role" },
300
+ requestAccountDeletion: { method: "POST", path: "/_auth/deletion/request" },
301
+ cancelAccountDeletion: { method: "POST", path: "/_auth/deletion/cancel" },
302
+ issueOpsToken: { method: "POST", path: "/_auth/ops-tokens" },
303
+ listOpsTokens: { method: "GET", path: "/_auth/ops-tokens" },
304
+ revokeOpsToken: { method: "DELETE", path: "/_auth/ops-tokens/:id" }
199
305
  };
200
306
 
201
307
  // src/lib/types.ts
@@ -331,9 +437,14 @@ var BUILTIN_ROLE_PERMISSIONS = {
331
437
 
332
438
  // src/server/types.ts
333
439
  var KEY_ALGORITHM = ["ES256", "RS256"];
440
+ var KEY_PLATFORM = ["ios", "android", "web", "desktop"];
441
+ var KEY_DEVICE_NAME_MAX_LENGTH = 64;
334
442
  var INVITATION_STATUSES = ["pending", "accepted", "expired", "cancelled"];
335
- var USER_STATUSES = ["active", "inactive", "suspended"];
336
- var SOCIAL_PROVIDERS = ["google", "github", "kakao", "naver"];
443
+ var USER_STATUSES = ["active", "inactive", "suspended", "pending_deletion", "deleted"];
444
+ var SOCIAL_PROVIDERS = ["google", "apple", "github", "kakao", "naver", "superself"];
445
+ var ACCOUNT_DELETION_REQUEST_STATUSES = ["pending", "cancelled", "completed"];
446
+ var ACCOUNT_DELETION_REQUESTED_BY = ["self", "admin"];
447
+ var PURGE_STRATEGIES = ["anonymize", "hard-delete"];
337
448
 
338
449
  // ../../node_modules/.pnpm/@sinclair+typebox@0.34.41/node_modules/@sinclair/typebox/build/esm/type/guard/value.mjs
339
450
  var value_exports = {};
@@ -2956,9 +3067,18 @@ var PhoneSchema = Type.String({
2956
3067
  pattern: PHONE_PATTERN2,
2957
3068
  description: "Phone number in E.164 format (e.g., +821012345678)"
2958
3069
  });
3070
+ var DeviceNameSchema = Type.String({
3071
+ maxLength: KEY_DEVICE_NAME_MAX_LENGTH,
3072
+ description: `Device label shown in the key list (max ${KEY_DEVICE_NAME_MAX_LENGTH} chars)`
3073
+ });
3074
+ var PlatformSchema = Type.Union(
3075
+ KEY_PLATFORM.map((platform) => Type.Literal(platform)),
3076
+ { description: "Platform the key lives on" }
3077
+ );
2959
3078
  var PasswordSchema = Type.String({
2960
3079
  minLength: 8,
2961
- description: "User password (minimum 8 characters)"
3080
+ maxLength: 72,
3081
+ description: "User password (8\u201372 characters). bcrypt silently ignores bytes past 72, so longer inputs are rejected rather than truncated."
2962
3082
  });
2963
3083
  var TargetTypeSchema = Type.Union([
2964
3084
  Type.Literal("email"),
@@ -2972,17 +3092,20 @@ var VerificationPurposeSchema = Type.Union([
2972
3092
  Type.Literal("login"),
2973
3093
  Type.Literal("password_reset"),
2974
3094
  Type.Literal("email_change"),
2975
- Type.Literal("phone_change")
3095
+ Type.Literal("phone_change"),
3096
+ Type.Literal("account_deletion")
2976
3097
  ], {
2977
3098
  description: "Purpose of verification"
2978
3099
  });
2979
- var VERIFICATION_PURPOSES = ["registration", "login", "password_reset", "email_change", "phone_change"];
3100
+ var VERIFICATION_PURPOSES = ["registration", "login", "password_reset", "email_change", "phone_change", "account_deletion"];
2980
3101
 
2981
3102
  // src/index.ts
2982
3103
  var authApi = createApi({
2983
3104
  errorRegistry: [authErrorRegistry]
2984
3105
  });
2985
3106
  export {
3107
+ ACCOUNT_DELETION_REQUESTED_BY,
3108
+ ACCOUNT_DELETION_REQUEST_STATUSES,
2986
3109
  BASE64_PATTERN,
2987
3110
  BUILTIN_PERMISSIONS,
2988
3111
  BUILTIN_ROLES,
@@ -2993,6 +3116,7 @@ export {
2993
3116
  KEY_ALGORITHM,
2994
3117
  PERMISSION_CATEGORIES,
2995
3118
  PHONE_PATTERN,
3119
+ PURGE_STRATEGIES,
2996
3120
  SOCIAL_PROVIDERS,
2997
3121
  USER_STATUSES,
2998
3122
  UUID_PATTERN,