@miragon/wardley-dsl 0.5.2 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lexer.ts","../src/parser.ts","../src/serializer.ts"],"names":["text","CURRENT_SCHEMA_VERSION","validateMap"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Small, line-oriented helpers for the OWM DSL (concept doc §7.4).\n * The DSL is line-based; a full tokenizer/generator is not needed.\n */\n\nimport type { Method } from '@miragon/wardley-schema-model';\n\nexport interface ParsedCoords {\n readonly a: number;\n readonly b: number;\n}\n\nconst COORDS_RE = /\\[\\s*([-\\d.]+)\\s*,\\s*([-\\d.]+)\\s*\\]/;\n\n/** Order stays raw (a, b). */\nexport function parseCoords(line: string): ParsedCoords | null {\n const m = COORDS_RE.exec(line);\n if (!m) return null;\n const a = Number(m[1]);\n const b = Number(m[2]);\n if (Number.isNaN(a) || Number.isNaN(b)) return null;\n return { a, b };\n}\n\nexport function stripCoords(line: string): string {\n return line.replace(COORDS_RE, ' ');\n}\n\n/**\n * Splits a line at the first `[a, b]` tuple: name before, suffix after.\n * Decorators/label offsets may then only be looked up in the suffix — parentheses or\n * words like \"inertia\" inside the name stay untouched.\n */\nexport function splitAtCoords(\n line: string,\n): { name: string; coords: ParsedCoords; suffix: string } | null {\n const m = COORDS_RE.exec(line);\n if (!m) return null;\n const a = Number(m[1]);\n const b = Number(m[2]);\n if (Number.isNaN(a) || Number.isNaN(b)) return null;\n return {\n name: line.slice(0, m.index).trim(),\n coords: { a, b },\n suffix: line.slice(m.index + m[0].length),\n };\n}\n\nconst COORDS4_RE = /\\[\\s*([-\\d.]+)\\s*,\\s*([-\\d.]+)\\s*,\\s*([-\\d.]+)\\s*,\\s*([-\\d.]+)\\s*\\]/;\n\nexport interface ParsedCoords4 {\n readonly a: number;\n readonly b: number;\n readonly c: number;\n readonly d: number;\n}\n\n/** Extracts an `[a, b, c, d]` tuple (OWM attitude form) — or null. */\nexport function parseCoords4(line: string): ParsedCoords4 | null {\n const m = COORDS4_RE.exec(line);\n if (!m) return null;\n const vals = [m[1], m[2], m[3], m[4]].map(Number);\n if (vals.some(Number.isNaN)) return null;\n return { a: vals[0]!, b: vals[1]!, c: vals[2]!, d: vals[3]! };\n}\n\n// `[^[\\]]` (tuples cannot contain '[') + bounded whitespace keep the scan linear (ReDoS-safe).\nconst MULTI_COORDS_RE = /\\[\\s{0,8}(\\[[^[\\]]*\\](?:\\s{0,8},\\s{0,8}\\[[^[\\]]*\\])+)\\s{0,8}\\]/;\n\n/** Extracts a tuple list `[[a,b],[c,d],…]` (OWM multi-position annotation) — or null. */\nexport function parseMultiCoords(line: string): { tuples: ParsedCoords[]; rest: string } | null {\n const m = MULTI_COORDS_RE.exec(line);\n if (!m) return null;\n const tuples: ParsedCoords[] = [];\n const inner = /\\[\\s{0,8}([-\\d.]+)\\s{0,8},\\s{0,8}([-\\d.]+)\\s{0,8}\\]/g;\n let t: RegExpExecArray | null;\n while ((t = inner.exec(m[1]!))) {\n const a = Number(t[1]);\n const b = Number(t[2]);\n if (!Number.isNaN(a) && !Number.isNaN(b)) tuples.push({ a, b });\n }\n if (!tuples.length) return null;\n return { tuples, rest: line.replace(MULTI_COORDS_RE, ' ') };\n}\n\n/**\n * Splits off a `//` line comment. Quote-aware (`+'http://x'>` stays untouched) and\n * URL-aware: `//` directly after `:` is a scheme separator (`url(https://…)`), not a comment.\n */\nexport function splitLineComment(line: string): { code: string; comment: string | null } {\n let inQuote = false;\n for (let i = 0; i < line.length - 1; i++) {\n const ch = line[i];\n if (ch === \"'\") inQuote = !inQuote;\n else if (!inQuote && ch === '/' && line[i + 1] === '/' && line[i - 1] !== ':') {\n return { code: line.slice(0, i), comment: line.slice(i) };\n }\n }\n return { code: line, comment: null };\n}\n\n/** First occurrence of `needle` outside `'…'` quotes — or -1. */\nexport function indexOfOutsideQuotes(line: string, needle: string): number {\n let inQuote = false;\n for (let i = 0; i + needle.length <= line.length; i++) {\n const ch = line[i];\n if (ch === \"'\") {\n inQuote = !inQuote;\n continue;\n }\n if (!inQuote && line.startsWith(needle, i)) return i;\n }\n return -1;\n}\n\nexport interface InlineDecorators {\n readonly market?: boolean;\n readonly ecosystem?: boolean;\n readonly inertia?: boolean;\n readonly method?: Method;\n}\n\nconst PAREN_RE = /\\(([^()]*)\\)/g;\nconst METHODS: ReadonlySet<string> = new Set(['build', 'buy', 'outsource']);\n\n/**\n * Reads the inline decorators of a component line:\n * - parenthesized: `(market)`, `(ecosystem)`, `(build|buy|outsource)`, combined `(market, outsource)`\n * - trailing keyword: `inertia`\n * Returns the decorators found and the line stripped of them.\n */\nexport function parseDecorators(line: string): { decorators: InlineDecorators; rest: string } {\n const dec: {\n market?: boolean;\n ecosystem?: boolean;\n inertia?: boolean;\n method?: Method;\n } = {};\n let rest = line;\n\n rest = rest.replace(PAREN_RE, (_full, group: string) => {\n for (const rawToken of group.split(',')) {\n const token = rawToken.trim().toLowerCase();\n if (token === 'market') dec.market = true;\n else if (token === 'ecosystem') dec.ecosystem = true;\n else if (token === 'inertia') dec.inertia = true;\n else if (METHODS.has(token)) dec.method = token as Method;\n }\n return ' ';\n });\n\n // trailing keyword `inertia` (unparenthesized)\n rest = rest.replace(/\\binertia\\b/i, () => {\n dec.inertia = true;\n return ' ';\n });\n\n return { decorators: dec, rest };\n}\n\n// Note color as an (OWM-backwards-compatible) extension: `(color #rrggbb)` OR `(color green)`.\n// Deliberately placed after the coordinates -> the OWM parser ignores the rest instead of pulling\n// it into the note text. Accepts hex or CSS color names.\nconst COLOR_RE = /\\(\\s*color\\s+(#[0-9a-fA-F]{3,8}|[a-zA-Z][\\w-]*)\\s*\\)/i;\n\nexport function parseColor(line: string): { color?: string; rest: string } {\n const m = COLOR_RE.exec(line);\n if (!m || !m[1]) return { rest: line };\n return { color: m[1], rest: line.replace(COLOR_RE, ' ') };\n}\n\nexport interface LabelOffsetToken {\n readonly dx: number;\n readonly dy: number;\n}\n\nconst LABEL_OFFSET_RE = /\\blabel\\s*\\[\\s*([-\\d.]+)\\s*,\\s*([-\\d.]+)\\s*\\]/i;\n\n/** Reads an optional `label [dx, dy]` (pixel offset) and returns it plus the stripped line. */\nexport function parseLabelOffset(line: string): {\n labelOffset: LabelOffsetToken | null;\n rest: string;\n} {\n const m = LABEL_OFFSET_RE.exec(line);\n if (!m) return { labelOffset: null, rest: line };\n const dx = Number(m[1]);\n const dy = Number(m[2]);\n const rest = line.replace(LABEL_OFFSET_RE, ' ');\n if (Number.isNaN(dx) || Number.isNaN(dy)) return { labelOffset: null, rest };\n return { labelOffset: { dx, dy }, rest };\n}\n\nconst URL_REF_RE = /\\burl\\s{0,8}\\(([^()]*)\\)/i;\n\n/**\n * Reads an optional `url(Name)` reference (OWM) and returns it plus the stripped line.\n * MUST run before parseDecorators — otherwise the word \"url\" would remain as junk in the suffix.\n */\nexport function parseUrlRef(line: string): { urlRef: string | null; rest: string } {\n const m = URL_REF_RE.exec(line);\n if (!m) return { urlRef: null, rest: line };\n return { urlRef: m[1]!.trim() || null, rest: line.replace(URL_REF_RE, ' ') };\n}\n\n/** First word (keyword) of a line, lowercased. */\nexport function keywordOf(line: string): string {\n const m = /^\\s*([A-Za-z][\\w-]*)/.exec(line);\n return m ? m[1]!.toLowerCase() : '';\n}\n\nexport function slug(label: string): string {\n return (\n label\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/^_/, '')\n .replace(/_$/, '') || 'x'\n );\n}\n","import {\n CURRENT_SCHEMA_VERSION,\n validateMap,\n type AcceleratorElement,\n type AnchorElement,\n type AnnotationElement,\n type DrawingElement,\n type DrawingStrokeStyle,\n type AttitudeElement,\n type AttitudeKind,\n type ComponentDecorators,\n type ComponentElement,\n type Coordinate,\n type MapConfig,\n type MapEdge,\n type MapElement,\n type MapStyle,\n type Method,\n type Movement,\n type NoteElement,\n type PipelineElement,\n type SubmapElement,\n type WardleyMap,\n} from '@miragon/wardley-schema-model';\nimport {\n indexOfOutsideQuotes,\n keywordOf,\n parseColor,\n parseCoords,\n parseCoords4,\n parseDecorators,\n parseLabelOffset,\n parseMultiCoords,\n parseUrlRef,\n slug,\n splitAtCoords,\n splitLineComment,\n stripCoords,\n type InlineDecorators,\n} from './lexer.js';\n\n/** Splits `A -> B` at the FIRST arrow — plain indexOf, immune to regex backtracking. */\nfunction splitDependency(core: string): { left: string; right: string } | null {\n const arrow = core.indexOf('->');\n if (arrow <= 0) return null;\n const left = core.slice(0, arrow).trim();\n const right = core.slice(arrow + 2).trim();\n return left && right ? { left, right } : null;\n}\n/**\n * Splits a flow line at the FIRST valid operator (`+>`, `+<>`, `+<`, `+'value'>`/`+'value'<>`)\n * via a linear scan — same semantics as the previous lazy regex, but immune to backtracking.\n */\nfunction splitFlow(\n core: string,\n): { left: string; right: string; op: string; value?: string } | null {\n for (let i = 1; i < core.length; i++) {\n if (core[i] !== '+') continue;\n let j = i + 1;\n let value: string | undefined;\n if (core[j] === \"'\") {\n const end = core.indexOf(\"'\", j + 1);\n if (end < 0) continue;\n value = core.slice(j + 1, end);\n j = end + 1;\n }\n const op = core.startsWith('<>', j)\n ? '<>'\n : core[j] === '>' || core[j] === '<'\n ? core[j]!\n : null;\n if (!op) continue;\n const left = core.slice(0, i).trim();\n const right = core.slice(j + op.length).trim();\n if (left && right) return { left, right, op, ...(value ? { value } : {}) };\n }\n return null;\n}\n// Config/special keywords that must NOT be (pre-)detected as an edge — `evolution`/`evolve`/\n// `y-axis`/`title` can themselves contain `->` and have their own handling in the switch.\nconst NON_LINK_KEYWORDS: ReadonlySet<string> = new Set([\n 'title',\n 'style',\n 'size',\n 'evolution',\n 'y-axis',\n 'annotations',\n 'annotation',\n 'evolve',\n 'line',\n]);\nconst KNOWN_STYLES: ReadonlySet<string> = new Set(['wardley', 'handwritten', 'colour', 'dark']);\n\ninterface PendingLink {\n readonly left: string;\n readonly right: string;\n readonly kind: 'dependency' | 'flow';\n readonly bidirectional?: boolean;\n /** `+<` — flow direction reversed (right -> left). */\n readonly reverse?: boolean;\n readonly flowValue?: string;\n /** Annotation text after `;`. */\n readonly label?: string;\n readonly raw: string;\n readonly lineNo: number;\n}\ninterface PendingEvolve {\n readonly name: string;\n readonly newLabel?: string;\n readonly target: number;\n readonly method?: Movement['method'];\n readonly labelOffset?: { dx: number; dy: number };\n readonly raw: string;\n readonly lineNo: number;\n}\ninterface PipelineChild {\n readonly name: string;\n readonly maturity: number;\n readonly decorators: InlineDecorators;\n readonly labelOffset?: { dx: number; dy: number };\n readonly color?: string;\n}\ninterface PendingPipeline {\n readonly name: string;\n /** Explicit range; if absent (OWM v2 block form without coordinates), it is derived from the children. */\n readonly start?: number;\n readonly end?: number;\n /** Explicit height — project extension `(y 0.x)`; otherwise derived from the anchor component. */\n readonly visibility?: number;\n readonly color?: string;\n readonly raw: string;\n readonly children: PipelineChild[];\n}\n/** Legacy standalone line `build|buy|outsource <Name>` — method on an existing component. */\ninterface PendingMethod {\n readonly name: string;\n readonly method: Method;\n readonly raw: string;\n readonly lineNo: number;\n}\n\nfunction compact<T extends Record<string, unknown>>(obj: T): T {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) if (v !== undefined) out[k] = v;\n return out as T;\n}\n\n/** Finding produced while parsing — line is 1-based; `text` is the (comment-stripped) line. */\nexport interface ParseDiagnostic {\n readonly line: number;\n readonly message: string;\n readonly text: string;\n}\n\nexport interface ParseResult {\n readonly map: WardleyMap;\n readonly diagnostics: readonly ParseDiagnostic[];\n}\n\nclass IdAllocator {\n private readonly used = new Set<string>();\n alloc(prefix: string, label: string): string {\n const base = `${prefix}_${slug(label)}`;\n let id = base;\n let i = 2;\n while (this.used.has(id)) id = `${base}_${i++}`;\n this.used.add(id);\n return id;\n }\n}\n\n/**\n * Keyword-differentiated coordinates (component/anchor/note = [visibility, maturity];\n * pipeline = [maturityStart, maturityEnd]). Unknown lines land in `rawPassthrough`.\n */\nexport function parseDSL(text: string): WardleyMap {\n return parseDSLWithDiagnostics(text).map;\n}\n\n/**\n * Like `parseDSL`, but additionally returns findings with line numbers (uninterpretable lines,\n * unresolved references, clamped coordinates) — for editor feedback instead of silent loss.\n */\nexport function parseDSLWithDiagnostics(text: string): ParseResult {\n const diagnostics: ParseDiagnostic[] = [];\n const ids = new IdAllocator();\n const nameToId = new Map<string, string>();\n const elements: MapElement[] = [];\n const rawPassthrough: string[] = [];\n const pendingLinks: PendingLink[] = [];\n const pendingEvolve: PendingEvolve[] = [];\n const pendingPipeline: PendingPipeline[] = [];\n const pendingMethod: PendingMethod[] = [];\n\n let config: MapConfig = { title: 'Untitled Map' };\n let annoCounter = 0;\n let inBlockComment = false;\n /** OWM `url Name [address]` definitions; resolved into component.url / submap.urlRef. */\n const urlDefs = new Map<string, string>();\n /** Not-yet-resolved `url(Name)` references: element index -> definition name. */\n const pendingUrlRefs: Array<{ readonly index: number; readonly ref: string }> = [];\n /** Pipeline from the immediately preceding line (candidate for a `{` block opening). */\n let lastPipeline: PendingPipeline | null = null;\n /** Currently open pipeline block (`{ … }`); component lines inside it are added as children. */\n let blockPipeline: PendingPipeline | null = null;\n\n const register = (name: string, id: string) => {\n if (!nameToId.has(name)) nameToId.set(name, id);\n };\n\n // Diagnostics helpers: read the current line/number from the loop state.\n let lineNo = 0;\n let currentLine = '';\n\n /** Tries to capture a line as a dependency/flow. Returns true when consumed. */\n const pushLink = (line: string): boolean => {\n // Split off an optional link annotation after ';' (e.g. `A -> B; limited by`).\n const semi = line.indexOf(';');\n const core = semi >= 0 ? line.slice(0, semi).trim() : line;\n const linkLabel = semi >= 0 ? line.slice(semi + 1).trim() : '';\n const dep = splitDependency(core);\n const flow = dep ? null : splitFlow(core);\n if (dep) {\n pendingLinks.push({\n left: dep.left,\n right: dep.right,\n kind: 'dependency',\n ...(linkLabel ? { label: linkLabel } : {}),\n raw: line,\n lineNo,\n });\n return true;\n }\n if (flow) {\n pendingLinks.push({\n left: flow.left,\n right: flow.right,\n kind: 'flow',\n bidirectional: flow.op === '<>',\n reverse: flow.op === '<',\n ...(flow.value ? { flowValue: flow.value } : {}),\n ...(linkLabel ? { label: linkLabel } : {}),\n raw: line,\n lineNo,\n });\n return true;\n }\n return false;\n };\n const diag = (message: string, atLine = lineNo, text_ = currentLine) =>\n diagnostics.push({ line: atLine, message, text: text_ });\n /** Passthrough for a line that looks like a known construct but cannot be parsed. */\n const failed = (l: string) => {\n rawPassthrough.push(l);\n diag('Line could not be interpreted (kept losslessly in rawPassthrough)');\n };\n /** Clamps a normalized value to [0,1] — with a diagnostic instead of a later validation crash. */\n const clampDiag = (n: number): number => {\n if (n < 0 || n > 1) diag(`Coordinate ${n} is outside [0,1] and was clamped`);\n return n < 0 ? 0 : n > 1 ? 1 : n;\n };\n const pos = (visibility: number, evolution: number) => ({\n visibility: clampDiag(visibility),\n evolution: clampDiag(evolution),\n });\n\n const sourceLines = text.split(/\\r?\\n/);\n for (let i = 0; i < sourceLines.length; i++) {\n const raw = sourceLines[i]!;\n lineNo = i + 1;\n currentLine = raw.trim();\n let working = raw;\n\n // --- Comments (`//`, `/* */`): strip, but keep losslessly in rawPassthrough. ---\n if (inBlockComment) {\n const close = working.indexOf('*/');\n if (close < 0) {\n rawPassthrough.push(raw);\n continue;\n }\n rawPassthrough.push(working.slice(0, close + 2));\n working = working.slice(close + 2);\n inBlockComment = false;\n }\n // OWM rule: url lines are exempt from comment stripping (https://…).\n if (keywordOf(working) !== 'url') {\n let open = indexOfOutsideQuotes(working, '/*');\n while (open >= 0) {\n const close = working.indexOf('*/', open + 2);\n if (close < 0) {\n rawPassthrough.push(working.slice(open));\n working = working.slice(0, open);\n inBlockComment = true;\n break;\n }\n rawPassthrough.push(working.slice(open, close + 2));\n working = `${working.slice(0, open)} ${working.slice(close + 2)}`;\n open = indexOfOutsideQuotes(working, '/*');\n }\n const { code, comment } = splitLineComment(working);\n if (comment !== null) rawPassthrough.push(comment);\n working = code;\n }\n\n const line = working.trim();\n if (!line) continue;\n\n // --- Pipeline block (OWM v2): `pipeline X [..]` followed by `{ component Child [maturity] }` ---\n if (blockPipeline) {\n if (line === '}') {\n blockPipeline = null;\n continue;\n }\n const childKw = keywordOf(line);\n if (childKw === 'component') {\n const child = parseBlockChild(line.slice(childKw.length).trim());\n if (child) {\n blockPipeline.children.push(child);\n continue;\n }\n }\n rawPassthrough.push(line);\n continue;\n }\n if (line.startsWith('{')) {\n if (lastPipeline) {\n blockPipeline = lastPipeline;\n lastPipeline = null;\n continue;\n }\n rawPassthrough.push(line);\n continue;\n }\n\n const kw = keywordOf(line);\n const after = line.slice(kw.length).trim();\n // `{` binds only to the DIRECTLY preceding pipeline line.\n if (kw !== 'pipeline') lastPipeline = null;\n\n // Edges/flows FIRST: element NAMES may begin with a keyword word (the default\n // component is named \"Component\" -> edge `Component -> X`). Declarations ALWAYS carry\n // coordinates `[...]`, edges never do. Without this pre-detection `Component -> X` would be\n // misread as a (broken) `component` declaration and vanish on re-import. Config/\n // special keywords (title/evolution/y-axis/evolve …) are exempt — they use `->` themselves.\n if (!NON_LINK_KEYWORDS.has(kw) && !parseCoords(line) && pushLink(line)) {\n continue;\n }\n\n switch (kw) {\n case 'title':\n config = { ...config, title: after };\n break;\n\n case 'anchor': {\n const node = parseNode(after);\n if (!node) {\n failed(line);\n break;\n }\n const id = ids.alloc('anchor', node.name);\n const anchor: AnchorElement = compact({\n id,\n elementType: 'anchor',\n label: node.name,\n position: pos(node.coords.a, node.coords.b),\n labelOffset: node.labelOffset,\n color: node.color,\n }) as AnchorElement;\n elements.push(anchor);\n register(node.name, id);\n break;\n }\n\n case 'component':\n case 'market':\n case 'ecosystem': {\n const node = parseNode(after);\n if (!node) {\n failed(line);\n break;\n }\n const decorators = mergeLegacy(kw, node.decorators);\n const id = ids.alloc('cmp', node.name);\n const component: ComponentElement = compact({\n id,\n elementType: 'component',\n label: node.name,\n position: pos(node.coords.a, node.coords.b),\n labelOffset: node.labelOffset,\n decorators: Object.keys(decorators).length ? decorators : undefined,\n color: node.color,\n }) as ComponentElement;\n elements.push(component);\n if (node.urlRef) pendingUrlRefs.push({ index: elements.length - 1, ref: node.urlRef });\n register(node.name, id);\n break;\n }\n\n case 'note': {\n const { color, rest } = parseColor(after);\n const coords = parseCoords(rest);\n // Literal `\\n` back into real line breaks (multi-line notes).\n const textPart = stripCoords(rest).trim().replace(/\\\\n/g, '\\n');\n if (!coords) {\n failed(line);\n break;\n }\n const id = ids.alloc('note', textPart || 'note');\n const note: NoteElement = compact({\n id,\n elementType: 'note',\n label: textPart,\n position: pos(coords.a, coords.b),\n color,\n }) as NoteElement;\n elements.push(note);\n break;\n }\n\n case 'pipeline': {\n // `pipeline X [s, e]`, `pipeline X` (block form, range from children) — optionally with `{` at the end.\n let body = after;\n let opensBlock = false;\n if (body.endsWith('{')) {\n opensBlock = true;\n body = body.slice(0, -1).trim();\n }\n const col = parseColor(body);\n // Project extension `(y 0.x)`: the OWM pipeline line has no slot for the height —\n // without it a standalone pipeline snaps back to visibility 0.5 on every round trip.\n const yMatch = /\\(\\s{0,8}y\\s{1,8}([\\d.]+)\\s{0,8}\\)/.exec(col.rest);\n const bodyRest = yMatch ? col.rest.replace(yMatch[0], ' ') : col.rest;\n const coords = parseCoords(bodyRest);\n const name = stripCoords(bodyRest).trim();\n if (!name) {\n failed(line);\n break;\n }\n const pending: PendingPipeline = {\n name,\n ...(coords ? { start: coords.a, end: coords.b } : {}),\n ...(yMatch ? { visibility: clamp01(Number(yMatch[1])) } : {}),\n ...(col.color ? { color: col.color } : {}),\n raw: line,\n children: [],\n };\n pendingPipeline.push(pending);\n if (opensBlock) blockPipeline = pending;\n else lastPipeline = pending;\n break;\n }\n\n case 'evolve': {\n const ev = parseEvolve(after);\n if (!ev) {\n failed(line);\n break;\n }\n pendingEvolve.push({ ...ev, target: clampDiag(ev.target), raw: line, lineNo });\n break;\n }\n\n case 'style': {\n const s = after.toLowerCase();\n if (KNOWN_STYLES.has(s)) config = { ...config, style: s as MapStyle };\n else failed(line);\n break;\n }\n\n case 'size': {\n const coords = parseCoords(after);\n if (coords) config = { ...config, size: { width: coords.a, height: coords.b } };\n else failed(line);\n break;\n }\n\n case 'evolution': {\n // Exactly four positions (the serializer always writes four). Do NOT filter out\n // empty segments, otherwise an empty stage label is lost (the whole line would fall\n // out of the 4-slot grid and land in rawPassthrough -> axis snaps back to default).\n const parts = after.split('->').map((s) => s.trim());\n if (parts.length === 4) {\n config = { ...config, evolutionLabels: [parts[0]!, parts[1]!, parts[2]!, parts[3]!] };\n } else rawPassthrough.push(raw);\n break;\n }\n\n case 'y-axis': {\n // OWM: `y-axis Label->BottomLabel->TopLabel` — keep the end labels losslessly too.\n const parts = after\n .split('->')\n .map((s) => s.trim())\n .filter(Boolean);\n if (parts.length) {\n config = {\n ...config,\n yAxisLabel: parts[0]!,\n ...(parts.length >= 3\n ? { yAxisEndLabels: [parts[1]!, parts[2]!] as [string, string] }\n : {}),\n };\n } else failed(line);\n break;\n }\n\n case 'annotations': {\n const coords = parseCoords(after);\n if (coords) {\n config = {\n ...config,\n annotationsBoxPosition: pos(coords.a, coords.b),\n };\n } else rawPassthrough.push(raw);\n break;\n }\n\n case 'annotation': {\n const numMatch = /^\\s*(\\d+)/.exec(after);\n const number = numMatch ? Number(numMatch[1]) : ++annoCounter;\n const colA = parseColor(after.replace(/^\\s*\\d+\\s*/, ''));\n const afterNum = colA.rest;\n // Try the multi-position form `[[y,x],[y,x]]` FIRST — the single-tuple RE would otherwise\n // match only the first inner tuple and corrupt the rest as text.\n const multi = parseMultiCoords(afterNum);\n let positions: Coordinate[];\n let text: string;\n if (multi) {\n positions = multi.tuples.map((t) => pos(t.a, t.b));\n text = multi.rest.trim();\n } else {\n const coords = parseCoords(afterNum);\n if (!coords) {\n rawPassthrough.push(line);\n break;\n }\n positions = [pos(coords.a, coords.b)];\n text = stripCoords(afterNum).trim();\n }\n const annotation: AnnotationElement = {\n id: ids.alloc('anno', String(number)),\n elementType: 'annotation',\n label: text,\n position: positions[0]!,\n number,\n positions,\n text,\n ...(colA.color ? { color: colA.color } : {}),\n };\n elements.push(annotation);\n break;\n }\n\n case 'line': {\n // Project extension (freeform drawing): `line [[v,e], [v,e], …] (closed) (dashed) (color x)`.\n const col = parseColor(after);\n const multi = parseMultiCoords(col.rest);\n if (!multi || multi.tuples.length < 2) {\n failed(line);\n break;\n }\n const flags = multi.rest.toLowerCase();\n const strokeStyle: DrawingStrokeStyle | undefined = flags.includes('(dashed)')\n ? 'dashed'\n : flags.includes('(dotted)')\n ? 'dotted'\n : undefined;\n const points = multi.tuples.map((t) => pos(t.a, t.b));\n const drawing: DrawingElement = {\n id: ids.alloc('draw', 'line'),\n elementType: 'drawing',\n label: '',\n position: points[0]!,\n points,\n ...(flags.includes('(closed)') ? { closed: true } : {}),\n ...(strokeStyle ? { strokeStyle } : {}),\n ...(col.color ? { color: col.color } : {}),\n };\n elements.push(drawing);\n break;\n }\n\n case 'pioneers':\n case 'settlers':\n case 'townplanners': {\n // Canonical OWM form: `<kind> [vis1, mat1, vis2, mat2]` (two corners, normalized).\n const col = parseColor(after);\n const four = parseCoords4(col.rest);\n if (!four) {\n failed(line);\n break;\n }\n elements.push(\n makeAttitude(ids, kw as AttitudeKind, four.a, four.b, four.c, four.d, col.color),\n );\n break;\n }\n\n case 'url': {\n // OWM: `url Name [https://…]` — definition, referenced via `url(Name)` on elements.\n // Parsed via indexOf (not regex) — immune to backtracking on hostile input.\n const open = after.indexOf('[');\n const close = after.lastIndexOf(']');\n const name = open > 0 ? after.slice(0, open).trim() : '';\n const address = open > 0 && close > open ? after.slice(open + 1, close).trim() : '';\n if (!name || !address || after.slice(close + 1).trim() !== '') {\n failed(line);\n break;\n }\n urlDefs.set(name, address);\n break;\n }\n\n case 'build':\n case 'buy':\n case 'outsource': {\n // Legacy OWM: `buy <Name>` (method on an existing component) or\n // `buy <Name> [vis, mat]` (create a component with a method).\n const node = parseNode(after);\n if (node) {\n const id = ids.alloc('cmp', node.name);\n const component: ComponentElement = compact({\n id,\n elementType: 'component',\n label: node.name,\n position: pos(node.coords.a, node.coords.b),\n labelOffset: node.labelOffset,\n decorators: { ...node.decorators, method: kw as Method },\n color: node.color,\n }) as ComponentElement;\n elements.push(component);\n register(node.name, id);\n } else if (after.trim()) {\n pendingMethod.push({ name: after.trim(), method: kw as Method, raw: line, lineNo });\n } else {\n rawPassthrough.push(line);\n }\n break;\n }\n\n case 'accelerator':\n case 'deaccelerator': {\n const node = parseNode(after);\n if (!node) {\n failed(line);\n break;\n }\n const id = ids.alloc('accel', node.name);\n const accelerator: AcceleratorElement = {\n id,\n elementType: 'accelerator',\n direction: kw === 'deaccelerator' ? 'deaccelerate' : 'accelerate',\n label: node.name,\n position: pos(node.coords.a, node.coords.b),\n ...(node.color ? { color: node.color } : {}),\n };\n elements.push(accelerator);\n register(node.name, id);\n break;\n }\n\n case 'submap': {\n const node = parseNode(after);\n if (!node) {\n failed(line);\n break;\n }\n const id = ids.alloc('submap', node.name);\n const submap: SubmapElement = {\n id,\n elementType: 'submap',\n label: node.name,\n position: pos(node.coords.a, node.coords.b),\n ...(node.color ? { color: node.color } : {}),\n };\n elements.push(submap);\n if (node.urlRef) pendingUrlRefs.push({ index: elements.length - 1, ref: node.urlRef });\n register(node.name, id);\n break;\n }\n\n default: {\n // Unknown keyword: try as a link (e.g. `A -> B; limited by`), otherwise keep raw.\n if (!pushLink(line)) rawPassthrough.push(line);\n }\n }\n }\n\n // --- Resolve pipelines (visibility from the same-named component; children inherit it) ---\n // BEFORE evolve/method so that evolve/buy can reference block children.\n for (const p of pendingPipeline) {\n const refId = nameToId.get(p.name);\n const ref = elements.find((e) => e.id === refId);\n const visibility = p.visibility ?? (ref ? ref.position.visibility : 0.5);\n const id = ids.alloc('pipeline', p.name);\n // Standalone pipelines (no same-named component) are edge endpoints themselves —\n // register() keeps the first entry, so an existing anchor component still wins.\n register(p.name, id);\n\n const childIds: string[] = [];\n const childElements: ComponentElement[] = [];\n for (const c of p.children) {\n const cid = ids.alloc('cmp', c.name);\n childElements.push(\n compact({\n id: cid,\n elementType: 'component',\n label: c.name,\n position: { visibility, evolution: clamp01(c.maturity) },\n labelOffset: c.labelOffset,\n decorators: Object.keys(c.decorators).length ? c.decorators : undefined,\n pipelineId: id,\n color: c.color,\n }) as ComponentElement,\n );\n register(c.name, cid);\n childIds.push(cid);\n }\n\n // Range: explicit, otherwise derived from the child maturities (OWM v2); useless without either.\n let start =\n p.start ?? (p.children.length ? Math.min(...p.children.map((c) => c.maturity)) : NaN);\n let end = p.end ?? (p.children.length ? Math.max(...p.children.map((c) => c.maturity)) : NaN);\n if (Number.isNaN(start) || Number.isNaN(end)) {\n rawPassthrough.push(p.raw);\n continue;\n }\n start = clamp01(start);\n end = clamp01(end);\n if (end <= start) end = Math.min(1, start + 0.05);\n\n const pipeline: PipelineElement = {\n id,\n elementType: 'pipeline',\n label: p.name,\n position: { visibility, evolution: (start + end) / 2 },\n evolutionStart: start,\n evolutionEnd: end,\n childIds,\n ...(p.color ? { color: p.color } : {}),\n };\n elements.push(pipeline, ...childElements);\n }\n\n // --- Resolve evolve ---\n for (const ev of pendingEvolve) {\n const id = nameToId.get(ev.name);\n const idx = elements.findIndex((e) => e.id === id);\n if (idx < 0 || elements[idx]!.elementType !== 'component') {\n rawPassthrough.push(ev.raw);\n diag(`evolve: component \"${ev.name}\" not found`, ev.lineNo, ev.raw);\n continue;\n }\n const movement = compact({\n targetEvolution: ev.target,\n newLabel: ev.newLabel,\n method: ev.method,\n labelOffset: ev.labelOffset,\n }) as Movement;\n elements[idx] = { ...(elements[idx] as ComponentElement), movement };\n }\n\n // --- Resolve legacy standalone methods (`buy <name>`) ---\n for (const pm of pendingMethod) {\n const id = nameToId.get(pm.name);\n const idx = elements.findIndex((e) => e.id === id);\n const el = idx >= 0 ? elements[idx]! : undefined;\n if (!el || el.elementType !== 'component') {\n rawPassthrough.push(pm.raw);\n diag(`${pm.method}: component \"${pm.name}\" not found`, pm.lineNo, pm.raw);\n continue;\n }\n elements[idx] = { ...el, decorators: { ...el.decorators, method: pm.method } };\n }\n\n // --- Resolve url(...) references (the definition may appear before OR after the element) ---\n const usedUrlDefs = new Set<string>();\n for (const { index, ref } of pendingUrlRefs) {\n const fromDef = urlDefs.get(ref);\n if (fromDef) usedUrlDefs.add(ref);\n // Also accept a directly embedded address (`url(https://…)`).\n const address = fromDef ?? (/^[a-z][\\w+.-]*:\\/\\//i.test(ref) ? ref : undefined);\n if (!address) continue;\n const el = elements[index]!;\n if (el.elementType === 'component') {\n elements[index] = { ...el, url: address };\n } else if (el.elementType === 'submap') {\n elements[index] = { ...el, urlRef: address };\n }\n }\n // Keep unreferenced definitions losslessly.\n for (const [name, address] of urlDefs) {\n if (!usedUrlDefs.has(name)) rawPassthrough.push(`url ${name} [${address}]`);\n }\n\n let depN = 0;\n let flowN = 0;\n const edges: MapEdge[] = [];\n for (const link of pendingLinks) {\n const fromId = nameToId.get(link.left);\n const toId = nameToId.get(link.right);\n if (!fromId || !toId) {\n rawPassthrough.push(link.raw);\n diag(\n `Link: ${!fromId ? `\"${link.left}\"` : `\"${link.right}\"`} not found`,\n link.lineNo,\n link.raw,\n );\n continue;\n }\n if (link.kind === 'dependency') {\n edges.push(\n compact({\n id: `dep_${++depN}`,\n edgeType: 'dependency',\n from: fromId,\n to: toId,\n label: link.label,\n }) as MapEdge,\n );\n } else {\n // `+<` reverses the flow direction (right -> left).\n const [f, t] = link.reverse ? [toId, fromId] : [fromId, toId];\n edges.push(\n compact({\n id: `flow_${++flowN}`,\n edgeType: 'flow',\n from: f,\n to: t,\n bidirectional: link.bidirectional ? true : undefined,\n flowValue: link.flowValue,\n label: link.label,\n }) as MapEdge,\n );\n }\n }\n\n const map = compact({\n schemaVersion: CURRENT_SCHEMA_VERSION,\n config,\n elements,\n edges,\n rawPassthrough: rawPassthrough.length ? rawPassthrough : undefined,\n }) as WardleyMap;\n\n return { map: validateMap(map), diagnostics };\n}\n\ninterface ParsedNode {\n readonly name: string;\n readonly coords: { a: number; b: number };\n readonly decorators: InlineDecorators;\n readonly labelOffset?: { dx: number; dy: number };\n /** `url(Name)` reference (definition name, not yet resolved). */\n readonly urlRef?: string;\n /** Project extension `(color …)` — supported on every element line. */\n readonly color?: string;\n}\n\n/**\n * Parses `<name> [a, b] <decorators> [url(Name)] [label [dx,dy]]`. Decorators, url reference and\n * label offset are looked up ONLY in the suffix AFTER the coordinates — parentheses\n * (`Tea (green)`) or words like \"inertia\" inside the name stay untouched.\n */\nfunction parseNode(after: string): ParsedNode | null {\n const split = splitAtCoords(after);\n if (!split || !split.name) return null;\n // Color must be stripped BEFORE the decorators — `(color x)` would otherwise be consumed\n // (and silently dropped) by the decorator parentheses.\n const col = parseColor(split.suffix);\n const url = parseUrlRef(col.rest);\n const lo = parseLabelOffset(url.rest);\n const dec = parseDecorators(lo.rest);\n return compact({\n name: split.name,\n coords: split.coords,\n decorators: dec.decorators,\n labelOffset: lo.labelOffset ?? undefined,\n urlRef: url.urlRef ?? undefined,\n color: col.color ?? undefined,\n }) as ParsedNode;\n}\n\nfunction clamp01(n: number): number {\n return n < 0 ? 0 : n > 1 ? 1 : n;\n}\n\nconst SINGLE_COORD_RE = /\\[\\s*([-\\d.]+)\\s*\\]/;\n\n/** Parses a pipeline block child line: `<name> [maturity]` (+ optional decorators/offset). */\nfunction parseBlockChild(after: string): PipelineChild | null {\n const m = SINGLE_COORD_RE.exec(after);\n if (!m) return null;\n const maturity = Number(m[1]);\n if (Number.isNaN(maturity)) return null;\n const name = after.slice(0, m.index).trim();\n if (!name) return null;\n const suffix = after.slice(m.index + m[0].length);\n const col = parseColor(suffix);\n const lo = parseLabelOffset(col.rest);\n const dec = parseDecorators(lo.rest);\n return compact({\n name,\n maturity,\n decorators: dec.decorators,\n labelOffset: lo.labelOffset ?? undefined,\n color: col.color ?? undefined,\n }) as PipelineChild;\n}\n\n/** Builds an AttitudeElement from two (arbitrarily oriented) corners; normalizes to TL/BR. */\nfunction makeAttitude(\n ids: IdAllocator,\n kind: AttitudeKind,\n v1: number,\n m1: number,\n v2: number,\n m2: number,\n color?: string,\n): AttitudeElement {\n return {\n id: ids.alloc('attitude', kind),\n elementType: 'attitude',\n kind,\n label: '',\n ...(color ? { color } : {}),\n position: {\n visibility: clamp01(Math.max(v1, v2)),\n evolution: clamp01(Math.min(m1, m2)),\n },\n corner2: {\n visibility: clamp01(Math.min(v1, v2)),\n evolution: clamp01(Math.max(m1, m2)),\n },\n };\n}\n\nfunction mergeLegacy(kw: string, dec: InlineDecorators): ComponentDecorators {\n const merged: Record<string, unknown> = { ...dec };\n if (kw === 'market') merged['market'] = true;\n if (kw === 'ecosystem') merged['ecosystem'] = true;\n return compact(merged) as ComponentDecorators;\n}\n\nfunction parseEvolve(after: string): Omit<PendingEvolve, 'raw'> | null {\n // Remove `label [dx, dy]` FIRST — otherwise the last token is `dy]` and Number() fails.\n const lo = parseLabelOffset(after);\n const dec = parseDecorators(lo.rest);\n const tokens = dec.rest.trim().split(/\\s+/);\n if (tokens.length < 2) return null;\n const last = tokens[tokens.length - 1]!;\n const target = Number(last);\n if (Number.isNaN(target)) return null;\n const namePart = tokens.slice(0, -1).join(' ').trim();\n if (!namePart) return null;\n const renameIdx = namePart.indexOf('->');\n const name = renameIdx >= 0 ? namePart.slice(0, renameIdx).trim() : namePart;\n const newLabel = renameIdx >= 0 ? namePart.slice(renameIdx + 2).trim() : undefined;\n return compact({\n name,\n newLabel: newLabel || undefined,\n target,\n method: dec.decorators.method,\n labelOffset: lo.labelOffset ?? undefined,\n }) as Omit<PendingEvolve, 'raw'>;\n}\n","import type {\n ComponentDecorators,\n ComponentElement,\n LabelOffset,\n MapElement,\n WardleyMap,\n} from '@miragon/wardley-schema-model';\n\n/** Address of an element (component.url / submap.urlRef) — or undefined. */\nfunction urlOf(el: MapElement): string | undefined {\n if (el.elementType === 'component') return el.url;\n if (el.elementType === 'submap') return el.urlRef;\n return undefined;\n}\n\nfunction r(n: number): string {\n return String(Math.round(n * 1000) / 1000);\n}\n\n/** Types referenced BY THEIR NAME in the OWM DSL (edge endpoints + namespace). */\nconst NAMED_TYPES: ReadonlySet<string> = new Set(['anchor', 'component', 'accelerator', 'submap']);\n\nfunction defaultName(type: string): string {\n return type === 'anchor'\n ? 'User'\n : type === 'accelerator'\n ? 'Accelerator'\n : type === 'submap'\n ? 'Submap'\n : 'Component';\n}\n\n/**\n * Returns a name per element ID that is UNIQUE within the DSL for the referenceable types\n * (component/anchor/…). Because edges are serialized by name (`A -> B`), duplicate or empty\n * labels would collapse onto the same node on re-import and make arrows disappear. So on\n * collision a suffix (`Name 2`) is assigned and on an empty label a default — consistently for\n * BOTH sides (node line AND edge reference). Unique names stay unchanged.\n */\nfunction uniqueNames(map: WardleyMap): Map<string, string> {\n const used = new Set<string>();\n const byId = new Map<string, string>();\n for (const el of map.elements) {\n if (!NAMED_TYPES.has(el.elementType)) continue;\n const base = el.label.trim().replace(/->/g, '→') || defaultName(el.elementType);\n let name = base;\n let i = 2;\n while (used.has(name)) name = `${base} ${i++}`;\n used.add(name);\n byId.set(el.id, name);\n }\n return byId;\n}\n\nfunction offsetSuffix(lo: LabelOffset | undefined): string {\n return lo ? ` label [${r(lo.dx)}, ${r(lo.dy)}]` : '';\n}\n\n/** Project extension: `(color …)` after the coordinates (the OWM parser ignores it). */\nfunction colorSuffix(el: { color?: string }): string {\n return el.color ? ` (color ${el.color})` : '';\n}\n\nfunction decoratorSuffix(dec: ComponentDecorators | undefined): string {\n if (!dec) return '';\n const paren: string[] = [];\n if (dec.market) paren.push('market');\n if (dec.ecosystem) paren.push('ecosystem');\n if (dec.method) paren.push(dec.method);\n let out = '';\n if (paren.length) out += ` (${paren.join(', ')})`;\n if (dec.inertia) out += ' inertia';\n return out;\n}\n\n/**\n * Serializes a WardleyMap into Online-Wardley-Maps text. Deterministic; writes only\n * syntax the OWM parser reads back. `rawPassthrough` is appended unchanged.\n * Coordinates are keyword-differentiated (component/anchor/note = [visibility, maturity];\n * pipeline = [maturityStart, maturityEnd]).\n */\nexport function serializeDSL(map: WardleyMap): string {\n const lines: string[] = [];\n const names = uniqueNames(map);\n const nameOf = (el: MapElement): string => names.get(el.id) ?? el.label;\n\n lines.push(`title ${map.config.title}`);\n if (map.config.style) lines.push(`style ${map.config.style}`);\n if (map.config.size)\n lines.push(`size [${r(map.config.size.width)}, ${r(map.config.size.height)}]`);\n if (map.config.evolutionLabels) lines.push(`evolution ${map.config.evolutionLabels.join('->')}`);\n if (map.config.yAxisLabel) {\n const ends = map.config.yAxisEndLabels;\n lines.push(`y-axis ${map.config.yAxisLabel}${ends ? `->${ends[0]}->${ends[1]}` : ''}`);\n }\n if (map.config.annotationsBoxPosition) {\n const b = map.config.annotationsBoxPosition;\n lines.push(`annotations [${r(b.visibility)}, ${r(b.evolution)}]`);\n }\n\n // url definitions: one `url <Name> URL [address]` line per element with an address,\n // referenced on the element via `url(<Name> URL)` (OWM form: definition + reference).\n const urlDefNames = new Map<string, string>(); // element ID -> definition name\n for (const el of map.elements) {\n const address = urlOf(el);\n if (!address) continue;\n const defName = `${nameOf(el)} URL`;\n urlDefNames.set(el.id, defName);\n lines.push(`url ${defName} [${address}]`);\n }\n const urlSuffix = (el: MapElement): string => {\n const def = urlDefNames.get(el.id);\n return def ? ` url(${def})` : '';\n };\n\n // Pipeline children (pipelineId set + pipeline exists) are emitted in the pipeline's\n // block form instead of as top-level components (OWM v2).\n const pipelineIds = new Set(\n map.elements.filter((e) => e.elementType === 'pipeline').map((e) => e.id),\n );\n const childrenByPipeline = new Map<string, ComponentElement[]>();\n for (const el of map.elements) {\n if (el.elementType !== 'component' || !el.pipelineId || !pipelineIds.has(el.pipelineId)) {\n continue;\n }\n const list = childrenByPipeline.get(el.pipelineId) ?? [];\n list.push(el);\n childrenByPipeline.set(el.pipelineId, list);\n }\n const isPipelineChild = (el: MapElement): el is ComponentElement =>\n el.elementType === 'component' && !!el.pipelineId && pipelineIds.has(el.pipelineId);\n\n const evolveLines: string[] = [];\n\n // The OWM pipeline line has no slot for the height — emit the project extension `(y 0.x)`\n // whenever the visibility differs from what re-parsing would derive (anchor component or 0.5),\n // so standalone pipelines do not snap back to mid-canvas on every round trip.\n const componentVisByLabel = new Map<string, number>();\n for (const el of map.elements) {\n if (el.elementType === 'component' && !componentVisByLabel.has(el.label)) {\n componentVisByLabel.set(el.label, el.position.visibility);\n }\n }\n const pipelineYSuffix = (el: MapElement): string => {\n if (el.elementType !== 'pipeline') return '';\n const derived = componentVisByLabel.get(el.label) ?? 0.5;\n return Math.abs(el.position.visibility - derived) > 0.0005\n ? ` (y ${r(el.position.visibility)})`\n : '';\n };\n\n for (const el of map.elements) {\n if (el.elementType === 'component' && el.movement) {\n evolveLines.push(evolveLine(el, nameOf(el)));\n }\n if (isPipelineChild(el)) continue; // emitted inside the pipeline block\n lines.push(elementLine(el, nameOf(el)) + pipelineYSuffix(el) + urlSuffix(el));\n if (el.elementType === 'pipeline') {\n const kids = childrenByPipeline.get(el.id) ?? [];\n if (kids.length) {\n lines.push('{');\n for (const k of kids) {\n lines.push(\n ` component ${nameOf(k)} [${r(k.position.evolution)}]` +\n `${decoratorSuffix(k.decorators)}${colorSuffix(k)}${offsetSuffix(k.labelOffset)}`,\n );\n }\n lines.push('}');\n }\n }\n }\n\n for (const line of evolveLines) lines.push(line);\n\n // Edges may also end at a pipeline (its ■ anchor) — fall back to the element label for\n // endpoint types that are not part of the unique-name pass.\n const labelsById = new Map(map.elements.map((el) => [el.id, el.label]));\n for (const edge of map.edges) {\n const from = names.get(edge.from) ?? labelsById.get(edge.from) ?? edge.from;\n const to = names.get(edge.to) ?? labelsById.get(edge.to) ?? edge.to;\n const annotation = edge.label ? `; ${edge.label}` : '';\n if (edge.edgeType === 'dependency') {\n lines.push(`${from} -> ${to}${annotation}`);\n } else {\n const op = edge.flowValue\n ? `+'${edge.flowValue}'${edge.bidirectional ? '<>' : '>'}`\n : edge.bidirectional\n ? '+<>'\n : '+>';\n lines.push(`${from} ${op} ${to}${annotation}`);\n }\n }\n\n // Config keywords were already emitted from the map above. A rawPassthrough entry with the\n // same keyword (e.g. an unparsable `evolution` line from externally-authored DSL) would\n // otherwise produce a contradictory duplicate line — drop it (config is the truth).\n if (map.rawPassthrough) {\n const emitted = new Set<string>();\n if (map.config.evolutionLabels) emitted.add('evolution');\n if (map.config.yAxisLabel) emitted.add('y-axis');\n for (const raw of map.rawPassthrough) {\n if (emitted.has(raw.trim().split(/\\s+/)[0]!)) continue;\n lines.push(raw);\n }\n }\n\n return lines.join('\\n') + '\\n';\n}\n\nfunction elementLine(el: MapElement, name: string): string {\n const p = el.position;\n switch (el.elementType) {\n case 'anchor':\n return `anchor ${name} [${r(p.visibility)}, ${r(p.evolution)}]${colorSuffix(el)}${offsetSuffix(el.labelOffset)}`;\n case 'component':\n return `component ${name} [${r(p.visibility)}, ${r(p.evolution)}]${decoratorSuffix(el.decorators)}${colorSuffix(el)}${offsetSuffix(el.labelOffset)}`;\n case 'note':\n // Encode line breaks as literal `\\n` -> the line-based DSL stays single-line.\n return `note ${name.replace(/\\n/g, '\\\\n')} [${r(p.visibility)}, ${r(p.evolution)}]${colorSuffix(el)}`;\n case 'pipeline':\n return `pipeline ${name} [${r(el.evolutionStart)}, ${r(el.evolutionEnd)}]${colorSuffix(el)}`;\n case 'submap':\n return `submap ${name} [${r(p.visibility)}, ${r(p.evolution)}]${colorSuffix(el)}`;\n case 'annotation': {\n const pos =\n el.positions.length > 1\n ? `[${el.positions.map((q) => `[${r(q.visibility)}, ${r(q.evolution)}]`).join(', ')}]`\n : `[${r(p.visibility)}, ${r(p.evolution)}]`;\n return `annotation ${el.number} ${pos}${colorSuffix(el)} ${el.text}`;\n }\n case 'accelerator':\n return `${el.direction === 'deaccelerate' ? 'deaccelerator' : 'accelerator'} ${name} [${r(p.visibility)}, ${r(p.evolution)}]${colorSuffix(el)}`;\n case 'attitude':\n // OWM canon: two corners, normalized — `pioneers [vis1, mat1, vis2, mat2]`.\n return `${el.kind} [${r(p.visibility)}, ${r(p.evolution)}, ${r(el.corner2.visibility)}, ${r(el.corner2.evolution)}]${colorSuffix(el)}`;\n case 'drawing': {\n // Project extension (freeform drawing): tuple list + style flags.\n const pts = el.points.map((q) => `[${r(q.visibility)}, ${r(q.evolution)}]`).join(', ');\n const closed = el.closed ? ' (closed)' : '';\n const stroke = el.strokeStyle && el.strokeStyle !== 'solid' ? ` (${el.strokeStyle})` : '';\n return `line [${pts}]${closed}${stroke}${colorSuffix(el)}`;\n }\n }\n}\n\nfunction evolveLine(el: ComponentElement, name: string): string {\n const mv = el.movement!;\n const label = mv.newLabel ? `${name}->${mv.newLabel}` : name;\n const method = mv.method ? ` (${mv.method})` : '';\n return `evolve ${label} ${r(mv.targetEvolution)}${method}${offsetSuffix(mv.labelOffset)}`;\n}\n"]}
1
+ {"version":3,"sources":["../src/lexer.ts","../src/names.ts","../src/parser.ts","../src/serializer.ts"],"names":["CURRENT_SCHEMA_VERSION","validateMap","urlDefinitionNames"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Small, line-oriented helpers for the OWM DSL (concept doc §7.4).\n * The DSL is line-based; a full tokenizer/generator is not needed.\n */\n\nimport type { Method } from '@miragon/wardley-schema-model';\n\nexport interface ParsedCoords {\n readonly a: number;\n readonly b: number;\n}\n\nconst COORDS_RE = /\\[\\s*([-\\d.]+)\\s*,\\s*([-\\d.]+)\\s*\\]/;\n\n/** Order stays raw (a, b). */\nexport function parseCoords(line: string): ParsedCoords | null {\n const m = COORDS_RE.exec(line);\n if (!m) return null;\n const a = Number(m[1]);\n const b = Number(m[2]);\n if (Number.isNaN(a) || Number.isNaN(b)) return null;\n return { a, b };\n}\n\n/** Splits a line at the first `[a, b]` tuple, readable or not; `coords` is null when it is not. */\nexport function splitAtTuple(\n line: string,\n): { before: string; tuple: string; coords: ParsedCoords | null; after: string } | null {\n const m = COORDS_RE.exec(line);\n if (!m) return null;\n const a = Number(m[1]);\n const b = Number(m[2]);\n return {\n before: line.slice(0, m.index).trim(),\n tuple: m[0],\n coords: Number.isNaN(a) || Number.isNaN(b) ? null : { a, b },\n after: line.slice(m.index + m[0].length),\n };\n}\n\n/**\n * Splits a line at the first `[a, b]` tuple: name before, suffix after.\n * Decorators/label offsets may then only be looked up in the suffix — parentheses or\n * words like \"inertia\" inside the name stay untouched.\n */\nexport function splitAtCoords(\n line: string,\n): { name: string; coords: ParsedCoords; suffix: string } | null {\n const split = splitAtTuple(line);\n if (!split?.coords) return null;\n return { name: split.before, coords: split.coords, suffix: split.after };\n}\n\nconst COORDS4_RE = /\\[\\s*([-\\d.]+)\\s*,\\s*([-\\d.]+)\\s*,\\s*([-\\d.]+)\\s*,\\s*([-\\d.]+)\\s*\\]/;\n\nexport interface ParsedCoords4 {\n readonly a: number;\n readonly b: number;\n readonly c: number;\n readonly d: number;\n}\n\nexport function splitAtCoords4(\n line: string,\n): { before: string; coords: ParsedCoords4; after: string } | null {\n const m = COORDS4_RE.exec(line);\n if (!m) return null;\n const vals = [m[1], m[2], m[3], m[4]].map(Number);\n if (vals.some(Number.isNaN)) return null;\n return {\n before: line.slice(0, m.index).trim(),\n coords: { a: vals[0]!, b: vals[1]!, c: vals[2]!, d: vals[3]! },\n after: line.slice(m.index + m[0].length),\n };\n}\n\n// `[^[\\]]` (tuples cannot contain '[') + bounded whitespace keep the scan linear (ReDoS-safe).\nconst TUPLE_LIST_RE = /\\[\\s{0,8}(\\[[^[\\]]*\\](?:\\s{0,8},\\s{0,8}\\[[^[\\]]*\\])*)\\s{0,8}\\]/;\nconst LIST_ENTRY_RE = /\\[[^[\\]]*\\]/g;\nconst WHOLE_COORDS_RE = /^\\[\\s*([-\\d.]+)\\s*,\\s*([-\\d.]+)\\s*\\]$/;\n\nexport interface PositionsOnLine {\n readonly tuples: ParsedCoords[];\n readonly unreadable: string[];\n readonly before: string;\n readonly after: string;\n}\n\nfunction readTupleList(line: string, list: RegExpExecArray): PositionsOnLine {\n const tuples: ParsedCoords[] = [];\n const unreadable: string[] = [];\n for (const [entry] of list[1]!.matchAll(LIST_ENTRY_RE)) {\n const coords = WHOLE_COORDS_RE.exec(entry);\n const a = Number(coords?.[1]);\n const b = Number(coords?.[2]);\n if (coords && !Number.isNaN(a) && !Number.isNaN(b)) tuples.push({ a, b });\n else unreadable.push(entry);\n }\n return {\n tuples,\n unreadable,\n before: line.slice(0, list.index).trim(),\n after: line.slice(list.index + list[0].length),\n };\n}\n\n/** Reads the first tuple list `[[a,b], [c,d], …]` (OWM multi-position form) on a line — or null. */\nexport function parseMultiCoords(line: string): PositionsOnLine | null {\n const list = TUPLE_LIST_RE.exec(line);\n return list ? readTupleList(line, list) : null;\n}\n\nconst FIRST_CHILD_TUPLE_RE = /\\[\\s*([-\\d.]+)\\s*(?:,\\s*([-\\d.]+)\\s*)?\\]/;\n\n/**\n * Splits a pipeline block line at its first `[maturity]` or `[visibility, maturity]` tuple, so a\n * name may hold other brackets (`Store [old] [0.4]`). `values` are the numbers as written.\n */\nexport function splitAtFirstChildTuple(\n line: string,\n): { before: string; values: string[]; after: string } | null {\n const m = FIRST_CHILD_TUPLE_RE.exec(line);\n if (!m) return null;\n return {\n before: line.slice(0, m.index).trim(),\n values: m[2] === undefined ? [m[1]!] : [m[1]!, m[2]],\n after: line.slice(m.index + m[0].length),\n };\n}\n\n/** Reads the first position on a line: a single `[a, b]` tuple or a tuple list, whichever comes first. */\nexport function parsePositions(line: string): PositionsOnLine | null {\n const single = COORDS_RE.exec(line);\n const list = TUPLE_LIST_RE.exec(line);\n if (list && (!single || list.index < single.index)) return readTupleList(line, list);\n if (!single) return null;\n const a = Number(single[1]);\n const b = Number(single[2]);\n const readable = !Number.isNaN(a) && !Number.isNaN(b);\n return {\n tuples: readable ? [{ a, b }] : [],\n unreadable: readable ? [] : [single[0]],\n before: line.slice(0, single.index).trim(),\n after: line.slice(single.index + single[0].length),\n };\n}\n\n/**\n * Index of the quote that closes a flow value `+'…'` opened at `at` — or -1. Only a quote directly\n * after \"+\" opens one, so an apostrophe in a name (`Bob's`) does not hide the comment after it.\n */\nfunction flowValueEnd(line: string, at: number): number {\n return line[at] === \"'\" && line[at - 1] === '+' ? line.indexOf(\"'\", at + 1) : -1;\n}\n\n/**\n * Rewrites the parts of a text outside its flow values `+'…'`, found exactly as the comment\n * stripper finds them, so that what the serializer escapes is what the parser would cut.\n */\nexport function rewriteOutsideFlowValues(text: string, rewrite: (part: string) => string): string {\n let rewritten = '';\n let partStart = 0;\n for (let i = 0; i < text.length; i++) {\n const valueEnd = flowValueEnd(text, i);\n if (valueEnd < 0) continue;\n rewritten += rewrite(text.slice(partStart, i)) + text.slice(i, valueEnd + 1);\n partStart = valueEnd + 1;\n i = valueEnd;\n }\n return rewritten + rewrite(text.slice(partStart));\n}\n\n/**\n * Index of the `//` that starts a line comment — or -1. Flow-value-aware (`+'http://x'>` stays\n * untouched) and URL-aware: `//` directly after `:` is a scheme separator (`url(https://…)`).\n */\nfunction indexOfLineComment(line: string): number {\n for (let i = 0; i < line.length - 1; i++) {\n const valueEnd = flowValueEnd(line, i);\n if (valueEnd > 0) i = valueEnd;\n else if (line[i] === '/' && line[i + 1] === '/' && line[i - 1] !== ':') return i;\n }\n return -1;\n}\n\n/** Reads `<Name> [<address>]`, the text after the `url` keyword — or null. indexOf keeps it linear. */\nexport function readUrlDefinition(after: string): { name: string; address: string } | null {\n const open = after.indexOf('[');\n const close = after.lastIndexOf(']');\n const name = open > 0 ? after.slice(0, open).trim() : '';\n const address = open > 0 && close > open ? after.slice(open + 1, close).trim() : '';\n if (!name || !address || after.slice(close + 1).trim() !== '') return null;\n return { name, address };\n}\n\nfunction isUrlDefinition(line: string): boolean {\n return keywordOf(line) === 'url' && readUrlDefinition(line.trim().slice('url'.length)) !== null;\n}\n\n/**\n * Strips `//` and `/* … *\\/` comments off source lines, tracking block comments across lines.\n * Returns the code part and the comment fragments (to keep them losslessly).\n */\nexport class CommentStripper {\n private inBlockComment = false;\n\n get insideBlockComment(): boolean {\n return this.inBlockComment;\n }\n\n strip(raw: string): { code: string; comments: string[] } {\n const comments: string[] = [];\n let working = raw;\n if (this.inBlockComment) {\n const close = working.indexOf('*/');\n if (close < 0) return { code: '', comments: [raw] };\n comments.push(working.slice(0, close + 2));\n working = working.slice(close + 2);\n this.inBlockComment = false;\n }\n // OWM exempts url lines from comment stripping, for the `//` in their address. Only a\n // definition holds an address; a link whose left name starts with \"URL\" is stripped as usual.\n const code = isUrlDefinition(working) ? working : this.stripComments(working, comments);\n return { code, comments };\n }\n\n /** Left to right, so a `/*` inside a `//` comment opens no block comment. */\n private stripComments(line: string, comments: string[]): string {\n let code = '';\n let rest = line;\n for (;;) {\n const lineComment = indexOfLineComment(rest);\n const open = indexOutsideFlowValues(rest, '/*');\n if (lineComment >= 0 && (open < 0 || lineComment < open)) {\n comments.push(rest.slice(lineComment));\n return code + rest.slice(0, lineComment);\n }\n if (open < 0) return code + rest;\n const close = rest.indexOf('*/', open + 2);\n if (close < 0) {\n comments.push(rest.slice(open));\n this.inBlockComment = true;\n return code + rest.slice(0, open);\n }\n comments.push(rest.slice(open, close + 2));\n code += `${rest.slice(0, open)} `;\n rest = rest.slice(close + 2);\n }\n }\n}\n\nfunction indexOutsideFlowValues(line: string, needle: string): number {\n for (let i = 0; i + needle.length <= line.length; i++) {\n const valueEnd = flowValueEnd(line, i);\n if (valueEnd > 0) i = valueEnd;\n else if (line.startsWith(needle, i)) return i;\n }\n return -1;\n}\n\nexport interface InlineDecorators {\n readonly market?: boolean;\n readonly ecosystem?: boolean;\n readonly inertia?: boolean;\n readonly method?: Method;\n}\n\nexport type MutableDecorators = {\n -readonly [Key in keyof InlineDecorators]: InlineDecorators[Key];\n};\n\nconst PAREN_RE = /\\(([^()]*)\\)/g;\nexport const METHODS: ReadonlySet<string> = new Set(['build', 'buy', 'outsource']);\n\n/**\n * Reads the inline decorators of a component line:\n * - parenthesized: `(market)`, `(ecosystem)`, `(build|buy|outsource)`, combined `(market, outsource)`\n * - trailing keyword: `inertia`\n * Returns the decorators found and the line stripped of them.\n *\n * @deprecated Kept for API compatibility; the parser no longer uses it. It reads every `( … )` group\n * and `inertia` anywhere on the line and lets the last method win, while `parseDSL` reads decorators\n * only after the coordinates and keeps the first method.\n */\nexport function parseDecorators(line: string): { decorators: InlineDecorators; rest: string } {\n const dec: MutableDecorators = {};\n let rest = line;\n\n rest = rest.replace(PAREN_RE, (_full, group: string) => {\n for (const rawToken of group.split(',')) {\n const token = rawToken.trim().toLowerCase();\n if (token === 'market') dec.market = true;\n else if (token === 'ecosystem') dec.ecosystem = true;\n else if (token === 'inertia') dec.inertia = true;\n else if (METHODS.has(token)) dec.method = token as Method;\n }\n return ' ';\n });\n\n // trailing keyword `inertia` (unparenthesized)\n rest = rest.replace(/\\binertia\\b/i, () => {\n dec.inertia = true;\n return ' ';\n });\n\n return { decorators: dec, rest };\n}\n\nexport interface TextSpan {\n readonly at: number;\n readonly text: string;\n}\n\n/** One piece of the text after a statement's coordinates; `at` is its offset in the scanned text. */\nexport type SuffixToken = TextSpan &\n (\n | { readonly kind: 'color'; readonly color: string }\n | { readonly kind: 'height'; readonly value: string }\n | { readonly kind: 'label'; readonly dx: string; readonly dy: string }\n | { readonly kind: 'url'; readonly ref: string }\n | { readonly kind: 'group'; readonly items: readonly TextSpan[] }\n | { readonly kind: 'inertia' }\n | { readonly kind: 'word' }\n );\n\n// Color as an (OWM-backwards-compatible) extension: `(color #rrggbb)` OR `(color green)`.\n// Deliberately placed after the coordinates -> the OWM parser ignores the rest instead of pulling\n// it into the note text. Accepts hex or CSS color names.\nconst COLOR_SOURCE = String.raw`\\(\\s*color\\s+(#[0-9a-fA-F]{3,8}|[a-zA-Z][\\w-]*)\\s*\\)`;\nconst HEIGHT_SOURCE = String.raw`\\(\\s{0,8}y\\s{1,8}([^\\s()]+)\\s{0,8}\\)`;\nconst LABEL_OFFSET_SOURCE = String.raw`label\\s*\\[\\s*([-\\d.]+)\\s*,\\s*([-\\d.]+)\\s*\\]`;\nconst COLOR_TOKEN_RE = new RegExp(COLOR_SOURCE, 'iy');\nconst HEIGHT_TOKEN_RE = new RegExp(HEIGHT_SOURCE, 'y');\nconst LABEL_TOKEN_RE = new RegExp(LABEL_OFFSET_SOURCE, 'iy');\nconst URL_TOKEN_RE = /url\\s{0,8}\\(([^()]*)\\)/iy;\nconst GROUP_TOKEN_RE = /\\(([^()]*)\\)/y;\nconst INERTIA_TOKEN_RE = /inertia\\b/iy;\nconst WORD_TOKEN_RE = /\\(?[^\\s(]*/y;\n\nfunction matchAt(pattern: RegExp, text: string, at: number): RegExpExecArray | null {\n pattern.lastIndex = at;\n return pattern.exec(text);\n}\n\nfunction groupItems(content: string, contentAt: number): TextSpan[] {\n const items: TextSpan[] = [];\n let itemStart = 0;\n for (const raw of content.split(',')) {\n const leading = raw.length - raw.trimStart().length;\n const text = raw.trim();\n if (text) items.push({ at: contentAt + itemStart + leading, text });\n itemStart += raw.length + 1;\n }\n return items;\n}\n\nfunction readSuffixToken(text: string, at: number): SuffixToken {\n let m: RegExpExecArray | null;\n if ((m = matchAt(COLOR_TOKEN_RE, text, at))) {\n return { at, text: m[0], kind: 'color', color: m[1]! };\n }\n if ((m = matchAt(HEIGHT_TOKEN_RE, text, at))) {\n return { at, text: m[0], kind: 'height', value: m[1]! };\n }\n if ((m = matchAt(LABEL_TOKEN_RE, text, at))) {\n return { at, text: m[0], kind: 'label', dx: m[1]!, dy: m[2]! };\n }\n if ((m = matchAt(URL_TOKEN_RE, text, at))) {\n return { at, text: m[0], kind: 'url', ref: m[1]!.trim() };\n }\n if ((m = matchAt(GROUP_TOKEN_RE, text, at))) {\n return { at, text: m[0], kind: 'group', items: groupItems(m[1]!, at + 1) };\n }\n if ((m = matchAt(INERTIA_TOKEN_RE, text, at))) return { at, text: m[0], kind: 'inertia' };\n return { at, text: matchAt(WORD_TOKEN_RE, text, at)![0], kind: 'word' };\n}\n\n/**\n * Splits the text after a statement's coordinates into its suffixes: `(color …)`, `(y …)`,\n * `label [dx, dy]`, `url(…)`, other `( … )` groups, `inertia` and any other word.\n */\nexport function scanSuffix(text: string): SuffixToken[] {\n const tokens: SuffixToken[] = [];\n let at = 0;\n while (at < text.length) {\n if (/\\s/.test(text[at]!)) {\n at++;\n continue;\n }\n const token = readSuffixToken(text, at);\n tokens.push(token);\n at += token.text.length;\n }\n return tokens;\n}\n\nconst WHOLE_COLOR_GROUP_RE = new RegExp(`^${COLOR_SOURCE}$`, 'i');\nconst WHOLE_HEIGHT_GROUP_RE = new RegExp(`^${HEIGHT_SOURCE}$`);\n\n/**\n * Splits trailing `(color …)` and `(y …)` groups off a text. Read from the end with indexOf, so a\n * word like \"url\" before them stays part of the text and long lines stay linear.\n */\nexport function splitTrailingGroups(\n text: string,\n kinds: { readonly color: boolean; readonly height: boolean },\n): { rest: string; groups: string[] } {\n const groups: string[] = [];\n let end = text.trimEnd().length;\n while (text[end - 1] === ')') {\n const open = text.lastIndexOf('(', end - 1);\n const group = text.slice(Math.max(open, 0), end);\n const wanted =\n (kinds.color && WHOLE_COLOR_GROUP_RE.test(group)) ||\n (kinds.height && WHOLE_HEIGHT_GROUP_RE.test(group));\n if (open < 0 || !wanted) break;\n groups.push(group);\n end = open;\n while (end > 0 && /\\s/.test(text[end - 1]!)) end--;\n }\n return { rest: text.slice(0, end), groups: groups.reverse() };\n}\n\n/** A `(color …)` directly at the start of the text (annotations write their text after it). */\nexport function splitLeadingColor(text: string): { color?: string; rest: string } {\n const start = text.length - text.trimStart().length;\n const m = matchAt(COLOR_TOKEN_RE, text, start);\n if (!m) return { rest: text };\n return { color: m[1]!, rest: text.slice(start + m[0].length) };\n}\n\nexport interface LabelOffsetToken {\n readonly dx: number;\n readonly dy: number;\n}\n\n// The serializer writes numbers rounded to three decimals; beyond this magnitude that output\n// switches to exponent notation or loses digits, so the value would not read back the same.\nconst MAX_UNCLAMPED_MAGNITUDE = 1e12;\n\n/** Whether the model can hold the number unclamped (offsets, sizes) and write it back unchanged. */\nexport function isRoundTrippableNumber(value: number): boolean {\n return Number.isFinite(value) && Math.abs(value) <= MAX_UNCLAMPED_MAGNITUDE;\n}\n\nexport function readUnclampedNumber(text: string): number | null {\n const value = Number(text);\n return isRoundTrippableNumber(value) ? value : null;\n}\n\nconst LABEL_OFFSET_RE = new RegExp(String.raw`\\b${LABEL_OFFSET_SOURCE}`, 'i');\n\n/**\n * Reads an optional `label [dx, dy]` (pixel offset) and returns it plus the stripped line.\n * `unreadable` holds the matched text when a number in it cannot be read.\n */\nexport function parseLabelOffset(line: string): {\n labelOffset: LabelOffsetToken | null;\n rest: string;\n unreadable?: string;\n} {\n const m = LABEL_OFFSET_RE.exec(line);\n if (!m) return { labelOffset: null, rest: line };\n const dx = readUnclampedNumber(m[1]!);\n const dy = readUnclampedNumber(m[2]!);\n const rest = line.replace(LABEL_OFFSET_RE, ' ');\n if (dx === null || dy === null) return { labelOffset: null, rest, unreadable: m[0] };\n return { labelOffset: { dx, dy }, rest };\n}\n\n// A keyword ends at a character that cannot continue a word, also a non-ASCII letter: `componentä`\n// is an unknown statement, not a component named \"ä\".\nconst KEYWORD_RE = /^\\s*([A-Za-z][\\w-]*)(?![\\w\\p{L}\\p{M}\\p{N}-])/u;\n\n/** First word (keyword) of a line, lowercased. */\nexport function keywordOf(line: string): string {\n const m = KEYWORD_RE.exec(line);\n return m ? m[1]!.toLowerCase() : '';\n}\n\nexport function slug(label: string): string {\n return (\n label\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/^_/, '')\n .replace(/_$/, '') || 'x'\n );\n}\n","/**\n * How names, texts and numbers are written into the DSL. Shared by the serializer and the parser:\n * the parser reads them the way the serializer will write them, so a second parse yields the same\n * model.\n */\nimport { rewriteOutsideFlowValues } from './lexer.js';\n\n/** Types referenced BY THEIR NAME in the OWM DSL (edge endpoints + namespace). */\nexport const NAMED_TYPES: ReadonlySet<string> = new Set([\n 'anchor',\n 'component',\n 'accelerator',\n 'submap',\n]);\n\nfunction defaultName(type: string): string {\n switch (type) {\n case 'anchor':\n return 'User';\n case 'accelerator':\n return 'Accelerator';\n case 'submap':\n return 'Submap';\n case 'pipeline':\n return 'Pipeline';\n default:\n return 'Component';\n }\n}\n\nexport function roundAsWritten(n: number): number {\n return Math.round(n * 1000) / 1000;\n}\n\nconst DIVISION_SLASH = '∕';\nconst FULLWIDTH_PLUS = '+';\nconst FULLWIDTH_LEFT_BRACE = '{';\n\n/**\n * Comment markers would cut the line on the next parse, so they are written with U+2215 instead\n * of \"/\". `//` directly after \":\" stays: the parser reads it as part of an address (`https://`).\n * So do markers inside a flow value `+'…'`, which the parser does not read as comments either.\n */\nexport function escapeCommentMarkers(text: string): string {\n return rewriteOutsideFlowValues(text, (part) =>\n part.replace(/\\/\\*/g, `${DIVISION_SLASH}*`).replace(/(?<!:)\\/\\//g, DIVISION_SLASH.repeat(2)),\n );\n}\n\n/** A text as it is written on one DSL line: line breaks become spaces, comment markers are escaped. */\nexport function writtenText(text: string): string {\n return escapeCommentMarkers(text.replace(/\\r?\\n/g, ' '));\n}\n\n/** Note texts keep their line breaks as a literal `\\n`. */\nexport function writtenNoteText(text: string): string {\n return escapeCommentMarkers(text).replace(/\\r?\\n/g, '\\\\n');\n}\n\n/**\n * A name is written where a link line reads its names, so nothing in it may read as link syntax:\n * `->` becomes `→`, a `+` that would start a flow operator (`+>`, `+<`, `+'`) becomes `+`, and a\n * leading `{` (which would open a pipeline block) becomes `{`. An empty name gets the type's default.\n */\nexport function writtenName(label: string, elementType: string): string {\n const name = label\n .replace(/\\r?\\n/g, ' ')\n .replace(/->/g, '→')\n .replace(/\\+(?=['<>])/g, FULLWIDTH_PLUS)\n .trim()\n .replace(/^\\{/, FULLWIDTH_LEFT_BRACE);\n return escapeCommentMarkers(name) || defaultName(elementType);\n}\n\n/** Hands out names that are unique within the DSL: a repeated name gets a suffix (`Name 2`). */\nexport class UniqueNames {\n private readonly used = new Set<string>();\n\n claim(base: string): string {\n let name = base;\n let suffix = 2;\n while (this.used.has(name)) name = `${base} ${suffix++}`;\n this.used.add(name);\n return name;\n }\n}\n","import {\n CURRENT_SCHEMA_VERSION,\n validateMap,\n type AcceleratorElement,\n type AnchorElement,\n type AnnotationElement,\n type DrawingElement,\n type DrawingStrokeStyle,\n type AttitudeElement,\n type AttitudeKind,\n type ComponentDecorators,\n type ComponentElement,\n type Coordinate,\n type MapConfig,\n type MapEdge,\n type MapElement,\n type MapStyle,\n type Method,\n type Movement,\n type NoteElement,\n type PipelineElement,\n type SubmapElement,\n type WardleyMap,\n} from '@miragon/wardley-schema-model';\nimport {\n CommentStripper,\n METHODS,\n isRoundTrippableNumber,\n keywordOf,\n parseCoords,\n parseLabelOffset,\n parseMultiCoords,\n parsePositions,\n readUnclampedNumber,\n readUrlDefinition,\n scanSuffix,\n slug,\n splitAtCoords,\n splitAtCoords4,\n splitAtFirstChildTuple,\n splitAtTuple,\n splitLeadingColor,\n splitTrailingGroups,\n type InlineDecorators,\n type LabelOffsetToken,\n type MutableDecorators,\n type SuffixToken,\n type TextSpan,\n} from './lexer.js';\nimport { UniqueNames, escapeCommentMarkers, roundAsWritten, writtenName } from './names.js';\n\n/** Splits `A -> B` at the FIRST arrow — plain indexOf, immune to regex backtracking. */\nfunction splitDependency(core: string): { left: string; right: string } | null {\n const arrow = core.indexOf('->');\n if (arrow <= 0) return null;\n const left = core.slice(0, arrow).trim();\n const right = core.slice(arrow + 2).trim();\n return left && right ? { left, right } : null;\n}\n/**\n * Splits a flow line at the FIRST valid operator (`+>`, `+<>`, `+<`, `+'value'>`/`+'value'<>`)\n * via a linear scan — same semantics as the previous lazy regex, but immune to backtracking.\n */\nfunction splitFlow(\n core: string,\n): { left: string; right: string; op: string; value?: string } | null {\n for (let i = 1; i < core.length; i++) {\n if (core[i] !== '+') continue;\n let j = i + 1;\n let value: string | undefined;\n if (core[j] === \"'\") {\n const end = core.indexOf(\"'\", j + 1);\n if (end < 0) continue;\n value = core.slice(j + 1, end);\n j = end + 1;\n }\n const op = core.startsWith('<>', j)\n ? '<>'\n : core[j] === '>' || core[j] === '<'\n ? core[j]!\n : null;\n if (!op) continue;\n const left = core.slice(0, i).trim();\n const right = core.slice(j + op.length).trim();\n if (left && right) return { left, right, op, ...(value ? { value } : {}) };\n }\n return null;\n}\n// A link-shaped line starting with one of these keywords may be that statement instead\n// (`Title Search -> X` vs. `title Search -> X`); `title`, `evolution`, `y-axis` and `evolve` hold\n// `->` themselves. The declared names decide.\nconst LINK_LIKE_STATEMENT_KEYWORDS: ReadonlySet<string> = new Set([\n 'title',\n 'style',\n 'size',\n 'evolution',\n 'y-axis',\n 'annotations',\n 'annotation',\n 'evolve',\n 'line',\n]);\n// A declaration needs a tuple, which a link line has only after its `;` (`note A -> B; see [x, y]`).\n// `pipeline` is not among them: read as a statement it opens or closes pipeline blocks, which would\n// change what the other lines declare between the two readings, so such a line is always a link.\nconst DECLARATION_KEYWORDS: ReadonlySet<string> = new Set([\n 'anchor',\n 'component',\n 'market',\n 'ecosystem',\n 'note',\n 'pioneers',\n 'settlers',\n 'townplanners',\n 'url',\n 'build',\n 'buy',\n 'outsource',\n 'accelerator',\n 'deaccelerator',\n 'submap',\n]);\nconst KNOWN_STYLES: ReadonlySet<string> = new Set(['wardley', 'handwritten', 'colour', 'dark']);\n\ninterface PendingLink {\n readonly left: string;\n readonly right: string;\n readonly kind: 'dependency' | 'flow';\n readonly bidirectional?: boolean;\n /** `+<` — flow direction reversed (right -> left). */\n readonly reverse?: boolean;\n readonly flowValue?: string;\n /** Annotation text after `;`. */\n readonly label?: string;\n /** Names as the serializer writes the statement, for a line that could also be its keyword's. */\n readonly writtenNames?: { readonly left: string; readonly right: string };\n readonly raw: string;\n readonly lineNo: number;\n readonly text: string;\n}\ninterface PendingEvolve {\n readonly name: string;\n readonly newLabel?: string;\n readonly target: number;\n readonly method?: Movement['method'];\n readonly labelOffset?: LabelOffsetToken;\n /** Findings that only matter once the evolve is applied; the whole line is kept otherwise. */\n readonly notes: readonly string[];\n readonly raw: string;\n readonly lineNo: number;\n readonly text: string;\n}\ninterface PipelineChild {\n readonly name: string;\n readonly maturity: number;\n readonly decorators: InlineDecorators;\n readonly labelOffset?: LabelOffsetToken;\n readonly color?: string;\n readonly lineNo: number;\n readonly text: string;\n}\ninterface PendingPipeline {\n readonly name: string;\n readonly lineNo: number;\n readonly text: string;\n /** Explicit range; if absent (OWM v2 block form without coordinates), it is derived from the children. */\n readonly start?: number;\n readonly end?: number;\n /** Explicit height — project extension `(y 0.x)`; otherwise derived from the anchor component. */\n readonly visibility?: number;\n readonly color?: string;\n /** Findings that only matter once the pipeline is drawn; the whole line is kept otherwise. */\n readonly notes: readonly string[];\n readonly raw: string;\n readonly children: PipelineChild[];\n}\n/** Legacy standalone line `build|buy|outsource <Name>` — method on an existing component. */\ninterface PendingMethod {\n readonly name: string;\n readonly method: Method;\n readonly raw: string;\n readonly lineNo: number;\n readonly text: string;\n}\ninterface UrlDefinition {\n readonly name: string;\n readonly address: string;\n readonly lineNo: number;\n readonly text: string;\n}\n/** An `evolution`/`y-axis` line that cannot be used; `index` is its place in the passthrough. */\ninterface UnusedConfigLine {\n readonly keyword: 'evolution' | 'y-axis';\n readonly reason: string;\n readonly index: number;\n readonly line: number;\n readonly text: string;\n}\n/** A `url(Name)` reference on the element at `index`, not yet resolved. */\ninterface PendingUrlRef {\n readonly index: number;\n readonly ref: string;\n readonly line: number;\n readonly text: string;\n}\ninterface PassthroughEntry {\n readonly text: string;\n readonly isComment: boolean;\n readonly lineNo: number;\n readonly source: string;\n}\ntype Report = (message: string, line: number, text: string) => void;\n\nfunction compact<T extends Record<string, unknown>>(obj: T): T {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) if (v !== undefined) out[k] = v;\n return out as T;\n}\n\nfunction linkCore(line: string): string {\n const semi = line.indexOf(';');\n return semi >= 0 ? line.slice(0, semi) : line;\n}\n\n/** Reads `A -> B`, `A +> B`, `A +'value'<> B`, … with an optional `; annotation` — or null. */\nfunction readLink(line: string, lineNo: number, text: string): PendingLink | null {\n const semi = line.indexOf(';');\n const core = (semi >= 0 ? line.slice(0, semi) : line).trim();\n const label = semi >= 0 ? line.slice(semi + 1).trim() : '';\n const common = { ...(label ? { label } : {}), raw: line, lineNo, text };\n const dependency = splitDependency(core);\n if (dependency) return { ...dependency, kind: 'dependency', ...common };\n const flow = splitFlow(core);\n if (!flow) return null;\n return {\n left: flow.left,\n right: flow.right,\n kind: 'flow',\n bidirectional: flow.op === '<>',\n reverse: flow.op === '<',\n ...(flow.value ? { flowValue: flow.value } : {}),\n ...common,\n };\n}\n\n/**\n * Whether a link-shaped line could also be its keyword's statement; the declared names decide then.\n * A whole url definition is one too: its address may hold `->` or `+>`.\n */\nfunction couldBeStatement(line: string, keyword: string, after: string): boolean {\n return (\n LINK_LIKE_STATEMENT_KEYWORDS.has(keyword) ||\n (DECLARATION_KEYWORDS.has(keyword) && parseCoords(line) !== null) ||\n (keyword === 'url' && readUrlDefinition(after) !== null)\n );\n}\n\n/**\n * The link names of a keyword line once the serializer has written it as its statement: lowercase\n * keyword, single spaces, `->` without spaces. Deciding on these too keeps a line read as a\n * statement from turning into a link on the next parse.\n */\nfunction namesAsWritten(link: PendingLink): { left: string; right: string } {\n const keyword = keywordOf(link.left);\n const nameAfterKeyword = link.left.slice(keyword.length).trim();\n return {\n left: [keyword, nameAfterKeyword].filter(Boolean).join(' '),\n right: link.right\n .split('->')\n .map((part) => part.trim())\n .join('->'),\n };\n}\n\nfunction leftNameIsDeclared(link: PendingLink, names: ReadonlySet<string>): boolean {\n return names.has(link.left) || names.has(namesAsWritten(link).left);\n}\n\nfunction unknownStatementMessage(line: string): string {\n const core = linkCore(line);\n if (/->|\\+('[^']*')?(<>|>|<)/.test(core)) return 'Link needs a name on both sides';\n const flowValue = /\\+'[^']*'/.exec(core);\n if (flowValue) return `Flow ${flowValue[0]} has no direction — add \">\", \"<\" or \"<>\"`;\n return `Unknown statement \"${line.split(/\\s/)[0]}\"`;\n}\n\nfunction buildEdges(\n links: readonly PendingLink[],\n idOfName: (name: string) => string | undefined,\n unresolved: (link: PendingLink, name: string) => void,\n labelOf: (link: PendingLink) => string | undefined,\n): MapEdge[] {\n let dependencies = 0;\n let flows = 0;\n const edges: MapEdge[] = [];\n for (const link of links) {\n const fromId = idOfName(link.left) ?? idOfName(link.writtenNames?.left ?? link.left);\n const toId = idOfName(link.right) ?? idOfName(link.writtenNames?.right ?? link.right);\n if (!fromId || !toId) {\n unresolved(link, fromId ? link.right : link.left);\n continue;\n }\n if (link.kind === 'dependency') {\n edges.push(\n compact({\n id: `dep_${++dependencies}`,\n edgeType: 'dependency',\n from: fromId,\n to: toId,\n label: labelOf(link),\n }) as MapEdge,\n );\n continue;\n }\n // `+<` reverses the flow direction (right -> left).\n const [from, to] = link.reverse ? [toId, fromId] : [fromId, toId];\n edges.push(\n compact({\n id: `flow_${++flows}`,\n edgeType: 'flow',\n from,\n to,\n bidirectional: link.bidirectional ? true : undefined,\n flowValue: link.flowValue,\n label: labelOf(link),\n }) as MapEdge,\n );\n }\n return edges;\n}\n\n/** Finding produced while parsing — line is 1-based; `text` is that source line, trimmed. */\nexport interface ParseDiagnostic {\n readonly line: number;\n readonly message: string;\n readonly text: string;\n}\n\nexport interface ParseResult {\n readonly map: WardleyMap;\n readonly diagnostics: readonly ParseDiagnostic[];\n}\n\nclass IdAllocator {\n private readonly used = new Set<string>();\n alloc(prefix: string, label: string): string {\n const base = `${prefix}_${slug(label)}`;\n let id = base;\n let i = 2;\n while (this.used.has(id)) id = `${base}_${i++}`;\n this.used.add(id);\n return id;\n }\n}\n\n/**\n * Keyword-differentiated coordinates (component/anchor/note = [visibility, maturity];\n * pipeline = [maturityStart, maturityEnd]). Unknown lines land in `rawPassthrough`.\n */\nexport function parseDSL(text: string): WardleyMap {\n return parseDSLWithDiagnostics(text).map;\n}\n\n/**\n * Like `parseDSL`, but additionally returns findings with line numbers (uninterpretable lines,\n * unresolved references, clamped coordinates) — for editor feedback instead of silent loss.\n */\nexport function parseDSLWithDiagnostics(text: string): ParseResult {\n const reading = new MapReader(new Set()).read(text);\n // `Title Search -> X` is a link only when both names are declared, maybe further down the file:\n // the first reading collects the names. Read either way, such a line declares no name a link can\n // reach (a declaration among them has the \";\" in its name), so the second reading sees the same.\n const needsDeclaredNames = reading.keywordLinks.some((link) =>\n leftNameIsDeclared(link, reading.declaredNames),\n );\n return needsDeclaredNames\n ? new MapReader(reading.declaredNames).read(text).result\n : reading.result;\n}\n\ninterface MapReading {\n readonly result: ParseResult;\n readonly declaredNames: ReadonlySet<string>;\n /** Link-shaped lines read as their keyword's statement because their names were not declared. */\n readonly keywordLinks: readonly PendingLink[];\n}\n\nclass MapReader {\n private readonly diagnostics: ParseDiagnostic[] = [];\n private readonly ids = new IdAllocator();\n private readonly namesInUse = new UniqueNames();\n /** The first element declared under a name wins it. */\n private readonly idBySourceName = new Map<string, string>();\n private readonly idByElementName = new Map<string, string>();\n private readonly elements: MapElement[] = [];\n private readonly passthrough: PassthroughEntry[] = [];\n private readonly pendingLinks: PendingLink[] = [];\n private readonly keywordLinks: PendingLink[] = [];\n private readonly pendingEvolve: PendingEvolve[] = [];\n private readonly pendingPipeline: PendingPipeline[] = [];\n private readonly pendingMethod: PendingMethod[] = [];\n private config: MapConfig = { title: 'Untitled Map' };\n private readonly lineThatSetConfig = new Map<string, number>();\n private readonly unusedConfigLines: UnusedConfigLine[] = [];\n private annotationCounter = 0;\n private readonly comments = new CommentStripper();\n private readonly urlDefinitions: UrlDefinition[] = [];\n private readonly pendingUrlRefs: PendingUrlRef[] = [];\n /** Candidate for a `{` block opening: a block binds only to the directly preceding pipeline line. */\n private lastPipeline: PendingPipeline | null = null;\n private blockPipeline: PendingPipeline | null = null;\n private blockOpening = { line: 0, text: '' };\n private lineNo = 0;\n private currentLine = '';\n\n constructor(private readonly linkNames: ReadonlySet<string>) {}\n\n private readonly report = (message: string) => this.diag(message);\n private readonly reportAt: Report = (message, line, text) => this.diag(message, line, text);\n\n private diag(message: string, atLine = this.lineNo, text = this.currentLine): void {\n this.diagnostics.push({ line: atLine, message, text });\n }\n\n private keepLine(statement: string, lineNo = this.lineNo, source = this.currentLine): void {\n this.passthrough.push({ text: statement, isComment: false, lineNo, source });\n }\n\n private keep(statement: string, message: string): void {\n this.keepLine(statement);\n this.diag(message);\n }\n\n /** For a line that looks like a known construct but cannot be parsed. */\n private failed(line: string): void {\n this.keep(line, 'Line could not be interpreted (kept losslessly in rawPassthrough)');\n }\n\n // A reference binds to the name as written first, so `X 2` stays bound to an explicit \"X 2\" even\n // when a duplicate \"X\" was renamed to \"X 2\"; the serializer then writes that reference by the\n // element's new name, and the next parse binds it the same way.\n private idOfName(name: string): string | undefined {\n return this.idBySourceName.get(name) ?? this.idByElementName.get(name);\n }\n\n private register(sourceName: string, elementName: string, id: string): void {\n if (!this.idBySourceName.has(sourceName)) this.idBySourceName.set(sourceName, id);\n this.idByElementName.set(elementName, id);\n }\n\n private setConfig(keyword: string, update: MapConfig): void {\n const earlier = this.lineThatSetConfig.get(keyword);\n if (earlier !== undefined) {\n this.diag(`Repeated \"${keyword}\" — replaces the one on line ${earlier}`);\n }\n this.lineThatSetConfig.set(keyword, this.lineNo);\n this.config = update;\n }\n\n private keepUnusedConfigLine(\n keyword: 'evolution' | 'y-axis',\n statement: string,\n reason: string,\n ): void {\n this.unusedConfigLines.push({\n keyword,\n reason,\n index: this.passthrough.length,\n line: this.lineNo,\n text: this.currentLine,\n });\n this.keepLine(statement);\n }\n\n /**\n * Links are read before statements, as names may begin with a keyword (`Component -> X`); a link\n * has no `[a, b]` tuple before its `;`. A line that could also be its keyword's statement is a\n * link only when both names are declared.\n */\n private readsAsLink(line: string, kw: string, after: string): boolean {\n const link = parseCoords(linkCore(line)) ? null : readLink(line, this.lineNo, this.currentLine);\n if (!link) return false;\n if (!couldBeStatement(line, kw, after)) {\n this.pendingLinks.push(link);\n return true;\n }\n const declared = this.linkNames;\n const written = namesAsWritten(link);\n const leftDeclared = declared.has(link.left) || declared.has(written.left);\n if (leftDeclared && (declared.has(link.right) || declared.has(written.right))) {\n this.pendingLinks.push({ ...link, writtenNames: written });\n return true;\n }\n this.keywordLinks.push(link);\n if (leftDeclared) this.diag(`Link: \"${link.right}\" not found — read as a \"${kw}\" statement`);\n return false;\n }\n\n /** Clamps a normalized value to [0,1] — with a diagnostic instead of a later validation crash. */\n private clamp(n: number, report = this.report): number {\n if (n < 0 || n > 1) report(`Coordinate ${n} is outside [0,1] and was clamped`);\n return n < 0 ? 0 : n > 1 ? 1 : n;\n }\n\n private position(visibility: number, evolution: number): Coordinate {\n return { visibility: this.clamp(visibility), evolution: this.clamp(evolution) };\n }\n\n private reportTextBefore(before: string): void {\n if (before) this.diag(`Ignored text before the coordinates: \"${before}\"`);\n }\n\n /** A suffix written in front of the coordinates is part of the name or text (OWM). */\n private reportMisplacedSuffix(groups: readonly string[], where: string, fix: string): void {\n if (groups.length) this.diag(`\"${groups.join(' ')}\" ${where} — ${fix}`);\n }\n\n /**\n * A text as the serializer writes it. Its comment markers are protected only by flow values\n * `+'…'` within the text itself; one that other parts of the line protected is escaped now,\n * not on the next parse.\n */\n private readText(text: string, line = this.lineNo, source = this.currentLine): string {\n const written = escapeCommentMarkers(text);\n if (written !== text) {\n this.diag(\n `\"${text}\" read as \"${written}\" — \"//\" or \"/*\" there would start a comment once saved`,\n line,\n source,\n );\n }\n return written;\n }\n\n /** Names an element the way the serializer writes it, so the next parse yields the same name. */\n private nameElement(\n sourceName: string,\n elementType: string,\n atLine = this.lineNo,\n atText = this.currentLine,\n ): string {\n const base = writtenName(sourceName, elementType);\n const name = this.namesInUse.claim(base);\n if (name !== base) {\n this.diag(\n `Duplicate name \"${sourceName}\" — renamed to \"${name}\"; links bind to the first \"${sourceName}\"`,\n atLine,\n atText,\n );\n } else if (name !== sourceName) {\n this.diag(renamedMessage(sourceName, name), atLine, atText);\n }\n return name;\n }\n\n private openBlock(): void {\n if (this.lastPipeline) {\n this.blockPipeline = this.lastPipeline;\n this.blockOpening = { line: this.lineNo, text: this.currentLine };\n } else this.diag('Ignored \"{\" — a block must directly follow a pipeline line');\n this.lastPipeline = null;\n }\n\n private closeBlock(): void {\n if (this.blockPipeline) this.blockPipeline = null;\n else this.diag('Ignored \"}\" — no pipeline block is open');\n this.lastPipeline = null;\n }\n\n private endUnclosedBlock(): void {\n if (!this.blockPipeline) return;\n this.diag(\n `Pipeline block of \"${this.blockPipeline.name}\" is never closed — add \"}\"`,\n this.blockOpening.line,\n this.blockOpening.text,\n );\n this.blockPipeline = null;\n }\n\n /** A `url(Name)` reference on the element just pushed. */\n private addUrlRef(ref: string): void {\n this.pendingUrlRefs.push({\n index: this.elements.length - 1,\n ref,\n line: this.lineNo,\n text: this.currentLine,\n });\n }\n\n read(text: string): MapReading {\n const sourceLines = text.split(/\\r?\\n/);\n // The newline that ends the last line does not start another one; inside an unclosed block\n // comment that phantom line would otherwise be kept and grow the file by one line per save.\n if (sourceLines.length > 1 && sourceLines[sourceLines.length - 1] === '') sourceLines.pop();\n let blockCommentStart: { readonly line: number; readonly text: string } | null = null;\n for (let i = 0; i < sourceLines.length; i++) {\n // A carriage return left over from a `\\r\\r\\n` ending would become part of a kept comment,\n // and the serializer's line break would then turn it into a line ending of its own.\n const raw = withoutTrailingCarriageReturns(sourceLines[i]!);\n this.lineNo = i + 1;\n this.currentLine = raw.trim();\n\n const stripped = this.comments.strip(raw);\n if (!this.comments.insideBlockComment) blockCommentStart = null;\n else blockCommentStart ??= { line: this.lineNo, text: this.currentLine };\n for (const fragment of stripped.comments) {\n this.passthrough.push({\n text: fragment,\n isComment: true,\n lineNo: this.lineNo,\n source: this.currentLine,\n });\n }\n this.readCode(stripped.code.trim());\n }\n this.endUnclosedBlock();\n if (blockCommentStart) {\n const { line, text: startText } = blockCommentStart;\n this.diag(\n 'Block comment \"/*\" is never closed — the rest of the file is a comment',\n line,\n startText,\n );\n }\n return this.finish();\n }\n\n /**\n * Braces are structural tokens: `{` at the start of a line, and `}` there while a block is open\n * or on its own; `}` also ends a block line. A name starting with `}` stays a name.\n */\n private readCode(code: string): void {\n let statement = code;\n for (;;) {\n if (statement.startsWith('{')) this.openBlock();\n else if (statement.startsWith('}') && (this.blockPipeline || statement === '}')) {\n this.closeBlock();\n } else break;\n statement = statement.slice(1).trim();\n }\n const closesBlock = this.blockPipeline !== null && statement.endsWith('}');\n if (closesBlock) statement = statement.slice(0, -1).trim();\n if (statement) this.readStatement(statement);\n if (closesBlock) this.blockPipeline = null;\n }\n\n private readStatement(line: string): void {\n const kw = keywordOf(line);\n const after = line.slice(kw.length).trim();\n if (this.blockPipeline && kw === 'component' && this.readBlockChild(after)) return;\n this.lastPipeline = null;\n if (this.readsAsLink(line, kw, after)) return;\n\n switch (kw) {\n case 'title':\n this.setConfig('title', { ...this.config, title: this.readText(after) });\n return;\n case 'anchor':\n return this.readAnchor(line, after);\n case 'component':\n case 'market':\n case 'ecosystem':\n if (!this.pushComponent(after, kw)) this.failed(line);\n return;\n case 'note':\n return this.readNote(line, after);\n case 'pipeline':\n return this.readPipeline(line, after);\n case 'evolve':\n return this.readEvolve(line, after);\n case 'style':\n return this.readStyle(line, after);\n case 'size':\n return this.readSize(line, after);\n case 'evolution':\n return this.readEvolution(line, after);\n case 'y-axis':\n return this.readYAxis(line, after);\n case 'annotations':\n return this.readAnnotationsBox(line, after);\n case 'annotation':\n return this.readAnnotation(line, after);\n case 'line':\n return this.readDrawing(line, after);\n case 'pioneers':\n case 'settlers':\n case 'townplanners':\n return this.readAttitude(line, after, kw);\n case 'url':\n return this.readUrlDefinition(line, after);\n case 'build':\n case 'buy':\n case 'outsource':\n return this.readMethod(line, after, kw);\n case 'accelerator':\n case 'deaccelerator':\n return this.readAccelerator(line, after, kw);\n case 'submap':\n return this.readSubmap(line, after);\n default: {\n // A link whose name holds a tuple (`A [x] -> B`) still reads as one.\n const link = readLink(line, this.lineNo, this.currentLine);\n if (link) this.pendingLinks.push(link);\n else this.keep(line, unknownStatementMessage(line));\n }\n }\n }\n\n private readBlockChild(after: string): boolean {\n const blockPipeline = this.blockPipeline!;\n const child = parseBlockChild(after, this.report);\n if (child) {\n blockPipeline.children.push({\n ...child,\n maturity: this.clamp(child.maturity),\n lineNo: this.lineNo,\n text: this.currentLine,\n });\n return true;\n }\n if (splitAtCoords(after)?.name) {\n this.diag(\n `Component with [visibility, maturity] inside the block of pipeline \"${blockPipeline.name}\" is not a child — use [maturity]`,\n );\n }\n return false;\n }\n\n private readAnchor(line: string, after: string): void {\n const node = parseNode(after, ANCHOR_SUFFIXES, this.report);\n if (!node) return this.failed(line);\n const label = this.nameElement(node.name, 'anchor');\n const id = this.ids.alloc('anchor', label);\n const anchor: AnchorElement = compact({\n id,\n elementType: 'anchor',\n label,\n position: this.position(node.coords.a, node.coords.b),\n labelOffset: node.labelOffset,\n color: node.color,\n }) as AnchorElement;\n this.elements.push(anchor);\n this.register(node.name, label, id);\n }\n\n /** `component`/`market`/`ecosystem` and `build`/`buy`/`outsource` lines with coordinates. */\n private pushComponent(after: string, kw: string): boolean {\n const keywordMethod = METHODS.has(kw) ? (kw as Method) : undefined;\n const node = parseNode(after, COMPONENT_SUFFIXES, this.report, keywordMethod);\n if (!node) return false;\n const decorators = mergeLegacy(kw, node.decorators);\n const label = this.nameElement(node.name, 'component');\n const id = this.ids.alloc('cmp', label);\n const component: ComponentElement = compact({\n id,\n elementType: 'component',\n label,\n position: this.position(node.coords.a, node.coords.b),\n labelOffset: node.labelOffset,\n decorators: Object.keys(decorators).length ? decorators : undefined,\n color: node.color,\n }) as ComponentElement;\n this.elements.push(component);\n if (node.urlRef) this.addUrlRef(node.urlRef);\n this.register(node.name, label, id);\n return true;\n }\n\n private readNote(line: string, after: string): void {\n const split = splitAtCoords(after);\n if (!split) return this.failed(line);\n const { color } = readSuffix(split.suffix, NOTE_SUFFIXES, this.report);\n this.reportMisplacedSuffix(\n splitTrailingGroups(split.name, { color: true, height: false }).groups,\n 'before the coordinates is read as part of the text',\n 'write it after them',\n );\n // Literal `\\n` back into real line breaks (multi-line notes).\n const textPart = this.readText(split.name.replace(/\\\\n/g, '\\n'));\n const note: NoteElement = compact({\n id: this.ids.alloc('note', textPart || 'note'),\n elementType: 'note',\n label: textPart,\n position: this.position(split.coords.a, split.coords.b),\n color,\n }) as NoteElement;\n this.elements.push(note);\n }\n\n /** `pipeline X [s, e]`, `pipeline X` (block form, range from children) — optionally with `{` at the end. */\n private readPipeline(line: string, after: string): void {\n this.endUnclosedBlock();\n let body = after;\n let opensBlock = false;\n while (body.endsWith('{')) {\n if (opensBlock) this.diag('Ignored \"{\" — a block must directly follow a pipeline line');\n opensBlock = true;\n body = body.slice(0, -1).trim();\n }\n const { name, range, suffixText, misplaced } = splitPipelineLine(body);\n if (!name) return this.failed(line);\n if (range && !range.coords) this.diag(unreadableNumberMessage(range.tuple));\n this.reportMisplacedSuffix(\n misplaced,\n 'before the coordinates is read as part of the name',\n 'write it after them',\n );\n const notes: string[] = [];\n const note = (message: string) => notes.push(message);\n // Project extension `(y 0.x)`: the OWM pipeline line has no slot for the height —\n // without it a standalone pipeline snaps back to visibility 0.5 on every round trip.\n const suffix = readSuffix(suffixText, PIPELINE_SUFFIXES, note);\n const coords = range?.coords;\n const pending: PendingPipeline = {\n name,\n lineNo: this.lineNo,\n text: this.currentLine,\n ...(coords ? { start: this.clamp(coords.a), end: this.clamp(coords.b) } : {}),\n ...(suffix.height !== undefined\n ? { visibility: roundAsWritten(this.clamp(suffix.height, note)) }\n : {}),\n ...(suffix.color ? { color: suffix.color } : {}),\n notes,\n raw: line.slice(0, line.length - after.length) + body,\n children: [],\n };\n this.pendingPipeline.push(pending);\n if (opensBlock) {\n this.blockPipeline = pending;\n this.blockOpening = { line: this.lineNo, text: this.currentLine };\n } else this.lastPipeline = pending;\n }\n\n private readEvolve(line: string, after: string): void {\n const notes: string[] = [];\n const note = (message: string) => notes.push(message);\n const evolve = parseEvolve(after, note);\n if (!evolve) return this.failed(line);\n this.pendingEvolve.push({\n ...evolve,\n target: this.clamp(evolve.target, note),\n notes,\n raw: line,\n lineNo: this.lineNo,\n text: this.currentLine,\n });\n }\n\n private readStyle(line: string, after: string): void {\n const style = after.toLowerCase();\n if (KNOWN_STYLES.has(style)) {\n this.setConfig('style', { ...this.config, style: style as MapStyle });\n } else this.failed(line);\n }\n\n private readSize(line: string, after: string): void {\n const split = splitAtCoords(after);\n const coords = split?.coords;\n if (!coords || !isRoundTrippableNumber(coords.a) || !isRoundTrippableNumber(coords.b)) {\n return this.failed(line);\n }\n this.reportTextBefore(split.name);\n readSuffix(split.suffix, NO_SUFFIXES, this.report);\n this.setConfig('size', { ...this.config, size: { width: coords.a, height: coords.b } });\n }\n\n private readEvolution(line: string, after: string): void {\n // Exactly four positions (the serializer always writes four). Do NOT filter out\n // empty segments, otherwise an empty stage label is lost (the whole line would fall\n // out of the 4-slot grid and land in rawPassthrough -> axis snaps back to default).\n const parts = after.split('->').map((s) => s.trim());\n if (parts.length === 4) {\n const [first, second, third, fourth] = parts.map((part) => this.readText(part));\n const evolutionLabels = [first!, second!, third!, fourth!] as const;\n this.setConfig('evolution', { ...this.config, evolutionLabels });\n } else {\n const reason = `Evolution needs exactly four stages, found ${parts.length}`;\n this.keepUnusedConfigLine('evolution', line, reason);\n }\n }\n\n /** `y-axis Label->BottomLabel->TopLabel` — keeps the end labels losslessly too. */\n private readYAxis(line: string, after: string): void {\n const written = after.split('->').map((s) => s.trim());\n const [label, bottom, top] = written.filter(Boolean).map((part) => this.readText(part));\n if (!label) return this.keepUnusedConfigLine('y-axis', line, 'y-axis has no label');\n const { yAxisEndLabels: _replaced, ...otherConfig } = this.config;\n const ends = bottom && top ? ([bottom, top] as const) : undefined;\n this.setConfig('y-axis', {\n ...otherConfig,\n yAxisLabel: label,\n ...(ends ? { yAxisEndLabels: ends } : {}),\n });\n if (written.length !== 1 && !(written.length === 3 && written.every(Boolean))) {\n const read = [label, ...(ends ?? [])].join('->');\n this.diag(`y-axis takes \"Label\" or \"Label->Bottom->Top\" — read as \"${read}\"`);\n }\n }\n\n private readAnnotationsBox(line: string, after: string): void {\n const split = splitAtCoords(after);\n if (!split) {\n return this.keep(\n line,\n 'Annotations box has no position — not used; add [visibility, maturity]',\n );\n }\n this.reportTextBefore(split.name);\n readSuffix(split.suffix, NO_SUFFIXES, this.report);\n const annotationsBoxPosition = this.position(split.coords.a, split.coords.b);\n this.setConfig('annotations', { ...this.config, annotationsBoxPosition });\n }\n\n /** `annotation N <position> [(color …)] <text>`; the position is a tuple or a tuple list. */\n private readAnnotation(line: string, after: string): void {\n const numMatch = /^\\s*(\\d+)/.exec(after);\n const number = numMatch ? Number(numMatch[1]) : ++this.annotationCounter;\n if (!Number.isSafeInteger(number)) return this.failed(line);\n const found = parsePositions(after.replace(/^\\s*\\d+\\s*/, ''));\n if (!found) {\n return this.keep(line, 'Annotation has no position — not drawn; add [visibility, maturity]');\n }\n if (!found.tuples.length) return this.failed(line);\n for (const unreadable of found.unreadable) this.diag(unreadableNumberMessage(unreadable));\n this.reportTextBefore(found.before);\n const { color, rest } = splitLeadingColor(found.after);\n this.reportMisplacedSuffix(\n splitTrailingGroups(rest, { color: true, height: false }).groups,\n 'after the annotation text is read as part of the text',\n 'write it directly after the position',\n );\n const text = this.readText(rest.trim());\n const positions: Coordinate[] = found.tuples.map((t) => this.position(t.a, t.b));\n const annotation: AnnotationElement = {\n id: this.ids.alloc('anno', String(number)),\n elementType: 'annotation',\n label: text,\n position: positions[0]!,\n number,\n positions,\n text,\n ...(color ? { color } : {}),\n };\n this.elements.push(annotation);\n }\n\n /** Project extension (freeform drawing): `line [[v,e], [v,e], …] (closed) (dashed) (color x)`. */\n private readDrawing(line: string, after: string): void {\n const list = parseMultiCoords(after);\n if (!list || list.tuples.length < 2) return this.failed(line);\n for (const unreadable of list.unreadable) this.diag(unreadableNumberMessage(unreadable));\n this.reportTextBefore(list.before);\n const suffix = readSuffix(list.after, DRAWING_SUFFIXES, this.report);\n const points = list.tuples.map((t) => this.position(t.a, t.b));\n const drawing: DrawingElement = {\n id: this.ids.alloc('draw', 'line'),\n elementType: 'drawing',\n label: '',\n position: points[0]!,\n points,\n ...(suffix.closed ? { closed: true } : {}),\n ...(suffix.strokeStyle ? { strokeStyle: suffix.strokeStyle } : {}),\n ...(suffix.color ? { color: suffix.color } : {}),\n };\n this.elements.push(drawing);\n }\n\n /** Canonical OWM form: `<kind> [vis1, mat1, vis2, mat2]` (two corners, normalized). */\n private readAttitude(line: string, after: string, kind: string): void {\n const split = splitAtCoords4(after);\n if (!split) return this.failed(line);\n this.reportTextBefore(split.before);\n const { color } = readSuffix(split.after, ATTITUDE_SUFFIXES, this.report);\n const { a, b, c, d } = split.coords;\n const corners = [this.clamp(a), this.clamp(b), this.clamp(c), this.clamp(d)] as const;\n this.elements.push(makeAttitude(this.ids, kind as AttitudeKind, corners, color));\n }\n\n /** OWM: `url Name [https://…]` — definition, referenced via `url(Name)` on elements. */\n private readUrlDefinition(line: string, after: string): void {\n const definition = readUrlDefinition(after);\n if (!definition) return this.failed(line);\n this.urlDefinitions.push({ ...definition, lineNo: this.lineNo, text: this.currentLine });\n }\n\n /**\n * Legacy OWM: `buy <Name>` (method on an existing component) or `buy <Name> [vis, mat]` (create a\n * component with a method).\n */\n private readMethod(line: string, after: string, kw: string): void {\n if (this.pushComponent(after, kw)) return;\n if (!after) return this.keep(line, `${kw}: needs a component name — not used`);\n this.pendingMethod.push({\n name: after,\n method: kw as Method,\n raw: line,\n lineNo: this.lineNo,\n text: this.currentLine,\n });\n }\n\n private readAccelerator(line: string, after: string, kw: string): void {\n const node = parseNode(after, ACCELERATOR_SUFFIXES, this.report);\n if (!node) return this.failed(line);\n const label = this.nameElement(node.name, 'accelerator');\n const id = this.ids.alloc('accel', label);\n const accelerator: AcceleratorElement = {\n id,\n elementType: 'accelerator',\n direction: kw === 'deaccelerator' ? 'deaccelerate' : 'accelerate',\n label,\n position: this.position(node.coords.a, node.coords.b),\n ...(node.color ? { color: node.color } : {}),\n };\n this.elements.push(accelerator);\n this.register(node.name, label, id);\n }\n\n private readSubmap(line: string, after: string): void {\n const node = parseNode(after, SUBMAP_SUFFIXES, this.report);\n if (!node) return this.failed(line);\n const label = this.nameElement(node.name, 'submap');\n const id = this.ids.alloc('submap', label);\n const submap: SubmapElement = {\n id,\n elementType: 'submap',\n label,\n position: this.position(node.coords.a, node.coords.b),\n ...(node.color ? { color: node.color } : {}),\n };\n this.elements.push(submap);\n if (node.urlRef) this.addUrlRef(node.urlRef);\n this.register(node.name, label, id);\n }\n\n private finish(): MapReading {\n const removedFromPassthrough = replacedConfigLines(\n this.unusedConfigLines,\n this.config,\n this.reportAt,\n );\n // BEFORE evolve/method so that evolve/buy can reference block children.\n this.resolvePipelines();\n const indexById = new Map(this.elements.map((el, index) => [el.id, index]));\n this.resolveEvolves(indexById);\n this.resolveMethods(indexById);\n const keptDefinitions = resolveUrlReferences(\n this.elements,\n this.pendingUrlRefs,\n this.urlDefinitions,\n this.reportAt,\n );\n for (const definition of keptDefinitions) {\n this.keepLine(\n `url ${definition.name} [${definition.address}]`,\n definition.lineNo,\n definition.text,\n );\n }\n\n const declaredNames = new Set([...this.idBySourceName.keys(), ...this.idByElementName.keys()]);\n const edges = buildEdges(\n this.pendingLinks,\n (name) => this.idOfName(name),\n (link, missing) => {\n this.keepLine(link.raw, link.lineNo, link.text);\n this.diag(`Link: \"${missing}\" not found`, link.lineNo, link.text);\n },\n (link) => link.label && this.readText(link.label, link.lineNo, link.text),\n );\n\n const kept = this.passthrough.filter((_, index) => !removedFromPassthrough.has(index));\n const rawPassthrough = withoutClosersOfKeptComments(kept, this.reportAt);\n const map = compact({\n schemaVersion: CURRENT_SCHEMA_VERSION,\n config: this.config,\n elements: this.elements,\n edges,\n rawPassthrough: rawPassthrough.length ? rawPassthrough : undefined,\n }) as WardleyMap;\n return {\n result: { map: validateMap(map), diagnostics: this.diagnostics },\n declaredNames,\n keywordLinks: this.keywordLinks,\n };\n }\n\n /**\n * A pipeline pairs with the component written under its name: it takes that component's height,\n * as the serializer assumes when it leaves out `(y …)`. Block children are not such components.\n */\n private resolvePipelines(): void {\n const componentByName = new Map<string, MapElement>();\n for (const el of this.elements) {\n if (el.elementType === 'component') componentByName.set(el.label, el);\n }\n for (const p of this.pendingPipeline) {\n const label = writtenName(p.name, 'pipeline');\n const component = componentByName.get(label);\n const writtenRange = pipelineRange(p);\n if (!writtenRange) {\n this.keepLine(p.raw, p.lineNo, p.text);\n // OWM reads `pipeline X` next to `component X` as a pipeline that is not drawn.\n if (!component) {\n this.diag(\n `Pipeline \"${p.name}\" has no range — not drawn; add [start, end] or child components`,\n p.lineNo,\n p.text,\n );\n }\n continue;\n }\n for (const message of p.notes) this.diag(message, p.lineNo, p.text);\n if (label !== p.name) this.diag(renamedMessage(p.name, label), p.lineNo, p.text);\n const range = widenEmptyRange(writtenRange);\n const widened = range.start !== writtenRange.start || range.end !== writtenRange.end;\n if (widened && !writtenRange.fromChildren) {\n this.diag(\n `Pipeline \"${p.name}\" range is empty or reversed — changed to [${range.start}, ${range.end}]`,\n p.lineNo,\n p.text,\n );\n }\n const visibility = p.visibility ?? component?.position.visibility ?? 0.5;\n const id = this.ids.alloc('pipeline', label);\n // Standalone pipelines (no same-named component) are edge endpoints themselves; an element\n // with that name still wins.\n if (this.idOfName(p.name) === undefined && this.idOfName(label) === undefined) {\n this.register(p.name, label, id);\n }\n const childNames = p.children.map((child) =>\n this.nameElement(child.name, 'component', child.lineNo, child.text),\n );\n const { pipeline, children } = pipelineElements(\n { ...p, name: label },\n id,\n visibility,\n range,\n this.ids,\n childNames,\n );\n this.elements.push(pipeline);\n children.forEach((child, index) => {\n this.elements.push(child);\n this.register(p.children[index]!.name, child.label, child.id);\n });\n }\n }\n\n private componentIndex(name: string, indexById: ReadonlyMap<string, number>): number {\n const index = indexById.get(this.idOfName(name) ?? '');\n return index !== undefined && this.elements[index]!.elementType === 'component' ? index : -1;\n }\n\n private resolveEvolves(indexById: ReadonlyMap<string, number>): void {\n const evolveLineOf = new Map<string, number>();\n for (const ev of this.pendingEvolve) {\n const index = this.componentIndex(ev.name, indexById);\n if (index < 0) {\n this.keepLine(ev.raw, ev.lineNo, ev.text);\n const misplaced = splitMisplacedEvolveSuffix(ev.name);\n const hint =\n misplaced && this.componentIndex(misplaced.name, indexById) >= 0\n ? misplacedEvolveSuffixHint(misplaced)\n : '';\n this.diag(`evolve: component \"${ev.name}\" not found${hint}`, ev.lineNo, ev.text);\n continue;\n }\n for (const message of ev.notes) this.diag(message, ev.lineNo, ev.text);\n const component = this.elements[index] as ComponentElement;\n const earlier = evolveLineOf.get(component.id);\n if (earlier !== undefined) {\n const message = `Repeated evolve for \"${ev.name}\" — replaces the one on line ${earlier}`;\n this.diag(message, ev.lineNo, ev.text);\n }\n evolveLineOf.set(component.id, ev.lineNo);\n const movement = compact({\n targetEvolution: ev.target,\n newLabel: ev.newLabel && this.readText(ev.newLabel, ev.lineNo, ev.text),\n method: ev.method,\n labelOffset: ev.labelOffset,\n }) as Movement;\n this.elements[index] = { ...component, movement };\n }\n }\n\n /** Legacy standalone methods (`buy <name>`). */\n private resolveMethods(indexById: ReadonlyMap<string, number>): void {\n for (const pm of this.pendingMethod) {\n const index = this.componentIndex(pm.name, indexById);\n if (index < 0) {\n this.keepLine(pm.raw, pm.lineNo, pm.text);\n this.diag(`${pm.method}: component \"${pm.name}\" not found`, pm.lineNo, pm.text);\n continue;\n }\n const el = this.elements[index] as ComponentElement;\n const replaced = el.decorators?.method;\n if (replaced && replaced !== pm.method) {\n const message = `${pm.method}: \"${pm.name}\" already has the method \"${replaced}\" — replaced`;\n this.diag(message, pm.lineNo, pm.text);\n }\n this.elements[index] = { ...el, decorators: { ...el.decorators, method: pm.method } };\n }\n }\n}\n\nfunction renamedMessage(sourceName: string, name: string): string {\n return `Name \"${sourceName}\" renamed to \"${name}\" — a name cannot hold link operators (\"->\", \"+>\", \"+<\", \"+'\"), comment markers or a leading \"{\"`;\n}\n\nfunction withoutTrailingCarriageReturns(line: string): string {\n let end = line.length;\n while (end > 0 && line[end - 1] === '\\r') end--;\n return line.slice(0, end);\n}\n\n/**\n * The serializer writes rawPassthrough after everything else, in order. A kept line that lands\n * behind a kept `/*` without its `*\\/` is inside that comment on the next parse, and a `*\\/` in it\n * would end the comment early, so it is removed there. Elsewhere a `*\\/` without a `/*` is plain\n * text and stays.\n */\nfunction withoutClosersOfKeptComments(\n entries: readonly PassthroughEntry[],\n report: Report,\n): string[] {\n const nextParse = new CommentStripper();\n return entries.map((entry) => {\n let text = entry.text;\n if (!entry.isComment && nextParse.insideBlockComment && text.includes('*/')) {\n text = text.replaceAll('*/', ' ');\n report(\n 'Ignored \"*/\" — this line is kept after an unclosed \"/*\" and would end that comment',\n entry.lineNo,\n entry.source,\n );\n }\n nextParse.strip(text);\n return text;\n });\n}\n\n/**\n * The serializer writes the config instead of an unusable `evolution`/`y-axis` line once another\n * line sets it; the parser drops such a line the same way. Returns their passthrough indexes.\n */\nfunction replacedConfigLines(\n unusedLines: readonly UnusedConfigLine[],\n config: MapConfig,\n report: Report,\n): Set<number> {\n const configIsSet = {\n evolution: config.evolutionLabels !== undefined,\n 'y-axis': config.yAxisLabel !== undefined,\n };\n const replacedIndexes = new Set<number>();\n for (const unused of unusedLines) {\n const replaced = configIsSet[unused.keyword];\n if (replaced) replacedIndexes.add(unused.index);\n const outcome = replaced ? `removed; another \"${unused.keyword}\" line sets it` : 'not used';\n report(`${unused.reason} — ${outcome}`, unused.line, unused.text);\n }\n return replacedIndexes;\n}\n\n/**\n * Resolves `url(Name)` references into component.url / submap.urlRef. A later definition of a name\n * replaces an earlier one. Returns, in source order, the definitions to keep losslessly: those no\n * element references and those replaced.\n */\nfunction resolveUrlReferences(\n elements: MapElement[],\n refs: readonly PendingUrlRef[],\n definitions: readonly UrlDefinition[],\n report: Report,\n): UrlDefinition[] {\n const definitionByName = new Map<string, UrlDefinition>();\n const replaced = new Set<UrlDefinition>();\n for (const definition of definitions) {\n const earlier = definitionByName.get(definition.name);\n if (earlier) {\n replaced.add(earlier);\n report(\n `Repeated url definition \"${definition.name}\" — replaces the one on line ${earlier.lineNo}, which is kept unused`,\n definition.lineNo,\n definition.text,\n );\n }\n definitionByName.set(definition.name, definition);\n }\n const used = new Set<UrlDefinition>();\n for (const { index, ref, line, text } of refs) {\n const definition = definitionByName.get(ref);\n if (definition) used.add(definition);\n // Also accept a directly embedded address (`url(https://…)`).\n const address = definition?.address ?? (/^[a-z][\\w+.-]*:\\/\\//i.test(ref) ? ref : undefined);\n if (!address) {\n report(`url(${ref}) has no matching \"url ${ref} [address]\" line — ignored`, line, text);\n continue;\n }\n const el = elements[index]!;\n if (el.elementType === 'component') elements[index] = { ...el, url: address };\n else if (el.elementType === 'submap') elements[index] = { ...el, urlRef: address };\n }\n return definitions.filter((definition) => replaced.has(definition) || !used.has(definition));\n}\n\ninterface ParsedNode {\n readonly name: string;\n readonly coords: { a: number; b: number };\n readonly decorators: InlineDecorators;\n readonly labelOffset?: LabelOffsetToken;\n /** `url(Name)` reference (definition name, not yet resolved). */\n readonly urlRef?: string;\n /** Project extension `(color …)` — supported on every element line. */\n readonly color?: string;\n}\n\n/**\n * Parses `<name> [a, b] <suffixes>`. Suffixes are looked up ONLY AFTER the coordinates —\n * parentheses (`Tea (green)`) or words like \"inertia\" inside the name stay untouched.\n */\nfunction parseNode(\n after: string,\n suffixes: SuffixSlots,\n report: (message: string) => void,\n keywordMethod?: Method,\n): ParsedNode | null {\n const split = splitAtCoords(after);\n if (!split || !split.name) return null;\n const suffix = readSuffix(split.suffix, suffixes, report, 'after the coordinates', keywordMethod);\n return compact({\n name: split.name,\n coords: split.coords,\n decorators: suffix.decorators,\n labelOffset: suffix.labelOffset,\n urlRef: suffix.urlRef,\n color: suffix.color,\n }) as ParsedNode;\n}\n\n/** The suffixes a statement can hold after its coordinates; anything else is reported and dropped. */\ntype SuffixSlot = 'color' | 'decorators' | 'method' | 'label' | 'url' | 'height' | 'stroke';\ntype SuffixSlots = ReadonlySet<SuffixSlot>;\n\nconst COMPONENT_SUFFIXES: SuffixSlots = new Set(['color', 'decorators', 'label', 'url']);\nconst PIPELINE_CHILD_SUFFIXES: SuffixSlots = new Set(['color', 'decorators', 'label']);\nconst ANCHOR_SUFFIXES: SuffixSlots = new Set(['color', 'label']);\nconst SUBMAP_SUFFIXES: SuffixSlots = new Set(['color', 'url']);\nconst ACCELERATOR_SUFFIXES: SuffixSlots = new Set(['color']);\nconst NOTE_SUFFIXES: SuffixSlots = new Set(['color']);\nconst ATTITUDE_SUFFIXES: SuffixSlots = new Set(['color']);\nconst PIPELINE_SUFFIXES: SuffixSlots = new Set(['color', 'height']);\nconst DRAWING_SUFFIXES: SuffixSlots = new Set(['color', 'stroke']);\nconst EVOLVE_SUFFIXES: SuffixSlots = new Set(['method']);\nconst NO_SUFFIXES: SuffixSlots = new Set();\n\ninterface SuffixReading {\n readonly color?: string;\n readonly decorators: InlineDecorators;\n readonly labelOffset?: LabelOffsetToken;\n readonly urlRef?: string;\n readonly height?: number;\n readonly closed?: boolean;\n readonly strokeStyle?: DrawingStrokeStyle;\n}\n\n/**\n * Reads the suffixes a statement can hold. The first of each single-valued suffix wins (a method\n * given as the statement keyword comes first); repeats and everything the statement cannot hold\n * are reported as ignored text, unreadable numbers as such.\n */\nfunction readSuffix(\n text: string,\n slots: SuffixSlots,\n report: (message: string) => void,\n place = 'after the coordinates',\n keywordMethod?: Method,\n): SuffixReading {\n const reading: {\n color?: string;\n labelOffset?: LabelOffsetToken;\n urlRef?: string;\n height?: number;\n closed?: boolean;\n strokeStyle?: DrawingStrokeStyle;\n } = {};\n const decorators: MutableDecorators = keywordMethod ? { method: keywordMethod } : {};\n const seen = new Set<SuffixToken['kind']>();\n const ignored: TextSpan[] = [];\n /** Whether a group item fits the statement; sets it when it does. */\n const readGroupItem = (item: string): boolean => {\n if (\n slots.has('decorators') &&\n (item === 'market' || item === 'ecosystem' || item === 'inertia')\n ) {\n decorators[item] = true;\n return true;\n }\n if ((slots.has('decorators') || slots.has('method')) && METHODS.has(item)) {\n decorators.method ??= item as Method;\n return decorators.method === item;\n }\n if (slots.has('stroke') && item === 'closed') {\n reading.closed = true;\n return true;\n }\n if (slots.has('stroke') && (item === 'dashed' || item === 'dotted')) {\n reading.strokeStyle ??= item;\n return reading.strokeStyle === item;\n }\n return false;\n };\n const firstOf = (token: SuffixToken, slot: SuffixSlot): boolean => {\n if (!slots.has(slot) || seen.has(token.kind)) return false;\n seen.add(token.kind);\n return true;\n };\n\n for (const token of scanSuffix(text)) {\n switch (token.kind) {\n case 'color':\n if (firstOf(token, 'color')) reading.color = token.color;\n else ignored.push(token);\n break;\n case 'height':\n if (firstOf(token, 'height')) {\n const height = readUnclampedNumber(token.value);\n if (height === null) report(unreadableNumberMessage(token.text));\n else reading.height = height;\n } else ignored.push(token);\n break;\n case 'label':\n if (firstOf(token, 'label')) {\n const dx = readUnclampedNumber(token.dx);\n const dy = readUnclampedNumber(token.dy);\n if (dx === null || dy === null) report(unreadableNumberMessage(token.text));\n else reading.labelOffset = { dx, dy };\n } else ignored.push(token);\n break;\n case 'url':\n if (token.ref && firstOf(token, 'url')) reading.urlRef = token.ref;\n else ignored.push(token);\n break;\n case 'inertia':\n if (slots.has('decorators')) decorators.inertia = true;\n else ignored.push(token);\n break;\n case 'group': {\n const unfit = token.items.filter((item) => !readGroupItem(item.text.toLowerCase()));\n if (unfit.length === token.items.length) ignored.push(token);\n else for (const item of unfit) ignored.push(item);\n break;\n }\n case 'word':\n ignored.push(token);\n }\n }\n if (ignored.length) report(`Ignored text ${place}: ${quotedSpans(text, ignored)}`);\n return compact({ ...reading, decorators });\n}\n\n/** The spans as they stand in the text, neighbours separated only by spaces joined into one. */\nfunction quotedSpans(text: string, spans: readonly TextSpan[]): string {\n const pieces: string[] = [];\n let start = spans[0]!.at;\n let end = start + spans[0]!.text.length;\n for (let i = 1; i < spans.length; i++) {\n const span = spans[i]!;\n if (text.slice(end, span.at).trim() !== '') {\n pieces.push(text.slice(start, end));\n start = span.at;\n }\n end = span.at + span.text.length;\n }\n pieces.push(text.slice(start, end));\n return pieces.map((piece) => `\"${piece}\"`).join(', ');\n}\n\n/**\n * Splits `<name> [start, end] <suffixes>`; without a range, trailing `(color …)`/`(y …)` are the\n * suffixes. `misplaced` are such groups written at the end of the name before a range.\n */\nfunction splitPipelineLine(body: string): {\n name: string;\n range: { tuple: string; coords: { a: number; b: number } | null } | null;\n suffixText: string;\n misplaced: readonly string[];\n} {\n const kinds = { color: true, height: true };\n const split = splitAtTuple(body);\n if (split) {\n return {\n name: split.before,\n range: { tuple: split.tuple, coords: split.coords },\n suffixText: split.after,\n misplaced: splitTrailingGroups(split.before, kinds).groups,\n };\n }\n const { rest, groups } = splitTrailingGroups(body, kinds);\n return { name: rest, range: null, suffixText: groups.join(' '), misplaced: [] };\n}\n\nfunction unreadableNumberMessage(text: string): string {\n return `Unreadable number in \"${text}\" — ignored`;\n}\n\ninterface PipelineRange {\n readonly start: number;\n readonly end: number;\n readonly fromChildren?: boolean;\n}\n\nfunction pipelineRange(p: PendingPipeline): PipelineRange | null {\n if (p.start !== undefined && p.end !== undefined) {\n return { start: roundAsWritten(p.start), end: roundAsWritten(p.end) };\n }\n const [first, ...others] = p.children;\n if (!first) return null;\n let start = first.maturity;\n let end = first.maturity;\n for (const child of others) {\n start = Math.min(start, child.maturity);\n end = Math.max(end, child.maturity);\n }\n return { start: roundAsWritten(start), end: roundAsWritten(end), fromChildren: true };\n}\n\n/** The model needs end > start; OWM keeps empty or reversed ranges as written. */\nfunction widenEmptyRange({ start, end }: PipelineRange): PipelineRange {\n if (end > start) return { start, end };\n const widenedStart = start >= 1 ? 0.95 : start;\n return { start: widenedStart, end: roundAsWritten(Math.min(1, widenedStart + 0.05)) };\n}\n\nfunction pipelineElements(\n p: PendingPipeline,\n id: string,\n visibility: number,\n range: PipelineRange,\n ids: IdAllocator,\n childNames: readonly string[],\n): { pipeline: PipelineElement; children: ComponentElement[] } {\n const children = p.children.map(\n (c, index) =>\n compact({\n id: ids.alloc('cmp', childNames[index]!),\n elementType: 'component',\n label: childNames[index]!,\n position: { visibility, evolution: c.maturity },\n labelOffset: c.labelOffset,\n decorators: Object.keys(c.decorators).length ? c.decorators : undefined,\n pipelineId: id,\n color: c.color,\n }) as ComponentElement,\n );\n const pipeline: PipelineElement = {\n id,\n elementType: 'pipeline',\n label: p.name,\n position: { visibility, evolution: (range.start + range.end) / 2 },\n evolutionStart: range.start,\n evolutionEnd: range.end,\n childIds: children.map((child) => child.id),\n ...(p.color ? { color: p.color } : {}),\n };\n return { pipeline, children };\n}\n\n/**\n * Parses a pipeline block child line: `<name> [maturity]` (+ optional decorators/offset). The\n * first numeric tuple decides, so the name may hold other brackets: a `[visibility, maturity]`\n * component is not a child.\n */\nfunction parseBlockChild(\n after: string,\n report: (message: string) => void,\n): Omit<PipelineChild, 'lineNo' | 'text'> | null {\n const split = splitAtFirstChildTuple(after);\n if (!split?.before || split.values.length !== 1) return null;\n const maturity = Number(split.values[0]);\n if (Number.isNaN(maturity)) return null;\n const suffix = readSuffix(split.after, PIPELINE_CHILD_SUFFIXES, report);\n return compact({\n name: split.before,\n maturity,\n decorators: suffix.decorators,\n labelOffset: suffix.labelOffset,\n color: suffix.color,\n }) as Omit<PipelineChild, 'lineNo' | 'text'>;\n}\n\n/** Builds an AttitudeElement from two (arbitrarily oriented) corners; normalizes to TL/BR. */\nfunction makeAttitude(\n ids: IdAllocator,\n kind: AttitudeKind,\n [v1, m1, v2, m2]: readonly [number, number, number, number],\n color?: string,\n): AttitudeElement {\n return {\n id: ids.alloc('attitude', kind),\n elementType: 'attitude',\n kind,\n label: '',\n ...(color ? { color } : {}),\n position: {\n visibility: Math.max(v1, v2),\n evolution: Math.min(m1, m2),\n },\n corner2: {\n visibility: Math.min(v1, v2),\n evolution: Math.max(m1, m2),\n },\n };\n}\n\n/** `market`/`ecosystem` and `build`/`buy`/`outsource` as the statement keyword (legacy OWM). */\nfunction mergeLegacy(kw: string, dec: InlineDecorators): ComponentDecorators {\n const merged: Record<string, unknown> = { ...dec };\n if (kw === 'market') merged['market'] = true;\n if (kw === 'ecosystem') merged['ecosystem'] = true;\n if (METHODS.has(kw)) merged['method'] = kw;\n return compact(merged) as ComponentDecorators;\n}\n\nconst MISPLACED_EVOLVE_SUFFIX_RE = /(?:\\((build|buy|outsource)\\)|\\binertia)$/i;\n\n/** A method group or `inertia` at the end of an evolve name, which older maps wrote there. */\nfunction splitMisplacedEvolveSuffix(name: string): { name: string; suffix: string } | null {\n const m = MISPLACED_EVOLVE_SUFFIX_RE.exec(name);\n if (!m) return null;\n const rest = name.slice(0, m.index).trimEnd();\n return rest ? { name: rest, suffix: m[0] } : null;\n}\n\nfunction misplacedEvolveSuffixHint({ name, suffix }: { name: string; suffix: string }): string {\n return suffix.startsWith('(')\n ? ` — for component \"${name}\", write \"${suffix}\" after the target`\n : ` — for component \"${name}\", write \"${suffix}\" on its component line`;\n}\n\nconst NUMBER_TOKEN_RE = /(^|\\s)([-+]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[-+]?\\d+)?)(?=\\s|\\(|$)/gi;\n\n/**\n * Parses `evolve <name>[-><new name>] <target> [label [dx, dy]] [(build|buy|outsource)]` from the\n * end: the target is the last number, so numbers and parentheses inside the name stay part of it.\n */\nfunction parseEvolve(\n after: string,\n report: (message: string) => void,\n): Omit<PendingEvolve, 'raw' | 'lineNo' | 'text' | 'notes'> | null {\n const lo = parseLabelOffset(after);\n let targetMatch: RegExpExecArray | undefined;\n for (const match of lo.rest.matchAll(NUMBER_TOKEN_RE)) targetMatch = match;\n if (!targetMatch) return null;\n const targetAt = targetMatch.index + targetMatch[1]!.length;\n const namePart = lo.rest.slice(0, targetAt).trim();\n const target = Number(targetMatch[2]);\n if (!namePart || !Number.isFinite(target)) return null;\n if (lo.unreadable) report(unreadableNumberMessage(lo.unreadable));\n const tail = readSuffix(\n lo.rest.slice(targetAt + targetMatch[2]!.length),\n EVOLVE_SUFFIXES,\n report,\n 'after the evolve target',\n );\n const renameIdx = namePart.indexOf('->');\n const name = renameIdx >= 0 ? namePart.slice(0, renameIdx).trim() : namePart;\n const newLabel = renameIdx >= 0 ? namePart.slice(renameIdx + 2).trim() : undefined;\n return compact({\n name,\n newLabel: newLabel || undefined,\n target,\n method: tail.decorators.method,\n labelOffset: lo.labelOffset ?? undefined,\n }) as Omit<PendingEvolve, 'raw' | 'lineNo' | 'text' | 'notes'>;\n}\n","import type {\n ComponentDecorators,\n ComponentElement,\n LabelOffset,\n MapElement,\n WardleyMap,\n} from '@miragon/wardley-schema-model';\nimport { CommentStripper, keywordOf, readUrlDefinition } from './lexer.js';\nimport {\n NAMED_TYPES,\n UniqueNames,\n roundAsWritten,\n writtenName,\n writtenNoteText,\n writtenText,\n} from './names.js';\n\n/** Address of an element (component.url / submap.urlRef) — or undefined. */\nfunction urlOf(el: MapElement): string | undefined {\n if (el.elementType === 'component') return el.url;\n if (el.elementType === 'submap') return el.urlRef;\n return undefined;\n}\n\nfunction r(n: number): string {\n return String(roundAsWritten(n));\n}\n\n/**\n * Returns a name per element ID that is UNIQUE within the DSL for the referenceable types\n * (component/anchor/…). Because edges are serialized by name (`A -> B`), duplicate or empty\n * labels would collapse onto the same node on re-import and make arrows disappear. So on\n * collision a suffix (`Name 2`) is assigned and on an empty label a default — consistently for\n * BOTH sides (node line AND edge reference). Unique names stay unchanged. The parser names\n * elements the same way, so a parsed map passes through unchanged.\n */\nfunction uniqueNames(map: WardleyMap): Map<string, string> {\n const namesInUse = new UniqueNames();\n const byId = new Map<string, string>();\n for (const el of map.elements) {\n if (NAMED_TYPES.has(el.elementType)) {\n byId.set(el.id, namesInUse.claim(writtenName(el.label, el.elementType)));\n } else if (el.elementType === 'pipeline') {\n byId.set(el.id, writtenName(el.label, el.elementType));\n }\n }\n return byId;\n}\n\n/**\n * `url(<name>)` cannot hold parentheses, `url <name> [address]` ends the name at \"[\" and a flow\n * operator (`+'x'>`) would make the definition a link, so the definition name leaves them out; the\n * parser resolves it into the address and forgets the name. Names of definitions kept in\n * rawPassthrough are taken first: the parser lets a later definition replace an earlier one.\n */\nfunction urlDefinitionNames(\n map: WardleyMap,\n nameOf: (el: MapElement) => string,\n keptDefinitionNames: readonly string[],\n) {\n const namesInUse = new UniqueNames();\n for (const name of keptDefinitionNames) namesInUse.claim(name);\n const byId = new Map<string, string>();\n for (const el of map.elements) {\n if (!urlOf(el)) continue;\n const readable = nameOf(el)\n .replace(/[()[\\]<>]/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n byId.set(el.id, namesInUse.claim(`${readable} URL`.trim()));\n }\n return byId;\n}\n\nfunction offsetSuffix(lo: LabelOffset | undefined): string {\n return lo ? ` label [${r(lo.dx)}, ${r(lo.dy)}]` : '';\n}\n\n/** Project extension: `(color …)` after the coordinates (the OWM parser ignores it). */\nfunction colorSuffix(el: { color?: string }): string {\n return el.color ? ` (color ${el.color})` : '';\n}\n\nfunction decoratorSuffix(dec: ComponentDecorators | undefined): string {\n if (!dec) return '';\n const paren: string[] = [];\n if (dec.market) paren.push('market');\n if (dec.ecosystem) paren.push('ecosystem');\n if (dec.method) paren.push(dec.method);\n let out = '';\n if (paren.length) out += ` (${paren.join(', ')})`;\n if (dec.inertia) out += ' inertia';\n return out;\n}\n\nfunction configLines(config: WardleyMap['config']): string[] {\n const lines = [`title ${writtenText(config.title)}`];\n if (config.style) lines.push(`style ${config.style}`);\n if (config.size) lines.push(`size [${r(config.size.width)}, ${r(config.size.height)}]`);\n if (config.evolutionLabels) {\n lines.push(`evolution ${config.evolutionLabels.map(writtenText).join('->')}`);\n }\n if (config.yAxisLabel) {\n const ends = config.yAxisEndLabels;\n const endLabels = ends ? `->${writtenText(ends[0])}->${writtenText(ends[1])}` : '';\n lines.push(`y-axis ${writtenText(config.yAxisLabel)}${endLabels}`);\n }\n if (config.annotationsBoxPosition) {\n const b = config.annotationsBoxPosition;\n lines.push(`annotations [${r(b.visibility)}, ${r(b.evolution)}]`);\n }\n return lines;\n}\n\n/**\n * The rawPassthrough lines as the next parse reads them: a config keyword the map already writes\n * (e.g. an unparsable `evolution` line from externally-authored DSL) would produce a contradictory\n * duplicate line, so it is dropped (config is the truth); the same words inside a comment are kept.\n * Also returns the names of the url definitions among them.\n */\nfunction passthroughLines(map: WardleyMap): { lines: string[]; urlDefinitionNames: string[] } {\n const emitted = new Set<string>();\n if (map.config.evolutionLabels) emitted.add('evolution');\n if (map.config.yAxisLabel) emitted.add('y-axis');\n const comments = new CommentStripper();\n const lines: string[] = [];\n const urlDefinitionNames: string[] = [];\n for (const raw of map.rawPassthrough ?? []) {\n const code = comments.strip(raw).code;\n const keyword = keywordOf(code);\n if (emitted.has(keyword)) continue;\n lines.push(raw);\n const definition = keyword === 'url' ? readUrlDefinition(code.trim().slice(3)) : null;\n if (definition) urlDefinitionNames.push(definition.name);\n }\n return { lines, urlDefinitionNames };\n}\n\n/**\n * The OWM pipeline line has no slot for the height — emit the project extension `(y 0.x)` whenever\n * the visibility written differs from what re-parsing would derive (the visibility of the component\n * written under the pipeline's name, or 0.5), so standalone pipelines do not snap back to\n * mid-canvas on every round trip. The parser derives it only from components declared on their own\n * lines, never from pipeline children.\n */\nfunction pipelineHeights(\n map: WardleyMap,\n pipelineIds: ReadonlySet<string>,\n nameOf: (el: MapElement) => string,\n): (el: MapElement) => string {\n const componentVisibilityByName = new Map<string, number>();\n for (const el of map.elements) {\n if (el.elementType !== 'component') continue;\n const isChild = !!el.pipelineId && pipelineIds.has(el.pipelineId);\n if (!isChild) componentVisibilityByName.set(nameOf(el), el.position.visibility);\n }\n return (el) => {\n if (el.elementType !== 'pipeline') return '';\n const derived = componentVisibilityByName.get(nameOf(el)) ?? 0.5;\n const written = r(el.position.visibility);\n return written !== r(derived) ? ` (y ${written})` : '';\n };\n}\n\nfunction edgeLines(map: WardleyMap, nameOf: (el: MapElement) => string): string[] {\n const namesById = new Map(map.elements.map((el) => [el.id, nameOf(el)]));\n return map.edges.map((edge) => {\n const from = namesById.get(edge.from) ?? edge.from;\n const to = namesById.get(edge.to) ?? edge.to;\n const annotation = edge.label ? `; ${writtenText(edge.label)}` : '';\n if (edge.edgeType === 'dependency') return `${from} -> ${to}${annotation}`;\n const op = edge.flowValue\n ? `+'${edge.flowValue}'${edge.bidirectional ? '<>' : '>'}`\n : edge.bidirectional\n ? '+<>'\n : '+>';\n return `${from} ${op} ${to}${annotation}`;\n });\n}\n\n/**\n * Serializes a WardleyMap into Online-Wardley-Maps text. Deterministic; writes only\n * syntax the OWM parser reads back. `rawPassthrough` is appended unchanged.\n * Coordinates are keyword-differentiated (component/anchor/note = [visibility, maturity];\n * pipeline = [maturityStart, maturityEnd]).\n */\nexport function serializeDSL(map: WardleyMap): string {\n const names = uniqueNames(map);\n const nameOf = (el: MapElement): string => names.get(el.id) ?? writtenText(el.label);\n const passthrough = passthroughLines(map);\n const lines = configLines(map.config);\n\n // url definitions: one `url <Name> URL [address]` line per element with an address,\n // referenced on the element via `url(<Name> URL)` (OWM form: definition + reference).\n const urlDefNames = urlDefinitionNames(map, nameOf, passthrough.urlDefinitionNames);\n for (const el of map.elements) {\n const defName = urlDefNames.get(el.id);\n if (defName) lines.push(`url ${defName} [${urlOf(el)}]`);\n }\n const urlSuffix = (el: MapElement): string => {\n const def = urlDefNames.get(el.id);\n return def ? ` url(${def})` : '';\n };\n\n // Pipeline children (pipelineId set + pipeline exists) are emitted in the pipeline's\n // block form instead of as top-level components (OWM v2).\n const pipelineIds = new Set(\n map.elements.filter((e) => e.elementType === 'pipeline').map((e) => e.id),\n );\n const childrenByPipeline = new Map<string, ComponentElement[]>();\n for (const el of map.elements) {\n if (el.elementType !== 'component' || !el.pipelineId || !pipelineIds.has(el.pipelineId)) {\n continue;\n }\n const list = childrenByPipeline.get(el.pipelineId) ?? [];\n list.push(el);\n childrenByPipeline.set(el.pipelineId, list);\n }\n const pipelineHeight = pipelineHeights(map, pipelineIds, nameOf);\n\n const evolveLines: string[] = [];\n for (const el of map.elements) {\n if (el.elementType === 'component' && el.movement) {\n evolveLines.push(evolveLine(el, nameOf(el)));\n }\n if (el.elementType === 'component' && el.pipelineId && pipelineIds.has(el.pipelineId)) {\n continue; // emitted inside the pipeline block\n }\n lines.push(elementLine(el, nameOf(el)) + pipelineHeight(el) + urlSuffix(el));\n const kids = childrenByPipeline.get(el.id) ?? [];\n if (kids.length) {\n lines.push('{');\n for (const k of kids) {\n lines.push(\n ` component ${nameOf(k)} [${r(k.position.evolution)}]` +\n `${decoratorSuffix(k.decorators)}${colorSuffix(k)}${offsetSuffix(k.labelOffset)}`,\n );\n }\n lines.push('}');\n }\n }\n\n return [...lines, ...evolveLines, ...edgeLines(map, nameOf), ...passthrough.lines, ''].join('\\n');\n}\n\nfunction elementLine(el: MapElement, name: string): string {\n const p = el.position;\n switch (el.elementType) {\n case 'anchor':\n return `anchor ${name} [${r(p.visibility)}, ${r(p.evolution)}]${colorSuffix(el)}${offsetSuffix(el.labelOffset)}`;\n case 'component':\n return `component ${name} [${r(p.visibility)}, ${r(p.evolution)}]${decoratorSuffix(el.decorators)}${colorSuffix(el)}${offsetSuffix(el.labelOffset)}`;\n case 'note':\n // Encode line breaks as literal `\\n` -> the line-based DSL stays single-line.\n return `note ${writtenNoteText(el.label)} [${r(p.visibility)}, ${r(p.evolution)}]${colorSuffix(el)}`;\n case 'pipeline':\n return `pipeline ${name} [${r(el.evolutionStart)}, ${r(el.evolutionEnd)}]${colorSuffix(el)}`;\n case 'submap':\n return `submap ${name} [${r(p.visibility)}, ${r(p.evolution)}]${colorSuffix(el)}`;\n case 'annotation': {\n const pos =\n el.positions.length > 1\n ? `[${el.positions.map((q) => `[${r(q.visibility)}, ${r(q.evolution)}]`).join(', ')}]`\n : `[${r(p.visibility)}, ${r(p.evolution)}]`;\n return `annotation ${el.number} ${pos}${colorSuffix(el)} ${writtenText(el.text)}`;\n }\n case 'accelerator':\n return `${el.direction === 'deaccelerate' ? 'deaccelerator' : 'accelerator'} ${name} [${r(p.visibility)}, ${r(p.evolution)}]${colorSuffix(el)}`;\n case 'attitude':\n // OWM canon: two corners, normalized — `pioneers [vis1, mat1, vis2, mat2]`.\n return `${el.kind} [${r(p.visibility)}, ${r(p.evolution)}, ${r(el.corner2.visibility)}, ${r(el.corner2.evolution)}]${colorSuffix(el)}`;\n case 'drawing': {\n // Project extension (freeform drawing): tuple list + style flags.\n const pts = el.points.map((q) => `[${r(q.visibility)}, ${r(q.evolution)}]`).join(', ');\n const closed = el.closed ? ' (closed)' : '';\n const stroke = el.strokeStyle && el.strokeStyle !== 'solid' ? ` (${el.strokeStyle})` : '';\n return `line [${pts}]${closed}${stroke}${colorSuffix(el)}`;\n }\n }\n}\n\nfunction evolveLine(el: ComponentElement, name: string): string {\n const mv = el.movement!;\n const label = mv.newLabel ? `${name}->${writtenText(mv.newLabel)}` : name;\n const method = mv.method ? ` (${mv.method})` : '';\n return `evolve ${label} ${r(mv.targetEvolution)}${method}${offsetSuffix(mv.labelOffset)}`;\n}\n"]}