/** * Svelte Stage 2 — Generates stores from Stage 1 output. * * Subscribes to the kernel for state. Returns readable stores. */ function pascalCase(str) { return str.split(/[.\-_]/).map(p => p.charAt(0).toUpperCase() + p.slice(1)).join('') } export function generateSvelteAdapter(schema) { const functions = schema['x-mizan-functions'] || [] const contextGroups = schema['x-mizan-contexts'] || {} const mutations = functions.filter(fn => !fn.isContext && !fn.isForm && fn.affects) const plainFns = functions.filter(fn => !fn.isContext && !fn.isForm && !fn.affects) const lines = [ '// AUTO-GENERATED by mizan — do not edit', '', "import { readable, type Readable } from 'svelte/store'", "import { registerContext, type ContextState } from '@mizan/base'", '', ] const stage1Imports = [] for (const [ctxName] of Object.entries(contextGroups)) { const p = pascalCase(ctxName) stage1Imports.push(`fetch${p}Context`, `type ${p}ContextData`, `type ${p}ContextParams`) } for (const fn of [...mutations, ...plainFns]) { stage1Imports.push(`call${pascalCase(fn.camelName)}`) } if (stage1Imports.length > 0) { lines.push(`import { ${stage1Imports.join(', ')} } from '../index'`) lines.push('') } for (const [ctxName, ctxMeta] of Object.entries(contextGroups)) { const p = pascalCase(ctxName) const ctxFunctions = functions.filter(fn => fn.isContext === ctxName) const paramEntries = Object.entries(ctxMeta.params || {}) const paramsArg = paramEntries.length > 0 ? 'params' : '{} as any' if (paramEntries.length > 0) { lines.push(`export function create${p}Context(params: ${p}ContextParams) {`) } else { lines.push(`export function create${p}Context() {`) } // Use readable store backed by kernel subscription lines.push(` const store = readable>(`) lines.push(` { data: null, status: 'idle', error: null },`) lines.push(` (set) => {`) lines.push(` const handle = registerContext('${ctxName}', ${paramsArg}, () => fetch${p}Context(${paramsArg}))`) lines.push(` const unsub = handle.subscribe(() => set(handle.getState()))`) lines.push(` handle.refetch()`) lines.push(` return () => { unsub(); handle.unregister() }`) lines.push(` },`) lines.push(` )`) lines.push('') lines.push(` return store`) lines.push('}') lines.push('') } // Re-export mutations as-is from Stage 1 for (const fn of [...mutations, ...plainFns]) { const p = pascalCase(fn.camelName) lines.push(`export { call${p} } from '../index'`) } lines.push('') lines.push("export type { ContextState } from '@mizan/base'") lines.push("export { configure, initSession, MizanError } from '@mizan/base'") lines.push('') return lines.join('\n') }