{
  "slug": "generate-otp-token",
  "runtimes": {
    "node": {
      "frameworks": {
        "express": {
          "dependencies": {
            "runtime": [
              ""
            ],
            "dev": []
          },
          "env": [],
          "architectures": {
            "mvc": {
              "files": [
                {
                  "type": "file",
                  "path": "src/helpers/token.helper.ts",
                  "content": "import crypto from \"node:crypto\";\n\n//? generate otp\nexport function generateOTP(length: number = 6, ttlMinutes: number = 5) {\n  const code = crypto\n    .randomInt(0, Math.pow(10, length))\n    .toString()\n    .padStart(length, \"0\");\n  const hashCode = crypto\n    .createHash(\"sha256\")\n    .update(String(code))\n    .digest(\"hex\");\n  const expiresAt = new Date(Date.now() + ttlMinutes * 60 * 1000).toISOString();\n  return { code, hashCode, expiresAt };\n}\n\n//? verify otp\nexport function verifyOTP(code: string, hashCode: string): boolean {\n  const validCode = crypto\n    .createHash(\"sha256\")\n    .update(String(code))\n    .digest(\"hex\");\n  return validCode === hashCode;\n}\n\n//? hash otp\nexport function hashOTP(otp: string): string {\n  return crypto.createHash(\"sha256\").update(String(otp)).digest(\"hex\");\n}\n\n//? generate secure token\nexport function generateSecureToken(length: number = 32): string {\n  return crypto.randomBytes(length).toString(\"hex\");\n}\n\n//? generate hashed token\nexport function generateHashedToken(token: string): string {\n  return crypto.createHash(\"sha256\").update(String(token)).digest(\"hex\");\n}\n\n//? generate token and hashed token\nexport function generateTokenAndHashedToken(id: string) {\n  const cryptoSecret = process.env.CRYPTO_SECRET! || \"secret\";\n  const token = crypto\n    .createHmac(\"sha256\", cryptoSecret)\n    .update(String(id))\n    .digest(\"hex\");\n\n  const hashedToken = crypto\n    .createHash(\"sha256\")\n    .update(String(token))\n    .digest(\"hex\");\n  return { token, hashedToken };\n}\n\n//? verify hashed token\nexport function verifyHashedToken(token: string, hashedToken: string): boolean {\n  return (\n    crypto.createHash(\"sha256\").update(String(token)).digest(\"hex\") ===\n    hashedToken\n  );\n}\n\n//? generate uuid\nexport function generateUUID(): string {\n  return crypto.randomUUID();\n}\n\n//? generate alphanumeric token\nexport function generateAlphanumericToken(length: number = 32): string {\n  const chars =\n    \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n  const randomBytes = crypto.randomBytes(length);\n  let token = \"\";\n\n  for (let i = 0; i < length; i++) {\n    token += chars[randomBytes[i] % chars.length];\n  }\n\n  return token;\n}\n\n//? generate url safe token\nexport function generateURLSafeToken(length: number = 32): string {\n  return crypto\n    .randomBytes(length)\n    .toString(\"base64\")\n    .replace(/\\+/g, \"-\")\n    .replace(/\\//g, \"_\")\n    .replace(/=/g, \"\");\n}\n\n//? generate numeric code\nexport function generateNumericCode(length: number = 6): string {\n  const digits = \"0123456789\";\n  const randomBytes = crypto.randomBytes(length);\n  let code = \"\";\n\n  for (let i = 0; i < length; i++) {\n    code += digits[randomBytes[i] % 10];\n  }\n\n  return code;\n}\n"
                }
              ]
            },
            "feature": {
              "files": [
                {
                  "type": "file",
                  "path": "src/shared/utils/token.helper.ts",
                  "content": "import crypto from \"node:crypto\";\n\n//? generate otp\nexport function generateOTP(length: number = 6, ttlMinutes: number = 5) {\n  const code = crypto\n    .randomInt(0, Math.pow(10, length))\n    .toString()\n    .padStart(length, \"0\");\n  const hashCode = crypto\n    .createHash(\"sha256\")\n    .update(String(code))\n    .digest(\"hex\");\n  const expiresAt = new Date(Date.now() + ttlMinutes * 60 * 1000).toISOString();\n  return { code, hashCode, expiresAt };\n}\n\n//? verify otp\nexport function verifyOTP(code: string, hashCode: string): boolean {\n  const validCode = crypto\n    .createHash(\"sha256\")\n    .update(String(code))\n    .digest(\"hex\");\n  return validCode === hashCode;\n}\n\n//? hash otp\nexport function hashOTP(otp: string): string {\n  return crypto.createHash(\"sha256\").update(String(otp)).digest(\"hex\");\n}\n\n//? generate secure token\nexport function generateSecureToken(length: number = 32): string {\n  return crypto.randomBytes(length).toString(\"hex\");\n}\n\n//? generate hashed token\nexport function generateHashedToken(token: string): string {\n  return crypto.createHash(\"sha256\").update(String(token)).digest(\"hex\");\n}\n\n//? generate token and hashed token\nexport function generateTokenAndHashedToken(id: string) {\n  const cryptoSecret = process.env.CRYPTO_SECRET! || \"secret\";\n  const token = crypto\n    .createHmac(\"sha256\", cryptoSecret)\n    .update(String(id))\n    .digest(\"hex\");\n\n  const hashedToken = crypto\n    .createHash(\"sha256\")\n    .update(String(token))\n    .digest(\"hex\");\n  return { token, hashedToken };\n}\n\n//? verify hashed token\nexport function verifyHashedToken(token: string, hashedToken: string): boolean {\n  return (\n    crypto.createHash(\"sha256\").update(String(token)).digest(\"hex\") ===\n    hashedToken\n  );\n}\n\n//? generate uuid\nexport function generateUUID(): string {\n  return crypto.randomUUID();\n}\n\n//? generate alphanumeric token\nexport function generateAlphanumericToken(length: number = 32): string {\n  const chars =\n    \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n  const randomBytes = crypto.randomBytes(length);\n  let token = \"\";\n\n  for (let i = 0; i < length; i++) {\n    token += chars[randomBytes[i] % chars.length];\n  }\n\n  return token;\n}\n\n//? generate url safe token\nexport function generateURLSafeToken(length: number = 32): string {\n  return crypto\n    .randomBytes(length)\n    .toString(\"base64\")\n    .replace(/\\+/g, \"-\")\n    .replace(/\\//g, \"_\")\n    .replace(/=/g, \"\");\n}\n\n//? generate numeric code\nexport function generateNumericCode(length: number = 6): string {\n  const digits = \"0123456789\";\n  const randomBytes = crypto.randomBytes(length);\n  let code = \"\";\n\n  for (let i = 0; i < length; i++) {\n    code += digits[randomBytes[i] % 10];\n  }\n\n  return code;\n}\n"
                }
              ]
            }
          }
        },
        "nextjs": {
          "dependencies": {
            "runtime": [
              ""
            ],
            "dev": []
          },
          "env": [],
          "architectures": {
            "file-api": {
              "files": [
                {
                  "type": "file",
                  "path": "src/helpers/token.helper.ts",
                  "content": "import crypto from \"node:crypto\";\n\n//? generate otp\nexport function generateOTP(length: number = 6, ttlMinutes: number = 5) {\n  const code = crypto\n    .randomInt(0, Math.pow(10, length))\n    .toString()\n    .padStart(length, \"0\");\n  const hashCode = crypto\n    .createHash(\"sha256\")\n    .update(String(code))\n    .digest(\"hex\");\n  const expiresAt = new Date(Date.now() + ttlMinutes * 60 * 1000).toISOString();\n  return { code, hashCode, expiresAt };\n}\n\n//? verify otp\nexport function verifyOTP(code: string, hashCode: string): boolean {\n  const validCode = crypto\n    .createHash(\"sha256\")\n    .update(String(code))\n    .digest(\"hex\");\n  return validCode === hashCode;\n}\n\n//? hash otp\nexport function hashOTP(otp: string): string {\n  return crypto.createHash(\"sha256\").update(String(otp)).digest(\"hex\");\n}\n\n//? generate secure token\nexport function generateSecureToken(length: number = 32): string {\n  return crypto.randomBytes(length).toString(\"hex\");\n}\n\n//? generate hashed token\nexport function generateHashedToken(token: string): string {\n  return crypto.createHash(\"sha256\").update(String(token)).digest(\"hex\");\n}\n\n//? generate token and hashed token\nexport function generateTokenAndHashedToken(id: string) {\n  const cryptoSecret = process.env.CRYPTO_SECRET! || \"secret\";\n  const token = crypto\n    .createHmac(\"sha256\", cryptoSecret)\n    .update(String(id))\n    .digest(\"hex\");\n\n  const hashedToken = crypto\n    .createHash(\"sha256\")\n    .update(String(token))\n    .digest(\"hex\");\n  return { token, hashedToken };\n}\n\n//? verify hashed token\nexport function verifyHashedToken(token: string, hashedToken: string): boolean {\n  return (\n    crypto.createHash(\"sha256\").update(String(token)).digest(\"hex\") ===\n    hashedToken\n  );\n}\n\n//? generate uuid\nexport function generateUUID(): string {\n  return crypto.randomUUID();\n}\n\n//? generate alphanumeric token\nexport function generateAlphanumericToken(length: number = 32): string {\n  const chars =\n    \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n  const randomBytes = crypto.randomBytes(length);\n  let token = \"\";\n\n  for (let i = 0; i < length; i++) {\n    token += chars[randomBytes[i] % chars.length];\n  }\n\n  return token;\n}\n\n//? generate url safe token\nexport function generateURLSafeToken(length: number = 32): string {\n  return crypto\n    .randomBytes(length)\n    .toString(\"base64\")\n    .replace(/\\+/g, \"-\")\n    .replace(/\\//g, \"_\")\n    .replace(/=/g, \"\");\n}\n\n//? generate numeric code\nexport function generateNumericCode(length: number = 6): string {\n  const digits = \"0123456789\";\n  const randomBytes = crypto.randomBytes(length);\n  let code = \"\";\n\n  for (let i = 0; i < length; i++) {\n    code += digits[randomBytes[i] % 10];\n  }\n\n  return code;\n}\n"
                }
              ]
            }
          }
        }
      }
    }
  }
}
