utils.ts 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. export function getCookie(name: string): string | undefined {
  2. if (typeof document === 'undefined') return undefined
  3. const escapedName = name.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')
  4. const match = document.cookie.match(new RegExp(`(^| )${escapedName}=([^;]+)`))
  5. return match ? decodeURIComponent(match[2]) : undefined
  6. }
  7. export function setCookie(name: string, value: string, path: string = '/') {
  8. if (typeof document === 'undefined') return
  9. document.cookie = `${name}=${encodeURIComponent(value)}; path=${path}`
  10. }
  11. export function deleteCookie(name: string) {
  12. if (typeof document === 'undefined') return
  13. document.cookie = `${name}=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT`
  14. }
  15. export function safeJsonParse<T>(value: string | undefined, fallback: T, context?: string): T {
  16. if (!value) return fallback
  17. try {
  18. return JSON.parse(value) as T
  19. } catch (error) {
  20. if (process.env.NODE_ENV === 'development') {
  21. console.warn(`[DevToolbar] Failed to parse JSON${context ? ` for ${context}` : ''}:`, error)
  22. }
  23. return fallback
  24. }
  25. }
  26. export const PH_ORIGINALS_KEY = 'devToolbarFlagOriginals:posthog'
  27. export const CC_ORIGINALS_KEY = 'devToolbarFlagOriginals:configcat'
  28. export function readOriginals(
  29. key: typeof PH_ORIGINALS_KEY | typeof CC_ORIGINALS_KEY
  30. ): Record<string, unknown> {
  31. if (typeof window === 'undefined') return {}
  32. try {
  33. const stored = window.localStorage.getItem(key)
  34. return stored ? JSON.parse(stored) : {}
  35. } catch (error) {
  36. if (process.env.NODE_ENV === 'development') {
  37. console.warn(`[DevToolbar] Failed to read originals from ${key}:`, error)
  38. }
  39. return {}
  40. }
  41. }
  42. export function writeOriginals(
  43. key: typeof PH_ORIGINALS_KEY | typeof CC_ORIGINALS_KEY,
  44. value: Record<string, unknown>
  45. ) {
  46. if (typeof window === 'undefined') return
  47. if (Object.keys(value).length === 0) {
  48. window.localStorage.removeItem(key)
  49. return
  50. }
  51. window.localStorage.setItem(key, JSON.stringify(value))
  52. }
  53. export function valuesAreEqual(a: unknown, b: unknown): boolean {
  54. if (a === b) return true
  55. if (a == null || b == null) return false
  56. if (typeof a === 'number' || typeof b === 'number') {
  57. const numA = Number(a)
  58. const numB = Number(b)
  59. if (Number.isNaN(numA) || Number.isNaN(numB)) return false
  60. return numA === numB
  61. }
  62. if (typeof a === 'boolean' || typeof b === 'boolean') {
  63. return a === b
  64. }
  65. return String(a) === String(b)
  66. }
  67. export function parseOverrideValue(value: unknown, original: unknown): unknown {
  68. if (typeof original === 'number') {
  69. const parsed = Number(value)
  70. return Number.isNaN(parsed) ? original : parsed
  71. }
  72. if (typeof original === 'boolean') {
  73. if (typeof value === 'string') {
  74. return value.toLowerCase() === 'true'
  75. }
  76. return Boolean(value)
  77. }
  78. if (typeof original === 'string') {
  79. return String(value)
  80. }
  81. return value
  82. }