// @requirements REQ-PRODUCT-REACT import {createElement} from 'react'; import {renderToString} from 'react-dom/server'; import {build as bundle} from 'esbuild'; import {createConsentRuntime} from 'notabenda/consent'; import {compileLegalDocuments,compileConsentRuntimeConfig} from 'notabenda/content'; import {exampleConsentConfig} from '../static/choices-build.mjs'; import {App} from './view.mjs'; export async function reactFiles(base) { const config=exampleConsentConfig(base);config.site.id='juniper-react'; for(const item of config.storage)if(item.serviceId==='privacy-choices')item.name=item.name.replace('juniper-choices',config.site.id); for(const item of config.storage)if(config.consent.services.some(s=>s.id===item.serviceId))item.name=`react-demo:${item.serviceId}`; const result={}; for(const prefix of ['','/dark']) { const themed=structuredClone(config);for(const [kind,doc] of Object.entries(themed.documents))doc.route=`${prefix}/react/${kind}`; const release=compileLegalDocuments(themed,{mode:'preview',stylesheetUrl:prefix?'/assets/dark.css':'/assets/notabenda.css'}); Object.assign(result,Object.fromEntries(Object.entries(release.files).filter(([path])=>path.startsWith('artifacts/')||path.startsWith(prefix? 'dark/react/':'react/')))); const page={runtime:compileConsentRuntimeConfig(themed,{mode:'preview',evidence:'local'}),legalLinks:Object.values(release.publicConfig.documents).map(({title,route})=>({title,route}))}; result[`${prefix.slice(1)}${prefix?'/':''}react/site.json`]=JSON.stringify(page); const controller=createConsentRuntime(page.runtime,{}); const html=renderToString(createElement(App,{controller,config:page.runtime.inventory,legalLinks:page.legalLinks}));controller.destroy(); result[`${prefix.slice(1)}${prefix?'/':''}react/index.html`]=`