(function (root, factory) { var settingsApi = root && root.TaberebaSettings; if (typeof module === 'object' && module.exports) { settingsApi = require('./settings.js'); } var api = factory(settingsApi); if (typeof module === 'object' && module.exports) { module.exports = api; } if (root) { root.TaberebaSettingsFile = api; } }(typeof window !== 'undefined' ? window : globalThis, function (settingsApi) { 'use strict'; var maxFileBytes = 1024 * 1024; var settingsKey = 'tabereba_settings_v1'; var backupKey = 'tabereba_settings_v1_before_file_import'; var appStorageKeys = [settingsKey, backupKey, 'tabereba_settings_v1_before_legacy_migration', 'tabereba_history_v1', 'tabereba_hero_dismissed_v1']; function normalize(value) { if (!settingsApi || !value || typeof value !== 'object' || value.service !== 'tabereba' || value.schema_version !== 1 || value.version !== 1 || !Array.isArray(value.sites) || value.sites.length < 1 || value.sites.length > 20) { return null; } return settingsApi.normalizeSettings(value); } function parse(json) { if (typeof json !== 'string' || json.length < 1 || json.length > maxFileBytes) { return {success: false, error: 'size', settings: null, summary: null}; } try { var settings = normalize(JSON.parse(json)); if (!settings) { return {success: false, error: 'schema', settings: null, summary: null}; } var affiliateEntries = 0; var affiliateSites = settings.sites.filter(function (site) { var count = ['hotpepper_valuecommerce_html', 'tabelog_valuecommerce_html', 'gnavi_linkshare_html'].filter(function (key) { return site[key] !== ''; }).length; affiliateEntries += count; return count > 0; }).length; return {success: true, error: '', settings: settings, summary: {site_count: settings.sites.length, affiliate_site_count: affiliateSites, affiliate_entry_count: affiliateEntries}}; } catch (error) { return {success: false, error: 'json', settings: null, summary: null}; } } function writeAndVerify(storage, key, value) { storage.setItem(key, value); return storage.getItem(key) === value; } function applyToStorage(storage, nextSettings) { var next = normalize(nextSettings); var current; if (!next) { return {success: false, error: 'next_invalid'}; } try { current = parse(storage.getItem(settingsKey) || ''); if (!current.success) { return {success: false, error: 'current_invalid'}; } if (!writeAndVerify(storage, backupKey, JSON.stringify(current.settings))) { return {success: false, error: 'backup_failed'}; } if (!writeAndVerify(storage, settingsKey, JSON.stringify(next))) { return {success: false, error: 'settings_failed'}; } return {success: true, error: ''}; } catch (error) { return {success: false, error: 'storage_failed'}; } } function restoreFromStorage(storage) { try { var backup = parse(storage.getItem(backupKey) || ''); if (!backup.success) { return {success: false, error: 'backup_invalid'}; } if (!writeAndVerify(storage, settingsKey, JSON.stringify(backup.settings))) { return {success: false, error: 'settings_failed'}; } storage.removeItem(backupKey); return {success: storage.getItem(backupKey) === null, error: storage.getItem(backupKey) === null ? '' : 'backup_remove_failed'}; } catch (error) { return {success: false, error: 'storage_failed'}; } } function resetStorage(storage) { try { appStorageKeys.forEach(function (key) { storage.removeItem(key); }); return {success: appStorageKeys.every(function (key) { return storage.getItem(key) === null; })}; } catch (error) { return {success: false}; } } return {maxFileBytes: maxFileBytes, settingsKey: settingsKey, backupKey: backupKey, appStorageKeys: appStorageKeys.slice(), normalize: normalize, parse: parse, applyToStorage: applyToStorage, restoreFromStorage: restoreFromStorage, resetStorage: resetStorage}; }));