import path from "node:path"; import { readFile } from "node:fs/promises"; import { docsDir, ensureDir, writeJson, writeText } from "./lib/common.mjs"; export async function generateRepeaterCms({ outputDir, pages }) { const collections = (pages || []).flatMap((page) => (page.repeaters || []).filter((r) => r.kind === "accordion-repeater").map((r, index) => plan(page, r, index))); const docs = docsDir(outputDir); await writeJson(path.join(docs, "repeater-cms.json"), { version: 1, collections }); await writeText(path.join(docs, "repeater-cms.md"), `# CMS repeater plan\n\n${collections.map((c) => `## ${c.displayName}\n\n- id: \`${c.id}\`\n- rows: ${c.items.length}\n- state: \`${JSON.stringify(c.state)}\`\n- fields: \`label\`, \`body\`, \`imagesJson\`, \`linksJson\`, \`sortOrder\`, \`initialExpanded\`, \`itemStructure\``).join("\n\n") || "No accordion repeaters extracted."}\n`); if (collections.length) await install(outputDir); return { collections }; } function plan(page, repeater, index) { const id = `rpAccordion${slug(`${page.area}-${repeater.label || index + 1}`).split("-").map((p) => p[0]?.toUpperCase() + p.slice(1)).join("")}`; return { id, displayName: `RePlatform Accordion: ${repeater.label || index + 1}`, sourceUrl: page.url, state: repeater.state || {}, items: (repeater.items || []).map((item, i) => ({ sourceKey: `${id}-${i + 1}`, label: item.heading || `Item ${i + 1}`, body: (item.paragraphs || []).join("\n\n"), imagesJson: JSON.stringify(item.images || []), linksJson: JSON.stringify(item.links || []), sortOrder: i, initialExpanded: Boolean(item.initialExpanded), itemStructure: item.itemStructure || "text-only" })) }; } async function install(outputDir) { const lib = path.join(outputDir, "src", "lib"), components = path.join(outputDir, "src", "components"); await ensureDir(lib); await ensureDir(components); await generated(path.join(lib, "rp-repeater-cms.ts"), `// @generated-source wix-headless-replatform\nexport async function loadAccordionRows(itemsApi:any,dataCollectionId:string){const r=await itemsApi.queryDataItems({dataCollectionId}).ascending("data.sortOrder").find();return (r.items||[]).map((x:any)=>x.data||x).sort((a:any,b:any)=>a.sortOrder-b.sortOrder)}\n`); await generated(path.join(components, "RpAccordion.astro"), `---\n// @generated-source wix-headless-replatform\nconst { rows, dataCollectionId, singleOpen = true } = Astro.props;\n---\n{rows.map((row)=>{row.label}{row.body.split('\\n\\n').map((p)=>{p})})}\n\n`, migrateLegacyAccordion); } async function generated(file,text,migrate) { try { const existing = await readFile(file,"utf8"); if (!existing.includes("@generated-source wix-headless-replatform")) { const migrated = migrate?.(existing); if (migrated && migrated !== existing) await writeText(file,migrated); return; } } catch {} await writeText(file,text); } function migrateLegacyAccordion(text) { const legacyImport = "import { createClient, OAuthStrategy } from '@wix/sdk';\nimport { items } from '@wix/data';"; const legacyQuery = "const client=createClient({modules:{items},auth:OAuthStrategy({clientId:import.meta.env.WIX_CLIENT_ID})});const result=await client.items.queryDataItems"; if (!text.includes(legacyImport) || !text.includes(legacyQuery)) return text; return text.replace(legacyImport, "import { items } from '@wix/data';").replace(legacyQuery, "const result=await items.queryDataItems"); } function slug(v) { return String(v).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"") || "accordion"; }
{p}