@miragon/wardley-dsl 0.5.3 → 0.7.0
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.
- package/README.md +38 -0
- package/dist/index.cjs +831 -75
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +43 -6
- package/dist/index.d.ts +43 -6
- package/dist/index.js +830 -77
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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"]}
|
|
1
|
+
{"version":3,"sources":["../src/lexer.ts","../src/names.ts","../src/parser.ts","../src/serializer.ts","../src/patch.ts","../src/read-back-ids.ts","../src/raw-passthrough.ts"],"names":["edge","DEFAULT_MAP_TITLE","configLines","CURRENT_SCHEMA_VERSION","validateMap","PLOT_MIN","PLOT_MAX","drawnPlotLength","withoutTrailingCarriageReturns"],"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 /** Takes a name as it is, even when it is already taken (a name the source text already uses). */\n reserve(name: string): void {\n this.used.add(name);\n }\n}\n","import {\n CURRENT_SCHEMA_VERSION,\n DEFAULT_MAP_TITLE,\n PLOT_MAX,\n PLOT_MIN,\n drawnPlotLength,\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';\nimport type { UrlReferenceHint } from './serializer.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 built: (edge: MapEdge, link: PendingLink) => void,\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 const edge = compact({\n id: `dep_${++dependencies}`,\n edgeType: 'dependency',\n from: fromId,\n to: toId,\n label: labelOf(link),\n }) as MapEdge;\n edges.push(edge);\n built(edge, link);\n continue;\n }\n // `+<` reverses the flow direction (right -> left).\n const [from, to] = link.reverse ? [toId, fromId] : [fromId, toId];\n const edge = 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 edges.push(edge);\n built(edge, link);\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\n/**\n * Where a parse read its statements: 1-based source lines per statement key (the keys\n * `serializeKeyedLines` writes). A secondary line also feeds the statement: a legacy `buy X`\n * line, or a repeated config or evolve line that the primary one replaces.\n */\nexport interface SourceMap {\n readonly primaryLineOf: ReadonlyMap<string, number>;\n readonly secondaryLinesOf: ReadonlyMap<string, readonly number[]>;\n /** Per rawPassthrough entry (same index). */\n readonly passthrough: readonly { readonly line: number; readonly isComment: boolean }[];\n /** The `{` and `}` lines of each pipeline block, by pipeline id. */\n readonly blocks: ReadonlyMap<string, { readonly open?: number; readonly close?: number }>;\n /** Pipelines written without a range: their children span it. */\n readonly rangeFromChildren: ReadonlySet<string>;\n readonly urlReferences: ReadonlyMap<string, UrlReferenceHint>;\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 return readMap(text).result;\n}\n\n/** Like `parseDSLWithDiagnostics`, plus the source lines each statement was read from. */\nexport function parseDSLWithSourceMap(\n text: string,\n): ParseResult & { readonly sourceMap: SourceMap } {\n const reading = readMap(text);\n return { ...reading.result, sourceMap: reading.sourceMap };\n}\n\nfunction readMap(text: string): MapReading {\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 ? new MapReader(reading.declaredNames).read(text) : reading;\n}\n\ninterface MapReading {\n readonly result: ParseResult;\n readonly sourceMap: SourceMap;\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: DEFAULT_MAP_TITLE };\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 private readonly declarationLineById = new Map<string, number>();\n private readonly configLinesByKeyword = new Map<string, number[]>();\n private readonly evolveLinesById = new Map<string, number[]>();\n private readonly methodLinesById = new Map<string, number[]>();\n private readonly blockLines = new Map<PendingPipeline, { open?: number; close?: number }>();\n private readonly pipelineIds = new Map<PendingPipeline, string>();\n private readonly rangeFromChildren = new Set<string>();\n\n constructor(private readonly linkNames: ReadonlySet<string>) {}\n\n private addElement(element: MapElement, line = this.lineNo): void {\n this.elements.push(element);\n this.declarationLineById.set(element.id, line);\n }\n\n private recordBlockLine(pipeline: PendingPipeline, end: 'open' | 'close'): void {\n const lines = this.blockLines.get(pipeline) ?? {};\n lines[end] = this.lineNo;\n this.blockLines.set(pipeline, lines);\n }\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 not understood — kept as written');\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 const configLines = this.configLinesByKeyword.get(keyword) ?? [];\n configLines.push(this.lineNo);\n this.configLinesByKeyword.set(keyword, configLines);\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.recordBlockLine(this.blockPipeline, 'open');\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) {\n this.recordBlockLine(this.blockPipeline, 'close');\n 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) {\n this.recordBlockLine(this.blockPipeline, 'close');\n this.blockPipeline = null;\n }\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.addElement(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.addElement(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.addElement(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.recordBlockLine(pending, 'open');\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 // The written size is kept as is (lossless round-trip); the findings only explain how it is drawn.\n const problem = sizeOutsideLimits(coords.a, coords.b);\n if (problem) this.diag(problem);\n if (!Number.isInteger(coords.a) || !Number.isInteger(coords.b)) {\n this.diag(\n `Map size ${coords.a}×${coords.b} is not in whole pixels — OWM only reads whole-pixel sizes`,\n );\n }\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.addElement(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.addElement(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.addElement(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.addElement(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.addElement(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 urlReferences = new Map<string, UrlReferenceHint>();\n const usedDefinitions = new Set<UrlDefinition>();\n const keptDefinitions = resolveUrlReferences(\n this.elements,\n this.pendingUrlRefs,\n this.urlDefinitions,\n this.reportAt,\n (element, definition) => {\n if (definition) usedDefinitions.add(definition);\n urlReferences.set(\n element.id,\n definition ? { kind: 'definition', name: definition.name } : { kind: 'embedded' },\n );\n },\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 edgeLineById = new Map<string, number>();\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 (edge, link) => edgeLineById.set(edge.id, link.lineNo),\n );\n\n const kept = this.passthrough.filter((_, index) => !removedFromPassthrough.has(index));\n const rawPassthrough = withoutClosersOfKeptComments(kept, this.reportAt);\n const sourceMap = this.sourceMap({\n removedFromPassthrough,\n usedDefinitions,\n urlReferences,\n edgeLineById,\n kept,\n });\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 sourceMap,\n declaredNames,\n keywordLinks: this.keywordLinks,\n };\n }\n\n private sourceMap(parts: {\n readonly removedFromPassthrough: ReadonlySet<number>;\n readonly usedDefinitions: ReadonlySet<UrlDefinition>;\n readonly urlReferences: ReadonlyMap<string, UrlReferenceHint>;\n readonly edgeLineById: ReadonlyMap<string, number>;\n readonly kept: readonly PassthroughEntry[];\n }): SourceMap {\n const primaryLineOf = new Map<string, number>();\n const secondaryLinesOf = new Map<string, number[]>();\n const addSecondary = (key: string, line: number) => {\n const lines = secondaryLinesOf.get(key) ?? [];\n lines.push(line);\n secondaryLinesOf.set(key, lines);\n };\n // The last line wins; the earlier ones would take over once it is gone.\n const addRepeated = (key: string, lines: readonly number[] | undefined) => {\n if (!lines?.length) return;\n primaryLineOf.set(key, lines[lines.length - 1]!);\n for (const line of lines.slice(0, -1)) addSecondary(key, line);\n };\n for (const [keyword, lines] of this.configLinesByKeyword) {\n addRepeated(`config:${keyword}`, lines);\n }\n for (const unused of this.unusedConfigLines) {\n if (parts.removedFromPassthrough.has(unused.index)) {\n addSecondary(`config:${unused.keyword}`, unused.line);\n }\n }\n for (const definition of parts.usedDefinitions) {\n primaryLineOf.set(`url:${definition.name}`, definition.lineNo);\n }\n for (const el of this.elements) {\n const isChild = el.elementType === 'component' && el.pipelineId !== undefined;\n const key = `${isChild ? 'child' : 'element'}:${el.id}`;\n const line = this.declarationLineById.get(el.id);\n if (line !== undefined) primaryLineOf.set(key, line);\n for (const methodLine of this.methodLinesById.get(el.id) ?? []) addSecondary(key, methodLine);\n addRepeated(`evolve:${el.id}`, this.evolveLinesById.get(el.id));\n }\n for (const [id, line] of parts.edgeLineById) primaryLineOf.set(`edge:${id}`, line);\n const blocks = new Map<string, { open?: number; close?: number }>();\n for (const [pipeline, lines] of this.blockLines) {\n const id = this.pipelineIds.get(pipeline);\n if (id !== undefined) blocks.set(id, lines);\n }\n return {\n primaryLineOf,\n secondaryLinesOf,\n passthrough: parts.kept.map((entry) => ({ line: entry.lineNo, isComment: entry.isComment })),\n blocks,\n rangeFromChildren: this.rangeFromChildren,\n urlReferences: parts.urlReferences,\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 this.pipelineIds.set(p, id);\n if (writtenRange.fromChildren) this.rangeFromChildren.add(id);\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.addElement(pipeline, p.lineNo);\n children.forEach((child, index) => {\n this.addElement(child, p.children[index]!.lineNo);\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 evolveLines = this.evolveLinesById.get(component.id) ?? [];\n evolveLines.push(ev.lineNo);\n this.evolveLinesById.set(component.id, evolveLines);\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 const methodLines = this.methodLinesById.get(el.id) ?? [];\n methodLines.push(pm.lineNo);\n this.methodLinesById.set(el.id, methodLines);\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 resolved: (element: MapElement, definition: UrlDefinition | undefined) => void,\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 resolved(el, definition);\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. */\nexport function 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\nfunction sizeOutsideLimits(width: number, height: number): string | null {\n const below = width < PLOT_MIN.width || height < PLOT_MIN.height;\n const above = width > PLOT_MAX.width || height > PLOT_MAX.height;\n if (!below && !above) return null;\n const drawnWidth = drawnPlotLength(width, 'width');\n const drawnHeight = drawnPlotLength(height, 'height');\n const minimum = `${PLOT_MIN.width}×${PLOT_MIN.height}`;\n const maximum = `${PLOT_MAX.width}×${PLOT_MAX.height}`;\n const limit =\n below && above\n ? `outside ${minimum} to ${maximum}`\n : below\n ? `below the minimum ${minimum}`\n : `above the maximum ${maximum}`;\n return `Map size ${width}×${height} is ${limit} — drawn at ${drawnWidth}×${drawnHeight}`;\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/** How the source text referenced an element's address, so a rewritten line keeps doing so. */\nexport type UrlReferenceHint =\n { readonly kind: 'definition'; readonly name: string } | { readonly kind: 'embedded' };\n\nexport interface SerializeHints {\n /** By element id. */\n readonly urlReferences?: ReadonlyMap<string, UrlReferenceHint>;\n}\n\n/** One output line and the statement it writes (`element:<id>`, `edge:<id>`, `config:title`, …). */\nexport interface KeyedLine {\n readonly key: string;\n readonly text: string;\n}\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\ninterface UrlPlan {\n /** In element order, one per definition name. */\n readonly definitions: readonly { readonly name: string; readonly address: string }[];\n /** What each element writes inside `url(…)`. */\n readonly referenceById: ReadonlyMap<string, string>;\n}\n\nconst EMBEDDABLE_ADDRESS_RE = /^[a-z][\\w+.-]*:\\/\\/[^\\s()]*$/i;\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 * A hinted name is the one the source text already uses; elements hinted to the same name with the\n * same address share its definition.\n */\nfunction planUrls(\n map: WardleyMap,\n nameOf: (el: MapElement) => string,\n keptDefinitionNames: readonly string[],\n hints: ReadonlyMap<string, UrlReferenceHint> | undefined,\n): UrlPlan {\n const namesInUse = new UniqueNames();\n for (const name of keptDefinitionNames) namesInUse.claim(name);\n const addressByHintedName = new Map<string, string>();\n const definitionNameById = new Map<string, string>();\n const referenceById = new Map<string, string>();\n for (const el of map.elements) {\n const address = urlOf(el);\n const hint = hints?.get(el.id);\n if (!address || !hint) continue;\n if (hint.kind === 'embedded') {\n if (EMBEDDABLE_ADDRESS_RE.test(address)) referenceById.set(el.id, address);\n continue;\n }\n const hintedAddress = addressByHintedName.get(hint.name);\n if (hintedAddress === undefined) {\n addressByHintedName.set(hint.name, address);\n namesInUse.reserve(hint.name);\n } else if (hintedAddress !== address) continue;\n definitionNameById.set(el.id, hint.name);\n }\n const definitions: { name: string; address: string }[] = [];\n const written = new Set<string>();\n for (const el of map.elements) {\n const address = urlOf(el);\n if (!address || referenceById.has(el.id)) continue;\n let name = definitionNameById.get(el.id);\n if (name === undefined) {\n const readable = nameOf(el)\n .replace(/[()[\\]<>]/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n name = namesInUse.claim(`${readable} URL`.trim());\n }\n referenceById.set(el.id, name);\n if (written.has(name)) continue;\n written.add(name);\n definitions.push({ name, address });\n }\n return { definitions, referenceById };\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']): KeyedLine[] {\n const lines: KeyedLine[] = [{ key: 'config:title', text: `title ${writtenText(config.title)}` }];\n const add = (keyword: string, text: string) => lines.push({ key: `config:${keyword}`, text });\n if (config.style) add('style', `style ${config.style}`);\n if (config.size) add('size', `size [${r(config.size.width)}, ${r(config.size.height)}]`);\n if (config.evolutionLabels) {\n add('evolution', `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 add('y-axis', `y-axis ${writtenText(config.yAxisLabel)}${endLabels}`);\n }\n if (config.annotationsBoxPosition) {\n const b = config.annotationsBoxPosition;\n add('annotations', `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: KeyedLine[]; 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: KeyedLine[] = [];\n const urlDefinitionNames: string[] = [];\n (map.rawPassthrough ?? []).forEach((raw, index) => {\n const code = comments.strip(raw).code;\n const keyword = keywordOf(code);\n if (emitted.has(keyword)) return;\n lines.push({ key: `raw:${index}`, text: 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): KeyedLine[] {\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 const key = `edge:${edge.id}`;\n if (edge.edgeType === 'dependency') return { key, text: `${from} -> ${to}${annotation}` };\n const op = edge.flowValue\n ? `+'${edge.flowValue}'${edge.bidirectional ? '<>' : '>'}`\n : edge.bidirectional\n ? '+<>'\n : '+>';\n return { key, text: `${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 return [...serializeKeyedLines(map).map((line) => line.text), ''].join('\\n');\n}\n\n/**\n * The lines `serializeDSL` writes, each keyed by the statement it writes: `config:<keyword>`,\n * `url:<definition name>`, `element:<id>`, `block-open:<pipeline id>`, `child:<id>`,\n * `block-close:<pipeline id>`, `evolve:<id>`, `edge:<id>` and `raw:<rawPassthrough index>`.\n */\nexport function serializeKeyedLines(map: WardleyMap, hints: SerializeHints = {}): KeyedLine[] {\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 urls = planUrls(map, nameOf, passthrough.urlDefinitionNames, hints.urlReferences);\n for (const { name, address } of urls.definitions) {\n lines.push({ key: `url:${name}`, text: `url ${name} [${address}]` });\n }\n const urlSuffix = (el: MapElement): string => {\n const reference = urls.referenceById.get(el.id);\n return reference ? ` url(${reference})` : '';\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: KeyedLine[] = [];\n for (const el of map.elements) {\n if (el.elementType === 'component' && el.movement) {\n evolveLines.push({ key: `evolve:${el.id}`, text: 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({\n key: `element:${el.id}`,\n text: elementLine(el, nameOf(el)) + pipelineHeight(el) + urlSuffix(el),\n });\n const kids = childrenByPipeline.get(el.id) ?? [];\n if (kids.length) {\n lines.push({ key: `block-open:${el.id}`, text: '{' });\n for (const k of kids) {\n lines.push({\n key: `child:${k.id}`,\n text:\n ` component ${nameOf(k)} [${r(k.position.evolution)}]` +\n `${decoratorSuffix(k.decorators)}${colorSuffix(k)}${offsetSuffix(k.labelOffset)}`,\n });\n }\n lines.push({ key: `block-close:${el.id}`, text: '}' });\n }\n }\n\n return [...lines, ...evolveLines, ...edgeLines(map, nameOf), ...passthrough.lines];\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","import type { MapEdge, MapElement, WardleyMap } from '@miragon/wardley-schema-model';\nimport { CommentStripper } from './lexer.js';\nimport { roundAsWritten } from './names.js';\nimport { parseDSL, parseDSLWithSourceMap, widenEmptyRange, type SourceMap } from './parser.js';\nimport { serializeDSL, serializeKeyedLines, type KeyedLine } from './serializer.js';\n\n/**\n * How `patchDSL` produced its text: `patched` rewrote only the changed statements, `rewritten`\n * rewrote every statement in place (comments, blank lines and order kept), `serialized` fell back\n * to `serializeDSL`, `unchanged` returned the original text because the map could not be\n * serialized at all.\n */\nexport type PatchOutcome = 'patched' | 'rewritten' | 'serialized' | 'unchanged';\n\n/**\n * Writes `map` back into `originalText`, the text it was read from, and keeps everything the edit\n * did not touch verbatim: comments, blank lines, line order, number formatting, unknown lines and\n * the line breaks. Changed statements are rewritten in place the way `serializeDSL` writes them,\n * removed ones are deleted and new ones are inserted after the last statement of their kind. The\n * result always reads back as the same map as `serializeDSL(map)`; when a patch cannot guarantee\n * that, the result is `serializeDSL(map)` itself, in the line break style of the source. Never\n * throws.\n */\nexport function patchDSL(\n originalText: string,\n map: WardleyMap,\n options: PatchOptions = {},\n): string {\n return patchDSLWithOutcome(originalText, map, options).text;\n}\n\nexport interface PatchOptions {\n /**\n * The map `originalText` was last written from, in the caller's ids. An editor that keeps the\n * ids of its first read (instead of re-reading every patched text) passes it, so an element\n * renamed twice is still recognised: the re-read text derives its id from the first new name.\n */\n readonly previous?: WardleyMap;\n}\n\n/** `patchDSL`, also telling how the text was produced. */\nexport function patchDSLWithOutcome(\n originalText: string,\n map: WardleyMap,\n options: PatchOptions = {},\n): { readonly text: string; readonly outcome: PatchOutcome } {\n const original = typeof originalText === 'string' ? originalText : '';\n let canonical: string;\n try {\n canonical = serializeDSL(map);\n } catch {\n return { text: original, outcome: 'unchanged' };\n }\n try {\n const expected = fingerprint(parseDSL(canonical));\n const source = readSource(original);\n const edited = alignToSource(source.map, map, options.previous);\n for (const mode of ['minimal', 'rewrite'] as const) {\n const text = patchLines(source, edited, mode);\n if (text !== null && fingerprint(parseDSL(text)) === expected) {\n return { text, outcome: mode === 'minimal' ? 'patched' : 'rewritten' };\n }\n }\n return { text: withLineBreaksOf(source, canonical), outcome: 'serialized' };\n } catch {\n return { text: canonical, outcome: 'serialized' };\n }\n}\n\ninterface SourceLine {\n /** Without its line break. */\n readonly text: string;\n /** Empty for a last line without one. */\n readonly lineBreak: string;\n}\n\ninterface LineShape {\n readonly indent: string;\n /** The statement part, trimmed: no indentation, no comment. */\n readonly code: string;\n /** The end of a block comment the line starts in (up to its `*\\/`), or empty. */\n readonly commentHead: string;\n /** Whitespace and comment after the code, or empty. */\n readonly commentTail: string;\n /** Whether the code can be replaced without touching the comments. */\n readonly editable: boolean;\n readonly endsInBlockComment: boolean;\n}\n\ninterface Source {\n readonly lines: readonly SourceLine[];\n readonly shapes: readonly LineShape[];\n readonly map: WardleyMap;\n readonly sourceMap: SourceMap;\n readonly lineBreak: string;\n readonly endsWithLineBreak: boolean;\n}\n\nfunction readSource(text: string): Source {\n const lines = splitLines(text);\n const parsed = parseDSLWithSourceMap(text);\n const crlf = (text.match(/\\r\\n/g) ?? []).length;\n const lf = (text.match(/\\n/g) ?? []).length - crlf;\n return {\n lines,\n shapes: shapeLines(lines),\n map: parsed.map,\n sourceMap: parsed.sourceMap,\n lineBreak: crlf > lf ? '\\r\\n' : '\\n',\n endsWithLineBreak: text === '' || text.endsWith('\\n'),\n };\n}\n\n/** Splits like the parser: at `\\n` or `\\r\\n`; the break ending the last line starts no new one. */\nfunction splitLines(text: string): SourceLine[] {\n const lines: SourceLine[] = [];\n const lineBreaks = /\\r?\\n/g;\n let start = 0;\n for (let match = lineBreaks.exec(text); match; match = lineBreaks.exec(text)) {\n lines.push({ text: text.slice(start, match.index), lineBreak: match[0] });\n start = match.index + match[0].length;\n }\n if (start < text.length) lines.push({ text: text.slice(start), lineBreak: '' });\n return lines;\n}\n\nfunction withoutTrailingCarriageReturns(text: string): string {\n let end = text.length;\n while (end > 0 && text.charCodeAt(end - 1) === 13) end--;\n return text.slice(0, end);\n}\n\nfunction shapeLines(lines: readonly SourceLine[]): LineShape[] {\n const comments = new CommentStripper();\n return lines.map(({ text }) => {\n const raw = withoutTrailingCarriageReturns(text);\n const startsInBlockComment = comments.insideBlockComment;\n let fragments = comments.strip(raw).comments;\n let rest = raw;\n let commentHead = '';\n let commentTail = '';\n let editable = true;\n if (startsInBlockComment) {\n // A statement after the end of a block comment is editable; the comment part stays verbatim.\n const head = fragments[0];\n if (head?.endsWith('*/') && raw.startsWith(head)) {\n commentHead = head;\n rest = raw.slice(head.length);\n fragments = fragments.slice(1);\n } else {\n editable = false;\n }\n }\n let codePart = rest;\n if (editable && fragments.length) {\n const comment = fragments[0]!;\n if (fragments.length > 1 || !rest.endsWith(comment)) {\n editable = false;\n } else {\n const beforeComment = rest.slice(0, rest.length - comment.length);\n codePart = beforeComment.trimEnd();\n commentTail = beforeComment.slice(codePart.length) + comment;\n }\n }\n return {\n indent: /^\\s*/.exec(codePart)![0],\n code: codePart.trim(),\n commentHead,\n commentTail,\n editable,\n endsInBlockComment: comments.insideBlockComment,\n };\n });\n}\n\nfunction withLineBreaksOf(source: Source, text: string): string {\n if (source.lines.length === 0) return text;\n const withBreaks = source.lineBreak === '\\n' ? text : text.replace(/\\n/g, source.lineBreak);\n return source.endsWithLineBreak ? withBreaks : withBreaks.replace(/\\r?\\n$/, '');\n}\n\n// --- Matching the edited map to the statements of the source -----------------------------------\n\nfunction identityOf(el: MapElement): string {\n switch (el.elementType) {\n case 'annotation':\n return `annotation\\0${el.number}`;\n case 'attitude':\n return `attitude\\0${el.kind}`;\n default:\n return `${el.elementType}\\0${el.label}`;\n }\n}\n\nfunction edgeIdentityOf(edge: MapEdge): string {\n return `${edge.edgeType}\\0${edge.from}\\0${edge.to}`;\n}\n\n/**\n * Pairs the elements of `edited` with the source statements they continue: same id and name, then\n * the pairing `hint` (same kind), then same name, then same id. Returns edited id -> source id.\n */\nfunction matchElements(\n source: WardleyMap,\n edited: WardleyMap,\n hint: ReadonlyMap<string, string> = new Map(),\n): Map<string, string> {\n const unmatchedSource = new Map(source.elements.map((el) => [el.id, el]));\n const idByEditedId = new Map<string, string>();\n const claim = (editedId: string, sourceId: string) => {\n idByEditedId.set(editedId, sourceId);\n unmatchedSource.delete(sourceId);\n };\n const unclaimed = () => edited.elements.filter((el) => !idByEditedId.has(el.id));\n for (const el of edited.elements) {\n const same = unmatchedSource.get(el.id);\n if (same && identityOf(same) === identityOf(el)) claim(el.id, el.id);\n }\n for (const el of unclaimed()) {\n const hinted = hint.get(el.id);\n const candidate = hinted === undefined ? undefined : unmatchedSource.get(hinted);\n if (candidate?.elementType === el.elementType) claim(el.id, candidate.id);\n }\n // The name outranks a bare id: a modeler that keeps the ids of its first read holds ids that\n // the re-read text has since given to other statements (rename \"Tea\", then add a new \"Tea\").\n const sourceIdsByIdentity = new Map<string, string[]>();\n for (const el of unmatchedSource.values()) {\n const ids = sourceIdsByIdentity.get(identityOf(el)) ?? [];\n ids.push(el.id);\n sourceIdsByIdentity.set(identityOf(el), ids);\n }\n for (const el of unclaimed()) {\n const match = sourceIdsByIdentity.get(identityOf(el))?.shift();\n if (match !== undefined) claim(el.id, match);\n }\n for (const el of unclaimed()) {\n if (unmatchedSource.get(el.id)?.elementType === el.elementType) claim(el.id, el.id);\n }\n return idByEditedId;\n}\n\n/**\n * Gives every element and edge of the edited map the id of the source statement it continues (see\n * `matchElements`; `previous` supplies the hint), so keys line up with the source lines, and puts\n * them in source order. New ones keep their id, made unique against the source ids.\n */\nfunction alignToSource(\n source: WardleyMap,\n edited: WardleyMap,\n previous: WardleyMap | undefined,\n): WardleyMap {\n const hint = previous ? matchElements(source, previous) : undefined;\n const idByEditedId = matchElements(source, edited, hint);\n const usedIds = new Set([...source.elements.map((el) => el.id), ...idByEditedId.values()]);\n const freshId = (id: string): string => {\n let candidate = id;\n for (let suffix = 2; usedIds.has(candidate); suffix++) candidate = `${id}~${suffix}`;\n usedIds.add(candidate);\n return candidate;\n };\n for (const el of edited.elements) {\n if (!idByEditedId.has(el.id)) idByEditedId.set(el.id, freshId(el.id));\n }\n const rename = (id: string): string => idByEditedId.get(id) ?? id;\n const elements = edited.elements.map((el): MapElement => {\n const renamed = { ...el, id: rename(el.id) } as MapElement;\n if (renamed.elementType === 'component' && renamed.pipelineId !== undefined) {\n return { ...renamed, pipelineId: rename(renamed.pipelineId) };\n }\n if (renamed.elementType === 'pipeline') {\n return { ...renamed, childIds: renamed.childIds.map(rename) };\n }\n return renamed;\n });\n const edges = alignEdges(\n source.edges,\n edited.edges.map((edge) => ({ ...edge, from: rename(edge.from), to: rename(edge.to) })),\n );\n return {\n ...edited,\n elements: inSourceOrder(elements, source.elements),\n edges: inSourceOrder(edges, source.edges),\n };\n}\n\nfunction alignEdges(sourceEdges: readonly MapEdge[], editedEdges: readonly MapEdge[]): MapEdge[] {\n const unmatchedSource = new Map(sourceEdges.map((edge) => [edge.id, edge]));\n const idByIndex = new Map<number, string>();\n const claim = (index: number, id: string) => {\n idByIndex.set(index, id);\n unmatchedSource.delete(id);\n };\n editedEdges.forEach((edge, index) => {\n const same = unmatchedSource.get(edge.id);\n if (same && edgeIdentityOf(same) === edgeIdentityOf(edge)) claim(index, edge.id);\n });\n editedEdges.forEach((edge, index) => {\n if (idByIndex.has(index)) return;\n const match = [...unmatchedSource.values()].find(\n (candidate) => edgeIdentityOf(candidate) === edgeIdentityOf(edge),\n );\n if (match) claim(index, match.id);\n });\n editedEdges.forEach((edge, index) => {\n if (idByIndex.has(index)) return;\n if (unmatchedSource.get(edge.id)?.edgeType === edge.edgeType) claim(index, edge.id);\n });\n const usedIds = new Set([...sourceEdges.map((edge) => edge.id), ...idByIndex.values()]);\n return editedEdges.map((edge, index) => {\n let id = idByIndex.get(index);\n if (id === undefined) {\n id = edge.id;\n for (let suffix = 2; usedIds.has(id); suffix++) id = `${edge.id}~${suffix}`;\n usedIds.add(id);\n }\n return { ...edge, id };\n });\n}\n\nfunction inSourceOrder<T extends { readonly id: string }>(\n items: readonly T[],\n sourceItems: readonly { readonly id: string }[],\n): T[] {\n const sourceIndex = new Map(sourceItems.map((item, index) => [item.id, index]));\n const position = (item: T) => sourceIndex.get(item.id) ?? Number.POSITIVE_INFINITY;\n return items\n .map((item, index) => ({ item, index }))\n .sort((a, b) => position(a.item) - position(b.item) || a.index - b.index)\n .map(({ item }) => item);\n}\n\n// --- Planning the edit --------------------------------------------------------------------------\n\ntype Mode = 'minimal' | 'rewrite';\ntype Status = 'same' | 'changed' | 'deleted';\n\nconst isRawKey = (key: string) => key.startsWith('raw:');\n\nfunction keyedTexts(lines: readonly KeyedLine[]): Map<string, string> {\n return new Map(lines.filter((line) => !isRawKey(line.key)).map((line) => [line.key, line.text]));\n}\n\nfunction listsByLine<T>(lineCount: number): T[][] {\n return Array.from({ length: lineCount }, () => []);\n}\n\n/** The rawPassthrough indexes of `before` that `after` no longer holds, and the entries it adds. */\nfunction diffPassthrough(\n before: readonly KeyedLine[],\n after: readonly KeyedLine[],\n): { removed: Set<number>; added: KeyedLine[] } {\n const remainingByText = new Map<string, number[]>();\n for (const line of before.filter((entry) => isRawKey(entry.key))) {\n const indexes = remainingByText.get(line.text) ?? [];\n indexes.push(Number(line.key.slice('raw:'.length)));\n remainingByText.set(line.text, indexes);\n }\n const added: KeyedLine[] = [];\n for (const line of after.filter((entry) => isRawKey(entry.key))) {\n if (remainingByText.get(line.text)?.shift() === undefined) added.push(line);\n }\n return { removed: new Set([...remainingByText.values()].flat()), added };\n}\n\ninterface Insertion {\n readonly text: string;\n readonly order: number;\n}\n\nfunction pipelineOfEachChild(map: WardleyMap): Map<string, string> {\n const pipelineById = new Map<string, string>();\n for (const el of map.elements) {\n if (el.elementType === 'component' && el.pipelineId !== undefined) {\n pipelineById.set(el.id, el.pipelineId);\n }\n }\n return pipelineById;\n}\n\n/** Children that moved to another pipeline: their line leaves one block and joins the other. */\nfunction reparentedChildKeys(source: WardleyMap, edited: WardleyMap): Set<string> {\n const pipelineBefore = pipelineOfEachChild(source);\n const keys = new Set<string>();\n for (const [id, pipelineId] of pipelineOfEachChild(edited)) {\n const previous = pipelineBefore.get(id);\n if (previous !== undefined && previous !== pipelineId) keys.add(`child:${id}`);\n }\n return keys;\n}\n\n/**\n * A pipeline line written without a range takes it from its children, so it needs the range\n * written out once its children no longer span exactly the pipeline's range.\n */\nfunction pipelinesNoLongerSpannedByChildren(\n edited: WardleyMap,\n rangeFromChildren: ReadonlySet<string>,\n): Set<string> {\n const keys = new Set<string>();\n if (rangeFromChildren.size === 0) return keys;\n const evolutionsByPipeline = new Map<string, number[]>();\n for (const el of edited.elements) {\n if (el.elementType !== 'component' || el.pipelineId === undefined) continue;\n const evolutions = evolutionsByPipeline.get(el.pipelineId) ?? [];\n evolutions.push(roundAsWritten(el.position.evolution));\n evolutionsByPipeline.set(el.pipelineId, evolutions);\n }\n for (const el of edited.elements) {\n if (el.elementType !== 'pipeline' || !rangeFromChildren.has(el.id)) continue;\n const evolutions = evolutionsByPipeline.get(el.id) ?? [];\n const read =\n evolutions.length > 0\n ? widenEmptyRange({ start: Math.min(...evolutions), end: Math.max(...evolutions) })\n : undefined;\n const spanned =\n read !== undefined &&\n read.start === roundAsWritten(el.evolutionStart) &&\n read.end === roundAsWritten(el.evolutionEnd);\n if (!spanned) keys.add(`element:${el.id}`);\n }\n return keys;\n}\n\n/** Returns the patched text, or null when this mode cannot express the edit. */\nfunction patchLines(source: Source, edited: WardleyMap, mode: Mode): string | null {\n const { lines, shapes, sourceMap } = source;\n const hints = { urlReferences: sourceMap.urlReferences };\n const before = serializeKeyedLines(source.map, hints);\n const after = serializeKeyedLines(edited, hints);\n const textBefore = keyedTexts(before);\n const textAfter = keyedTexts(after);\n const passthrough = diffPassthrough(before, after);\n const reparented = reparentedChildKeys(source.map, edited);\n const unspanned = pipelinesNoLongerSpannedByChildren(edited, sourceMap.rangeFromChildren);\n\n const statusOf = (key: string): Status => {\n const written = textAfter.get(key);\n if (written === undefined || reparented.has(key)) return 'deleted';\n if (mode === 'rewrite' || written !== textBefore.get(key) || unspanned.has(key)) {\n return 'changed';\n }\n return 'same';\n };\n\n const primaryKeysByLine = listsByLine<string>(lines.length);\n for (const [key, line] of sourceMap.primaryLineOf) {\n if (textBefore.has(key)) primaryKeysByLine[line - 1]?.push(key);\n }\n const secondaryKeysByLine = listsByLine<string>(lines.length);\n for (const [key, secondaryLines] of sourceMap.secondaryLinesOf) {\n if (!textBefore.has(key)) continue;\n for (const line of secondaryLines) secondaryKeysByLine[line - 1]?.push(key);\n }\n const passthroughByLine = listsByLine<number>(lines.length);\n sourceMap.passthrough.forEach((entry, index) => passthroughByLine[entry.line - 1]?.push(index));\n const bracesByLine = listsByLine<{ pipelineId: string; end: 'open' | 'close' }>(lines.length);\n for (const [pipelineId, block] of sourceMap.blocks) {\n if (block.open !== undefined) {\n bracesByLine[block.open - 1]?.push({ pipelineId, end: 'open' });\n }\n if (block.close !== undefined) {\n bracesByLine[block.close - 1]?.push({ pipelineId, end: 'close' });\n }\n }\n // A block goes with its pipeline or its last child; an empty block of a kept pipeline stays.\n const braceRemoved = (pipelineId: string) =>\n !textAfter.has(`block-open:${pipelineId}`) &&\n (textBefore.has(`block-open:${pipelineId}`) || !textAfter.has(`element:${pipelineId}`));\n\n const result: (string | null)[] = [];\n for (let index = 0; index < lines.length; index++) {\n const patched = patchLine(index);\n if (patched === undefined) return null;\n result.push(patched);\n }\n\n function patchLine(index: number): string | null | undefined {\n const line = lines[index]!;\n const shape = shapes[index]!;\n const primaries = primaryKeysByLine[index]!;\n const removedPassthrough = passthroughByLine[index]!.filter((entry) =>\n passthrough.removed.has(entry),\n );\n const braces = bracesByLine[index]!;\n const changed =\n primaries.some((key) => statusOf(key) !== 'same') ||\n secondaryKeysByLine[index]!.some((key) => statusOf(key) !== 'same') ||\n removedPassthrough.length > 0 ||\n braces.some((brace) => braceRemoved(brace.pipelineId));\n if (!changed) return line.text;\n if (!shape.editable || primaries.length > 1) return undefined;\n if (removedPassthrough.some((entry) => sourceMap.passthrough[entry]!.isComment)) {\n return undefined;\n }\n\n // null keeps the statement as written; '' removes it\n let statement: string | null = null;\n const primary = primaries[0];\n if (primary !== undefined) {\n const status = statusOf(primary);\n if (status === 'changed') statement = textAfter.get(primary)!.trim();\n else if (status === 'deleted') statement = '';\n } else if (secondaryKeysByLine[index]!.length || removedPassthrough.length) {\n statement = '';\n }\n\n // The block braces on the line: a leading `{`, a trailing `}`, or the `{` ending a pipeline line.\n const open = braces.find((brace) => brace.end === 'open');\n const close = braces.find((brace) => brace.end === 'close');\n let rest = shape.code;\n let prefix = '';\n let suffix = '';\n if (open && primary !== `element:${open.pipelineId}` && rest.startsWith('{')) {\n prefix = braceRemoved(open.pipelineId) ? '' : '{';\n rest = rest.slice(1).trimStart();\n } else if (open && rest.endsWith('{')) {\n suffix = braceRemoved(open.pipelineId) ? '' : '{';\n rest = rest.slice(0, -1).trimEnd();\n } else if (open) return undefined;\n if (close && rest.endsWith('}') && !(open && suffix)) {\n suffix = braceRemoved(close.pipelineId) ? '' : '}';\n rest = rest.slice(0, -1).trimEnd();\n } else if (close) return undefined;\n const assembled = [prefix, statement ?? rest, suffix].filter(Boolean).join(' ');\n if (assembled) return shape.commentHead + shape.indent + assembled + shape.commentTail;\n // A removed statement keeps the comment around it (the head still closes its block comment).\n if (shape.commentHead) return shape.commentHead + shape.commentTail;\n return shape.commentTail ? shape.indent + shape.commentTail.trimStart() : null;\n }\n\n const insertions = planInsertions(source, edited, after, textBefore, textAfter, reparented);\n if (!insertions) return null;\n passthrough.added.forEach((line, index) => {\n addInsertion(insertions, lines.length - 1, line.text, after.length + index);\n });\n return assemble(source, result, insertions);\n}\n\nfunction addInsertion(\n insertions: Map<number, Insertion[]>,\n afterLine: number,\n text: string,\n order: number,\n): void {\n const list = insertions.get(afterLine) ?? [];\n list.push({ text, order });\n insertions.set(afterLine, list);\n}\n\n/**\n * Where the statements the source does not hold yet go: after the last statement of the same kind\n * (children at the end of their pipeline's block), else after related statements, else at the end\n * (config at the top). Keyed by the 0-based line they follow; -1 is the top of the file.\n */\nfunction planInsertions(\n source: Source,\n edited: WardleyMap,\n after: readonly KeyedLine[],\n textBefore: ReadonlyMap<string, string>,\n textAfter: ReadonlyMap<string, string>,\n reparented: ReadonlySet<string>,\n): Map<number, Insertion[]> | null {\n const { lines, shapes, sourceMap } = source;\n const lastLine = lines.length - 1;\n const lineOf = (key: string) => {\n const line = sourceMap.primaryLineOf.get(key);\n return line === undefined ? undefined : line - 1;\n };\n const pipelineLineOf = (pipelineId: string) => lineOf(`element:${pipelineId}`);\n const childLinesOf = (pipelineId: string): number[] =>\n source.map.elements.flatMap((el) => {\n if (el.elementType !== 'component' || el.pipelineId !== pipelineId) return [];\n const line = lineOf(`child:${el.id}`);\n return line === undefined ? [] : [line];\n });\n /** The last line of a pipeline's block in the source, if it has one. */\n const blockEndOf = (pipelineId: string): number | undefined => {\n const block = sourceMap.blocks.get(pipelineId);\n if (block?.open === undefined || pipelineLineOf(pipelineId) === undefined) return undefined;\n if (block.close !== undefined) return block.close - 1;\n return Math.max(block.open - 1, ...childLinesOf(pipelineId));\n };\n /** Where a child joins its pipeline's source block; null when the block's layout cannot take it. */\n const anchorInBlock = (pipelineId: string): number | null => {\n const block = sourceMap.blocks.get(pipelineId)!;\n let anchor: number;\n if (block.close === undefined) anchor = blockEndOf(pipelineId)!;\n else if (block.close !== block.open && shapes[block.close - 1]!.code === '}') {\n anchor = block.close - 2;\n } else return null;\n return shapes[anchor]?.endsInBlockComment ? null : anchor;\n };\n const hasSourceBlock = (pipelineId: string) => blockEndOf(pipelineId) !== undefined;\n /** The last line a statement occupies: a pipeline reaches to the end of its block. */\n const endOf = (key: string): number | undefined => {\n const line = lineOf(key);\n if (line === undefined || !key.startsWith('element:')) return line;\n return Math.max(line, blockEndOf(key.slice('element:'.length)) ?? line);\n };\n const sourceElementTypes = new Map(source.map.elements.map((el) => [el.id, el.elementType]));\n const editedElementById = new Map(edited.elements.map((el) => [el.id, el]));\n const lastLineOf = (accepts: (key: string) => boolean): number | undefined => {\n let last: number | undefined;\n for (const key of sourceMap.primaryLineOf.keys()) {\n if (!accepts(key) || !textBefore.has(key)) continue;\n const end = endOf(key);\n if (end !== undefined && (last === undefined || end > last)) last = end;\n }\n return last;\n };\n const isElementOfType = (type: string) => (key: string) =>\n key.startsWith('element:') && sourceElementTypes.get(key.slice('element:'.length)) === type;\n const startsWith = (prefix: string) => (key: string) => key.startsWith(prefix);\n\n /** Never between a pipeline and its block, never inside a block or a block comment. */\n const settle = (line: number): number => {\n if (line < 0) return -1;\n let settled = line;\n for (const pipelineId of sourceMap.blocks.keys()) {\n const start = pipelineLineOf(pipelineId);\n const end = blockEndOf(pipelineId);\n if (start === undefined || end === undefined) continue;\n if (settled >= start && settled < end) settled = end;\n }\n while (settled < lastLine && shapes[settled]!.endsInBlockComment) settled++;\n return settled;\n };\n const firstOf = (...candidates: (number | undefined)[]): number => {\n for (const candidate of candidates) if (candidate !== undefined) return candidate;\n return lastLine;\n };\n\n const needsInsertion = (key: string) =>\n reparented.has(key) ||\n (!sourceMap.primaryLineOf.has(key) && textBefore.get(key) !== textAfter.get(key));\n const anchorOfElement = (id: string): number => {\n const type = editedElementById.get(id)?.elementType ?? '';\n return settle(\n firstOf(\n lastLineOf(isElementOfType(type)),\n lastLineOf(startsWith('element:')),\n lastLineOf(startsWith('url:')),\n lastLineOf(startsWith('config:')),\n ),\n );\n };\n /** A new block goes right after its pipeline line, as the parser binds it only there. */\n const anchorOfNewBlock = (pipelineId: string): number =>\n pipelineLineOf(pipelineId) ?? anchorOfElement(pipelineId);\n\n const insertions = new Map<number, Insertion[]>();\n for (let order = 0; order < after.length; order++) {\n const { key, text } = after[order]!;\n if (isRawKey(key)) continue;\n const separator = key.indexOf(':');\n const kind = key.slice(0, separator);\n const id = key.slice(separator + 1);\n let anchor: number | null;\n if (kind === 'block-open' || kind === 'block-close') {\n if (textBefore.has(`block-open:${id}`)) continue;\n if (hasSourceBlock(id)) {\n // The source holds an empty block: the new children go into it.\n if (anchorInBlock(id) === null) return null;\n continue;\n }\n anchor = anchorOfNewBlock(id);\n } else if (!needsInsertion(key)) {\n continue;\n } else if (kind === 'config') {\n anchor = settle(firstOf(lastLineOf(startsWith('config:')), -1));\n } else if (kind === 'url') {\n const lastUrl = lastLineOf(startsWith('url:'));\n anchor = settle(firstOf(lastUrl, lastLineOf(startsWith('config:')), -1));\n } else if (kind === 'element') {\n anchor = anchorOfElement(id);\n } else if (kind === 'child') {\n const child = editedElementById.get(id);\n const pipelineId = child?.elementType === 'component' ? child.pipelineId : undefined;\n if (pipelineId === undefined) return null;\n anchor = hasSourceBlock(pipelineId)\n ? anchorInBlock(pipelineId)\n : anchorOfNewBlock(pipelineId);\n } else if (kind === 'evolve') {\n anchor = settle(firstOf(lastLineOf(startsWith('evolve:')), endOf(`element:${id}`)));\n } else if (kind === 'edge') {\n anchor = settle(firstOf(lastLineOf(startsWith('edge:'))));\n } else return null;\n if (anchor === null) return null;\n addInsertion(insertions, anchor, text, order);\n }\n return insertions;\n}\n\nfunction assemble(\n source: Source,\n result: readonly (string | null)[],\n insertions: ReadonlyMap<number, Insertion[]>,\n): string {\n const output: { text: string; lineBreak: string }[] = [];\n const insertAfter = (line: number) => {\n const list = [...(insertions.get(line) ?? [])].sort((a, b) => a.order - b.order);\n for (const { text } of list) output.push({ text, lineBreak: '' });\n };\n insertAfter(-1);\n result.forEach((text, index) => {\n if (text !== null) output.push({ text, lineBreak: source.lines[index]!.lineBreak });\n insertAfter(index);\n });\n return output\n .map(({ text, lineBreak }, index) => {\n const isLast = index === output.length - 1;\n if (isLast && !source.endsWithLineBreak) return text;\n return text + (lineBreak || source.lineBreak);\n })\n .join('');\n}\n\n// --- Safety net ---------------------------------------------------------------------------------\n\n/** Rounds numbers as the serializer writes them and orders object keys, so equal maps compare equal. */\nfunction normalized(value: unknown): unknown {\n if (typeof value === 'number') return roundAsWritten(value);\n if (Array.isArray(value)) return value.map(normalized);\n if (value !== null && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value)\n .filter(([, entry]) => entry !== undefined)\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n .map(([key, entry]) => [key, normalized(entry)]),\n );\n }\n return value;\n}\n\n/**\n * The meaning of a map, independent of ids (derived from names and order) and statement order:\n * elements and edges reference each other by type and label.\n */\nfunction fingerprint(map: WardleyMap): string {\n const elementById = new Map(map.elements.map((el) => [el.id, el]));\n const reference = (id: string) => {\n const el = elementById.get(id);\n return el ? `${el.elementType}:${el.label}` : `?${id}`;\n };\n const entries = [`config ${JSON.stringify(normalized(map.config))}`];\n for (const el of map.elements) {\n const { id: _id, ...rest } = el;\n const described: Record<string, unknown> = { ...rest };\n if (el.elementType === 'component' && el.pipelineId !== undefined) {\n described['pipelineId'] = reference(el.pipelineId);\n }\n if (el.elementType === 'pipeline') described['childIds'] = el.childIds.map(reference).sort();\n entries.push(`element ${JSON.stringify(normalized(described))}`);\n }\n for (const edge of map.edges) {\n const { id: _id, ...rest } = edge;\n const described = { ...rest, from: reference(edge.from), to: reference(edge.to) };\n entries.push(`edge ${JSON.stringify(normalized(described))}`);\n }\n for (const raw of map.rawPassthrough ?? []) entries.push(`raw ${raw}`);\n return entries.sort().join('\\n');\n}\n","import type { WardleyMap } from '@miragon/wardley-schema-model';\nimport { parseDSLWithSourceMap } from './parser.js';\nimport { serializeKeyedLines } from './serializer.js';\n\n/** The statement keys of an element line: a top-level element or a pipeline block's child. */\nconst ELEMENT_KEY = /^(?:element|child):(.*)$/s;\n\nfunction elementIdOf(key: string): string | undefined {\n return ELEMENT_KEY.exec(key)?.[1];\n}\n\n/**\n * The id each element of `map` carries once `serializeDSL(map)` is read back, keyed by its id in\n * `map`. The OWM DSL writes no ids: the parser derives them from names, texts and the order of the\n * lines, so an element created or renamed in an editor has another id in memory than in the\n * document until the text is read again. Elements the text does not write (none today) are\n * missing from the result.\n */\nexport function readBackIds(map: WardleyMap): Map<string, string> {\n const lines = serializeKeyedLines(map);\n const { sourceMap } = parseDSLWithSourceMap([...lines.map((line) => line.text), ''].join('\\n'));\n const readIdByLine = new Map<number, string>();\n for (const [key, line] of sourceMap.primaryLineOf) {\n const id = elementIdOf(key);\n if (id !== undefined) readIdByLine.set(line, id);\n }\n const ids = new Map<string, string>();\n lines.forEach((line, index) => {\n const id = elementIdOf(line.key);\n const readId = readIdByLine.get(index + 1);\n if (id !== undefined && readId !== undefined) ids.set(id, readId);\n });\n return ids;\n}\n","import { CommentStripper, keywordOf } from './lexer.js';\n\n/**\n * `rawPassthrough` without the uninterpreted statements of one keyword (e.g. an unreadable `size`\n * line once the map writes a valid one). Lines are judged by their code outside comments, so text\n * inside a block comment that merely starts with the keyword stays. A dropped statement keeps its\n * own comment fragments, so an opened block comment still closes where it did.\n */\nexport function withoutRawStatements(\n rawPassthrough: readonly string[] | undefined,\n keyword: string,\n): readonly string[] | undefined {\n if (!rawPassthrough) return rawPassthrough;\n const wanted = keyword.toLowerCase();\n const comments = new CommentStripper();\n let changed = false;\n const kept: string[] = [];\n for (const raw of rawPassthrough) {\n const stripped = comments.strip(raw);\n if (keywordOf(stripped.code) !== wanted) {\n kept.push(raw);\n continue;\n }\n changed = true;\n if (stripped.comments.length) kept.push(stripped.comments.join(' '));\n }\n if (!changed) return rawPassthrough;\n return kept.length ? kept : undefined;\n}\n"]}
|