# storybook config generator following salesforce's [RFE](https://trello.com/c/3joR3UlD/758-salesforce-storybook-rfe-for-dynamic-config) ticket I decided to suggest the following to the customer. ### `npm script` ```json { "scripts": { "prompt": "node applitools.prompts.js && eyes-storybook" } } ``` ### `applitools.prompts.js` ```javascript const { prompt } = require('enquirer'); const branch = require('git-branch'); const fs = require('fs').promises; const pkg = require('./package.json'); const sfdcVersion = pkg.slds.id; const sfdcName = pkg.slds.name.toLowerCase().replace(' ’', '-'); const currentBranch = branch.sync(); async function ask() { return prompt([ { type: 'input', name: 'apiKey', message: 'Please provide your APPLITOOLS_API_KEY value\n ', skip: () => { if (process.env.APPLITOOLS_API_KEY) { return true; } } }, { type: 'input', name: 'batchName', message: 'Please provide a batch name for this run\n ', initial: 'Local run', result(name) { return `${name} (${process.env.LOGNAME})`; } }, { type: 'input', name: 'parentBranch', message: 'Which branch would you like to compare against\n ', initial: `${sfdcVersion}-${sfdcName}`, result(branch) { if (branch) { return `salesforce-ux/design-system-internal/${branch}`; } return `localRun/${currentBranch}`; } }, { type: 'input', name: 'testKindPattern', message: `If you'd like to test only some blueprints please enter the regex pattern\n `, footer: ` (ex. "Path|Buttons|Icons$" NOTE: do not use ^)`, initial: 'all', result(pattern) { if (pattern.toLowerCase() === 'all') { return new RegExp('.*', 'g').toString(); } return new RegExp(pattern, 'g').toString(); } }, { type: 'input', name: 'testNamePattern', message: `If you'd like to test only specific tests within blueprints please enter the regex pattern\n `, initial: '^Kitchen Sink', result(pattern) { return new RegExp(pattern, 'g').toString(); } }, { type: 'confirm', name: 'showStorybookOutput', message: `Would you like to show Storybook output logs?\n ` }, { type: 'confirm', name: 'showLogs', message: `Would you like to show Applitools output logs?\n ` } ]) .catch(console.error); }; ask().then(async answers => { answers.branch = currentBranch; const template = require('./applitools.config.template') const userConfig = Object.keys(answers).reduce((acc, key) => { if (key in template) { acc[key] = answers[key] || template[key]; } return acc; }, {}); const config = Object.assign(template, userConfig); const parsedConfig = Object.keys(config).map(key => { const value = config[key]; const type = typeof value; if(type === 'object'){ return `${key}: ${JSON.stringify(value, null, 4)}`; } else if (type === 'string') { return `${key}: '${value}'` } else { return `${key}: ${value}`; } }).join(',\n ') const configExport = ` module.exports = { ${parsedConfig} } ` await fs.writeFile(`./applitools.config.js`, configExport) }) ``` ### `applitools.config.template.js` ```javascript const resolution = { width: 1024, height: 768 }; module.exports = { apiKey: process.env.APPLITOOLS_API_KEY, appName: 'SLDS', matchLevel: 'Strict', ignoreDisplacements: true, accessibilityValidation: { level: 'AA', guidelinesVersion: 'WCAG_2_0', }, properties: [{ name: 'Group', value: 'desktop' }], batchName: process.env.CI ? undefined : '', branch: process.env.CI ? undefined : '', parentBranch: process.env.CI ? undefined : '', showLogs: !!!process.env.CI, showStorybookOutput: !!process.env.CI, // saveDebugData: false, exitcode: false, concurrency: 100, serverUrl: 'https://salesforceuxeyesapi.applitools.com', testKindPattern: '', testNamePattern: '', include: function ({ name, kind, parameters }) { return new RegExp(this.testKindPattern).test(kind) && new RegExp(this.testNamePattern).test(name); }, puppeteerOptions: process.env.CIRCLECI ? { executablePath: '/usr/bin/google-chrome' } : undefined, waitBeforeScreenshot: 250, browser: [ { width: resolution.width, height: resolution.height, name: 'firefox' }, { width: resolution.width, height: resolution.height, name: 'chrome' }, { width: resolution.width, height: resolution.height, name: 'safari' }, { width: resolution.width, height: resolution.height, name: 'edgechromium', }, ], }; ``` :::warning NOTE! this is provided as-is and by no means considered a formal solution or part of our product. It is meant to help the customer achieve their goal with our tools. I verified it works but any future maintenace/fixes required is the responsibility of the user. :::