UNPKG

strapi-to-lokalise-plugin

Version:

Preview and sync Lokalise translations from Strapi admin

186 lines (160 loc) 4.86 kB
export const getStrapiVersion = (strapi) => { const version = strapi?.config?.info?.strapi?.version || strapi?.config?.info?.version || process.env.STRAPI_VERSION || null; if (!version) { if (strapi?.server?.httpServer) return { version: '5.x', major: 5, isV5: true, isV4: false }; if (strapi?.server?.koa) return { version: '4.x', major: 4, isV5: false, isV4: true }; return { version: null, major: null, isV5: false, isV4: false }; } const [major, minor] = version.split('.').map((n) => parseInt(n, 10)); return { version, major, minor, isV5: major >= 5, isV4: major === 4, }; }; export const isFeatureAvailable = (strapi, feature) => { const version = getStrapiVersion(strapi); const matrix = { 'vite-admin': version.isV5, 'webpack-admin': version.isV4, 'i18n-plugin': true, }; return matrix[feature] ?? true; }; export const getApiEndpoint = (path) => { if (path.startsWith('/')) return `/api/lokalise-sync${path}`; return `/api/lokalise-sync/${path}`; }; export const safePluginCall = (strapi, method, ...args) => { try { const plugin = strapi?.plugin('lokalise-sync'); if (!plugin) return null; if (typeof plugin[method] === 'function') { return plugin[method](...args); } } catch (error) { console.error(`[lokalise-sync] Error calling ${method}:`, error); } return null; }; export default { getStrapiVersion, isFeatureAvailable, getApiEndpoint, safePluginCall, }; /** * Compatibility utilities for Strapi v4.x and v5.x * * This module provides utilities to detect Strapi version and * adjust plugin behavior if needed. */ /** * Detect the Strapi version from the strapi instance * @param {Object} strapi - Strapi instance * @returns {Object} Version information */ export const getStrapiVersion = (strapi) => { if (!strapi) { return { major: null, minor: null, version: null }; } // Try to get version from strapi.config let version = strapi.config?.info?.strapi?.version || strapi.config?.info?.version || process.env.STRAPI_VERSION || null; if (!version) { // Try to detect from package structure // Strapi v5 uses different internal structure if (strapi.server?.koa) { // Likely v4 (uses Koa directly) return { major: 4, minor: null, version: '4.x', isV5: false }; } else if (strapi.server?.httpServer) { // Likely v5 (uses httpServer) return { major: 5, minor: null, version: '5.x', isV5: true }; } return { major: null, minor: null, version: null }; } // Parse version string (e.g., "4.15.0" or "5.0.0") const parts = version.split('.'); const major = parseInt(parts[0], 10) || null; const minor = parseInt(parts[1], 10) || null; return { major, minor, version, isV5: major >= 5, isV4: major === 4, }; }; /** * Check if a feature is available in the current Strapi version * @param {Object} strapi - Strapi instance * @param {string} feature - Feature name to check * @returns {boolean} */ export const isFeatureAvailable = (strapi, feature) => { const version = getStrapiVersion(strapi); if (!version.major) { // If we can't detect version, assume it's available (fail open) return true; } // Feature compatibility matrix const features = { 'vite-admin': version.isV5, 'webpack-admin': version.isV4, 'i18n-plugin': true, // Available in both }; return features[feature] ?? true; }; /** * Get the appropriate API endpoint format for the current Strapi version * @param {Object} strapi - Strapi instance * @param {string} path - API path * @returns {string} Full API endpoint */ export const getApiEndpoint = (strapi, path) => { const version = getStrapiVersion(strapi); // Both v4 and v5 use the same plugin API structure // But we can adjust if needed if (path.startsWith('/')) { return `/api/lokalise-sync${path}`; } return `/api/lokalise-sync/${path}`; }; /** * Safe plugin API access with version compatibility * @param {Object} strapi - Strapi instance * @param {string} method - Method name * @param {...any} args - Arguments * @returns {any} */ export const safePluginCall = (strapi, method, ...args) => { try { const plugin = strapi.plugin('lokalise-sync'); if (!plugin) { console.warn('[lokalise-sync] Plugin not found'); return null; } if (typeof plugin[method] === 'function') { return plugin[method](...args); } console.warn(`[lokalise-sync] Method ${method} not found on plugin`); return null; } catch (error) { console.error(`[lokalise-sync] Error calling ${method}:`, error); return null; } }; export default { getStrapiVersion, isFeatureAvailable, getApiEndpoint, safePluginCall, };