UNPKG

rn-color-thief

Version:

A powerful React Native library for extracting prominent colors from images and SVGs using Skia rendering engine

250 lines (249 loc) 9.02 kB
"use strict"; /** * Version compatibility utilities for react-native-color-thief * Handles version checking and compatibility warnings for React, React Native, and Skia */ Object.defineProperty(exports, "__esModule", { value: true }); exports.checkCompatibility = checkCompatibility; exports.logCompatibilityStatus = logCompatibilityStatus; exports.getRecommendedSkiaVersion = getRecommendedSkiaVersion; exports.supportsVideoFeatures = supportsVideoFeatures; exports.parseVersion = parseVersion; exports.compareVersions = compareVersions; exports.getPackageVersion = getPackageVersion; /** * Parse a semantic version string into components */ function parseVersion(version) { const match = version.match(/(\d+)\.(\d+)\.(\d+)/); if (!match) return null; return { major: parseInt(match[1], 10), minor: parseInt(match[2], 10), patch: parseInt(match[3], 10) }; } /** * Compare two version objects * Returns: -1 if v1 < v2, 0 if equal, 1 if v1 > v2 */ function compareVersions(v1, v2) { if (v1.major !== v2.major) return v1.major - v2.major; if (v1.minor !== v2.minor) return v1.minor - v2.minor; return v1.patch - v2.patch; } /** * Get package version from node_modules or package.json */ function getPackageVersion(packageName) { try { // Try to require the package to get its version const pkg = require(`${packageName}/package.json`); return pkg.version; } catch (error) { // Fallback: try to get from current project's dependencies try { const projectPkg = require('../package.json'); return (projectPkg.dependencies?.[packageName] || projectPkg.devDependencies?.[packageName] || projectPkg.peerDependencies?.[packageName])?.replace(/[\^~>=<]/, '') || null; } catch { return null; } } } /** * Check React version compatibility */ function checkReactCompatibility(version) { const result = { isSupported: false, isLegacy: false, warnings: [], errors: [] }; if (!version) { result.errors.push('React not found. Please install React >=18.0.0 (preferably >=19.0.0)'); return result; } const parsed = parseVersion(version); if (!parsed) { result.errors.push(`Invalid React version format: ${version}`); return result; } const react19 = { major: 19, minor: 0, patch: 0 }; const react18 = { major: 18, minor: 0, patch: 0 }; if (compareVersions(parsed, react19) >= 0) { result.isSupported = true; } else if (compareVersions(parsed, react18) >= 0) { result.isSupported = true; result.isLegacy = true; result.warnings.push(`React ${version} is in legacy support mode. Consider upgrading to React >=19.0.0 for full feature support.`); } else { result.errors.push(`React ${version} is not supported. Please upgrade to React >=18.0.0 (preferably >=19.0.0)`); } return result; } /** * Check React Native version compatibility */ function checkReactNativeCompatibility(version) { const result = { isSupported: false, isLegacy: false, warnings: [], errors: [] }; if (!version) { result.errors.push('React Native not found. Please install React Native >=0.70.0 (preferably >=0.79.0)'); return result; } const parsed = parseVersion(version); if (!parsed) { result.errors.push(`Invalid React Native version format: ${version}`); return result; } const rn79 = { major: 0, minor: 79, patch: 0 }; const rn70 = { major: 0, minor: 70, patch: 0 }; if (compareVersions(parsed, rn79) >= 0) { result.isSupported = true; } else if (compareVersions(parsed, rn70) >= 0) { result.isSupported = true; result.isLegacy = true; result.warnings.push(`React Native ${version} is in legacy support mode. Consider upgrading to React Native >=0.79.0 for full feature support.`); } else { result.errors.push(`React Native ${version} is not supported. Please upgrade to React Native >=0.70.0 (preferably >=0.79.0)`); } return result; } /** * Check React Native Skia version compatibility */ function checkSkiaCompatibility(skiaVersion, reactNativeVersion) { const result = { isSupported: false, isLegacy: false, warnings: [], errors: [] }; if (!skiaVersion) { result.errors.push('@shopify/react-native-skia not found. Please install @shopify/react-native-skia'); return result; } const skiaParsed = parseVersion(skiaVersion); if (!skiaParsed) { result.errors.push(`Invalid React Native Skia version format: ${skiaVersion}`); return result; } // Check React Native compatibility if available if (reactNativeVersion) { const rnParsed = parseVersion(reactNativeVersion); if (rnParsed) { const rn78 = { major: 0, minor: 78, patch: 99 }; const skia1124 = { major: 1, minor: 12, patch: 4 }; const isRN78OrBelow = compareVersions(rnParsed, rn78) <= 0; const isSkia1124OrBelow = compareVersions(skiaParsed, skia1124) <= 0; if (isRN78OrBelow && !isSkia1124OrBelow) { result.errors.push(`React Native Skia ${skiaVersion} is incompatible with React Native ${reactNativeVersion}. ` + 'For React Native ≤0.78, please use @shopify/react-native-skia ≤1.12.4'); return result; } } } const skia2 = { major: 2, minor: 0, patch: 0 }; const skia1 = { major: 1, minor: 0, patch: 0 }; if (compareVersions(skiaParsed, skia2) >= 0) { result.isSupported = true; } else if (compareVersions(skiaParsed, skia1) >= 0) { result.isSupported = true; result.isLegacy = true; result.warnings.push(`React Native Skia ${skiaVersion} is in legacy support mode. Consider upgrading to >=2.0.0 for full feature support.`); } else { result.errors.push(`React Native Skia ${skiaVersion} is not supported. Please upgrade to @shopify/react-native-skia >=1.0.0`); } return result; } /** * Comprehensive compatibility check for all dependencies */ function checkCompatibility() { const reactVersion = getPackageVersion('react'); const reactNativeVersion = getPackageVersion('react-native'); const skiaVersion = getPackageVersion('@shopify/react-native-skia'); const react = checkReactCompatibility(reactVersion); const reactNative = checkReactNativeCompatibility(reactNativeVersion); const skia = checkSkiaCompatibility(skiaVersion, reactNativeVersion); const isCompatible = react.isSupported && reactNative.isSupported && skia.isSupported; const hasWarnings = react.warnings.length > 0 || reactNative.warnings.length > 0 || skia.warnings.length > 0; return { isCompatible, hasWarnings, react, reactNative, skia, platformRequirements: [ 'iOS 14.0 or higher required', 'Android API level 21 (Android 5.0) or higher required', 'Android with video support: API level 26 (Android 8.0) or higher required' ] }; } /** * Log compatibility warnings and errors to console */ function logCompatibilityStatus(silent = false) { if (silent) return true; const compatibility = checkCompatibility(); if (!compatibility.isCompatible) { console.warn('⚠️ react-native-color-thief compatibility issues detected:'); [compatibility.react, compatibility.reactNative, compatibility.skia].forEach(result => { result.errors.forEach(error => console.error(`❌ ${error}`)); }); console.warn('\n💡 Please update your dependencies to ensure compatibility.'); return false; } if (compatibility.hasWarnings) { console.info('ℹ️ react-native-color-thief compatibility notes:'); [compatibility.react, compatibility.reactNative, compatibility.skia].forEach(result => { result.warnings.forEach(warning => console.warn(`⚠️ ${warning}`)); }); } return true; } /** * Get recommended Skia version based on React Native version */ function getRecommendedSkiaVersion(reactNativeVersion) { if (!reactNativeVersion) { return '>=2.0.0'; } const parsed = parseVersion(reactNativeVersion); if (!parsed) { return '>=2.0.0'; } const rn78 = { major: 0, minor: 78, patch: 99 }; if (compareVersions(parsed, rn78) <= 0) { return '<=1.12.4'; } return '>=2.0.0'; } /** * Check if current environment supports video features (Android API 26+) */ function supportsVideoFeatures() { // This would need to be implemented with platform-specific checks // For now, we assume support is available return true; }