UNPKG

@proca/widget

Version:

Proca is an open-source campaign toolkit designed to empower activists and organisations in their digital advocacy efforts. It provides a flexible and customisable platform for creating and managing online petitions, email campaigns, and other forms of di

158 lines (151 loc) 5.23 kB
const envVar = "actionpage"; const fs = require("graceful-fs"); const path = require("path"); const merge = require("lodash").merge; function getConfigOverride(id) { const config = readConfigOverride(id); if (config) { return config; } throw Error( "\n\n\n Oops ! Tell me which config file to use: yarn command *config*\n\n\n", ); } function configFolder() { return process.env.REACT_APP_CONFIG_FOLDER ? "../" + process.env.REACT_APP_CONFIG_FOLDER + "/" : "../config/"; } function readConfigOverride(id) { // console.log(id);console.trace("Here I am!") let apId = id || process.env[envVar] || process.argv[2]; if (apId) { const configFile = apId + ".json"; const fn = path.resolve(__dirname, configFolder() + configFile); try { const config = parseConfig(fs.readFileSync(fn)); let campaignConfig = {}; if (config.campaign.name) { campaignConfig = parseConfig( fs.readFileSync( path.resolve( __dirname, configFolder() + "/campaign/" + config.campaign.name + ".json", ), ), ); if (!config.locales) config.locales = {}; ["layout", "component"].map((k) => { config[k] = merge(campaignConfig.config[k], config[k]); }); if (!config.portal || config.portal.length === 0) { config.portal = campaignConfig.config.portal; } if (!config.import || config.import.length === 0) { config.import = campaignConfig.config.import; } if (!config.journey || config.journey.length === 0) { config.journey = campaignConfig.config.journey || [ "Petition", "Share", ]; } if ( campaignConfig.config.locales && campaignConfig.config.locales[config.lang] && campaignConfig.config.locales[config.lang]["common:"] ) { config.locales = merge( campaignConfig.config.locales[config.lang]["common:"], config.locales, ); delete campaignConfig.config.locales[config.lang]["common:"]; } if ( // TODO: investigate campaignConfig.config.portal && campaignConfig.config.portal[0] === "Snowflake" && campaignConfig.config.locales && campaignConfig.config.locales[config.lang] && campaignConfig.config.locales[config.lang]["letter:"] ) { console.log("IT SHOULD NOT HAPPEN"); process.exit(1); config.locales = merge( { "letter:": campaignConfig.config.locales[config.lang]["letter:"], }, config.locales, ); delete campaignConfig.config.locales[config.lang]["letter:"]; } if ( campaignConfig.config.locales && campaignConfig.config.locales[config.lang] ) { let campaigns = merge( campaignConfig.config.locales[config.lang]["campaign:"], config.locales["campaign:"], ); Object.keys(campaignConfig.config.locales[config.lang]) .filter((d) => d.slice(-1) !== ":") .forEach((d) => { // typeof campaignConfig.config.locales[config.lang][d] === // "string", if ( typeof campaignConfig.config.locales[config.lang][d] === "string" ) { campaigns[d] = campaignConfig.config.locales[config.lang][d]; } else { if (!config.locales["campaign:"]) config.locales["campaign:"] = {}; campaigns[d] = merge( campaignConfig.config.locales[config.lang][d], config.locales["campaign:"][d], ); } }); config.locales["campaign:"] = campaigns; if ( config.locales["campaign:"] && config.locales["campaign:"].title ) { config.campaign.title = config.locales["campaign:"].title; } } } else { console.error("can't find the campaign.name on the config", config); } config.locale = config.lang; config.lang = config.lang.substring(0, 2).toLowerCase(); if (process.env.DEBUG && process.env.DEBUG === "CONFIG") { console.log(JSON.stringify(config, null, 2)); process.exit(1); } return [configFile, config, campaignConfig]; } catch (e) { const confFolder = path.resolve(__dirname, configFolder()); if (!fs.existsSync(confFolder)) { console.error("missing folder", confFolder, ". mkdir it"); process.exit(1); } console.error( `Cannot read action page config for actionpage=${apId}, did You yarn pull ${apId}?`, e.message, ); throw e; } } else { return null; } } function parseConfig(config) { try { return JSON.parse(config); } catch (e) { console.error(`Cannot parse config: `, e.message); throw e; } } module.exports = { getConfigOverride, configFolder };