@miragon/wardley-dsl 0.5.0 → 0.5.1
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/dist/index.cjs.map +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lexer.ts","../src/parser.ts","../src/serializer.ts"],"names":["text","CURRENT_SCHEMA_VERSION","validateMap"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Small, line-oriented helpers for the OWM DSL (concept doc §7.4).\n * The DSL is line-based; a full tokenizer/generator is not needed.\n */\n\nimport type { Method } from '@miragon/wardley-schema-model';\n\nexport interface ParsedCoords {\n readonly a: number;\n readonly b: number;\n}\n\nconst COORDS_RE = /\\[\\s*([-\\d.]+)\\s*,\\s*([-\\d.]+)\\s*\\]/;\n\n/** Order stays raw (a, b). */\nexport function parseCoords(line: string): ParsedCoords | null {\n const m = COORDS_RE.exec(line);\n if (!m) return null;\n const a = Number(m[1]);\n const b = Number(m[2]);\n if (Number.isNaN(a) || Number.isNaN(b)) return null;\n return { a, b };\n}\n\nexport function stripCoords(line: string): string {\n return line.replace(COORDS_RE, ' ');\n}\n\n/**\n * Splits a line at the first `[a, b]` tuple: name before, suffix after.\n * Decorators/label offsets may then only be looked up in the suffix — parentheses or\n * words like \"inertia\" inside the name stay untouched.\n */\nexport function splitAtCoords(\n line: string,\n): { name: string; coords: ParsedCoords; suffix: string } | null {\n const m = COORDS_RE.exec(line);\n if (!m) return null;\n const a = Number(m[1]);\n const b = Number(m[2]);\n if (Number.isNaN(a) || Number.isNaN(b)) return null;\n return {\n name: line.slice(0, m.index).trim(),\n coords: { a, b },\n suffix: line.slice(m.index + m[0].length),\n };\n}\n\nconst COORDS4_RE = /\\[\\s*([-\\d.]+)\\s*,\\s*([-\\d.]+)\\s*,\\s*([-\\d.]+)\\s*,\\s*([-\\d.]+)\\s*\\]/;\n\nexport interface ParsedCoords4 {\n readonly a: number;\n readonly b: number;\n readonly c: number;\n readonly d: number;\n}\n\n/** Extracts an `[a, b, c, d]` tuple (OWM attitude form) — or null. */\nexport function parseCoords4(line: string): ParsedCoords4 | null {\n const m = COORDS4_RE.exec(line);\n if (!m) return null;\n const vals = [m[1], m[2], m[3], m[4]].map(Number);\n if (vals.some(Number.isNaN)) return null;\n return { a: vals[0]!, b: vals[1]!, c: vals[2]!, d: vals[3]! };\n}\n\n// `[^[\\]]` (tuples cannot contain '[') + bounded whitespace keep the scan linear (ReDoS-safe).\nconst MULTI_COORDS_RE = /\\[\\s{0,8}(\\[[^[\\]]*\\](?:\\s{0,8},\\s{0,8}\\[[^[\\]]*\\])+)\\s{0,8}\\]/;\n\n/** Extracts a tuple list `[[a,b],[c,d],…]` (OWM multi-position annotation) — or null. */\nexport function parseMultiCoords(line: string): { tuples: ParsedCoords[]; rest: string } | null {\n const m = MULTI_COORDS_RE.exec(line);\n if (!m) return null;\n const tuples: ParsedCoords[] = [];\n const inner = /\\[\\s{0,8}([-\\d.]+)\\s{0,8},\\s{0,8}([-\\d.]+)\\s{0,8}\\]/g;\n let t: RegExpExecArray | null;\n while ((t = inner.exec(m[1]!))) {\n const a = Number(t[1]);\n const b = Number(t[2]);\n if (!Number.isNaN(a) && !Number.isNaN(b)) tuples.push({ a, b });\n }\n if (!tuples.length) return null;\n return { tuples, rest: line.replace(MULTI_COORDS_RE, ' ') };\n}\n\n/**\n * Splits off a `//` line comment. Quote-aware (`+'http://x'>` stays untouched) and\n * URL-aware: `//` directly after `:` is a scheme separator (`url(https://…)`), not a comment.\n */\nexport function splitLineComment(line: string): { code: string; comment: string | null } {\n let inQuote = false;\n for (let i = 0; i < line.length - 1; i++) {\n const ch = line[i];\n if (ch === \"'\") inQuote = !inQuote;\n else if (!inQuote && ch === '/' && line[i + 1] === '/' && line[i - 1] !== ':') {\n return { code: line.slice(0, i), comment: line.slice(i) };\n }\n }\n return { code: line, comment: null };\n}\n\n/** First occurrence of `needle` outside `'…'` quotes — or -1. */\nexport function indexOfOutsideQuotes(line: string, needle: string): number {\n let inQuote = false;\n for (let i = 0; i + needle.length <= line.length; i++) {\n const ch = line[i];\n if (ch === \"'\") {\n inQuote = !inQuote;\n continue;\n }\n if (!inQuote && line.startsWith(needle, i)) return i;\n }\n return -1;\n}\n\nexport interface InlineDecorators {\n readonly market?: boolean;\n readonly ecosystem?: boolean;\n readonly inertia?: boolean;\n readonly method?: Method;\n}\n\nconst PAREN_RE = /\\(([^()]*)\\)/g;\nconst METHODS: ReadonlySet<string> = new Set(['build', 'buy', 'outsource']);\n\n/**\n * Reads the inline decorators of a component line:\n * - parenthesized: `(market)`, `(ecosystem)`, `(build|buy|outsource)`, combined `(market, outsource)`\n * - trailing keyword: `inertia`\n * Returns the decorators found and the line stripped of them.\n */\nexport function parseDecorators(line: string): { decorators: InlineDecorators; rest: string } {\n const dec: {\n market?: boolean;\n ecosystem?: boolean;\n inertia?: boolean;\n method?: Method;\n } = {};\n let rest = line;\n\n rest = rest.replace(PAREN_RE, (_full, group: string) => {\n for (const rawToken of group.split(',')) {\n const token = rawToken.trim().toLowerCase();\n if (token === 'market') dec.market = true;\n else if (token === 'ecosystem') dec.ecosystem = true;\n else if (token === 'inertia') dec.inertia = true;\n else if (METHODS.has(token)) dec.method = token as Method;\n }\n return ' ';\n });\n\n // trailing keyword `inertia` (unparenthesized)\n rest = rest.replace(/\\binertia\\b/i, () => {\n dec.inertia = true;\n return ' ';\n });\n\n return { decorators: dec, rest };\n}\n\n// Note color as an (OWM-backwards-compatible) extension: `(color #rrggbb)` OR `(color green)`.\n// Deliberately placed after the coordinates -> the OWM parser ignores the rest instead of pulling\n// it into the note text. Accepts hex or CSS color names.\nconst COLOR_RE = /\\(\\s*color\\s+(#[0-9a-fA-F]{3,8}|[a-zA-Z][\\w-]*)\\s*\\)/i;\n\nexport function parseColor(line: string): { color?: string; rest: string } {\n const m = COLOR_RE.exec(line);\n if (!m || !m[1]) return { rest: line };\n return { color: m[1], rest: line.replace(COLOR_RE, ' ') };\n}\n\nexport interface LabelOffsetToken {\n readonly dx: number;\n readonly dy: number;\n}\n\nconst LABEL_OFFSET_RE = /\\blabel\\s*\\[\\s*([-\\d.]+)\\s*,\\s*([-\\d.]+)\\s*\\]/i;\n\n/** Reads an optional `label [dx, dy]` (pixel offset) and returns it plus the stripped line. */\nexport function parseLabelOffset(line: string): {\n labelOffset: LabelOffsetToken | null;\n rest: string;\n} {\n const m = LABEL_OFFSET_RE.exec(line);\n if (!m) return { labelOffset: null, rest: line };\n const dx = Number(m[1]);\n const dy = Number(m[2]);\n const rest = line.replace(LABEL_OFFSET_RE, ' ');\n if (Number.isNaN(dx) || Number.isNaN(dy)) return { labelOffset: null, rest };\n return { labelOffset: { dx, dy }, rest };\n}\n\nconst URL_REF_RE = /\\burl\\s{0,8}\\(([^()]*)\\)/i;\n\n/** Reads an optional `url(Name)` reference (OWM) and returns it plus the stripped line.\n * MUST run before parseDecorators — otherwise the word \"url\" would remain as junk in the suffix. */\nexport function parseUrlRef(line: string): { urlRef: string | null; rest: string } {\n const m = URL_REF_RE.exec(line);\n if (!m) return { urlRef: null, rest: line };\n return { urlRef: m[1]!.trim() || null, rest: line.replace(URL_REF_RE, ' ') };\n}\n\n/** First word (keyword) of a line, lowercased. */\nexport function keywordOf(line: string): string {\n const m = /^\\s*([A-Za-z][\\w-]*)/.exec(line);\n return m ? m[1]!.toLowerCase() : '';\n}\n\nexport function slug(label: string): string {\n return (\n label\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/^_/, '')\n .replace(/_$/, '') || 'x'\n );\n}\n","import {\n CURRENT_SCHEMA_VERSION,\n validateMap,\n type AcceleratorElement,\n type AnchorElement,\n type AnnotationElement,\n type DrawingElement,\n type DrawingStrokeStyle,\n type AttitudeElement,\n type AttitudeKind,\n type ComponentDecorators,\n type ComponentElement,\n type Coordinate,\n type MapConfig,\n type MapEdge,\n type MapElement,\n type MapStyle,\n type Method,\n type Movement,\n type NoteElement,\n type PipelineElement,\n type SubmapElement,\n type WardleyMap,\n} from '@miragon/wardley-schema-model';\nimport {\n indexOfOutsideQuotes,\n keywordOf,\n parseColor,\n parseCoords,\n parseCoords4,\n parseDecorators,\n parseLabelOffset,\n parseMultiCoords,\n parseUrlRef,\n slug,\n splitAtCoords,\n splitLineComment,\n stripCoords,\n type InlineDecorators,\n} from './lexer.js';\n\n/** Splits `A -> B` at the FIRST arrow — plain indexOf, immune to regex backtracking. */\nfunction splitDependency(core: string): { left: string; right: string } | null {\n const arrow = core.indexOf('->');\n if (arrow <= 0) return null;\n const left = core.slice(0, arrow).trim();\n const right = core.slice(arrow + 2).trim();\n return left && right ? { left, right } : null;\n}\n/** 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. */\nfunction splitFlow(\n core: string,\n): { left: string; right: string; op: string; value?: string } | null {\n for (let i = 1; i < core.length; i++) {\n if (core[i] !== '+') continue;\n let j = i + 1;\n let value: string | undefined;\n if (core[j] === \"'\") {\n const end = core.indexOf(\"'\", j + 1);\n if (end < 0) continue;\n value = core.slice(j + 1, end);\n j = end + 1;\n }\n const op = core.startsWith('<>', j)\n ? '<>'\n : core[j] === '>' || core[j] === '<'\n ? core[j]!\n : null;\n if (!op) continue;\n const left = core.slice(0, i).trim();\n const right = core.slice(j + op.length).trim();\n if (left && right) return { left, right, op, ...(value ? { value } : {}) };\n }\n return null;\n}\n// Config/special keywords that must NOT be (pre-)detected as an edge — `evolution`/`evolve`/\n// `y-axis`/`title` can themselves contain `->` and have their own handling in the switch.\nconst NON_LINK_KEYWORDS: ReadonlySet<string> = new Set([\n 'title',\n 'style',\n 'size',\n 'evolution',\n 'y-axis',\n 'annotations',\n 'annotation',\n 'evolve',\n 'line',\n]);\nconst KNOWN_STYLES: ReadonlySet<string> = new Set(['wardley', 'handwritten', 'colour', 'dark']);\n\ninterface PendingLink {\n readonly left: string;\n readonly right: string;\n readonly kind: 'dependency' | 'flow';\n readonly bidirectional?: boolean;\n /** `+<` — flow direction reversed (right -> left). */\n readonly reverse?: boolean;\n readonly flowValue?: string;\n /** Annotation text after `;`. */\n readonly label?: string;\n readonly raw: string;\n readonly lineNo: number;\n}\ninterface PendingEvolve {\n readonly name: string;\n readonly newLabel?: string;\n readonly target: number;\n readonly method?: Movement['method'];\n readonly labelOffset?: { dx: number; dy: number };\n readonly raw: string;\n readonly lineNo: number;\n}\ninterface PipelineChild {\n readonly name: string;\n readonly maturity: number;\n readonly decorators: InlineDecorators;\n readonly labelOffset?: { dx: number; dy: number };\n readonly color?: string;\n}\ninterface PendingPipeline {\n readonly name: string;\n /** Explicit range; if absent (OWM v2 block form without coordinates), it is derived from the children. */\n readonly start?: number;\n readonly end?: number;\n /** Explicit height — project extension `(y 0.x)`; otherwise derived from the anchor component. */\n readonly visibility?: number;\n readonly color?: string;\n readonly raw: string;\n readonly children: PipelineChild[];\n}\n/** Legacy standalone line `build|buy|outsource <Name>` — method on an existing component. */\ninterface PendingMethod {\n readonly name: string;\n readonly method: Method;\n readonly raw: string;\n readonly lineNo: number;\n}\n\nfunction compact<T extends Record<string, unknown>>(obj: T): T {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) if (v !== undefined) out[k] = v;\n return out as T;\n}\n\n/** Finding produced while parsing — line is 1-based; `text` is the (comment-stripped) line. */\nexport interface ParseDiagnostic {\n readonly line: number;\n readonly message: string;\n readonly text: string;\n}\n\nexport interface ParseResult {\n readonly map: WardleyMap;\n readonly diagnostics: readonly ParseDiagnostic[];\n}\n\nclass IdAllocator {\n private readonly used = new Set<string>();\n alloc(prefix: string, label: string): string {\n const base = `${prefix}_${slug(label)}`;\n let id = base;\n let i = 2;\n while (this.used.has(id)) id = `${base}_${i++}`;\n this.used.add(id);\n return id;\n }\n}\n\n/**\n * Keyword-differentiated coordinates (component/anchor/note = [visibility, maturity];\n * pipeline = [maturityStart, maturityEnd]). Unknown lines land in `rawPassthrough`.\n */\nexport function parseDSL(text: string): WardleyMap {\n return parseDSLWithDiagnostics(text).map;\n}\n\n/**\n * Like `parseDSL`, but additionally returns findings with line numbers (uninterpretable lines,\n * unresolved references, clamped coordinates) — for editor feedback instead of silent loss.\n */\nexport function parseDSLWithDiagnostics(text: string): ParseResult {\n const diagnostics: ParseDiagnostic[] = [];\n const ids = new IdAllocator();\n const nameToId = new Map<string, string>();\n const elements: MapElement[] = [];\n const rawPassthrough: string[] = [];\n const pendingLinks: PendingLink[] = [];\n const pendingEvolve: PendingEvolve[] = [];\n const pendingPipeline: PendingPipeline[] = [];\n const pendingMethod: PendingMethod[] = [];\n\n let config: MapConfig = { title: 'Untitled Map' };\n let annoCounter = 0;\n let inBlockComment = false;\n /** OWM `url Name [address]` definitions; resolved into component.url / submap.urlRef. */\n const urlDefs = new Map<string, string>();\n /** Not-yet-resolved `url(Name)` references: element index -> definition name. */\n const pendingUrlRefs: Array<{ readonly index: number; readonly ref: string }> = [];\n /** Pipeline from the immediately preceding line (candidate for a `{` block opening). */\n let lastPipeline: PendingPipeline | null = null;\n /** Currently open pipeline block (`{ … }`); component lines inside it are added as children. */\n let blockPipeline: PendingPipeline | null = null;\n\n const register = (name: string, id: string) => {\n if (!nameToId.has(name)) nameToId.set(name, id);\n };\n\n // Diagnostics helpers: read the current line/number from the loop state.\n let lineNo = 0;\n let currentLine = '';\n\n /** Tries to capture a line as a dependency/flow. Returns true when consumed. */\n const pushLink = (line: string): boolean => {\n // Split off an optional link annotation after ';' (e.g. `A -> B; limited by`).\n const semi = line.indexOf(';');\n const core = semi >= 0 ? line.slice(0, semi).trim() : line;\n const linkLabel = semi >= 0 ? line.slice(semi + 1).trim() : '';\n const dep = splitDependency(core);\n const flow = dep ? null : splitFlow(core);\n if (dep) {\n pendingLinks.push({\n left: dep.left,\n right: dep.right,\n kind: 'dependency',\n ...(linkLabel ? { label: linkLabel } : {}),\n raw: line,\n lineNo,\n });\n return true;\n }\n if (flow) {\n pendingLinks.push({\n left: flow.left,\n right: flow.right,\n kind: 'flow',\n bidirectional: flow.op === '<>',\n reverse: flow.op === '<',\n ...(flow.value ? { flowValue: flow.value } : {}),\n ...(linkLabel ? { label: linkLabel } : {}),\n raw: line,\n lineNo,\n });\n return true;\n }\n return false;\n };\n const diag = (message: string, atLine = lineNo, text_ = currentLine) =>\n diagnostics.push({ line: atLine, message, text: text_ });\n /** Passthrough for a line that looks like a known construct but cannot be parsed. */\n const failed = (l: string) => {\n rawPassthrough.push(l);\n diag('Line could not be interpreted (kept losslessly in rawPassthrough)');\n };\n /** Clamps a normalized value to [0,1] — with a diagnostic instead of a later validation crash. */\n const clampDiag = (n: number): number => {\n if (n < 0 || n > 1) diag(`Coordinate ${n} is outside [0,1] and was clamped`);\n return n < 0 ? 0 : n > 1 ? 1 : n;\n };\n const pos = (visibility: number, evolution: number) => ({\n visibility: clampDiag(visibility),\n evolution: clampDiag(evolution),\n });\n\n const sourceLines = text.split(/\\r?\\n/);\n for (let i = 0; i < sourceLines.length; i++) {\n const raw = sourceLines[i]!;\n lineNo = i + 1;\n currentLine = raw.trim();\n let working = raw;\n\n // --- Comments (`//`, `/* */`): strip, but keep losslessly in rawPassthrough. ---\n if (inBlockComment) {\n const close = working.indexOf('*/');\n if (close < 0) {\n rawPassthrough.push(raw);\n continue;\n }\n rawPassthrough.push(working.slice(0, close + 2));\n working = working.slice(close + 2);\n inBlockComment = false;\n }\n // OWM rule: url lines are exempt from comment stripping (https://…).\n if (keywordOf(working) !== 'url') {\n let open = indexOfOutsideQuotes(working, '/*');\n while (open >= 0) {\n const close = working.indexOf('*/', open + 2);\n if (close < 0) {\n rawPassthrough.push(working.slice(open));\n working = working.slice(0, open);\n inBlockComment = true;\n break;\n }\n rawPassthrough.push(working.slice(open, close + 2));\n working = `${working.slice(0, open)} ${working.slice(close + 2)}`;\n open = indexOfOutsideQuotes(working, '/*');\n }\n const { code, comment } = splitLineComment(working);\n if (comment !== null) rawPassthrough.push(comment);\n working = code;\n }\n\n const line = working.trim();\n if (!line) continue;\n\n // --- Pipeline block (OWM v2): `pipeline X [..]` followed by `{ component Child [maturity] }` ---\n if (blockPipeline) {\n if (line === '}') {\n blockPipeline = null;\n continue;\n }\n const childKw = keywordOf(line);\n if (childKw === 'component') {\n const child = parseBlockChild(line.slice(childKw.length).trim());\n if (child) {\n blockPipeline.children.push(child);\n continue;\n }\n }\n rawPassthrough.push(line);\n continue;\n }\n if (line.startsWith('{')) {\n if (lastPipeline) {\n blockPipeline = lastPipeline;\n lastPipeline = null;\n continue;\n }\n rawPassthrough.push(line);\n continue;\n }\n\n const kw = keywordOf(line);\n const after = line.slice(kw.length).trim();\n // `{` binds only to the DIRECTLY preceding pipeline line.\n if (kw !== 'pipeline') lastPipeline = null;\n\n // Edges/flows FIRST: element NAMES may begin with a keyword word (the default\n // component is named \"Component\" -> edge `Component -> X`). Declarations ALWAYS carry\n // coordinates `[...]`, edges never do. Without this pre-detection `Component -> X` would be\n // misread as a (broken) `component` declaration and vanish on re-import. Config/\n // special keywords (title/evolution/y-axis/evolve …) are exempt — they use `->` themselves.\n if (!NON_LINK_KEYWORDS.has(kw) && !parseCoords(line) && pushLink(line)) {\n continue;\n }\n\n switch (kw) {\n case 'title':\n config = { ...config, title: after };\n break;\n\n case 'anchor': {\n const node = parseNode(after);\n if (!node) {\n failed(line);\n break;\n }\n const id = ids.alloc('anchor', node.name);\n const anchor: AnchorElement = compact({\n id,\n elementType: 'anchor',\n label: node.name,\n position: pos(node.coords.a, node.coords.b),\n labelOffset: node.labelOffset,\n color: node.color,\n }) as AnchorElement;\n elements.push(anchor);\n register(node.name, id);\n break;\n }\n\n case 'component':\n case 'market':\n case 'ecosystem': {\n const node = parseNode(after);\n if (!node) {\n failed(line);\n break;\n }\n const decorators = mergeLegacy(kw, node.decorators);\n const id = ids.alloc('cmp', node.name);\n const component: ComponentElement = compact({\n id,\n elementType: 'component',\n label: node.name,\n position: pos(node.coords.a, node.coords.b),\n labelOffset: node.labelOffset,\n decorators: Object.keys(decorators).length ? decorators : undefined,\n color: node.color,\n }) as ComponentElement;\n elements.push(component);\n if (node.urlRef) pendingUrlRefs.push({ index: elements.length - 1, ref: node.urlRef });\n register(node.name, id);\n break;\n }\n\n case 'note': {\n const { color, rest } = parseColor(after);\n const coords = parseCoords(rest);\n // Literal `\\n` back into real line breaks (multi-line notes).\n const textPart = stripCoords(rest).trim().replace(/\\\\n/g, '\\n');\n if (!coords) {\n failed(line);\n break;\n }\n const id = ids.alloc('note', textPart || 'note');\n const note: NoteElement = compact({\n id,\n elementType: 'note',\n label: textPart,\n position: pos(coords.a, coords.b),\n color,\n }) as NoteElement;\n elements.push(note);\n break;\n }\n\n case 'pipeline': {\n // `pipeline X [s, e]`, `pipeline X` (block form, range from children) — optionally with `{` at the end.\n let body = after;\n let opensBlock = false;\n if (body.endsWith('{')) {\n opensBlock = true;\n body = body.slice(0, -1).trim();\n }\n const col = parseColor(body);\n // Project extension `(y 0.x)`: the OWM pipeline line has no slot for the height —\n // without it a standalone pipeline snaps back to visibility 0.5 on every round trip.\n const yMatch = /\\(\\s{0,8}y\\s{1,8}([\\d.]+)\\s{0,8}\\)/.exec(col.rest);\n const bodyRest = yMatch ? col.rest.replace(yMatch[0], ' ') : col.rest;\n const coords = parseCoords(bodyRest);\n const name = stripCoords(bodyRest).trim();\n if (!name) {\n failed(line);\n break;\n }\n const pending: PendingPipeline = {\n name,\n ...(coords ? { start: coords.a, end: coords.b } : {}),\n ...(yMatch ? { visibility: clamp01(Number(yMatch[1])) } : {}),\n ...(col.color ? { color: col.color } : {}),\n raw: line,\n children: [],\n };\n pendingPipeline.push(pending);\n if (opensBlock) blockPipeline = pending;\n else lastPipeline = pending;\n break;\n }\n\n case 'evolve': {\n const ev = parseEvolve(after);\n if (!ev) {\n failed(line);\n break;\n }\n pendingEvolve.push({ ...ev, target: clampDiag(ev.target), raw: line, lineNo });\n break;\n }\n\n case 'style': {\n const s = after.toLowerCase();\n if (KNOWN_STYLES.has(s)) config = { ...config, style: s as MapStyle };\n else failed(line);\n break;\n }\n\n case 'size': {\n const coords = parseCoords(after);\n if (coords) config = { ...config, size: { width: coords.a, height: coords.b } };\n else failed(line);\n break;\n }\n\n case 'evolution': {\n // Exactly four positions (the serializer always writes four). Do NOT filter out\n // empty segments, otherwise an empty stage label is lost (the whole line would fall\n // out of the 4-slot grid and land in rawPassthrough -> axis snaps back to default).\n const parts = after.split('->').map((s) => s.trim());\n if (parts.length === 4) {\n config = { ...config, evolutionLabels: [parts[0]!, parts[1]!, parts[2]!, parts[3]!] };\n } else rawPassthrough.push(raw);\n break;\n }\n\n case 'y-axis': {\n // OWM: `y-axis Label->BottomLabel->TopLabel` — keep the end labels losslessly too.\n const parts = after\n .split('->')\n .map((s) => s.trim())\n .filter(Boolean);\n if (parts.length) {\n config = {\n ...config,\n yAxisLabel: parts[0]!,\n ...(parts.length >= 3\n ? { yAxisEndLabels: [parts[1]!, parts[2]!] as [string, string] }\n : {}),\n };\n } else failed(line);\n break;\n }\n\n case 'annotations': {\n const coords = parseCoords(after);\n if (coords) {\n config = {\n ...config,\n annotationsBoxPosition: pos(coords.a, coords.b),\n };\n } else rawPassthrough.push(raw);\n break;\n }\n\n case 'annotation': {\n const numMatch = /^\\s*(\\d+)/.exec(after);\n const number = numMatch ? Number(numMatch[1]) : ++annoCounter;\n const colA = parseColor(after.replace(/^\\s*\\d+\\s*/, ''));\n const afterNum = colA.rest;\n // Try the multi-position form `[[y,x],[y,x]]` FIRST — the single-tuple RE would otherwise\n // match only the first inner tuple and corrupt the rest as text.\n const multi = parseMultiCoords(afterNum);\n let positions: Coordinate[];\n let text: string;\n if (multi) {\n positions = multi.tuples.map((t) => pos(t.a, t.b));\n text = multi.rest.trim();\n } else {\n const coords = parseCoords(afterNum);\n if (!coords) {\n rawPassthrough.push(line);\n break;\n }\n positions = [pos(coords.a, coords.b)];\n text = stripCoords(afterNum).trim();\n }\n const annotation: AnnotationElement = {\n id: ids.alloc('anno', String(number)),\n elementType: 'annotation',\n label: text,\n position: positions[0]!,\n number,\n positions,\n text,\n ...(colA.color ? { color: colA.color } : {}),\n };\n elements.push(annotation);\n break;\n }\n\n case 'line': {\n // Project extension (freeform drawing): `line [[v,e], [v,e], …] (closed) (dashed) (color x)`.\n const col = parseColor(after);\n const multi = parseMultiCoords(col.rest);\n if (!multi || multi.tuples.length < 2) {\n failed(line);\n break;\n }\n const flags = multi.rest.toLowerCase();\n const strokeStyle: DrawingStrokeStyle | undefined = flags.includes('(dashed)')\n ? 'dashed'\n : flags.includes('(dotted)')\n ? 'dotted'\n : undefined;\n const points = multi.tuples.map((t) => pos(t.a, t.b));\n const drawing: DrawingElement = {\n id: ids.alloc('draw', 'line'),\n elementType: 'drawing',\n label: '',\n position: points[0]!,\n points,\n ...(flags.includes('(closed)') ? { closed: true } : {}),\n ...(strokeStyle ? { strokeStyle } : {}),\n ...(col.color ? { color: col.color } : {}),\n };\n elements.push(drawing);\n break;\n }\n\n case 'pioneers':\n case 'settlers':\n case 'townplanners': {\n // Canonical OWM form: `<kind> [vis1, mat1, vis2, mat2]` (two corners, normalized).\n const col = parseColor(after);\n const four = parseCoords4(col.rest);\n if (!four) {\n failed(line);\n break;\n }\n elements.push(\n makeAttitude(ids, kw as AttitudeKind, four.a, four.b, four.c, four.d, col.color),\n );\n break;\n }\n\n case 'url': {\n // OWM: `url Name [https://…]` — definition, referenced via `url(Name)` on elements.\n // Parsed via indexOf (not regex) — immune to backtracking on hostile input.\n const open = after.indexOf('[');\n const close = after.lastIndexOf(']');\n const name = open > 0 ? after.slice(0, open).trim() : '';\n const address = open > 0 && close > open ? after.slice(open + 1, close).trim() : '';\n if (!name || !address || after.slice(close + 1).trim() !== '') {\n failed(line);\n break;\n }\n urlDefs.set(name, address);\n break;\n }\n\n case 'build':\n case 'buy':\n case 'outsource': {\n // Legacy OWM: `buy <Name>` (method on an existing component) or\n // `buy <Name> [vis, mat]` (create a component with a method).\n const node = parseNode(after);\n if (node) {\n const id = ids.alloc('cmp', node.name);\n const component: ComponentElement = compact({\n id,\n elementType: 'component',\n label: node.name,\n position: pos(node.coords.a, node.coords.b),\n labelOffset: node.labelOffset,\n decorators: { ...node.decorators, method: kw as Method },\n color: node.color,\n }) as ComponentElement;\n elements.push(component);\n register(node.name, id);\n } else if (after.trim()) {\n pendingMethod.push({ name: after.trim(), method: kw as Method, raw: line, lineNo });\n } else {\n rawPassthrough.push(line);\n }\n break;\n }\n\n case 'accelerator':\n case 'deaccelerator': {\n const node = parseNode(after);\n if (!node) {\n failed(line);\n break;\n }\n const id = ids.alloc('accel', node.name);\n const accelerator: AcceleratorElement = {\n id,\n elementType: 'accelerator',\n direction: kw === 'deaccelerator' ? 'deaccelerate' : 'accelerate',\n label: node.name,\n position: pos(node.coords.a, node.coords.b),\n ...(node.color ? { color: node.color } : {}),\n };\n elements.push(accelerator);\n register(node.name, id);\n break;\n }\n\n case 'submap': {\n const node = parseNode(after);\n if (!node) {\n failed(line);\n break;\n }\n const id = ids.alloc('submap', node.name);\n const submap: SubmapElement = {\n id,\n elementType: 'submap',\n label: node.name,\n position: pos(node.coords.a, node.coords.b),\n ...(node.color ? { color: node.color } : {}),\n };\n elements.push(submap);\n if (node.urlRef) pendingUrlRefs.push({ index: elements.length - 1, ref: node.urlRef });\n register(node.name, id);\n break;\n }\n\n default: {\n // Unknown keyword: try as a link (e.g. `A -> B; limited by`), otherwise keep raw.\n if (!pushLink(line)) rawPassthrough.push(line);\n }\n }\n }\n\n // --- Resolve pipelines (visibility from the same-named component; children inherit it) ---\n // BEFORE evolve/method so that evolve/buy can reference block children.\n for (const p of pendingPipeline) {\n const refId = nameToId.get(p.name);\n const ref = elements.find((e) => e.id === refId);\n const visibility = p.visibility ?? (ref ? ref.position.visibility : 0.5);\n const id = ids.alloc('pipeline', p.name);\n // Standalone pipelines (no same-named component) are edge endpoints themselves —\n // register() keeps the first entry, so an existing anchor component still wins.\n register(p.name, id);\n\n const childIds: string[] = [];\n const childElements: ComponentElement[] = [];\n for (const c of p.children) {\n const cid = ids.alloc('cmp', c.name);\n childElements.push(\n compact({\n id: cid,\n elementType: 'component',\n label: c.name,\n position: { visibility, evolution: clamp01(c.maturity) },\n labelOffset: c.labelOffset,\n decorators: Object.keys(c.decorators).length ? c.decorators : undefined,\n pipelineId: id,\n color: c.color,\n }) as ComponentElement,\n );\n register(c.name, cid);\n childIds.push(cid);\n }\n\n // Range: explicit, otherwise derived from the child maturities (OWM v2); useless without either.\n let start =\n p.start ?? (p.children.length ? Math.min(...p.children.map((c) => c.maturity)) : NaN);\n let end = p.end ?? (p.children.length ? Math.max(...p.children.map((c) => c.maturity)) : NaN);\n if (Number.isNaN(start) || Number.isNaN(end)) {\n rawPassthrough.push(p.raw);\n continue;\n }\n start = clamp01(start);\n end = clamp01(end);\n if (end <= start) end = Math.min(1, start + 0.05);\n\n const pipeline: PipelineElement = {\n id,\n elementType: 'pipeline',\n label: p.name,\n position: { visibility, evolution: (start + end) / 2 },\n evolutionStart: start,\n evolutionEnd: end,\n childIds,\n ...(p.color ? { color: p.color } : {}),\n };\n elements.push(pipeline, ...childElements);\n }\n\n // --- Resolve evolve ---\n for (const ev of pendingEvolve) {\n const id = nameToId.get(ev.name);\n const idx = elements.findIndex((e) => e.id === id);\n if (idx < 0 || elements[idx]!.elementType !== 'component') {\n rawPassthrough.push(ev.raw);\n diag(`evolve: component \"${ev.name}\" not found`, ev.lineNo, ev.raw);\n continue;\n }\n const movement = compact({\n targetEvolution: ev.target,\n newLabel: ev.newLabel,\n method: ev.method,\n labelOffset: ev.labelOffset,\n }) as Movement;\n elements[idx] = { ...(elements[idx] as ComponentElement), movement };\n }\n\n // --- Resolve legacy standalone methods (`buy <name>`) ---\n for (const pm of pendingMethod) {\n const id = nameToId.get(pm.name);\n const idx = elements.findIndex((e) => e.id === id);\n const el = idx >= 0 ? elements[idx]! : undefined;\n if (!el || el.elementType !== 'component') {\n rawPassthrough.push(pm.raw);\n diag(`${pm.method}: component \"${pm.name}\" not found`, pm.lineNo, pm.raw);\n continue;\n }\n elements[idx] = { ...el, decorators: { ...el.decorators, method: pm.method } };\n }\n\n // --- Resolve url(...) references (the definition may appear before OR after the element) ---\n const usedUrlDefs = new Set<string>();\n for (const { index, ref } of pendingUrlRefs) {\n const fromDef = urlDefs.get(ref);\n if (fromDef) usedUrlDefs.add(ref);\n // Also accept a directly embedded address (`url(https://…)`).\n const address = fromDef ?? (/^[a-z][\\w+.-]*:\\/\\//i.test(ref) ? ref : undefined);\n if (!address) continue;\n const el = elements[index]!;\n if (el.elementType === 'component') {\n elements[index] = { ...el, url: address };\n } else if (el.elementType === 'submap') {\n elements[index] = { ...el, urlRef: address };\n }\n }\n // Keep unreferenced definitions losslessly.\n for (const [name, address] of urlDefs) {\n if (!usedUrlDefs.has(name)) rawPassthrough.push(`url ${name} [${address}]`);\n }\n\n let depN = 0;\n let flowN = 0;\n const edges: MapEdge[] = [];\n for (const link of pendingLinks) {\n const fromId = nameToId.get(link.left);\n const toId = nameToId.get(link.right);\n if (!fromId || !toId) {\n rawPassthrough.push(link.raw);\n diag(\n `Link: ${!fromId ? `\"${link.left}\"` : `\"${link.right}\"`} not found`,\n link.lineNo,\n link.raw,\n );\n continue;\n }\n if (link.kind === 'dependency') {\n edges.push(\n compact({\n id: `dep_${++depN}`,\n edgeType: 'dependency',\n from: fromId,\n to: toId,\n label: link.label,\n }) as MapEdge,\n );\n } else {\n // `+<` reverses the flow direction (right -> left).\n const [f, t] = link.reverse ? [toId, fromId] : [fromId, toId];\n edges.push(\n compact({\n id: `flow_${++flowN}`,\n edgeType: 'flow',\n from: f,\n to: t,\n bidirectional: link.bidirectional ? true : undefined,\n flowValue: link.flowValue,\n label: link.label,\n }) as MapEdge,\n );\n }\n }\n\n const map = compact({\n schemaVersion: CURRENT_SCHEMA_VERSION,\n config,\n elements,\n edges,\n rawPassthrough: rawPassthrough.length ? rawPassthrough : undefined,\n }) as WardleyMap;\n\n return { map: validateMap(map), diagnostics };\n}\n\ninterface ParsedNode {\n readonly name: string;\n readonly coords: { a: number; b: number };\n readonly decorators: InlineDecorators;\n readonly labelOffset?: { dx: number; dy: number };\n /** `url(Name)` reference (definition name, not yet resolved). */\n readonly urlRef?: string;\n /** Project extension `(color …)` — supported on every element line. */\n readonly color?: string;\n}\n\n/**\n * Parses `<name> [a, b] <decorators> [url(Name)] [label [dx,dy]]`. Decorators, url reference and\n * label offset are looked up ONLY in the suffix AFTER the coordinates — parentheses\n * (`Tea (green)`) or words like \"inertia\" inside the name stay untouched.\n */\nfunction parseNode(after: string): ParsedNode | null {\n const split = splitAtCoords(after);\n if (!split || !split.name) return null;\n // Color must be stripped BEFORE the decorators — `(color x)` would otherwise be consumed\n // (and silently dropped) by the decorator parentheses.\n const col = parseColor(split.suffix);\n const url = parseUrlRef(col.rest);\n const lo = parseLabelOffset(url.rest);\n const dec = parseDecorators(lo.rest);\n return compact({\n name: split.name,\n coords: split.coords,\n decorators: dec.decorators,\n labelOffset: lo.labelOffset ?? undefined,\n urlRef: url.urlRef ?? undefined,\n color: col.color ?? undefined,\n }) as ParsedNode;\n}\n\nfunction clamp01(n: number): number {\n return n < 0 ? 0 : n > 1 ? 1 : n;\n}\n\nconst SINGLE_COORD_RE = /\\[\\s*([-\\d.]+)\\s*\\]/;\n\n/** Parses a pipeline block child line: `<name> [maturity]` (+ optional decorators/offset). */\nfunction parseBlockChild(after: string): PipelineChild | null {\n const m = SINGLE_COORD_RE.exec(after);\n if (!m) return null;\n const maturity = Number(m[1]);\n if (Number.isNaN(maturity)) return null;\n const name = after.slice(0, m.index).trim();\n if (!name) return null;\n const suffix = after.slice(m.index + m[0].length);\n const col = parseColor(suffix);\n const lo = parseLabelOffset(col.rest);\n const dec = parseDecorators(lo.rest);\n return compact({\n name,\n maturity,\n decorators: dec.decorators,\n labelOffset: lo.labelOffset ?? undefined,\n color: col.color ?? undefined,\n }) as PipelineChild;\n}\n\n/** Builds an AttitudeElement from two (arbitrarily oriented) corners; normalizes to TL/BR. */\nfunction makeAttitude(\n ids: IdAllocator,\n kind: AttitudeKind,\n v1: number,\n m1: number,\n v2: number,\n m2: number,\n color?: string,\n): AttitudeElement {\n return {\n id: ids.alloc('attitude', kind),\n elementType: 'attitude',\n kind,\n label: '',\n ...(color ? { color } : {}),\n position: {\n visibility: clamp01(Math.max(v1, v2)),\n evolution: clamp01(Math.min(m1, m2)),\n },\n corner2: {\n visibility: clamp01(Math.min(v1, v2)),\n evolution: clamp01(Math.max(m1, m2)),\n },\n };\n}\n\nfunction mergeLegacy(kw: string, dec: InlineDecorators): ComponentDecorators {\n const merged: Record<string, unknown> = { ...dec };\n if (kw === 'market') merged['market'] = true;\n if (kw === 'ecosystem') merged['ecosystem'] = true;\n return compact(merged) as ComponentDecorators;\n}\n\nfunction parseEvolve(after: string): Omit<PendingEvolve, 'raw'> | null {\n // Remove `label [dx, dy]` FIRST — otherwise the last token is `dy]` and Number() fails.\n const lo = parseLabelOffset(after);\n const dec = parseDecorators(lo.rest);\n const tokens = dec.rest.trim().split(/\\s+/);\n if (tokens.length < 2) return null;\n const last = tokens[tokens.length - 1]!;\n const target = Number(last);\n if (Number.isNaN(target)) return null;\n const namePart = tokens.slice(0, -1).join(' ').trim();\n if (!namePart) return null;\n const renameIdx = namePart.indexOf('->');\n const name = renameIdx >= 0 ? namePart.slice(0, renameIdx).trim() : namePart;\n const newLabel = renameIdx >= 0 ? namePart.slice(renameIdx + 2).trim() : undefined;\n return compact({\n name,\n newLabel: newLabel || undefined,\n target,\n method: dec.decorators.method,\n labelOffset: lo.labelOffset ?? undefined,\n }) as Omit<PendingEvolve, 'raw'>;\n}\n","import type {\n ComponentDecorators,\n ComponentElement,\n LabelOffset,\n MapElement,\n WardleyMap,\n} from '@miragon/wardley-schema-model';\n\n/** Address of an element (component.url / submap.urlRef) — or undefined. */\nfunction urlOf(el: MapElement): string | undefined {\n if (el.elementType === 'component') return el.url;\n if (el.elementType === 'submap') return el.urlRef;\n return undefined;\n}\n\nfunction r(n: number): string {\n return String(Math.round(n * 1000) / 1000);\n}\n\n/** Types referenced BY THEIR NAME in the OWM DSL (edge endpoints + namespace). */\nconst NAMED_TYPES: ReadonlySet<string> = new Set(['anchor', 'component', 'accelerator', 'submap']);\n\nfunction defaultName(type: string): string {\n return type === 'anchor'\n ? 'User'\n : type === 'accelerator'\n ? 'Accelerator'\n : type === 'submap'\n ? 'Submap'\n : 'Component';\n}\n\n/**\n * Returns a name per element ID that is UNIQUE within the DSL for the referenceable types\n * (component/anchor/…). Because edges are serialized by name (`A -> B`), duplicate or empty\n * labels would collapse onto the same node on re-import and make arrows disappear. So on\n * collision a suffix (`Name 2`) is assigned and on an empty label a default — consistently for\n * BOTH sides (node line AND edge reference). Unique names stay unchanged.\n */\nfunction uniqueNames(map: WardleyMap): Map<string, string> {\n const used = new Set<string>();\n const byId = new Map<string, string>();\n for (const el of map.elements) {\n if (!NAMED_TYPES.has(el.elementType)) continue;\n const base = el.label.trim().replace(/->/g, '→') || defaultName(el.elementType);\n let name = base;\n let i = 2;\n while (used.has(name)) name = `${base} ${i++}`;\n used.add(name);\n byId.set(el.id, name);\n }\n return byId;\n}\n\nfunction offsetSuffix(lo: LabelOffset | undefined): string {\n return lo ? ` label [${r(lo.dx)}, ${r(lo.dy)}]` : '';\n}\n\n/** Project extension: `(color …)` after the coordinates (the OWM parser ignores it). */\nfunction colorSuffix(el: { color?: string }): string {\n return el.color ? ` (color ${el.color})` : '';\n}\n\nfunction decoratorSuffix(dec: ComponentDecorators | undefined): string {\n if (!dec) return '';\n const paren: string[] = [];\n if (dec.market) paren.push('market');\n if (dec.ecosystem) paren.push('ecosystem');\n if (dec.method) paren.push(dec.method);\n let out = '';\n if (paren.length) out += ` (${paren.join(', ')})`;\n if (dec.inertia) out += ' inertia';\n return out;\n}\n\n/**\n * Serializes a WardleyMap into Online-Wardley-Maps text. Deterministic; writes only\n * syntax the OWM parser reads back. `rawPassthrough` is appended unchanged.\n * Coordinates are keyword-differentiated (component/anchor/note = [visibility, maturity];\n * pipeline = [maturityStart, maturityEnd]).\n */\nexport function serializeDSL(map: WardleyMap): string {\n const lines: string[] = [];\n const names = uniqueNames(map);\n const nameOf = (el: MapElement): string => names.get(el.id) ?? el.label;\n\n lines.push(`title ${map.config.title}`);\n if (map.config.style) lines.push(`style ${map.config.style}`);\n if (map.config.size)\n lines.push(`size [${r(map.config.size.width)}, ${r(map.config.size.height)}]`);\n if (map.config.evolutionLabels) lines.push(`evolution ${map.config.evolutionLabels.join('->')}`);\n if (map.config.yAxisLabel) {\n const ends = map.config.yAxisEndLabels;\n lines.push(`y-axis ${map.config.yAxisLabel}${ends ? `->${ends[0]}->${ends[1]}` : ''}`);\n }\n if (map.config.annotationsBoxPosition) {\n const b = map.config.annotationsBoxPosition;\n lines.push(`annotations [${r(b.visibility)}, ${r(b.evolution)}]`);\n }\n\n // url definitions: one `url <Name> URL [address]` line per element with an address,\n // referenced on the element via `url(<Name> URL)` (OWM form: definition + reference).\n const urlDefNames = new Map<string, string>(); // element ID -> definition name\n for (const el of map.elements) {\n const address = urlOf(el);\n if (!address) continue;\n const defName = `${nameOf(el)} URL`;\n urlDefNames.set(el.id, defName);\n lines.push(`url ${defName} [${address}]`);\n }\n const urlSuffix = (el: MapElement): string => {\n const def = urlDefNames.get(el.id);\n return def ? ` url(${def})` : '';\n };\n\n // Pipeline children (pipelineId set + pipeline exists) are emitted in the pipeline's\n // block form instead of as top-level components (OWM v2).\n const pipelineIds = new Set(\n map.elements.filter((e) => e.elementType === 'pipeline').map((e) => e.id),\n );\n const childrenByPipeline = new Map<string, ComponentElement[]>();\n for (const el of map.elements) {\n if (el.elementType !== 'component' || !el.pipelineId || !pipelineIds.has(el.pipelineId)) {\n continue;\n }\n const list = childrenByPipeline.get(el.pipelineId) ?? [];\n list.push(el);\n childrenByPipeline.set(el.pipelineId, list);\n }\n const isPipelineChild = (el: MapElement): el is ComponentElement =>\n el.elementType === 'component' && !!el.pipelineId && pipelineIds.has(el.pipelineId);\n\n const evolveLines: string[] = [];\n\n // The OWM pipeline line has no slot for the height — emit the project extension `(y 0.x)`\n // whenever the visibility differs from what re-parsing would derive (anchor component or 0.5),\n // so standalone pipelines do not snap back to mid-canvas on every round trip.\n const componentVisByLabel = new Map<string, number>();\n for (const el of map.elements) {\n if (el.elementType === 'component' && !componentVisByLabel.has(el.label)) {\n componentVisByLabel.set(el.label, el.position.visibility);\n }\n }\n const pipelineYSuffix = (el: MapElement): string => {\n if (el.elementType !== 'pipeline') return '';\n const derived = componentVisByLabel.get(el.label) ?? 0.5;\n return Math.abs(el.position.visibility - derived) > 0.0005\n ? ` (y ${r(el.position.visibility)})`\n : '';\n };\n\n for (const el of map.elements) {\n if (el.elementType === 'component' && el.movement) {\n evolveLines.push(evolveLine(el, nameOf(el)));\n }\n if (isPipelineChild(el)) continue; // emitted inside the pipeline block\n lines.push(elementLine(el, nameOf(el)) + pipelineYSuffix(el) + urlSuffix(el));\n if (el.elementType === 'pipeline') {\n const kids = childrenByPipeline.get(el.id) ?? [];\n if (kids.length) {\n lines.push('{');\n for (const k of kids) {\n lines.push(\n ` component ${nameOf(k)} [${r(k.position.evolution)}]` +\n `${decoratorSuffix(k.decorators)}${colorSuffix(k)}${offsetSuffix(k.labelOffset)}`,\n );\n }\n lines.push('}');\n }\n }\n }\n\n for (const line of evolveLines) lines.push(line);\n\n // Edges may also end at a pipeline (its ■ anchor) — fall back to the element label for\n // endpoint types that are not part of the unique-name pass.\n const labelsById = new Map(map.elements.map((el) => [el.id, el.label]));\n for (const edge of map.edges) {\n const from = names.get(edge.from) ?? labelsById.get(edge.from) ?? edge.from;\n const to = names.get(edge.to) ?? labelsById.get(edge.to) ?? edge.to;\n const annotation = edge.label ? `; ${edge.label}` : '';\n if (edge.edgeType === 'dependency') {\n lines.push(`${from} -> ${to}${annotation}`);\n } else {\n const op = edge.flowValue\n ? `+'${edge.flowValue}'${edge.bidirectional ? '<>' : '>'}`\n : edge.bidirectional\n ? '+<>'\n : '+>';\n lines.push(`${from} ${op} ${to}${annotation}`);\n }\n }\n\n // Config keywords were already emitted from the map above. A rawPassthrough entry with the\n // same keyword (e.g. an unparsable `evolution` line from externally-authored DSL) would\n // otherwise produce a contradictory duplicate line — drop it (config is the truth).\n if (map.rawPassthrough) {\n const emitted = new Set<string>();\n if (map.config.evolutionLabels) emitted.add('evolution');\n if (map.config.yAxisLabel) emitted.add('y-axis');\n for (const raw of map.rawPassthrough) {\n if (emitted.has(raw.trim().split(/\\s+/)[0]!)) continue;\n lines.push(raw);\n }\n }\n\n return lines.join('\\n') + '\\n';\n}\n\nfunction elementLine(el: MapElement, name: string): string {\n const p = el.position;\n switch (el.elementType) {\n case 'anchor':\n return `anchor ${name} [${r(p.visibility)}, ${r(p.evolution)}]${colorSuffix(el)}${offsetSuffix(el.labelOffset)}`;\n case 'component':\n return `component ${name} [${r(p.visibility)}, ${r(p.evolution)}]${decoratorSuffix(el.decorators)}${colorSuffix(el)}${offsetSuffix(el.labelOffset)}`;\n case 'note':\n // Encode line breaks as literal `\\n` -> the line-based DSL stays single-line.\n return `note ${name.replace(/\\n/g, '\\\\n')} [${r(p.visibility)}, ${r(p.evolution)}]${colorSuffix(el)}`;\n case 'pipeline':\n return `pipeline ${name} [${r(el.evolutionStart)}, ${r(el.evolutionEnd)}]${colorSuffix(el)}`;\n case 'submap':\n return `submap ${name} [${r(p.visibility)}, ${r(p.evolution)}]${colorSuffix(el)}`;\n case 'annotation': {\n const pos =\n el.positions.length > 1\n ? `[${el.positions.map((q) => `[${r(q.visibility)}, ${r(q.evolution)}]`).join(', ')}]`\n : `[${r(p.visibility)}, ${r(p.evolution)}]`;\n return `annotation ${el.number} ${pos}${colorSuffix(el)} ${el.text}`;\n }\n case 'accelerator':\n return `${el.direction === 'deaccelerate' ? 'deaccelerator' : 'accelerator'} ${name} [${r(p.visibility)}, ${r(p.evolution)}]${colorSuffix(el)}`;\n case 'attitude':\n // OWM canon: two corners, normalized — `pioneers [vis1, mat1, vis2, mat2]`.\n return `${el.kind} [${r(p.visibility)}, ${r(p.evolution)}, ${r(el.corner2.visibility)}, ${r(el.corner2.evolution)}]${colorSuffix(el)}`;\n case 'drawing': {\n // Project extension (freeform drawing): tuple list + style flags.\n const pts = el.points.map((q) => `[${r(q.visibility)}, ${r(q.evolution)}]`).join(', ');\n const closed = el.closed ? ' (closed)' : '';\n const stroke = el.strokeStyle && el.strokeStyle !== 'solid' ? ` (${el.strokeStyle})` : '';\n return `line [${pts}]${closed}${stroke}${colorSuffix(el)}`;\n }\n }\n}\n\nfunction evolveLine(el: ComponentElement, name: string): string {\n const mv = el.movement!;\n const label = mv.newLabel ? `${name}->${mv.newLabel}` : name;\n const method = mv.method ? ` (${mv.method})` : '';\n return `evolve ${label} ${r(mv.targetEvolution)}${method}${offsetSuffix(mv.labelOffset)}`;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/lexer.ts","../src/parser.ts","../src/serializer.ts"],"names":["text","CURRENT_SCHEMA_VERSION","validateMap"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Small, line-oriented helpers for the OWM DSL (concept doc §7.4).\n * The DSL is line-based; a full tokenizer/generator is not needed.\n */\n\nimport type { Method } from '@miragon/wardley-schema-model';\n\nexport interface ParsedCoords {\n readonly a: number;\n readonly b: number;\n}\n\nconst COORDS_RE = /\\[\\s*([-\\d.]+)\\s*,\\s*([-\\d.]+)\\s*\\]/;\n\n/** Order stays raw (a, b). */\nexport function parseCoords(line: string): ParsedCoords | null {\n const m = COORDS_RE.exec(line);\n if (!m) return null;\n const a = Number(m[1]);\n const b = Number(m[2]);\n if (Number.isNaN(a) || Number.isNaN(b)) return null;\n return { a, b };\n}\n\nexport function stripCoords(line: string): string {\n return line.replace(COORDS_RE, ' ');\n}\n\n/**\n * Splits a line at the first `[a, b]` tuple: name before, suffix after.\n * Decorators/label offsets may then only be looked up in the suffix — parentheses or\n * words like \"inertia\" inside the name stay untouched.\n */\nexport function splitAtCoords(\n line: string,\n): { name: string; coords: ParsedCoords; suffix: string } | null {\n const m = COORDS_RE.exec(line);\n if (!m) return null;\n const a = Number(m[1]);\n const b = Number(m[2]);\n if (Number.isNaN(a) || Number.isNaN(b)) return null;\n return {\n name: line.slice(0, m.index).trim(),\n coords: { a, b },\n suffix: line.slice(m.index + m[0].length),\n };\n}\n\nconst COORDS4_RE = /\\[\\s*([-\\d.]+)\\s*,\\s*([-\\d.]+)\\s*,\\s*([-\\d.]+)\\s*,\\s*([-\\d.]+)\\s*\\]/;\n\nexport interface ParsedCoords4 {\n readonly a: number;\n readonly b: number;\n readonly c: number;\n readonly d: number;\n}\n\n/** Extracts an `[a, b, c, d]` tuple (OWM attitude form) — or null. */\nexport function parseCoords4(line: string): ParsedCoords4 | null {\n const m = COORDS4_RE.exec(line);\n if (!m) return null;\n const vals = [m[1], m[2], m[3], m[4]].map(Number);\n if (vals.some(Number.isNaN)) return null;\n return { a: vals[0]!, b: vals[1]!, c: vals[2]!, d: vals[3]! };\n}\n\n// `[^[\\]]` (tuples cannot contain '[') + bounded whitespace keep the scan linear (ReDoS-safe).\nconst MULTI_COORDS_RE = /\\[\\s{0,8}(\\[[^[\\]]*\\](?:\\s{0,8},\\s{0,8}\\[[^[\\]]*\\])+)\\s{0,8}\\]/;\n\n/** Extracts a tuple list `[[a,b],[c,d],…]` (OWM multi-position annotation) — or null. */\nexport function parseMultiCoords(line: string): { tuples: ParsedCoords[]; rest: string } | null {\n const m = MULTI_COORDS_RE.exec(line);\n if (!m) return null;\n const tuples: ParsedCoords[] = [];\n const inner = /\\[\\s{0,8}([-\\d.]+)\\s{0,8},\\s{0,8}([-\\d.]+)\\s{0,8}\\]/g;\n let t: RegExpExecArray | null;\n while ((t = inner.exec(m[1]!))) {\n const a = Number(t[1]);\n const b = Number(t[2]);\n if (!Number.isNaN(a) && !Number.isNaN(b)) tuples.push({ a, b });\n }\n if (!tuples.length) return null;\n return { tuples, rest: line.replace(MULTI_COORDS_RE, ' ') };\n}\n\n/**\n * Splits off a `//` line comment. Quote-aware (`+'http://x'>` stays untouched) and\n * URL-aware: `//` directly after `:` is a scheme separator (`url(https://…)`), not a comment.\n */\nexport function splitLineComment(line: string): { code: string; comment: string | null } {\n let inQuote = false;\n for (let i = 0; i < line.length - 1; i++) {\n const ch = line[i];\n if (ch === \"'\") inQuote = !inQuote;\n else if (!inQuote && ch === '/' && line[i + 1] === '/' && line[i - 1] !== ':') {\n return { code: line.slice(0, i), comment: line.slice(i) };\n }\n }\n return { code: line, comment: null };\n}\n\n/** First occurrence of `needle` outside `'…'` quotes — or -1. */\nexport function indexOfOutsideQuotes(line: string, needle: string): number {\n let inQuote = false;\n for (let i = 0; i + needle.length <= line.length; i++) {\n const ch = line[i];\n if (ch === \"'\") {\n inQuote = !inQuote;\n continue;\n }\n if (!inQuote && line.startsWith(needle, i)) return i;\n }\n return -1;\n}\n\nexport interface InlineDecorators {\n readonly market?: boolean;\n readonly ecosystem?: boolean;\n readonly inertia?: boolean;\n readonly method?: Method;\n}\n\nconst PAREN_RE = /\\(([^()]*)\\)/g;\nconst METHODS: ReadonlySet<string> = new Set(['build', 'buy', 'outsource']);\n\n/**\n * Reads the inline decorators of a component line:\n * - parenthesized: `(market)`, `(ecosystem)`, `(build|buy|outsource)`, combined `(market, outsource)`\n * - trailing keyword: `inertia`\n * Returns the decorators found and the line stripped of them.\n */\nexport function parseDecorators(line: string): { decorators: InlineDecorators; rest: string } {\n const dec: {\n market?: boolean;\n ecosystem?: boolean;\n inertia?: boolean;\n method?: Method;\n } = {};\n let rest = line;\n\n rest = rest.replace(PAREN_RE, (_full, group: string) => {\n for (const rawToken of group.split(',')) {\n const token = rawToken.trim().toLowerCase();\n if (token === 'market') dec.market = true;\n else if (token === 'ecosystem') dec.ecosystem = true;\n else if (token === 'inertia') dec.inertia = true;\n else if (METHODS.has(token)) dec.method = token as Method;\n }\n return ' ';\n });\n\n // trailing keyword `inertia` (unparenthesized)\n rest = rest.replace(/\\binertia\\b/i, () => {\n dec.inertia = true;\n return ' ';\n });\n\n return { decorators: dec, rest };\n}\n\n// Note color as an (OWM-backwards-compatible) extension: `(color #rrggbb)` OR `(color green)`.\n// Deliberately placed after the coordinates -> the OWM parser ignores the rest instead of pulling\n// it into the note text. Accepts hex or CSS color names.\nconst COLOR_RE = /\\(\\s*color\\s+(#[0-9a-fA-F]{3,8}|[a-zA-Z][\\w-]*)\\s*\\)/i;\n\nexport function parseColor(line: string): { color?: string; rest: string } {\n const m = COLOR_RE.exec(line);\n if (!m || !m[1]) return { rest: line };\n return { color: m[1], rest: line.replace(COLOR_RE, ' ') };\n}\n\nexport interface LabelOffsetToken {\n readonly dx: number;\n readonly dy: number;\n}\n\nconst LABEL_OFFSET_RE = /\\blabel\\s*\\[\\s*([-\\d.]+)\\s*,\\s*([-\\d.]+)\\s*\\]/i;\n\n/** Reads an optional `label [dx, dy]` (pixel offset) and returns it plus the stripped line. */\nexport function parseLabelOffset(line: string): {\n labelOffset: LabelOffsetToken | null;\n rest: string;\n} {\n const m = LABEL_OFFSET_RE.exec(line);\n if (!m) return { labelOffset: null, rest: line };\n const dx = Number(m[1]);\n const dy = Number(m[2]);\n const rest = line.replace(LABEL_OFFSET_RE, ' ');\n if (Number.isNaN(dx) || Number.isNaN(dy)) return { labelOffset: null, rest };\n return { labelOffset: { dx, dy }, rest };\n}\n\nconst URL_REF_RE = /\\burl\\s{0,8}\\(([^()]*)\\)/i;\n\n/**\n * Reads an optional `url(Name)` reference (OWM) and returns it plus the stripped line.\n * MUST run before parseDecorators — otherwise the word \"url\" would remain as junk in the suffix.\n */\nexport function parseUrlRef(line: string): { urlRef: string | null; rest: string } {\n const m = URL_REF_RE.exec(line);\n if (!m) return { urlRef: null, rest: line };\n return { urlRef: m[1]!.trim() || null, rest: line.replace(URL_REF_RE, ' ') };\n}\n\n/** First word (keyword) of a line, lowercased. */\nexport function keywordOf(line: string): string {\n const m = /^\\s*([A-Za-z][\\w-]*)/.exec(line);\n return m ? m[1]!.toLowerCase() : '';\n}\n\nexport function slug(label: string): string {\n return (\n label\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/^_/, '')\n .replace(/_$/, '') || 'x'\n );\n}\n","import {\n CURRENT_SCHEMA_VERSION,\n validateMap,\n type AcceleratorElement,\n type AnchorElement,\n type AnnotationElement,\n type DrawingElement,\n type DrawingStrokeStyle,\n type AttitudeElement,\n type AttitudeKind,\n type ComponentDecorators,\n type ComponentElement,\n type Coordinate,\n type MapConfig,\n type MapEdge,\n type MapElement,\n type MapStyle,\n type Method,\n type Movement,\n type NoteElement,\n type PipelineElement,\n type SubmapElement,\n type WardleyMap,\n} from '@miragon/wardley-schema-model';\nimport {\n indexOfOutsideQuotes,\n keywordOf,\n parseColor,\n parseCoords,\n parseCoords4,\n parseDecorators,\n parseLabelOffset,\n parseMultiCoords,\n parseUrlRef,\n slug,\n splitAtCoords,\n splitLineComment,\n stripCoords,\n type InlineDecorators,\n} from './lexer.js';\n\n/** Splits `A -> B` at the FIRST arrow — plain indexOf, immune to regex backtracking. */\nfunction splitDependency(core: string): { left: string; right: string } | null {\n const arrow = core.indexOf('->');\n if (arrow <= 0) return null;\n const left = core.slice(0, arrow).trim();\n const right = core.slice(arrow + 2).trim();\n return left && right ? { left, right } : null;\n}\n/**\n * Splits a flow line at the FIRST valid operator (`+>`, `+<>`, `+<`, `+'value'>`/`+'value'<>`)\n * via a linear scan — same semantics as the previous lazy regex, but immune to backtracking.\n */\nfunction splitFlow(\n core: string,\n): { left: string; right: string; op: string; value?: string } | null {\n for (let i = 1; i < core.length; i++) {\n if (core[i] !== '+') continue;\n let j = i + 1;\n let value: string | undefined;\n if (core[j] === \"'\") {\n const end = core.indexOf(\"'\", j + 1);\n if (end < 0) continue;\n value = core.slice(j + 1, end);\n j = end + 1;\n }\n const op = core.startsWith('<>', j)\n ? '<>'\n : core[j] === '>' || core[j] === '<'\n ? core[j]!\n : null;\n if (!op) continue;\n const left = core.slice(0, i).trim();\n const right = core.slice(j + op.length).trim();\n if (left && right) return { left, right, op, ...(value ? { value } : {}) };\n }\n return null;\n}\n// Config/special keywords that must NOT be (pre-)detected as an edge — `evolution`/`evolve`/\n// `y-axis`/`title` can themselves contain `->` and have their own handling in the switch.\nconst NON_LINK_KEYWORDS: ReadonlySet<string> = new Set([\n 'title',\n 'style',\n 'size',\n 'evolution',\n 'y-axis',\n 'annotations',\n 'annotation',\n 'evolve',\n 'line',\n]);\nconst KNOWN_STYLES: ReadonlySet<string> = new Set(['wardley', 'handwritten', 'colour', 'dark']);\n\ninterface PendingLink {\n readonly left: string;\n readonly right: string;\n readonly kind: 'dependency' | 'flow';\n readonly bidirectional?: boolean;\n /** `+<` — flow direction reversed (right -> left). */\n readonly reverse?: boolean;\n readonly flowValue?: string;\n /** Annotation text after `;`. */\n readonly label?: string;\n readonly raw: string;\n readonly lineNo: number;\n}\ninterface PendingEvolve {\n readonly name: string;\n readonly newLabel?: string;\n readonly target: number;\n readonly method?: Movement['method'];\n readonly labelOffset?: { dx: number; dy: number };\n readonly raw: string;\n readonly lineNo: number;\n}\ninterface PipelineChild {\n readonly name: string;\n readonly maturity: number;\n readonly decorators: InlineDecorators;\n readonly labelOffset?: { dx: number; dy: number };\n readonly color?: string;\n}\ninterface PendingPipeline {\n readonly name: string;\n /** Explicit range; if absent (OWM v2 block form without coordinates), it is derived from the children. */\n readonly start?: number;\n readonly end?: number;\n /** Explicit height — project extension `(y 0.x)`; otherwise derived from the anchor component. */\n readonly visibility?: number;\n readonly color?: string;\n readonly raw: string;\n readonly children: PipelineChild[];\n}\n/** Legacy standalone line `build|buy|outsource <Name>` — method on an existing component. */\ninterface PendingMethod {\n readonly name: string;\n readonly method: Method;\n readonly raw: string;\n readonly lineNo: number;\n}\n\nfunction compact<T extends Record<string, unknown>>(obj: T): T {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) if (v !== undefined) out[k] = v;\n return out as T;\n}\n\n/** Finding produced while parsing — line is 1-based; `text` is the (comment-stripped) line. */\nexport interface ParseDiagnostic {\n readonly line: number;\n readonly message: string;\n readonly text: string;\n}\n\nexport interface ParseResult {\n readonly map: WardleyMap;\n readonly diagnostics: readonly ParseDiagnostic[];\n}\n\nclass IdAllocator {\n private readonly used = new Set<string>();\n alloc(prefix: string, label: string): string {\n const base = `${prefix}_${slug(label)}`;\n let id = base;\n let i = 2;\n while (this.used.has(id)) id = `${base}_${i++}`;\n this.used.add(id);\n return id;\n }\n}\n\n/**\n * Keyword-differentiated coordinates (component/anchor/note = [visibility, maturity];\n * pipeline = [maturityStart, maturityEnd]). Unknown lines land in `rawPassthrough`.\n */\nexport function parseDSL(text: string): WardleyMap {\n return parseDSLWithDiagnostics(text).map;\n}\n\n/**\n * Like `parseDSL`, but additionally returns findings with line numbers (uninterpretable lines,\n * unresolved references, clamped coordinates) — for editor feedback instead of silent loss.\n */\nexport function parseDSLWithDiagnostics(text: string): ParseResult {\n const diagnostics: ParseDiagnostic[] = [];\n const ids = new IdAllocator();\n const nameToId = new Map<string, string>();\n const elements: MapElement[] = [];\n const rawPassthrough: string[] = [];\n const pendingLinks: PendingLink[] = [];\n const pendingEvolve: PendingEvolve[] = [];\n const pendingPipeline: PendingPipeline[] = [];\n const pendingMethod: PendingMethod[] = [];\n\n let config: MapConfig = { title: 'Untitled Map' };\n let annoCounter = 0;\n let inBlockComment = false;\n /** OWM `url Name [address]` definitions; resolved into component.url / submap.urlRef. */\n const urlDefs = new Map<string, string>();\n /** Not-yet-resolved `url(Name)` references: element index -> definition name. */\n const pendingUrlRefs: Array<{ readonly index: number; readonly ref: string }> = [];\n /** Pipeline from the immediately preceding line (candidate for a `{` block opening). */\n let lastPipeline: PendingPipeline | null = null;\n /** Currently open pipeline block (`{ … }`); component lines inside it are added as children. */\n let blockPipeline: PendingPipeline | null = null;\n\n const register = (name: string, id: string) => {\n if (!nameToId.has(name)) nameToId.set(name, id);\n };\n\n // Diagnostics helpers: read the current line/number from the loop state.\n let lineNo = 0;\n let currentLine = '';\n\n /** Tries to capture a line as a dependency/flow. Returns true when consumed. */\n const pushLink = (line: string): boolean => {\n // Split off an optional link annotation after ';' (e.g. `A -> B; limited by`).\n const semi = line.indexOf(';');\n const core = semi >= 0 ? line.slice(0, semi).trim() : line;\n const linkLabel = semi >= 0 ? line.slice(semi + 1).trim() : '';\n const dep = splitDependency(core);\n const flow = dep ? null : splitFlow(core);\n if (dep) {\n pendingLinks.push({\n left: dep.left,\n right: dep.right,\n kind: 'dependency',\n ...(linkLabel ? { label: linkLabel } : {}),\n raw: line,\n lineNo,\n });\n return true;\n }\n if (flow) {\n pendingLinks.push({\n left: flow.left,\n right: flow.right,\n kind: 'flow',\n bidirectional: flow.op === '<>',\n reverse: flow.op === '<',\n ...(flow.value ? { flowValue: flow.value } : {}),\n ...(linkLabel ? { label: linkLabel } : {}),\n raw: line,\n lineNo,\n });\n return true;\n }\n return false;\n };\n const diag = (message: string, atLine = lineNo, text_ = currentLine) =>\n diagnostics.push({ line: atLine, message, text: text_ });\n /** Passthrough for a line that looks like a known construct but cannot be parsed. */\n const failed = (l: string) => {\n rawPassthrough.push(l);\n diag('Line could not be interpreted (kept losslessly in rawPassthrough)');\n };\n /** Clamps a normalized value to [0,1] — with a diagnostic instead of a later validation crash. */\n const clampDiag = (n: number): number => {\n if (n < 0 || n > 1) diag(`Coordinate ${n} is outside [0,1] and was clamped`);\n return n < 0 ? 0 : n > 1 ? 1 : n;\n };\n const pos = (visibility: number, evolution: number) => ({\n visibility: clampDiag(visibility),\n evolution: clampDiag(evolution),\n });\n\n const sourceLines = text.split(/\\r?\\n/);\n for (let i = 0; i < sourceLines.length; i++) {\n const raw = sourceLines[i]!;\n lineNo = i + 1;\n currentLine = raw.trim();\n let working = raw;\n\n // --- Comments (`//`, `/* */`): strip, but keep losslessly in rawPassthrough. ---\n if (inBlockComment) {\n const close = working.indexOf('*/');\n if (close < 0) {\n rawPassthrough.push(raw);\n continue;\n }\n rawPassthrough.push(working.slice(0, close + 2));\n working = working.slice(close + 2);\n inBlockComment = false;\n }\n // OWM rule: url lines are exempt from comment stripping (https://…).\n if (keywordOf(working) !== 'url') {\n let open = indexOfOutsideQuotes(working, '/*');\n while (open >= 0) {\n const close = working.indexOf('*/', open + 2);\n if (close < 0) {\n rawPassthrough.push(working.slice(open));\n working = working.slice(0, open);\n inBlockComment = true;\n break;\n }\n rawPassthrough.push(working.slice(open, close + 2));\n working = `${working.slice(0, open)} ${working.slice(close + 2)}`;\n open = indexOfOutsideQuotes(working, '/*');\n }\n const { code, comment } = splitLineComment(working);\n if (comment !== null) rawPassthrough.push(comment);\n working = code;\n }\n\n const line = working.trim();\n if (!line) continue;\n\n // --- Pipeline block (OWM v2): `pipeline X [..]` followed by `{ component Child [maturity] }` ---\n if (blockPipeline) {\n if (line === '}') {\n blockPipeline = null;\n continue;\n }\n const childKw = keywordOf(line);\n if (childKw === 'component') {\n const child = parseBlockChild(line.slice(childKw.length).trim());\n if (child) {\n blockPipeline.children.push(child);\n continue;\n }\n }\n rawPassthrough.push(line);\n continue;\n }\n if (line.startsWith('{')) {\n if (lastPipeline) {\n blockPipeline = lastPipeline;\n lastPipeline = null;\n continue;\n }\n rawPassthrough.push(line);\n continue;\n }\n\n const kw = keywordOf(line);\n const after = line.slice(kw.length).trim();\n // `{` binds only to the DIRECTLY preceding pipeline line.\n if (kw !== 'pipeline') lastPipeline = null;\n\n // Edges/flows FIRST: element NAMES may begin with a keyword word (the default\n // component is named \"Component\" -> edge `Component -> X`). Declarations ALWAYS carry\n // coordinates `[...]`, edges never do. Without this pre-detection `Component -> X` would be\n // misread as a (broken) `component` declaration and vanish on re-import. Config/\n // special keywords (title/evolution/y-axis/evolve …) are exempt — they use `->` themselves.\n if (!NON_LINK_KEYWORDS.has(kw) && !parseCoords(line) && pushLink(line)) {\n continue;\n }\n\n switch (kw) {\n case 'title':\n config = { ...config, title: after };\n break;\n\n case 'anchor': {\n const node = parseNode(after);\n if (!node) {\n failed(line);\n break;\n }\n const id = ids.alloc('anchor', node.name);\n const anchor: AnchorElement = compact({\n id,\n elementType: 'anchor',\n label: node.name,\n position: pos(node.coords.a, node.coords.b),\n labelOffset: node.labelOffset,\n color: node.color,\n }) as AnchorElement;\n elements.push(anchor);\n register(node.name, id);\n break;\n }\n\n case 'component':\n case 'market':\n case 'ecosystem': {\n const node = parseNode(after);\n if (!node) {\n failed(line);\n break;\n }\n const decorators = mergeLegacy(kw, node.decorators);\n const id = ids.alloc('cmp', node.name);\n const component: ComponentElement = compact({\n id,\n elementType: 'component',\n label: node.name,\n position: pos(node.coords.a, node.coords.b),\n labelOffset: node.labelOffset,\n decorators: Object.keys(decorators).length ? decorators : undefined,\n color: node.color,\n }) as ComponentElement;\n elements.push(component);\n if (node.urlRef) pendingUrlRefs.push({ index: elements.length - 1, ref: node.urlRef });\n register(node.name, id);\n break;\n }\n\n case 'note': {\n const { color, rest } = parseColor(after);\n const coords = parseCoords(rest);\n // Literal `\\n` back into real line breaks (multi-line notes).\n const textPart = stripCoords(rest).trim().replace(/\\\\n/g, '\\n');\n if (!coords) {\n failed(line);\n break;\n }\n const id = ids.alloc('note', textPart || 'note');\n const note: NoteElement = compact({\n id,\n elementType: 'note',\n label: textPart,\n position: pos(coords.a, coords.b),\n color,\n }) as NoteElement;\n elements.push(note);\n break;\n }\n\n case 'pipeline': {\n // `pipeline X [s, e]`, `pipeline X` (block form, range from children) — optionally with `{` at the end.\n let body = after;\n let opensBlock = false;\n if (body.endsWith('{')) {\n opensBlock = true;\n body = body.slice(0, -1).trim();\n }\n const col = parseColor(body);\n // Project extension `(y 0.x)`: the OWM pipeline line has no slot for the height —\n // without it a standalone pipeline snaps back to visibility 0.5 on every round trip.\n const yMatch = /\\(\\s{0,8}y\\s{1,8}([\\d.]+)\\s{0,8}\\)/.exec(col.rest);\n const bodyRest = yMatch ? col.rest.replace(yMatch[0], ' ') : col.rest;\n const coords = parseCoords(bodyRest);\n const name = stripCoords(bodyRest).trim();\n if (!name) {\n failed(line);\n break;\n }\n const pending: PendingPipeline = {\n name,\n ...(coords ? { start: coords.a, end: coords.b } : {}),\n ...(yMatch ? { visibility: clamp01(Number(yMatch[1])) } : {}),\n ...(col.color ? { color: col.color } : {}),\n raw: line,\n children: [],\n };\n pendingPipeline.push(pending);\n if (opensBlock) blockPipeline = pending;\n else lastPipeline = pending;\n break;\n }\n\n case 'evolve': {\n const ev = parseEvolve(after);\n if (!ev) {\n failed(line);\n break;\n }\n pendingEvolve.push({ ...ev, target: clampDiag(ev.target), raw: line, lineNo });\n break;\n }\n\n case 'style': {\n const s = after.toLowerCase();\n if (KNOWN_STYLES.has(s)) config = { ...config, style: s as MapStyle };\n else failed(line);\n break;\n }\n\n case 'size': {\n const coords = parseCoords(after);\n if (coords) config = { ...config, size: { width: coords.a, height: coords.b } };\n else failed(line);\n break;\n }\n\n case 'evolution': {\n // Exactly four positions (the serializer always writes four). Do NOT filter out\n // empty segments, otherwise an empty stage label is lost (the whole line would fall\n // out of the 4-slot grid and land in rawPassthrough -> axis snaps back to default).\n const parts = after.split('->').map((s) => s.trim());\n if (parts.length === 4) {\n config = { ...config, evolutionLabels: [parts[0]!, parts[1]!, parts[2]!, parts[3]!] };\n } else rawPassthrough.push(raw);\n break;\n }\n\n case 'y-axis': {\n // OWM: `y-axis Label->BottomLabel->TopLabel` — keep the end labels losslessly too.\n const parts = after\n .split('->')\n .map((s) => s.trim())\n .filter(Boolean);\n if (parts.length) {\n config = {\n ...config,\n yAxisLabel: parts[0]!,\n ...(parts.length >= 3\n ? { yAxisEndLabels: [parts[1]!, parts[2]!] as [string, string] }\n : {}),\n };\n } else failed(line);\n break;\n }\n\n case 'annotations': {\n const coords = parseCoords(after);\n if (coords) {\n config = {\n ...config,\n annotationsBoxPosition: pos(coords.a, coords.b),\n };\n } else rawPassthrough.push(raw);\n break;\n }\n\n case 'annotation': {\n const numMatch = /^\\s*(\\d+)/.exec(after);\n const number = numMatch ? Number(numMatch[1]) : ++annoCounter;\n const colA = parseColor(after.replace(/^\\s*\\d+\\s*/, ''));\n const afterNum = colA.rest;\n // Try the multi-position form `[[y,x],[y,x]]` FIRST — the single-tuple RE would otherwise\n // match only the first inner tuple and corrupt the rest as text.\n const multi = parseMultiCoords(afterNum);\n let positions: Coordinate[];\n let text: string;\n if (multi) {\n positions = multi.tuples.map((t) => pos(t.a, t.b));\n text = multi.rest.trim();\n } else {\n const coords = parseCoords(afterNum);\n if (!coords) {\n rawPassthrough.push(line);\n break;\n }\n positions = [pos(coords.a, coords.b)];\n text = stripCoords(afterNum).trim();\n }\n const annotation: AnnotationElement = {\n id: ids.alloc('anno', String(number)),\n elementType: 'annotation',\n label: text,\n position: positions[0]!,\n number,\n positions,\n text,\n ...(colA.color ? { color: colA.color } : {}),\n };\n elements.push(annotation);\n break;\n }\n\n case 'line': {\n // Project extension (freeform drawing): `line [[v,e], [v,e], …] (closed) (dashed) (color x)`.\n const col = parseColor(after);\n const multi = parseMultiCoords(col.rest);\n if (!multi || multi.tuples.length < 2) {\n failed(line);\n break;\n }\n const flags = multi.rest.toLowerCase();\n const strokeStyle: DrawingStrokeStyle | undefined = flags.includes('(dashed)')\n ? 'dashed'\n : flags.includes('(dotted)')\n ? 'dotted'\n : undefined;\n const points = multi.tuples.map((t) => pos(t.a, t.b));\n const drawing: DrawingElement = {\n id: ids.alloc('draw', 'line'),\n elementType: 'drawing',\n label: '',\n position: points[0]!,\n points,\n ...(flags.includes('(closed)') ? { closed: true } : {}),\n ...(strokeStyle ? { strokeStyle } : {}),\n ...(col.color ? { color: col.color } : {}),\n };\n elements.push(drawing);\n break;\n }\n\n case 'pioneers':\n case 'settlers':\n case 'townplanners': {\n // Canonical OWM form: `<kind> [vis1, mat1, vis2, mat2]` (two corners, normalized).\n const col = parseColor(after);\n const four = parseCoords4(col.rest);\n if (!four) {\n failed(line);\n break;\n }\n elements.push(\n makeAttitude(ids, kw as AttitudeKind, four.a, four.b, four.c, four.d, col.color),\n );\n break;\n }\n\n case 'url': {\n // OWM: `url Name [https://…]` — definition, referenced via `url(Name)` on elements.\n // Parsed via indexOf (not regex) — immune to backtracking on hostile input.\n const open = after.indexOf('[');\n const close = after.lastIndexOf(']');\n const name = open > 0 ? after.slice(0, open).trim() : '';\n const address = open > 0 && close > open ? after.slice(open + 1, close).trim() : '';\n if (!name || !address || after.slice(close + 1).trim() !== '') {\n failed(line);\n break;\n }\n urlDefs.set(name, address);\n break;\n }\n\n case 'build':\n case 'buy':\n case 'outsource': {\n // Legacy OWM: `buy <Name>` (method on an existing component) or\n // `buy <Name> [vis, mat]` (create a component with a method).\n const node = parseNode(after);\n if (node) {\n const id = ids.alloc('cmp', node.name);\n const component: ComponentElement = compact({\n id,\n elementType: 'component',\n label: node.name,\n position: pos(node.coords.a, node.coords.b),\n labelOffset: node.labelOffset,\n decorators: { ...node.decorators, method: kw as Method },\n color: node.color,\n }) as ComponentElement;\n elements.push(component);\n register(node.name, id);\n } else if (after.trim()) {\n pendingMethod.push({ name: after.trim(), method: kw as Method, raw: line, lineNo });\n } else {\n rawPassthrough.push(line);\n }\n break;\n }\n\n case 'accelerator':\n case 'deaccelerator': {\n const node = parseNode(after);\n if (!node) {\n failed(line);\n break;\n }\n const id = ids.alloc('accel', node.name);\n const accelerator: AcceleratorElement = {\n id,\n elementType: 'accelerator',\n direction: kw === 'deaccelerator' ? 'deaccelerate' : 'accelerate',\n label: node.name,\n position: pos(node.coords.a, node.coords.b),\n ...(node.color ? { color: node.color } : {}),\n };\n elements.push(accelerator);\n register(node.name, id);\n break;\n }\n\n case 'submap': {\n const node = parseNode(after);\n if (!node) {\n failed(line);\n break;\n }\n const id = ids.alloc('submap', node.name);\n const submap: SubmapElement = {\n id,\n elementType: 'submap',\n label: node.name,\n position: pos(node.coords.a, node.coords.b),\n ...(node.color ? { color: node.color } : {}),\n };\n elements.push(submap);\n if (node.urlRef) pendingUrlRefs.push({ index: elements.length - 1, ref: node.urlRef });\n register(node.name, id);\n break;\n }\n\n default: {\n // Unknown keyword: try as a link (e.g. `A -> B; limited by`), otherwise keep raw.\n if (!pushLink(line)) rawPassthrough.push(line);\n }\n }\n }\n\n // --- Resolve pipelines (visibility from the same-named component; children inherit it) ---\n // BEFORE evolve/method so that evolve/buy can reference block children.\n for (const p of pendingPipeline) {\n const refId = nameToId.get(p.name);\n const ref = elements.find((e) => e.id === refId);\n const visibility = p.visibility ?? (ref ? ref.position.visibility : 0.5);\n const id = ids.alloc('pipeline', p.name);\n // Standalone pipelines (no same-named component) are edge endpoints themselves —\n // register() keeps the first entry, so an existing anchor component still wins.\n register(p.name, id);\n\n const childIds: string[] = [];\n const childElements: ComponentElement[] = [];\n for (const c of p.children) {\n const cid = ids.alloc('cmp', c.name);\n childElements.push(\n compact({\n id: cid,\n elementType: 'component',\n label: c.name,\n position: { visibility, evolution: clamp01(c.maturity) },\n labelOffset: c.labelOffset,\n decorators: Object.keys(c.decorators).length ? c.decorators : undefined,\n pipelineId: id,\n color: c.color,\n }) as ComponentElement,\n );\n register(c.name, cid);\n childIds.push(cid);\n }\n\n // Range: explicit, otherwise derived from the child maturities (OWM v2); useless without either.\n let start =\n p.start ?? (p.children.length ? Math.min(...p.children.map((c) => c.maturity)) : NaN);\n let end = p.end ?? (p.children.length ? Math.max(...p.children.map((c) => c.maturity)) : NaN);\n if (Number.isNaN(start) || Number.isNaN(end)) {\n rawPassthrough.push(p.raw);\n continue;\n }\n start = clamp01(start);\n end = clamp01(end);\n if (end <= start) end = Math.min(1, start + 0.05);\n\n const pipeline: PipelineElement = {\n id,\n elementType: 'pipeline',\n label: p.name,\n position: { visibility, evolution: (start + end) / 2 },\n evolutionStart: start,\n evolutionEnd: end,\n childIds,\n ...(p.color ? { color: p.color } : {}),\n };\n elements.push(pipeline, ...childElements);\n }\n\n // --- Resolve evolve ---\n for (const ev of pendingEvolve) {\n const id = nameToId.get(ev.name);\n const idx = elements.findIndex((e) => e.id === id);\n if (idx < 0 || elements[idx]!.elementType !== 'component') {\n rawPassthrough.push(ev.raw);\n diag(`evolve: component \"${ev.name}\" not found`, ev.lineNo, ev.raw);\n continue;\n }\n const movement = compact({\n targetEvolution: ev.target,\n newLabel: ev.newLabel,\n method: ev.method,\n labelOffset: ev.labelOffset,\n }) as Movement;\n elements[idx] = { ...(elements[idx] as ComponentElement), movement };\n }\n\n // --- Resolve legacy standalone methods (`buy <name>`) ---\n for (const pm of pendingMethod) {\n const id = nameToId.get(pm.name);\n const idx = elements.findIndex((e) => e.id === id);\n const el = idx >= 0 ? elements[idx]! : undefined;\n if (!el || el.elementType !== 'component') {\n rawPassthrough.push(pm.raw);\n diag(`${pm.method}: component \"${pm.name}\" not found`, pm.lineNo, pm.raw);\n continue;\n }\n elements[idx] = { ...el, decorators: { ...el.decorators, method: pm.method } };\n }\n\n // --- Resolve url(...) references (the definition may appear before OR after the element) ---\n const usedUrlDefs = new Set<string>();\n for (const { index, ref } of pendingUrlRefs) {\n const fromDef = urlDefs.get(ref);\n if (fromDef) usedUrlDefs.add(ref);\n // Also accept a directly embedded address (`url(https://…)`).\n const address = fromDef ?? (/^[a-z][\\w+.-]*:\\/\\//i.test(ref) ? ref : undefined);\n if (!address) continue;\n const el = elements[index]!;\n if (el.elementType === 'component') {\n elements[index] = { ...el, url: address };\n } else if (el.elementType === 'submap') {\n elements[index] = { ...el, urlRef: address };\n }\n }\n // Keep unreferenced definitions losslessly.\n for (const [name, address] of urlDefs) {\n if (!usedUrlDefs.has(name)) rawPassthrough.push(`url ${name} [${address}]`);\n }\n\n let depN = 0;\n let flowN = 0;\n const edges: MapEdge[] = [];\n for (const link of pendingLinks) {\n const fromId = nameToId.get(link.left);\n const toId = nameToId.get(link.right);\n if (!fromId || !toId) {\n rawPassthrough.push(link.raw);\n diag(\n `Link: ${!fromId ? `\"${link.left}\"` : `\"${link.right}\"`} not found`,\n link.lineNo,\n link.raw,\n );\n continue;\n }\n if (link.kind === 'dependency') {\n edges.push(\n compact({\n id: `dep_${++depN}`,\n edgeType: 'dependency',\n from: fromId,\n to: toId,\n label: link.label,\n }) as MapEdge,\n );\n } else {\n // `+<` reverses the flow direction (right -> left).\n const [f, t] = link.reverse ? [toId, fromId] : [fromId, toId];\n edges.push(\n compact({\n id: `flow_${++flowN}`,\n edgeType: 'flow',\n from: f,\n to: t,\n bidirectional: link.bidirectional ? true : undefined,\n flowValue: link.flowValue,\n label: link.label,\n }) as MapEdge,\n );\n }\n }\n\n const map = compact({\n schemaVersion: CURRENT_SCHEMA_VERSION,\n config,\n elements,\n edges,\n rawPassthrough: rawPassthrough.length ? rawPassthrough : undefined,\n }) as WardleyMap;\n\n return { map: validateMap(map), diagnostics };\n}\n\ninterface ParsedNode {\n readonly name: string;\n readonly coords: { a: number; b: number };\n readonly decorators: InlineDecorators;\n readonly labelOffset?: { dx: number; dy: number };\n /** `url(Name)` reference (definition name, not yet resolved). */\n readonly urlRef?: string;\n /** Project extension `(color …)` — supported on every element line. */\n readonly color?: string;\n}\n\n/**\n * Parses `<name> [a, b] <decorators> [url(Name)] [label [dx,dy]]`. Decorators, url reference and\n * label offset are looked up ONLY in the suffix AFTER the coordinates — parentheses\n * (`Tea (green)`) or words like \"inertia\" inside the name stay untouched.\n */\nfunction parseNode(after: string): ParsedNode | null {\n const split = splitAtCoords(after);\n if (!split || !split.name) return null;\n // Color must be stripped BEFORE the decorators — `(color x)` would otherwise be consumed\n // (and silently dropped) by the decorator parentheses.\n const col = parseColor(split.suffix);\n const url = parseUrlRef(col.rest);\n const lo = parseLabelOffset(url.rest);\n const dec = parseDecorators(lo.rest);\n return compact({\n name: split.name,\n coords: split.coords,\n decorators: dec.decorators,\n labelOffset: lo.labelOffset ?? undefined,\n urlRef: url.urlRef ?? undefined,\n color: col.color ?? undefined,\n }) as ParsedNode;\n}\n\nfunction clamp01(n: number): number {\n return n < 0 ? 0 : n > 1 ? 1 : n;\n}\n\nconst SINGLE_COORD_RE = /\\[\\s*([-\\d.]+)\\s*\\]/;\n\n/** Parses a pipeline block child line: `<name> [maturity]` (+ optional decorators/offset). */\nfunction parseBlockChild(after: string): PipelineChild | null {\n const m = SINGLE_COORD_RE.exec(after);\n if (!m) return null;\n const maturity = Number(m[1]);\n if (Number.isNaN(maturity)) return null;\n const name = after.slice(0, m.index).trim();\n if (!name) return null;\n const suffix = after.slice(m.index + m[0].length);\n const col = parseColor(suffix);\n const lo = parseLabelOffset(col.rest);\n const dec = parseDecorators(lo.rest);\n return compact({\n name,\n maturity,\n decorators: dec.decorators,\n labelOffset: lo.labelOffset ?? undefined,\n color: col.color ?? undefined,\n }) as PipelineChild;\n}\n\n/** Builds an AttitudeElement from two (arbitrarily oriented) corners; normalizes to TL/BR. */\nfunction makeAttitude(\n ids: IdAllocator,\n kind: AttitudeKind,\n v1: number,\n m1: number,\n v2: number,\n m2: number,\n color?: string,\n): AttitudeElement {\n return {\n id: ids.alloc('attitude', kind),\n elementType: 'attitude',\n kind,\n label: '',\n ...(color ? { color } : {}),\n position: {\n visibility: clamp01(Math.max(v1, v2)),\n evolution: clamp01(Math.min(m1, m2)),\n },\n corner2: {\n visibility: clamp01(Math.min(v1, v2)),\n evolution: clamp01(Math.max(m1, m2)),\n },\n };\n}\n\nfunction mergeLegacy(kw: string, dec: InlineDecorators): ComponentDecorators {\n const merged: Record<string, unknown> = { ...dec };\n if (kw === 'market') merged['market'] = true;\n if (kw === 'ecosystem') merged['ecosystem'] = true;\n return compact(merged) as ComponentDecorators;\n}\n\nfunction parseEvolve(after: string): Omit<PendingEvolve, 'raw'> | null {\n // Remove `label [dx, dy]` FIRST — otherwise the last token is `dy]` and Number() fails.\n const lo = parseLabelOffset(after);\n const dec = parseDecorators(lo.rest);\n const tokens = dec.rest.trim().split(/\\s+/);\n if (tokens.length < 2) return null;\n const last = tokens[tokens.length - 1]!;\n const target = Number(last);\n if (Number.isNaN(target)) return null;\n const namePart = tokens.slice(0, -1).join(' ').trim();\n if (!namePart) return null;\n const renameIdx = namePart.indexOf('->');\n const name = renameIdx >= 0 ? namePart.slice(0, renameIdx).trim() : namePart;\n const newLabel = renameIdx >= 0 ? namePart.slice(renameIdx + 2).trim() : undefined;\n return compact({\n name,\n newLabel: newLabel || undefined,\n target,\n method: dec.decorators.method,\n labelOffset: lo.labelOffset ?? undefined,\n }) as Omit<PendingEvolve, 'raw'>;\n}\n","import type {\n ComponentDecorators,\n ComponentElement,\n LabelOffset,\n MapElement,\n WardleyMap,\n} from '@miragon/wardley-schema-model';\n\n/** Address of an element (component.url / submap.urlRef) — or undefined. */\nfunction urlOf(el: MapElement): string | undefined {\n if (el.elementType === 'component') return el.url;\n if (el.elementType === 'submap') return el.urlRef;\n return undefined;\n}\n\nfunction r(n: number): string {\n return String(Math.round(n * 1000) / 1000);\n}\n\n/** Types referenced BY THEIR NAME in the OWM DSL (edge endpoints + namespace). */\nconst NAMED_TYPES: ReadonlySet<string> = new Set(['anchor', 'component', 'accelerator', 'submap']);\n\nfunction defaultName(type: string): string {\n return type === 'anchor'\n ? 'User'\n : type === 'accelerator'\n ? 'Accelerator'\n : type === 'submap'\n ? 'Submap'\n : 'Component';\n}\n\n/**\n * Returns a name per element ID that is UNIQUE within the DSL for the referenceable types\n * (component/anchor/…). Because edges are serialized by name (`A -> B`), duplicate or empty\n * labels would collapse onto the same node on re-import and make arrows disappear. So on\n * collision a suffix (`Name 2`) is assigned and on an empty label a default — consistently for\n * BOTH sides (node line AND edge reference). Unique names stay unchanged.\n */\nfunction uniqueNames(map: WardleyMap): Map<string, string> {\n const used = new Set<string>();\n const byId = new Map<string, string>();\n for (const el of map.elements) {\n if (!NAMED_TYPES.has(el.elementType)) continue;\n const base = el.label.trim().replace(/->/g, '→') || defaultName(el.elementType);\n let name = base;\n let i = 2;\n while (used.has(name)) name = `${base} ${i++}`;\n used.add(name);\n byId.set(el.id, name);\n }\n return byId;\n}\n\nfunction offsetSuffix(lo: LabelOffset | undefined): string {\n return lo ? ` label [${r(lo.dx)}, ${r(lo.dy)}]` : '';\n}\n\n/** Project extension: `(color …)` after the coordinates (the OWM parser ignores it). */\nfunction colorSuffix(el: { color?: string }): string {\n return el.color ? ` (color ${el.color})` : '';\n}\n\nfunction decoratorSuffix(dec: ComponentDecorators | undefined): string {\n if (!dec) return '';\n const paren: string[] = [];\n if (dec.market) paren.push('market');\n if (dec.ecosystem) paren.push('ecosystem');\n if (dec.method) paren.push(dec.method);\n let out = '';\n if (paren.length) out += ` (${paren.join(', ')})`;\n if (dec.inertia) out += ' inertia';\n return out;\n}\n\n/**\n * Serializes a WardleyMap into Online-Wardley-Maps text. Deterministic; writes only\n * syntax the OWM parser reads back. `rawPassthrough` is appended unchanged.\n * Coordinates are keyword-differentiated (component/anchor/note = [visibility, maturity];\n * pipeline = [maturityStart, maturityEnd]).\n */\nexport function serializeDSL(map: WardleyMap): string {\n const lines: string[] = [];\n const names = uniqueNames(map);\n const nameOf = (el: MapElement): string => names.get(el.id) ?? el.label;\n\n lines.push(`title ${map.config.title}`);\n if (map.config.style) lines.push(`style ${map.config.style}`);\n if (map.config.size)\n lines.push(`size [${r(map.config.size.width)}, ${r(map.config.size.height)}]`);\n if (map.config.evolutionLabels) lines.push(`evolution ${map.config.evolutionLabels.join('->')}`);\n if (map.config.yAxisLabel) {\n const ends = map.config.yAxisEndLabels;\n lines.push(`y-axis ${map.config.yAxisLabel}${ends ? `->${ends[0]}->${ends[1]}` : ''}`);\n }\n if (map.config.annotationsBoxPosition) {\n const b = map.config.annotationsBoxPosition;\n lines.push(`annotations [${r(b.visibility)}, ${r(b.evolution)}]`);\n }\n\n // url definitions: one `url <Name> URL [address]` line per element with an address,\n // referenced on the element via `url(<Name> URL)` (OWM form: definition + reference).\n const urlDefNames = new Map<string, string>(); // element ID -> definition name\n for (const el of map.elements) {\n const address = urlOf(el);\n if (!address) continue;\n const defName = `${nameOf(el)} URL`;\n urlDefNames.set(el.id, defName);\n lines.push(`url ${defName} [${address}]`);\n }\n const urlSuffix = (el: MapElement): string => {\n const def = urlDefNames.get(el.id);\n return def ? ` url(${def})` : '';\n };\n\n // Pipeline children (pipelineId set + pipeline exists) are emitted in the pipeline's\n // block form instead of as top-level components (OWM v2).\n const pipelineIds = new Set(\n map.elements.filter((e) => e.elementType === 'pipeline').map((e) => e.id),\n );\n const childrenByPipeline = new Map<string, ComponentElement[]>();\n for (const el of map.elements) {\n if (el.elementType !== 'component' || !el.pipelineId || !pipelineIds.has(el.pipelineId)) {\n continue;\n }\n const list = childrenByPipeline.get(el.pipelineId) ?? [];\n list.push(el);\n childrenByPipeline.set(el.pipelineId, list);\n }\n const isPipelineChild = (el: MapElement): el is ComponentElement =>\n el.elementType === 'component' && !!el.pipelineId && pipelineIds.has(el.pipelineId);\n\n const evolveLines: string[] = [];\n\n // The OWM pipeline line has no slot for the height — emit the project extension `(y 0.x)`\n // whenever the visibility differs from what re-parsing would derive (anchor component or 0.5),\n // so standalone pipelines do not snap back to mid-canvas on every round trip.\n const componentVisByLabel = new Map<string, number>();\n for (const el of map.elements) {\n if (el.elementType === 'component' && !componentVisByLabel.has(el.label)) {\n componentVisByLabel.set(el.label, el.position.visibility);\n }\n }\n const pipelineYSuffix = (el: MapElement): string => {\n if (el.elementType !== 'pipeline') return '';\n const derived = componentVisByLabel.get(el.label) ?? 0.5;\n return Math.abs(el.position.visibility - derived) > 0.0005\n ? ` (y ${r(el.position.visibility)})`\n : '';\n };\n\n for (const el of map.elements) {\n if (el.elementType === 'component' && el.movement) {\n evolveLines.push(evolveLine(el, nameOf(el)));\n }\n if (isPipelineChild(el)) continue; // emitted inside the pipeline block\n lines.push(elementLine(el, nameOf(el)) + pipelineYSuffix(el) + urlSuffix(el));\n if (el.elementType === 'pipeline') {\n const kids = childrenByPipeline.get(el.id) ?? [];\n if (kids.length) {\n lines.push('{');\n for (const k of kids) {\n lines.push(\n ` component ${nameOf(k)} [${r(k.position.evolution)}]` +\n `${decoratorSuffix(k.decorators)}${colorSuffix(k)}${offsetSuffix(k.labelOffset)}`,\n );\n }\n lines.push('}');\n }\n }\n }\n\n for (const line of evolveLines) lines.push(line);\n\n // Edges may also end at a pipeline (its ■ anchor) — fall back to the element label for\n // endpoint types that are not part of the unique-name pass.\n const labelsById = new Map(map.elements.map((el) => [el.id, el.label]));\n for (const edge of map.edges) {\n const from = names.get(edge.from) ?? labelsById.get(edge.from) ?? edge.from;\n const to = names.get(edge.to) ?? labelsById.get(edge.to) ?? edge.to;\n const annotation = edge.label ? `; ${edge.label}` : '';\n if (edge.edgeType === 'dependency') {\n lines.push(`${from} -> ${to}${annotation}`);\n } else {\n const op = edge.flowValue\n ? `+'${edge.flowValue}'${edge.bidirectional ? '<>' : '>'}`\n : edge.bidirectional\n ? '+<>'\n : '+>';\n lines.push(`${from} ${op} ${to}${annotation}`);\n }\n }\n\n // Config keywords were already emitted from the map above. A rawPassthrough entry with the\n // same keyword (e.g. an unparsable `evolution` line from externally-authored DSL) would\n // otherwise produce a contradictory duplicate line — drop it (config is the truth).\n if (map.rawPassthrough) {\n const emitted = new Set<string>();\n if (map.config.evolutionLabels) emitted.add('evolution');\n if (map.config.yAxisLabel) emitted.add('y-axis');\n for (const raw of map.rawPassthrough) {\n if (emitted.has(raw.trim().split(/\\s+/)[0]!)) continue;\n lines.push(raw);\n }\n }\n\n return lines.join('\\n') + '\\n';\n}\n\nfunction elementLine(el: MapElement, name: string): string {\n const p = el.position;\n switch (el.elementType) {\n case 'anchor':\n return `anchor ${name} [${r(p.visibility)}, ${r(p.evolution)}]${colorSuffix(el)}${offsetSuffix(el.labelOffset)}`;\n case 'component':\n return `component ${name} [${r(p.visibility)}, ${r(p.evolution)}]${decoratorSuffix(el.decorators)}${colorSuffix(el)}${offsetSuffix(el.labelOffset)}`;\n case 'note':\n // Encode line breaks as literal `\\n` -> the line-based DSL stays single-line.\n return `note ${name.replace(/\\n/g, '\\\\n')} [${r(p.visibility)}, ${r(p.evolution)}]${colorSuffix(el)}`;\n case 'pipeline':\n return `pipeline ${name} [${r(el.evolutionStart)}, ${r(el.evolutionEnd)}]${colorSuffix(el)}`;\n case 'submap':\n return `submap ${name} [${r(p.visibility)}, ${r(p.evolution)}]${colorSuffix(el)}`;\n case 'annotation': {\n const pos =\n el.positions.length > 1\n ? `[${el.positions.map((q) => `[${r(q.visibility)}, ${r(q.evolution)}]`).join(', ')}]`\n : `[${r(p.visibility)}, ${r(p.evolution)}]`;\n return `annotation ${el.number} ${pos}${colorSuffix(el)} ${el.text}`;\n }\n case 'accelerator':\n return `${el.direction === 'deaccelerate' ? 'deaccelerator' : 'accelerator'} ${name} [${r(p.visibility)}, ${r(p.evolution)}]${colorSuffix(el)}`;\n case 'attitude':\n // OWM canon: two corners, normalized — `pioneers [vis1, mat1, vis2, mat2]`.\n return `${el.kind} [${r(p.visibility)}, ${r(p.evolution)}, ${r(el.corner2.visibility)}, ${r(el.corner2.evolution)}]${colorSuffix(el)}`;\n case 'drawing': {\n // Project extension (freeform drawing): tuple list + style flags.\n const pts = el.points.map((q) => `[${r(q.visibility)}, ${r(q.evolution)}]`).join(', ');\n const closed = el.closed ? ' (closed)' : '';\n const stroke = el.strokeStyle && el.strokeStyle !== 'solid' ? ` (${el.strokeStyle})` : '';\n return `line [${pts}]${closed}${stroke}${colorSuffix(el)}`;\n }\n }\n}\n\nfunction evolveLine(el: ComponentElement, name: string): string {\n const mv = el.movement!;\n const label = mv.newLabel ? `${name}->${mv.newLabel}` : name;\n const method = mv.method ? ` (${mv.method})` : '';\n return `evolve ${label} ${r(mv.targetEvolution)}${method}${offsetSuffix(mv.labelOffset)}`;\n}\n"]}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lexer.ts","../src/parser.ts","../src/serializer.ts"],"names":["text"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Small, line-oriented helpers for the OWM DSL (concept doc §7.4).\n * The DSL is line-based; a full tokenizer/generator is not needed.\n */\n\nimport type { Method } from '@miragon/wardley-schema-model';\n\nexport interface ParsedCoords {\n readonly a: number;\n readonly b: number;\n}\n\nconst COORDS_RE = /\\[\\s*([-\\d.]+)\\s*,\\s*([-\\d.]+)\\s*\\]/;\n\n/** Order stays raw (a, b). */\nexport function parseCoords(line: string): ParsedCoords | null {\n const m = COORDS_RE.exec(line);\n if (!m) return null;\n const a = Number(m[1]);\n const b = Number(m[2]);\n if (Number.isNaN(a) || Number.isNaN(b)) return null;\n return { a, b };\n}\n\nexport function stripCoords(line: string): string {\n return line.replace(COORDS_RE, ' ');\n}\n\n/**\n * Splits a line at the first `[a, b]` tuple: name before, suffix after.\n * Decorators/label offsets may then only be looked up in the suffix — parentheses or\n * words like \"inertia\" inside the name stay untouched.\n */\nexport function splitAtCoords(\n line: string,\n): { name: string; coords: ParsedCoords; suffix: string } | null {\n const m = COORDS_RE.exec(line);\n if (!m) return null;\n const a = Number(m[1]);\n const b = Number(m[2]);\n if (Number.isNaN(a) || Number.isNaN(b)) return null;\n return {\n name: line.slice(0, m.index).trim(),\n coords: { a, b },\n suffix: line.slice(m.index + m[0].length),\n };\n}\n\nconst COORDS4_RE = /\\[\\s*([-\\d.]+)\\s*,\\s*([-\\d.]+)\\s*,\\s*([-\\d.]+)\\s*,\\s*([-\\d.]+)\\s*\\]/;\n\nexport interface ParsedCoords4 {\n readonly a: number;\n readonly b: number;\n readonly c: number;\n readonly d: number;\n}\n\n/** Extracts an `[a, b, c, d]` tuple (OWM attitude form) — or null. */\nexport function parseCoords4(line: string): ParsedCoords4 | null {\n const m = COORDS4_RE.exec(line);\n if (!m) return null;\n const vals = [m[1], m[2], m[3], m[4]].map(Number);\n if (vals.some(Number.isNaN)) return null;\n return { a: vals[0]!, b: vals[1]!, c: vals[2]!, d: vals[3]! };\n}\n\n// `[^[\\]]` (tuples cannot contain '[') + bounded whitespace keep the scan linear (ReDoS-safe).\nconst MULTI_COORDS_RE = /\\[\\s{0,8}(\\[[^[\\]]*\\](?:\\s{0,8},\\s{0,8}\\[[^[\\]]*\\])+)\\s{0,8}\\]/;\n\n/** Extracts a tuple list `[[a,b],[c,d],…]` (OWM multi-position annotation) — or null. */\nexport function parseMultiCoords(line: string): { tuples: ParsedCoords[]; rest: string } | null {\n const m = MULTI_COORDS_RE.exec(line);\n if (!m) return null;\n const tuples: ParsedCoords[] = [];\n const inner = /\\[\\s{0,8}([-\\d.]+)\\s{0,8},\\s{0,8}([-\\d.]+)\\s{0,8}\\]/g;\n let t: RegExpExecArray | null;\n while ((t = inner.exec(m[1]!))) {\n const a = Number(t[1]);\n const b = Number(t[2]);\n if (!Number.isNaN(a) && !Number.isNaN(b)) tuples.push({ a, b });\n }\n if (!tuples.length) return null;\n return { tuples, rest: line.replace(MULTI_COORDS_RE, ' ') };\n}\n\n/**\n * Splits off a `//` line comment. Quote-aware (`+'http://x'>` stays untouched) and\n * URL-aware: `//` directly after `:` is a scheme separator (`url(https://…)`), not a comment.\n */\nexport function splitLineComment(line: string): { code: string; comment: string | null } {\n let inQuote = false;\n for (let i = 0; i < line.length - 1; i++) {\n const ch = line[i];\n if (ch === \"'\") inQuote = !inQuote;\n else if (!inQuote && ch === '/' && line[i + 1] === '/' && line[i - 1] !== ':') {\n return { code: line.slice(0, i), comment: line.slice(i) };\n }\n }\n return { code: line, comment: null };\n}\n\n/** First occurrence of `needle` outside `'…'` quotes — or -1. */\nexport function indexOfOutsideQuotes(line: string, needle: string): number {\n let inQuote = false;\n for (let i = 0; i + needle.length <= line.length; i++) {\n const ch = line[i];\n if (ch === \"'\") {\n inQuote = !inQuote;\n continue;\n }\n if (!inQuote && line.startsWith(needle, i)) return i;\n }\n return -1;\n}\n\nexport interface InlineDecorators {\n readonly market?: boolean;\n readonly ecosystem?: boolean;\n readonly inertia?: boolean;\n readonly method?: Method;\n}\n\nconst PAREN_RE = /\\(([^()]*)\\)/g;\nconst METHODS: ReadonlySet<string> = new Set(['build', 'buy', 'outsource']);\n\n/**\n * Reads the inline decorators of a component line:\n * - parenthesized: `(market)`, `(ecosystem)`, `(build|buy|outsource)`, combined `(market, outsource)`\n * - trailing keyword: `inertia`\n * Returns the decorators found and the line stripped of them.\n */\nexport function parseDecorators(line: string): { decorators: InlineDecorators; rest: string } {\n const dec: {\n market?: boolean;\n ecosystem?: boolean;\n inertia?: boolean;\n method?: Method;\n } = {};\n let rest = line;\n\n rest = rest.replace(PAREN_RE, (_full, group: string) => {\n for (const rawToken of group.split(',')) {\n const token = rawToken.trim().toLowerCase();\n if (token === 'market') dec.market = true;\n else if (token === 'ecosystem') dec.ecosystem = true;\n else if (token === 'inertia') dec.inertia = true;\n else if (METHODS.has(token)) dec.method = token as Method;\n }\n return ' ';\n });\n\n // trailing keyword `inertia` (unparenthesized)\n rest = rest.replace(/\\binertia\\b/i, () => {\n dec.inertia = true;\n return ' ';\n });\n\n return { decorators: dec, rest };\n}\n\n// Note color as an (OWM-backwards-compatible) extension: `(color #rrggbb)` OR `(color green)`.\n// Deliberately placed after the coordinates -> the OWM parser ignores the rest instead of pulling\n// it into the note text. Accepts hex or CSS color names.\nconst COLOR_RE = /\\(\\s*color\\s+(#[0-9a-fA-F]{3,8}|[a-zA-Z][\\w-]*)\\s*\\)/i;\n\nexport function parseColor(line: string): { color?: string; rest: string } {\n const m = COLOR_RE.exec(line);\n if (!m || !m[1]) return { rest: line };\n return { color: m[1], rest: line.replace(COLOR_RE, ' ') };\n}\n\nexport interface LabelOffsetToken {\n readonly dx: number;\n readonly dy: number;\n}\n\nconst LABEL_OFFSET_RE = /\\blabel\\s*\\[\\s*([-\\d.]+)\\s*,\\s*([-\\d.]+)\\s*\\]/i;\n\n/** Reads an optional `label [dx, dy]` (pixel offset) and returns it plus the stripped line. */\nexport function parseLabelOffset(line: string): {\n labelOffset: LabelOffsetToken | null;\n rest: string;\n} {\n const m = LABEL_OFFSET_RE.exec(line);\n if (!m) return { labelOffset: null, rest: line };\n const dx = Number(m[1]);\n const dy = Number(m[2]);\n const rest = line.replace(LABEL_OFFSET_RE, ' ');\n if (Number.isNaN(dx) || Number.isNaN(dy)) return { labelOffset: null, rest };\n return { labelOffset: { dx, dy }, rest };\n}\n\nconst URL_REF_RE = /\\burl\\s{0,8}\\(([^()]*)\\)/i;\n\n/** Reads an optional `url(Name)` reference (OWM) and returns it plus the stripped line.\n * MUST run before parseDecorators — otherwise the word \"url\" would remain as junk in the suffix. */\nexport function parseUrlRef(line: string): { urlRef: string | null; rest: string } {\n const m = URL_REF_RE.exec(line);\n if (!m) return { urlRef: null, rest: line };\n return { urlRef: m[1]!.trim() || null, rest: line.replace(URL_REF_RE, ' ') };\n}\n\n/** First word (keyword) of a line, lowercased. */\nexport function keywordOf(line: string): string {\n const m = /^\\s*([A-Za-z][\\w-]*)/.exec(line);\n return m ? m[1]!.toLowerCase() : '';\n}\n\nexport function slug(label: string): string {\n return (\n label\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/^_/, '')\n .replace(/_$/, '') || 'x'\n );\n}\n","import {\n CURRENT_SCHEMA_VERSION,\n validateMap,\n type AcceleratorElement,\n type AnchorElement,\n type AnnotationElement,\n type DrawingElement,\n type DrawingStrokeStyle,\n type AttitudeElement,\n type AttitudeKind,\n type ComponentDecorators,\n type ComponentElement,\n type Coordinate,\n type MapConfig,\n type MapEdge,\n type MapElement,\n type MapStyle,\n type Method,\n type Movement,\n type NoteElement,\n type PipelineElement,\n type SubmapElement,\n type WardleyMap,\n} from '@miragon/wardley-schema-model';\nimport {\n indexOfOutsideQuotes,\n keywordOf,\n parseColor,\n parseCoords,\n parseCoords4,\n parseDecorators,\n parseLabelOffset,\n parseMultiCoords,\n parseUrlRef,\n slug,\n splitAtCoords,\n splitLineComment,\n stripCoords,\n type InlineDecorators,\n} from './lexer.js';\n\n/** Splits `A -> B` at the FIRST arrow — plain indexOf, immune to regex backtracking. */\nfunction splitDependency(core: string): { left: string; right: string } | null {\n const arrow = core.indexOf('->');\n if (arrow <= 0) return null;\n const left = core.slice(0, arrow).trim();\n const right = core.slice(arrow + 2).trim();\n return left && right ? { left, right } : null;\n}\n/** 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. */\nfunction splitFlow(\n core: string,\n): { left: string; right: string; op: string; value?: string } | null {\n for (let i = 1; i < core.length; i++) {\n if (core[i] !== '+') continue;\n let j = i + 1;\n let value: string | undefined;\n if (core[j] === \"'\") {\n const end = core.indexOf(\"'\", j + 1);\n if (end < 0) continue;\n value = core.slice(j + 1, end);\n j = end + 1;\n }\n const op = core.startsWith('<>', j)\n ? '<>'\n : core[j] === '>' || core[j] === '<'\n ? core[j]!\n : null;\n if (!op) continue;\n const left = core.slice(0, i).trim();\n const right = core.slice(j + op.length).trim();\n if (left && right) return { left, right, op, ...(value ? { value } : {}) };\n }\n return null;\n}\n// Config/special keywords that must NOT be (pre-)detected as an edge — `evolution`/`evolve`/\n// `y-axis`/`title` can themselves contain `->` and have their own handling in the switch.\nconst NON_LINK_KEYWORDS: ReadonlySet<string> = new Set([\n 'title',\n 'style',\n 'size',\n 'evolution',\n 'y-axis',\n 'annotations',\n 'annotation',\n 'evolve',\n 'line',\n]);\nconst KNOWN_STYLES: ReadonlySet<string> = new Set(['wardley', 'handwritten', 'colour', 'dark']);\n\ninterface PendingLink {\n readonly left: string;\n readonly right: string;\n readonly kind: 'dependency' | 'flow';\n readonly bidirectional?: boolean;\n /** `+<` — flow direction reversed (right -> left). */\n readonly reverse?: boolean;\n readonly flowValue?: string;\n /** Annotation text after `;`. */\n readonly label?: string;\n readonly raw: string;\n readonly lineNo: number;\n}\ninterface PendingEvolve {\n readonly name: string;\n readonly newLabel?: string;\n readonly target: number;\n readonly method?: Movement['method'];\n readonly labelOffset?: { dx: number; dy: number };\n readonly raw: string;\n readonly lineNo: number;\n}\ninterface PipelineChild {\n readonly name: string;\n readonly maturity: number;\n readonly decorators: InlineDecorators;\n readonly labelOffset?: { dx: number; dy: number };\n readonly color?: string;\n}\ninterface PendingPipeline {\n readonly name: string;\n /** Explicit range; if absent (OWM v2 block form without coordinates), it is derived from the children. */\n readonly start?: number;\n readonly end?: number;\n /** Explicit height — project extension `(y 0.x)`; otherwise derived from the anchor component. */\n readonly visibility?: number;\n readonly color?: string;\n readonly raw: string;\n readonly children: PipelineChild[];\n}\n/** Legacy standalone line `build|buy|outsource <Name>` — method on an existing component. */\ninterface PendingMethod {\n readonly name: string;\n readonly method: Method;\n readonly raw: string;\n readonly lineNo: number;\n}\n\nfunction compact<T extends Record<string, unknown>>(obj: T): T {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) if (v !== undefined) out[k] = v;\n return out as T;\n}\n\n/** Finding produced while parsing — line is 1-based; `text` is the (comment-stripped) line. */\nexport interface ParseDiagnostic {\n readonly line: number;\n readonly message: string;\n readonly text: string;\n}\n\nexport interface ParseResult {\n readonly map: WardleyMap;\n readonly diagnostics: readonly ParseDiagnostic[];\n}\n\nclass IdAllocator {\n private readonly used = new Set<string>();\n alloc(prefix: string, label: string): string {\n const base = `${prefix}_${slug(label)}`;\n let id = base;\n let i = 2;\n while (this.used.has(id)) id = `${base}_${i++}`;\n this.used.add(id);\n return id;\n }\n}\n\n/**\n * Keyword-differentiated coordinates (component/anchor/note = [visibility, maturity];\n * pipeline = [maturityStart, maturityEnd]). Unknown lines land in `rawPassthrough`.\n */\nexport function parseDSL(text: string): WardleyMap {\n return parseDSLWithDiagnostics(text).map;\n}\n\n/**\n * Like `parseDSL`, but additionally returns findings with line numbers (uninterpretable lines,\n * unresolved references, clamped coordinates) — for editor feedback instead of silent loss.\n */\nexport function parseDSLWithDiagnostics(text: string): ParseResult {\n const diagnostics: ParseDiagnostic[] = [];\n const ids = new IdAllocator();\n const nameToId = new Map<string, string>();\n const elements: MapElement[] = [];\n const rawPassthrough: string[] = [];\n const pendingLinks: PendingLink[] = [];\n const pendingEvolve: PendingEvolve[] = [];\n const pendingPipeline: PendingPipeline[] = [];\n const pendingMethod: PendingMethod[] = [];\n\n let config: MapConfig = { title: 'Untitled Map' };\n let annoCounter = 0;\n let inBlockComment = false;\n /** OWM `url Name [address]` definitions; resolved into component.url / submap.urlRef. */\n const urlDefs = new Map<string, string>();\n /** Not-yet-resolved `url(Name)` references: element index -> definition name. */\n const pendingUrlRefs: Array<{ readonly index: number; readonly ref: string }> = [];\n /** Pipeline from the immediately preceding line (candidate for a `{` block opening). */\n let lastPipeline: PendingPipeline | null = null;\n /** Currently open pipeline block (`{ … }`); component lines inside it are added as children. */\n let blockPipeline: PendingPipeline | null = null;\n\n const register = (name: string, id: string) => {\n if (!nameToId.has(name)) nameToId.set(name, id);\n };\n\n // Diagnostics helpers: read the current line/number from the loop state.\n let lineNo = 0;\n let currentLine = '';\n\n /** Tries to capture a line as a dependency/flow. Returns true when consumed. */\n const pushLink = (line: string): boolean => {\n // Split off an optional link annotation after ';' (e.g. `A -> B; limited by`).\n const semi = line.indexOf(';');\n const core = semi >= 0 ? line.slice(0, semi).trim() : line;\n const linkLabel = semi >= 0 ? line.slice(semi + 1).trim() : '';\n const dep = splitDependency(core);\n const flow = dep ? null : splitFlow(core);\n if (dep) {\n pendingLinks.push({\n left: dep.left,\n right: dep.right,\n kind: 'dependency',\n ...(linkLabel ? { label: linkLabel } : {}),\n raw: line,\n lineNo,\n });\n return true;\n }\n if (flow) {\n pendingLinks.push({\n left: flow.left,\n right: flow.right,\n kind: 'flow',\n bidirectional: flow.op === '<>',\n reverse: flow.op === '<',\n ...(flow.value ? { flowValue: flow.value } : {}),\n ...(linkLabel ? { label: linkLabel } : {}),\n raw: line,\n lineNo,\n });\n return true;\n }\n return false;\n };\n const diag = (message: string, atLine = lineNo, text_ = currentLine) =>\n diagnostics.push({ line: atLine, message, text: text_ });\n /** Passthrough for a line that looks like a known construct but cannot be parsed. */\n const failed = (l: string) => {\n rawPassthrough.push(l);\n diag('Line could not be interpreted (kept losslessly in rawPassthrough)');\n };\n /** Clamps a normalized value to [0,1] — with a diagnostic instead of a later validation crash. */\n const clampDiag = (n: number): number => {\n if (n < 0 || n > 1) diag(`Coordinate ${n} is outside [0,1] and was clamped`);\n return n < 0 ? 0 : n > 1 ? 1 : n;\n };\n const pos = (visibility: number, evolution: number) => ({\n visibility: clampDiag(visibility),\n evolution: clampDiag(evolution),\n });\n\n const sourceLines = text.split(/\\r?\\n/);\n for (let i = 0; i < sourceLines.length; i++) {\n const raw = sourceLines[i]!;\n lineNo = i + 1;\n currentLine = raw.trim();\n let working = raw;\n\n // --- Comments (`//`, `/* */`): strip, but keep losslessly in rawPassthrough. ---\n if (inBlockComment) {\n const close = working.indexOf('*/');\n if (close < 0) {\n rawPassthrough.push(raw);\n continue;\n }\n rawPassthrough.push(working.slice(0, close + 2));\n working = working.slice(close + 2);\n inBlockComment = false;\n }\n // OWM rule: url lines are exempt from comment stripping (https://…).\n if (keywordOf(working) !== 'url') {\n let open = indexOfOutsideQuotes(working, '/*');\n while (open >= 0) {\n const close = working.indexOf('*/', open + 2);\n if (close < 0) {\n rawPassthrough.push(working.slice(open));\n working = working.slice(0, open);\n inBlockComment = true;\n break;\n }\n rawPassthrough.push(working.slice(open, close + 2));\n working = `${working.slice(0, open)} ${working.slice(close + 2)}`;\n open = indexOfOutsideQuotes(working, '/*');\n }\n const { code, comment } = splitLineComment(working);\n if (comment !== null) rawPassthrough.push(comment);\n working = code;\n }\n\n const line = working.trim();\n if (!line) continue;\n\n // --- Pipeline block (OWM v2): `pipeline X [..]` followed by `{ component Child [maturity] }` ---\n if (blockPipeline) {\n if (line === '}') {\n blockPipeline = null;\n continue;\n }\n const childKw = keywordOf(line);\n if (childKw === 'component') {\n const child = parseBlockChild(line.slice(childKw.length).trim());\n if (child) {\n blockPipeline.children.push(child);\n continue;\n }\n }\n rawPassthrough.push(line);\n continue;\n }\n if (line.startsWith('{')) {\n if (lastPipeline) {\n blockPipeline = lastPipeline;\n lastPipeline = null;\n continue;\n }\n rawPassthrough.push(line);\n continue;\n }\n\n const kw = keywordOf(line);\n const after = line.slice(kw.length).trim();\n // `{` binds only to the DIRECTLY preceding pipeline line.\n if (kw !== 'pipeline') lastPipeline = null;\n\n // Edges/flows FIRST: element NAMES may begin with a keyword word (the default\n // component is named \"Component\" -> edge `Component -> X`). Declarations ALWAYS carry\n // coordinates `[...]`, edges never do. Without this pre-detection `Component -> X` would be\n // misread as a (broken) `component` declaration and vanish on re-import. Config/\n // special keywords (title/evolution/y-axis/evolve …) are exempt — they use `->` themselves.\n if (!NON_LINK_KEYWORDS.has(kw) && !parseCoords(line) && pushLink(line)) {\n continue;\n }\n\n switch (kw) {\n case 'title':\n config = { ...config, title: after };\n break;\n\n case 'anchor': {\n const node = parseNode(after);\n if (!node) {\n failed(line);\n break;\n }\n const id = ids.alloc('anchor', node.name);\n const anchor: AnchorElement = compact({\n id,\n elementType: 'anchor',\n label: node.name,\n position: pos(node.coords.a, node.coords.b),\n labelOffset: node.labelOffset,\n color: node.color,\n }) as AnchorElement;\n elements.push(anchor);\n register(node.name, id);\n break;\n }\n\n case 'component':\n case 'market':\n case 'ecosystem': {\n const node = parseNode(after);\n if (!node) {\n failed(line);\n break;\n }\n const decorators = mergeLegacy(kw, node.decorators);\n const id = ids.alloc('cmp', node.name);\n const component: ComponentElement = compact({\n id,\n elementType: 'component',\n label: node.name,\n position: pos(node.coords.a, node.coords.b),\n labelOffset: node.labelOffset,\n decorators: Object.keys(decorators).length ? decorators : undefined,\n color: node.color,\n }) as ComponentElement;\n elements.push(component);\n if (node.urlRef) pendingUrlRefs.push({ index: elements.length - 1, ref: node.urlRef });\n register(node.name, id);\n break;\n }\n\n case 'note': {\n const { color, rest } = parseColor(after);\n const coords = parseCoords(rest);\n // Literal `\\n` back into real line breaks (multi-line notes).\n const textPart = stripCoords(rest).trim().replace(/\\\\n/g, '\\n');\n if (!coords) {\n failed(line);\n break;\n }\n const id = ids.alloc('note', textPart || 'note');\n const note: NoteElement = compact({\n id,\n elementType: 'note',\n label: textPart,\n position: pos(coords.a, coords.b),\n color,\n }) as NoteElement;\n elements.push(note);\n break;\n }\n\n case 'pipeline': {\n // `pipeline X [s, e]`, `pipeline X` (block form, range from children) — optionally with `{` at the end.\n let body = after;\n let opensBlock = false;\n if (body.endsWith('{')) {\n opensBlock = true;\n body = body.slice(0, -1).trim();\n }\n const col = parseColor(body);\n // Project extension `(y 0.x)`: the OWM pipeline line has no slot for the height —\n // without it a standalone pipeline snaps back to visibility 0.5 on every round trip.\n const yMatch = /\\(\\s{0,8}y\\s{1,8}([\\d.]+)\\s{0,8}\\)/.exec(col.rest);\n const bodyRest = yMatch ? col.rest.replace(yMatch[0], ' ') : col.rest;\n const coords = parseCoords(bodyRest);\n const name = stripCoords(bodyRest).trim();\n if (!name) {\n failed(line);\n break;\n }\n const pending: PendingPipeline = {\n name,\n ...(coords ? { start: coords.a, end: coords.b } : {}),\n ...(yMatch ? { visibility: clamp01(Number(yMatch[1])) } : {}),\n ...(col.color ? { color: col.color } : {}),\n raw: line,\n children: [],\n };\n pendingPipeline.push(pending);\n if (opensBlock) blockPipeline = pending;\n else lastPipeline = pending;\n break;\n }\n\n case 'evolve': {\n const ev = parseEvolve(after);\n if (!ev) {\n failed(line);\n break;\n }\n pendingEvolve.push({ ...ev, target: clampDiag(ev.target), raw: line, lineNo });\n break;\n }\n\n case 'style': {\n const s = after.toLowerCase();\n if (KNOWN_STYLES.has(s)) config = { ...config, style: s as MapStyle };\n else failed(line);\n break;\n }\n\n case 'size': {\n const coords = parseCoords(after);\n if (coords) config = { ...config, size: { width: coords.a, height: coords.b } };\n else failed(line);\n break;\n }\n\n case 'evolution': {\n // Exactly four positions (the serializer always writes four). Do NOT filter out\n // empty segments, otherwise an empty stage label is lost (the whole line would fall\n // out of the 4-slot grid and land in rawPassthrough -> axis snaps back to default).\n const parts = after.split('->').map((s) => s.trim());\n if (parts.length === 4) {\n config = { ...config, evolutionLabels: [parts[0]!, parts[1]!, parts[2]!, parts[3]!] };\n } else rawPassthrough.push(raw);\n break;\n }\n\n case 'y-axis': {\n // OWM: `y-axis Label->BottomLabel->TopLabel` — keep the end labels losslessly too.\n const parts = after\n .split('->')\n .map((s) => s.trim())\n .filter(Boolean);\n if (parts.length) {\n config = {\n ...config,\n yAxisLabel: parts[0]!,\n ...(parts.length >= 3\n ? { yAxisEndLabels: [parts[1]!, parts[2]!] as [string, string] }\n : {}),\n };\n } else failed(line);\n break;\n }\n\n case 'annotations': {\n const coords = parseCoords(after);\n if (coords) {\n config = {\n ...config,\n annotationsBoxPosition: pos(coords.a, coords.b),\n };\n } else rawPassthrough.push(raw);\n break;\n }\n\n case 'annotation': {\n const numMatch = /^\\s*(\\d+)/.exec(after);\n const number = numMatch ? Number(numMatch[1]) : ++annoCounter;\n const colA = parseColor(after.replace(/^\\s*\\d+\\s*/, ''));\n const afterNum = colA.rest;\n // Try the multi-position form `[[y,x],[y,x]]` FIRST — the single-tuple RE would otherwise\n // match only the first inner tuple and corrupt the rest as text.\n const multi = parseMultiCoords(afterNum);\n let positions: Coordinate[];\n let text: string;\n if (multi) {\n positions = multi.tuples.map((t) => pos(t.a, t.b));\n text = multi.rest.trim();\n } else {\n const coords = parseCoords(afterNum);\n if (!coords) {\n rawPassthrough.push(line);\n break;\n }\n positions = [pos(coords.a, coords.b)];\n text = stripCoords(afterNum).trim();\n }\n const annotation: AnnotationElement = {\n id: ids.alloc('anno', String(number)),\n elementType: 'annotation',\n label: text,\n position: positions[0]!,\n number,\n positions,\n text,\n ...(colA.color ? { color: colA.color } : {}),\n };\n elements.push(annotation);\n break;\n }\n\n case 'line': {\n // Project extension (freeform drawing): `line [[v,e], [v,e], …] (closed) (dashed) (color x)`.\n const col = parseColor(after);\n const multi = parseMultiCoords(col.rest);\n if (!multi || multi.tuples.length < 2) {\n failed(line);\n break;\n }\n const flags = multi.rest.toLowerCase();\n const strokeStyle: DrawingStrokeStyle | undefined = flags.includes('(dashed)')\n ? 'dashed'\n : flags.includes('(dotted)')\n ? 'dotted'\n : undefined;\n const points = multi.tuples.map((t) => pos(t.a, t.b));\n const drawing: DrawingElement = {\n id: ids.alloc('draw', 'line'),\n elementType: 'drawing',\n label: '',\n position: points[0]!,\n points,\n ...(flags.includes('(closed)') ? { closed: true } : {}),\n ...(strokeStyle ? { strokeStyle } : {}),\n ...(col.color ? { color: col.color } : {}),\n };\n elements.push(drawing);\n break;\n }\n\n case 'pioneers':\n case 'settlers':\n case 'townplanners': {\n // Canonical OWM form: `<kind> [vis1, mat1, vis2, mat2]` (two corners, normalized).\n const col = parseColor(after);\n const four = parseCoords4(col.rest);\n if (!four) {\n failed(line);\n break;\n }\n elements.push(\n makeAttitude(ids, kw as AttitudeKind, four.a, four.b, four.c, four.d, col.color),\n );\n break;\n }\n\n case 'url': {\n // OWM: `url Name [https://…]` — definition, referenced via `url(Name)` on elements.\n // Parsed via indexOf (not regex) — immune to backtracking on hostile input.\n const open = after.indexOf('[');\n const close = after.lastIndexOf(']');\n const name = open > 0 ? after.slice(0, open).trim() : '';\n const address = open > 0 && close > open ? after.slice(open + 1, close).trim() : '';\n if (!name || !address || after.slice(close + 1).trim() !== '') {\n failed(line);\n break;\n }\n urlDefs.set(name, address);\n break;\n }\n\n case 'build':\n case 'buy':\n case 'outsource': {\n // Legacy OWM: `buy <Name>` (method on an existing component) or\n // `buy <Name> [vis, mat]` (create a component with a method).\n const node = parseNode(after);\n if (node) {\n const id = ids.alloc('cmp', node.name);\n const component: ComponentElement = compact({\n id,\n elementType: 'component',\n label: node.name,\n position: pos(node.coords.a, node.coords.b),\n labelOffset: node.labelOffset,\n decorators: { ...node.decorators, method: kw as Method },\n color: node.color,\n }) as ComponentElement;\n elements.push(component);\n register(node.name, id);\n } else if (after.trim()) {\n pendingMethod.push({ name: after.trim(), method: kw as Method, raw: line, lineNo });\n } else {\n rawPassthrough.push(line);\n }\n break;\n }\n\n case 'accelerator':\n case 'deaccelerator': {\n const node = parseNode(after);\n if (!node) {\n failed(line);\n break;\n }\n const id = ids.alloc('accel', node.name);\n const accelerator: AcceleratorElement = {\n id,\n elementType: 'accelerator',\n direction: kw === 'deaccelerator' ? 'deaccelerate' : 'accelerate',\n label: node.name,\n position: pos(node.coords.a, node.coords.b),\n ...(node.color ? { color: node.color } : {}),\n };\n elements.push(accelerator);\n register(node.name, id);\n break;\n }\n\n case 'submap': {\n const node = parseNode(after);\n if (!node) {\n failed(line);\n break;\n }\n const id = ids.alloc('submap', node.name);\n const submap: SubmapElement = {\n id,\n elementType: 'submap',\n label: node.name,\n position: pos(node.coords.a, node.coords.b),\n ...(node.color ? { color: node.color } : {}),\n };\n elements.push(submap);\n if (node.urlRef) pendingUrlRefs.push({ index: elements.length - 1, ref: node.urlRef });\n register(node.name, id);\n break;\n }\n\n default: {\n // Unknown keyword: try as a link (e.g. `A -> B; limited by`), otherwise keep raw.\n if (!pushLink(line)) rawPassthrough.push(line);\n }\n }\n }\n\n // --- Resolve pipelines (visibility from the same-named component; children inherit it) ---\n // BEFORE evolve/method so that evolve/buy can reference block children.\n for (const p of pendingPipeline) {\n const refId = nameToId.get(p.name);\n const ref = elements.find((e) => e.id === refId);\n const visibility = p.visibility ?? (ref ? ref.position.visibility : 0.5);\n const id = ids.alloc('pipeline', p.name);\n // Standalone pipelines (no same-named component) are edge endpoints themselves —\n // register() keeps the first entry, so an existing anchor component still wins.\n register(p.name, id);\n\n const childIds: string[] = [];\n const childElements: ComponentElement[] = [];\n for (const c of p.children) {\n const cid = ids.alloc('cmp', c.name);\n childElements.push(\n compact({\n id: cid,\n elementType: 'component',\n label: c.name,\n position: { visibility, evolution: clamp01(c.maturity) },\n labelOffset: c.labelOffset,\n decorators: Object.keys(c.decorators).length ? c.decorators : undefined,\n pipelineId: id,\n color: c.color,\n }) as ComponentElement,\n );\n register(c.name, cid);\n childIds.push(cid);\n }\n\n // Range: explicit, otherwise derived from the child maturities (OWM v2); useless without either.\n let start =\n p.start ?? (p.children.length ? Math.min(...p.children.map((c) => c.maturity)) : NaN);\n let end = p.end ?? (p.children.length ? Math.max(...p.children.map((c) => c.maturity)) : NaN);\n if (Number.isNaN(start) || Number.isNaN(end)) {\n rawPassthrough.push(p.raw);\n continue;\n }\n start = clamp01(start);\n end = clamp01(end);\n if (end <= start) end = Math.min(1, start + 0.05);\n\n const pipeline: PipelineElement = {\n id,\n elementType: 'pipeline',\n label: p.name,\n position: { visibility, evolution: (start + end) / 2 },\n evolutionStart: start,\n evolutionEnd: end,\n childIds,\n ...(p.color ? { color: p.color } : {}),\n };\n elements.push(pipeline, ...childElements);\n }\n\n // --- Resolve evolve ---\n for (const ev of pendingEvolve) {\n const id = nameToId.get(ev.name);\n const idx = elements.findIndex((e) => e.id === id);\n if (idx < 0 || elements[idx]!.elementType !== 'component') {\n rawPassthrough.push(ev.raw);\n diag(`evolve: component \"${ev.name}\" not found`, ev.lineNo, ev.raw);\n continue;\n }\n const movement = compact({\n targetEvolution: ev.target,\n newLabel: ev.newLabel,\n method: ev.method,\n labelOffset: ev.labelOffset,\n }) as Movement;\n elements[idx] = { ...(elements[idx] as ComponentElement), movement };\n }\n\n // --- Resolve legacy standalone methods (`buy <name>`) ---\n for (const pm of pendingMethod) {\n const id = nameToId.get(pm.name);\n const idx = elements.findIndex((e) => e.id === id);\n const el = idx >= 0 ? elements[idx]! : undefined;\n if (!el || el.elementType !== 'component') {\n rawPassthrough.push(pm.raw);\n diag(`${pm.method}: component \"${pm.name}\" not found`, pm.lineNo, pm.raw);\n continue;\n }\n elements[idx] = { ...el, decorators: { ...el.decorators, method: pm.method } };\n }\n\n // --- Resolve url(...) references (the definition may appear before OR after the element) ---\n const usedUrlDefs = new Set<string>();\n for (const { index, ref } of pendingUrlRefs) {\n const fromDef = urlDefs.get(ref);\n if (fromDef) usedUrlDefs.add(ref);\n // Also accept a directly embedded address (`url(https://…)`).\n const address = fromDef ?? (/^[a-z][\\w+.-]*:\\/\\//i.test(ref) ? ref : undefined);\n if (!address) continue;\n const el = elements[index]!;\n if (el.elementType === 'component') {\n elements[index] = { ...el, url: address };\n } else if (el.elementType === 'submap') {\n elements[index] = { ...el, urlRef: address };\n }\n }\n // Keep unreferenced definitions losslessly.\n for (const [name, address] of urlDefs) {\n if (!usedUrlDefs.has(name)) rawPassthrough.push(`url ${name} [${address}]`);\n }\n\n let depN = 0;\n let flowN = 0;\n const edges: MapEdge[] = [];\n for (const link of pendingLinks) {\n const fromId = nameToId.get(link.left);\n const toId = nameToId.get(link.right);\n if (!fromId || !toId) {\n rawPassthrough.push(link.raw);\n diag(\n `Link: ${!fromId ? `\"${link.left}\"` : `\"${link.right}\"`} not found`,\n link.lineNo,\n link.raw,\n );\n continue;\n }\n if (link.kind === 'dependency') {\n edges.push(\n compact({\n id: `dep_${++depN}`,\n edgeType: 'dependency',\n from: fromId,\n to: toId,\n label: link.label,\n }) as MapEdge,\n );\n } else {\n // `+<` reverses the flow direction (right -> left).\n const [f, t] = link.reverse ? [toId, fromId] : [fromId, toId];\n edges.push(\n compact({\n id: `flow_${++flowN}`,\n edgeType: 'flow',\n from: f,\n to: t,\n bidirectional: link.bidirectional ? true : undefined,\n flowValue: link.flowValue,\n label: link.label,\n }) as MapEdge,\n );\n }\n }\n\n const map = compact({\n schemaVersion: CURRENT_SCHEMA_VERSION,\n config,\n elements,\n edges,\n rawPassthrough: rawPassthrough.length ? rawPassthrough : undefined,\n }) as WardleyMap;\n\n return { map: validateMap(map), diagnostics };\n}\n\ninterface ParsedNode {\n readonly name: string;\n readonly coords: { a: number; b: number };\n readonly decorators: InlineDecorators;\n readonly labelOffset?: { dx: number; dy: number };\n /** `url(Name)` reference (definition name, not yet resolved). */\n readonly urlRef?: string;\n /** Project extension `(color …)` — supported on every element line. */\n readonly color?: string;\n}\n\n/**\n * Parses `<name> [a, b] <decorators> [url(Name)] [label [dx,dy]]`. Decorators, url reference and\n * label offset are looked up ONLY in the suffix AFTER the coordinates — parentheses\n * (`Tea (green)`) or words like \"inertia\" inside the name stay untouched.\n */\nfunction parseNode(after: string): ParsedNode | null {\n const split = splitAtCoords(after);\n if (!split || !split.name) return null;\n // Color must be stripped BEFORE the decorators — `(color x)` would otherwise be consumed\n // (and silently dropped) by the decorator parentheses.\n const col = parseColor(split.suffix);\n const url = parseUrlRef(col.rest);\n const lo = parseLabelOffset(url.rest);\n const dec = parseDecorators(lo.rest);\n return compact({\n name: split.name,\n coords: split.coords,\n decorators: dec.decorators,\n labelOffset: lo.labelOffset ?? undefined,\n urlRef: url.urlRef ?? undefined,\n color: col.color ?? undefined,\n }) as ParsedNode;\n}\n\nfunction clamp01(n: number): number {\n return n < 0 ? 0 : n > 1 ? 1 : n;\n}\n\nconst SINGLE_COORD_RE = /\\[\\s*([-\\d.]+)\\s*\\]/;\n\n/** Parses a pipeline block child line: `<name> [maturity]` (+ optional decorators/offset). */\nfunction parseBlockChild(after: string): PipelineChild | null {\n const m = SINGLE_COORD_RE.exec(after);\n if (!m) return null;\n const maturity = Number(m[1]);\n if (Number.isNaN(maturity)) return null;\n const name = after.slice(0, m.index).trim();\n if (!name) return null;\n const suffix = after.slice(m.index + m[0].length);\n const col = parseColor(suffix);\n const lo = parseLabelOffset(col.rest);\n const dec = parseDecorators(lo.rest);\n return compact({\n name,\n maturity,\n decorators: dec.decorators,\n labelOffset: lo.labelOffset ?? undefined,\n color: col.color ?? undefined,\n }) as PipelineChild;\n}\n\n/** Builds an AttitudeElement from two (arbitrarily oriented) corners; normalizes to TL/BR. */\nfunction makeAttitude(\n ids: IdAllocator,\n kind: AttitudeKind,\n v1: number,\n m1: number,\n v2: number,\n m2: number,\n color?: string,\n): AttitudeElement {\n return {\n id: ids.alloc('attitude', kind),\n elementType: 'attitude',\n kind,\n label: '',\n ...(color ? { color } : {}),\n position: {\n visibility: clamp01(Math.max(v1, v2)),\n evolution: clamp01(Math.min(m1, m2)),\n },\n corner2: {\n visibility: clamp01(Math.min(v1, v2)),\n evolution: clamp01(Math.max(m1, m2)),\n },\n };\n}\n\nfunction mergeLegacy(kw: string, dec: InlineDecorators): ComponentDecorators {\n const merged: Record<string, unknown> = { ...dec };\n if (kw === 'market') merged['market'] = true;\n if (kw === 'ecosystem') merged['ecosystem'] = true;\n return compact(merged) as ComponentDecorators;\n}\n\nfunction parseEvolve(after: string): Omit<PendingEvolve, 'raw'> | null {\n // Remove `label [dx, dy]` FIRST — otherwise the last token is `dy]` and Number() fails.\n const lo = parseLabelOffset(after);\n const dec = parseDecorators(lo.rest);\n const tokens = dec.rest.trim().split(/\\s+/);\n if (tokens.length < 2) return null;\n const last = tokens[tokens.length - 1]!;\n const target = Number(last);\n if (Number.isNaN(target)) return null;\n const namePart = tokens.slice(0, -1).join(' ').trim();\n if (!namePart) return null;\n const renameIdx = namePart.indexOf('->');\n const name = renameIdx >= 0 ? namePart.slice(0, renameIdx).trim() : namePart;\n const newLabel = renameIdx >= 0 ? namePart.slice(renameIdx + 2).trim() : undefined;\n return compact({\n name,\n newLabel: newLabel || undefined,\n target,\n method: dec.decorators.method,\n labelOffset: lo.labelOffset ?? undefined,\n }) as Omit<PendingEvolve, 'raw'>;\n}\n","import type {\n ComponentDecorators,\n ComponentElement,\n LabelOffset,\n MapElement,\n WardleyMap,\n} from '@miragon/wardley-schema-model';\n\n/** Address of an element (component.url / submap.urlRef) — or undefined. */\nfunction urlOf(el: MapElement): string | undefined {\n if (el.elementType === 'component') return el.url;\n if (el.elementType === 'submap') return el.urlRef;\n return undefined;\n}\n\nfunction r(n: number): string {\n return String(Math.round(n * 1000) / 1000);\n}\n\n/** Types referenced BY THEIR NAME in the OWM DSL (edge endpoints + namespace). */\nconst NAMED_TYPES: ReadonlySet<string> = new Set(['anchor', 'component', 'accelerator', 'submap']);\n\nfunction defaultName(type: string): string {\n return type === 'anchor'\n ? 'User'\n : type === 'accelerator'\n ? 'Accelerator'\n : type === 'submap'\n ? 'Submap'\n : 'Component';\n}\n\n/**\n * Returns a name per element ID that is UNIQUE within the DSL for the referenceable types\n * (component/anchor/…). Because edges are serialized by name (`A -> B`), duplicate or empty\n * labels would collapse onto the same node on re-import and make arrows disappear. So on\n * collision a suffix (`Name 2`) is assigned and on an empty label a default — consistently for\n * BOTH sides (node line AND edge reference). Unique names stay unchanged.\n */\nfunction uniqueNames(map: WardleyMap): Map<string, string> {\n const used = new Set<string>();\n const byId = new Map<string, string>();\n for (const el of map.elements) {\n if (!NAMED_TYPES.has(el.elementType)) continue;\n const base = el.label.trim().replace(/->/g, '→') || defaultName(el.elementType);\n let name = base;\n let i = 2;\n while (used.has(name)) name = `${base} ${i++}`;\n used.add(name);\n byId.set(el.id, name);\n }\n return byId;\n}\n\nfunction offsetSuffix(lo: LabelOffset | undefined): string {\n return lo ? ` label [${r(lo.dx)}, ${r(lo.dy)}]` : '';\n}\n\n/** Project extension: `(color …)` after the coordinates (the OWM parser ignores it). */\nfunction colorSuffix(el: { color?: string }): string {\n return el.color ? ` (color ${el.color})` : '';\n}\n\nfunction decoratorSuffix(dec: ComponentDecorators | undefined): string {\n if (!dec) return '';\n const paren: string[] = [];\n if (dec.market) paren.push('market');\n if (dec.ecosystem) paren.push('ecosystem');\n if (dec.method) paren.push(dec.method);\n let out = '';\n if (paren.length) out += ` (${paren.join(', ')})`;\n if (dec.inertia) out += ' inertia';\n return out;\n}\n\n/**\n * Serializes a WardleyMap into Online-Wardley-Maps text. Deterministic; writes only\n * syntax the OWM parser reads back. `rawPassthrough` is appended unchanged.\n * Coordinates are keyword-differentiated (component/anchor/note = [visibility, maturity];\n * pipeline = [maturityStart, maturityEnd]).\n */\nexport function serializeDSL(map: WardleyMap): string {\n const lines: string[] = [];\n const names = uniqueNames(map);\n const nameOf = (el: MapElement): string => names.get(el.id) ?? el.label;\n\n lines.push(`title ${map.config.title}`);\n if (map.config.style) lines.push(`style ${map.config.style}`);\n if (map.config.size)\n lines.push(`size [${r(map.config.size.width)}, ${r(map.config.size.height)}]`);\n if (map.config.evolutionLabels) lines.push(`evolution ${map.config.evolutionLabels.join('->')}`);\n if (map.config.yAxisLabel) {\n const ends = map.config.yAxisEndLabels;\n lines.push(`y-axis ${map.config.yAxisLabel}${ends ? `->${ends[0]}->${ends[1]}` : ''}`);\n }\n if (map.config.annotationsBoxPosition) {\n const b = map.config.annotationsBoxPosition;\n lines.push(`annotations [${r(b.visibility)}, ${r(b.evolution)}]`);\n }\n\n // url definitions: one `url <Name> URL [address]` line per element with an address,\n // referenced on the element via `url(<Name> URL)` (OWM form: definition + reference).\n const urlDefNames = new Map<string, string>(); // element ID -> definition name\n for (const el of map.elements) {\n const address = urlOf(el);\n if (!address) continue;\n const defName = `${nameOf(el)} URL`;\n urlDefNames.set(el.id, defName);\n lines.push(`url ${defName} [${address}]`);\n }\n const urlSuffix = (el: MapElement): string => {\n const def = urlDefNames.get(el.id);\n return def ? ` url(${def})` : '';\n };\n\n // Pipeline children (pipelineId set + pipeline exists) are emitted in the pipeline's\n // block form instead of as top-level components (OWM v2).\n const pipelineIds = new Set(\n map.elements.filter((e) => e.elementType === 'pipeline').map((e) => e.id),\n );\n const childrenByPipeline = new Map<string, ComponentElement[]>();\n for (const el of map.elements) {\n if (el.elementType !== 'component' || !el.pipelineId || !pipelineIds.has(el.pipelineId)) {\n continue;\n }\n const list = childrenByPipeline.get(el.pipelineId) ?? [];\n list.push(el);\n childrenByPipeline.set(el.pipelineId, list);\n }\n const isPipelineChild = (el: MapElement): el is ComponentElement =>\n el.elementType === 'component' && !!el.pipelineId && pipelineIds.has(el.pipelineId);\n\n const evolveLines: string[] = [];\n\n // The OWM pipeline line has no slot for the height — emit the project extension `(y 0.x)`\n // whenever the visibility differs from what re-parsing would derive (anchor component or 0.5),\n // so standalone pipelines do not snap back to mid-canvas on every round trip.\n const componentVisByLabel = new Map<string, number>();\n for (const el of map.elements) {\n if (el.elementType === 'component' && !componentVisByLabel.has(el.label)) {\n componentVisByLabel.set(el.label, el.position.visibility);\n }\n }\n const pipelineYSuffix = (el: MapElement): string => {\n if (el.elementType !== 'pipeline') return '';\n const derived = componentVisByLabel.get(el.label) ?? 0.5;\n return Math.abs(el.position.visibility - derived) > 0.0005\n ? ` (y ${r(el.position.visibility)})`\n : '';\n };\n\n for (const el of map.elements) {\n if (el.elementType === 'component' && el.movement) {\n evolveLines.push(evolveLine(el, nameOf(el)));\n }\n if (isPipelineChild(el)) continue; // emitted inside the pipeline block\n lines.push(elementLine(el, nameOf(el)) + pipelineYSuffix(el) + urlSuffix(el));\n if (el.elementType === 'pipeline') {\n const kids = childrenByPipeline.get(el.id) ?? [];\n if (kids.length) {\n lines.push('{');\n for (const k of kids) {\n lines.push(\n ` component ${nameOf(k)} [${r(k.position.evolution)}]` +\n `${decoratorSuffix(k.decorators)}${colorSuffix(k)}${offsetSuffix(k.labelOffset)}`,\n );\n }\n lines.push('}');\n }\n }\n }\n\n for (const line of evolveLines) lines.push(line);\n\n // Edges may also end at a pipeline (its ■ anchor) — fall back to the element label for\n // endpoint types that are not part of the unique-name pass.\n const labelsById = new Map(map.elements.map((el) => [el.id, el.label]));\n for (const edge of map.edges) {\n const from = names.get(edge.from) ?? labelsById.get(edge.from) ?? edge.from;\n const to = names.get(edge.to) ?? labelsById.get(edge.to) ?? edge.to;\n const annotation = edge.label ? `; ${edge.label}` : '';\n if (edge.edgeType === 'dependency') {\n lines.push(`${from} -> ${to}${annotation}`);\n } else {\n const op = edge.flowValue\n ? `+'${edge.flowValue}'${edge.bidirectional ? '<>' : '>'}`\n : edge.bidirectional\n ? '+<>'\n : '+>';\n lines.push(`${from} ${op} ${to}${annotation}`);\n }\n }\n\n // Config keywords were already emitted from the map above. A rawPassthrough entry with the\n // same keyword (e.g. an unparsable `evolution` line from externally-authored DSL) would\n // otherwise produce a contradictory duplicate line — drop it (config is the truth).\n if (map.rawPassthrough) {\n const emitted = new Set<string>();\n if (map.config.evolutionLabels) emitted.add('evolution');\n if (map.config.yAxisLabel) emitted.add('y-axis');\n for (const raw of map.rawPassthrough) {\n if (emitted.has(raw.trim().split(/\\s+/)[0]!)) continue;\n lines.push(raw);\n }\n }\n\n return lines.join('\\n') + '\\n';\n}\n\nfunction elementLine(el: MapElement, name: string): string {\n const p = el.position;\n switch (el.elementType) {\n case 'anchor':\n return `anchor ${name} [${r(p.visibility)}, ${r(p.evolution)}]${colorSuffix(el)}${offsetSuffix(el.labelOffset)}`;\n case 'component':\n return `component ${name} [${r(p.visibility)}, ${r(p.evolution)}]${decoratorSuffix(el.decorators)}${colorSuffix(el)}${offsetSuffix(el.labelOffset)}`;\n case 'note':\n // Encode line breaks as literal `\\n` -> the line-based DSL stays single-line.\n return `note ${name.replace(/\\n/g, '\\\\n')} [${r(p.visibility)}, ${r(p.evolution)}]${colorSuffix(el)}`;\n case 'pipeline':\n return `pipeline ${name} [${r(el.evolutionStart)}, ${r(el.evolutionEnd)}]${colorSuffix(el)}`;\n case 'submap':\n return `submap ${name} [${r(p.visibility)}, ${r(p.evolution)}]${colorSuffix(el)}`;\n case 'annotation': {\n const pos =\n el.positions.length > 1\n ? `[${el.positions.map((q) => `[${r(q.visibility)}, ${r(q.evolution)}]`).join(', ')}]`\n : `[${r(p.visibility)}, ${r(p.evolution)}]`;\n return `annotation ${el.number} ${pos}${colorSuffix(el)} ${el.text}`;\n }\n case 'accelerator':\n return `${el.direction === 'deaccelerate' ? 'deaccelerator' : 'accelerator'} ${name} [${r(p.visibility)}, ${r(p.evolution)}]${colorSuffix(el)}`;\n case 'attitude':\n // OWM canon: two corners, normalized — `pioneers [vis1, mat1, vis2, mat2]`.\n return `${el.kind} [${r(p.visibility)}, ${r(p.evolution)}, ${r(el.corner2.visibility)}, ${r(el.corner2.evolution)}]${colorSuffix(el)}`;\n case 'drawing': {\n // Project extension (freeform drawing): tuple list + style flags.\n const pts = el.points.map((q) => `[${r(q.visibility)}, ${r(q.evolution)}]`).join(', ');\n const closed = el.closed ? ' (closed)' : '';\n const stroke = el.strokeStyle && el.strokeStyle !== 'solid' ? ` (${el.strokeStyle})` : '';\n return `line [${pts}]${closed}${stroke}${colorSuffix(el)}`;\n }\n }\n}\n\nfunction evolveLine(el: ComponentElement, name: string): string {\n const mv = el.movement!;\n const label = mv.newLabel ? `${name}->${mv.newLabel}` : name;\n const method = mv.method ? ` (${mv.method})` : '';\n return `evolve ${label} ${r(mv.targetEvolution)}${method}${offsetSuffix(mv.labelOffset)}`;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/lexer.ts","../src/parser.ts","../src/serializer.ts"],"names":["text"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Small, line-oriented helpers for the OWM DSL (concept doc §7.4).\n * The DSL is line-based; a full tokenizer/generator is not needed.\n */\n\nimport type { Method } from '@miragon/wardley-schema-model';\n\nexport interface ParsedCoords {\n readonly a: number;\n readonly b: number;\n}\n\nconst COORDS_RE = /\\[\\s*([-\\d.]+)\\s*,\\s*([-\\d.]+)\\s*\\]/;\n\n/** Order stays raw (a, b). */\nexport function parseCoords(line: string): ParsedCoords | null {\n const m = COORDS_RE.exec(line);\n if (!m) return null;\n const a = Number(m[1]);\n const b = Number(m[2]);\n if (Number.isNaN(a) || Number.isNaN(b)) return null;\n return { a, b };\n}\n\nexport function stripCoords(line: string): string {\n return line.replace(COORDS_RE, ' ');\n}\n\n/**\n * Splits a line at the first `[a, b]` tuple: name before, suffix after.\n * Decorators/label offsets may then only be looked up in the suffix — parentheses or\n * words like \"inertia\" inside the name stay untouched.\n */\nexport function splitAtCoords(\n line: string,\n): { name: string; coords: ParsedCoords; suffix: string } | null {\n const m = COORDS_RE.exec(line);\n if (!m) return null;\n const a = Number(m[1]);\n const b = Number(m[2]);\n if (Number.isNaN(a) || Number.isNaN(b)) return null;\n return {\n name: line.slice(0, m.index).trim(),\n coords: { a, b },\n suffix: line.slice(m.index + m[0].length),\n };\n}\n\nconst COORDS4_RE = /\\[\\s*([-\\d.]+)\\s*,\\s*([-\\d.]+)\\s*,\\s*([-\\d.]+)\\s*,\\s*([-\\d.]+)\\s*\\]/;\n\nexport interface ParsedCoords4 {\n readonly a: number;\n readonly b: number;\n readonly c: number;\n readonly d: number;\n}\n\n/** Extracts an `[a, b, c, d]` tuple (OWM attitude form) — or null. */\nexport function parseCoords4(line: string): ParsedCoords4 | null {\n const m = COORDS4_RE.exec(line);\n if (!m) return null;\n const vals = [m[1], m[2], m[3], m[4]].map(Number);\n if (vals.some(Number.isNaN)) return null;\n return { a: vals[0]!, b: vals[1]!, c: vals[2]!, d: vals[3]! };\n}\n\n// `[^[\\]]` (tuples cannot contain '[') + bounded whitespace keep the scan linear (ReDoS-safe).\nconst MULTI_COORDS_RE = /\\[\\s{0,8}(\\[[^[\\]]*\\](?:\\s{0,8},\\s{0,8}\\[[^[\\]]*\\])+)\\s{0,8}\\]/;\n\n/** Extracts a tuple list `[[a,b],[c,d],…]` (OWM multi-position annotation) — or null. */\nexport function parseMultiCoords(line: string): { tuples: ParsedCoords[]; rest: string } | null {\n const m = MULTI_COORDS_RE.exec(line);\n if (!m) return null;\n const tuples: ParsedCoords[] = [];\n const inner = /\\[\\s{0,8}([-\\d.]+)\\s{0,8},\\s{0,8}([-\\d.]+)\\s{0,8}\\]/g;\n let t: RegExpExecArray | null;\n while ((t = inner.exec(m[1]!))) {\n const a = Number(t[1]);\n const b = Number(t[2]);\n if (!Number.isNaN(a) && !Number.isNaN(b)) tuples.push({ a, b });\n }\n if (!tuples.length) return null;\n return { tuples, rest: line.replace(MULTI_COORDS_RE, ' ') };\n}\n\n/**\n * Splits off a `//` line comment. Quote-aware (`+'http://x'>` stays untouched) and\n * URL-aware: `//` directly after `:` is a scheme separator (`url(https://…)`), not a comment.\n */\nexport function splitLineComment(line: string): { code: string; comment: string | null } {\n let inQuote = false;\n for (let i = 0; i < line.length - 1; i++) {\n const ch = line[i];\n if (ch === \"'\") inQuote = !inQuote;\n else if (!inQuote && ch === '/' && line[i + 1] === '/' && line[i - 1] !== ':') {\n return { code: line.slice(0, i), comment: line.slice(i) };\n }\n }\n return { code: line, comment: null };\n}\n\n/** First occurrence of `needle` outside `'…'` quotes — or -1. */\nexport function indexOfOutsideQuotes(line: string, needle: string): number {\n let inQuote = false;\n for (let i = 0; i + needle.length <= line.length; i++) {\n const ch = line[i];\n if (ch === \"'\") {\n inQuote = !inQuote;\n continue;\n }\n if (!inQuote && line.startsWith(needle, i)) return i;\n }\n return -1;\n}\n\nexport interface InlineDecorators {\n readonly market?: boolean;\n readonly ecosystem?: boolean;\n readonly inertia?: boolean;\n readonly method?: Method;\n}\n\nconst PAREN_RE = /\\(([^()]*)\\)/g;\nconst METHODS: ReadonlySet<string> = new Set(['build', 'buy', 'outsource']);\n\n/**\n * Reads the inline decorators of a component line:\n * - parenthesized: `(market)`, `(ecosystem)`, `(build|buy|outsource)`, combined `(market, outsource)`\n * - trailing keyword: `inertia`\n * Returns the decorators found and the line stripped of them.\n */\nexport function parseDecorators(line: string): { decorators: InlineDecorators; rest: string } {\n const dec: {\n market?: boolean;\n ecosystem?: boolean;\n inertia?: boolean;\n method?: Method;\n } = {};\n let rest = line;\n\n rest = rest.replace(PAREN_RE, (_full, group: string) => {\n for (const rawToken of group.split(',')) {\n const token = rawToken.trim().toLowerCase();\n if (token === 'market') dec.market = true;\n else if (token === 'ecosystem') dec.ecosystem = true;\n else if (token === 'inertia') dec.inertia = true;\n else if (METHODS.has(token)) dec.method = token as Method;\n }\n return ' ';\n });\n\n // trailing keyword `inertia` (unparenthesized)\n rest = rest.replace(/\\binertia\\b/i, () => {\n dec.inertia = true;\n return ' ';\n });\n\n return { decorators: dec, rest };\n}\n\n// Note color as an (OWM-backwards-compatible) extension: `(color #rrggbb)` OR `(color green)`.\n// Deliberately placed after the coordinates -> the OWM parser ignores the rest instead of pulling\n// it into the note text. Accepts hex or CSS color names.\nconst COLOR_RE = /\\(\\s*color\\s+(#[0-9a-fA-F]{3,8}|[a-zA-Z][\\w-]*)\\s*\\)/i;\n\nexport function parseColor(line: string): { color?: string; rest: string } {\n const m = COLOR_RE.exec(line);\n if (!m || !m[1]) return { rest: line };\n return { color: m[1], rest: line.replace(COLOR_RE, ' ') };\n}\n\nexport interface LabelOffsetToken {\n readonly dx: number;\n readonly dy: number;\n}\n\nconst LABEL_OFFSET_RE = /\\blabel\\s*\\[\\s*([-\\d.]+)\\s*,\\s*([-\\d.]+)\\s*\\]/i;\n\n/** Reads an optional `label [dx, dy]` (pixel offset) and returns it plus the stripped line. */\nexport function parseLabelOffset(line: string): {\n labelOffset: LabelOffsetToken | null;\n rest: string;\n} {\n const m = LABEL_OFFSET_RE.exec(line);\n if (!m) return { labelOffset: null, rest: line };\n const dx = Number(m[1]);\n const dy = Number(m[2]);\n const rest = line.replace(LABEL_OFFSET_RE, ' ');\n if (Number.isNaN(dx) || Number.isNaN(dy)) return { labelOffset: null, rest };\n return { labelOffset: { dx, dy }, rest };\n}\n\nconst URL_REF_RE = /\\burl\\s{0,8}\\(([^()]*)\\)/i;\n\n/**\n * Reads an optional `url(Name)` reference (OWM) and returns it plus the stripped line.\n * MUST run before parseDecorators — otherwise the word \"url\" would remain as junk in the suffix.\n */\nexport function parseUrlRef(line: string): { urlRef: string | null; rest: string } {\n const m = URL_REF_RE.exec(line);\n if (!m) return { urlRef: null, rest: line };\n return { urlRef: m[1]!.trim() || null, rest: line.replace(URL_REF_RE, ' ') };\n}\n\n/** First word (keyword) of a line, lowercased. */\nexport function keywordOf(line: string): string {\n const m = /^\\s*([A-Za-z][\\w-]*)/.exec(line);\n return m ? m[1]!.toLowerCase() : '';\n}\n\nexport function slug(label: string): string {\n return (\n label\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/^_/, '')\n .replace(/_$/, '') || 'x'\n );\n}\n","import {\n CURRENT_SCHEMA_VERSION,\n validateMap,\n type AcceleratorElement,\n type AnchorElement,\n type AnnotationElement,\n type DrawingElement,\n type DrawingStrokeStyle,\n type AttitudeElement,\n type AttitudeKind,\n type ComponentDecorators,\n type ComponentElement,\n type Coordinate,\n type MapConfig,\n type MapEdge,\n type MapElement,\n type MapStyle,\n type Method,\n type Movement,\n type NoteElement,\n type PipelineElement,\n type SubmapElement,\n type WardleyMap,\n} from '@miragon/wardley-schema-model';\nimport {\n indexOfOutsideQuotes,\n keywordOf,\n parseColor,\n parseCoords,\n parseCoords4,\n parseDecorators,\n parseLabelOffset,\n parseMultiCoords,\n parseUrlRef,\n slug,\n splitAtCoords,\n splitLineComment,\n stripCoords,\n type InlineDecorators,\n} from './lexer.js';\n\n/** Splits `A -> B` at the FIRST arrow — plain indexOf, immune to regex backtracking. */\nfunction splitDependency(core: string): { left: string; right: string } | null {\n const arrow = core.indexOf('->');\n if (arrow <= 0) return null;\n const left = core.slice(0, arrow).trim();\n const right = core.slice(arrow + 2).trim();\n return left && right ? { left, right } : null;\n}\n/**\n * Splits a flow line at the FIRST valid operator (`+>`, `+<>`, `+<`, `+'value'>`/`+'value'<>`)\n * via a linear scan — same semantics as the previous lazy regex, but immune to backtracking.\n */\nfunction splitFlow(\n core: string,\n): { left: string; right: string; op: string; value?: string } | null {\n for (let i = 1; i < core.length; i++) {\n if (core[i] !== '+') continue;\n let j = i + 1;\n let value: string | undefined;\n if (core[j] === \"'\") {\n const end = core.indexOf(\"'\", j + 1);\n if (end < 0) continue;\n value = core.slice(j + 1, end);\n j = end + 1;\n }\n const op = core.startsWith('<>', j)\n ? '<>'\n : core[j] === '>' || core[j] === '<'\n ? core[j]!\n : null;\n if (!op) continue;\n const left = core.slice(0, i).trim();\n const right = core.slice(j + op.length).trim();\n if (left && right) return { left, right, op, ...(value ? { value } : {}) };\n }\n return null;\n}\n// Config/special keywords that must NOT be (pre-)detected as an edge — `evolution`/`evolve`/\n// `y-axis`/`title` can themselves contain `->` and have their own handling in the switch.\nconst NON_LINK_KEYWORDS: ReadonlySet<string> = new Set([\n 'title',\n 'style',\n 'size',\n 'evolution',\n 'y-axis',\n 'annotations',\n 'annotation',\n 'evolve',\n 'line',\n]);\nconst KNOWN_STYLES: ReadonlySet<string> = new Set(['wardley', 'handwritten', 'colour', 'dark']);\n\ninterface PendingLink {\n readonly left: string;\n readonly right: string;\n readonly kind: 'dependency' | 'flow';\n readonly bidirectional?: boolean;\n /** `+<` — flow direction reversed (right -> left). */\n readonly reverse?: boolean;\n readonly flowValue?: string;\n /** Annotation text after `;`. */\n readonly label?: string;\n readonly raw: string;\n readonly lineNo: number;\n}\ninterface PendingEvolve {\n readonly name: string;\n readonly newLabel?: string;\n readonly target: number;\n readonly method?: Movement['method'];\n readonly labelOffset?: { dx: number; dy: number };\n readonly raw: string;\n readonly lineNo: number;\n}\ninterface PipelineChild {\n readonly name: string;\n readonly maturity: number;\n readonly decorators: InlineDecorators;\n readonly labelOffset?: { dx: number; dy: number };\n readonly color?: string;\n}\ninterface PendingPipeline {\n readonly name: string;\n /** Explicit range; if absent (OWM v2 block form without coordinates), it is derived from the children. */\n readonly start?: number;\n readonly end?: number;\n /** Explicit height — project extension `(y 0.x)`; otherwise derived from the anchor component. */\n readonly visibility?: number;\n readonly color?: string;\n readonly raw: string;\n readonly children: PipelineChild[];\n}\n/** Legacy standalone line `build|buy|outsource <Name>` — method on an existing component. */\ninterface PendingMethod {\n readonly name: string;\n readonly method: Method;\n readonly raw: string;\n readonly lineNo: number;\n}\n\nfunction compact<T extends Record<string, unknown>>(obj: T): T {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) if (v !== undefined) out[k] = v;\n return out as T;\n}\n\n/** Finding produced while parsing — line is 1-based; `text` is the (comment-stripped) line. */\nexport interface ParseDiagnostic {\n readonly line: number;\n readonly message: string;\n readonly text: string;\n}\n\nexport interface ParseResult {\n readonly map: WardleyMap;\n readonly diagnostics: readonly ParseDiagnostic[];\n}\n\nclass IdAllocator {\n private readonly used = new Set<string>();\n alloc(prefix: string, label: string): string {\n const base = `${prefix}_${slug(label)}`;\n let id = base;\n let i = 2;\n while (this.used.has(id)) id = `${base}_${i++}`;\n this.used.add(id);\n return id;\n }\n}\n\n/**\n * Keyword-differentiated coordinates (component/anchor/note = [visibility, maturity];\n * pipeline = [maturityStart, maturityEnd]). Unknown lines land in `rawPassthrough`.\n */\nexport function parseDSL(text: string): WardleyMap {\n return parseDSLWithDiagnostics(text).map;\n}\n\n/**\n * Like `parseDSL`, but additionally returns findings with line numbers (uninterpretable lines,\n * unresolved references, clamped coordinates) — for editor feedback instead of silent loss.\n */\nexport function parseDSLWithDiagnostics(text: string): ParseResult {\n const diagnostics: ParseDiagnostic[] = [];\n const ids = new IdAllocator();\n const nameToId = new Map<string, string>();\n const elements: MapElement[] = [];\n const rawPassthrough: string[] = [];\n const pendingLinks: PendingLink[] = [];\n const pendingEvolve: PendingEvolve[] = [];\n const pendingPipeline: PendingPipeline[] = [];\n const pendingMethod: PendingMethod[] = [];\n\n let config: MapConfig = { title: 'Untitled Map' };\n let annoCounter = 0;\n let inBlockComment = false;\n /** OWM `url Name [address]` definitions; resolved into component.url / submap.urlRef. */\n const urlDefs = new Map<string, string>();\n /** Not-yet-resolved `url(Name)` references: element index -> definition name. */\n const pendingUrlRefs: Array<{ readonly index: number; readonly ref: string }> = [];\n /** Pipeline from the immediately preceding line (candidate for a `{` block opening). */\n let lastPipeline: PendingPipeline | null = null;\n /** Currently open pipeline block (`{ … }`); component lines inside it are added as children. */\n let blockPipeline: PendingPipeline | null = null;\n\n const register = (name: string, id: string) => {\n if (!nameToId.has(name)) nameToId.set(name, id);\n };\n\n // Diagnostics helpers: read the current line/number from the loop state.\n let lineNo = 0;\n let currentLine = '';\n\n /** Tries to capture a line as a dependency/flow. Returns true when consumed. */\n const pushLink = (line: string): boolean => {\n // Split off an optional link annotation after ';' (e.g. `A -> B; limited by`).\n const semi = line.indexOf(';');\n const core = semi >= 0 ? line.slice(0, semi).trim() : line;\n const linkLabel = semi >= 0 ? line.slice(semi + 1).trim() : '';\n const dep = splitDependency(core);\n const flow = dep ? null : splitFlow(core);\n if (dep) {\n pendingLinks.push({\n left: dep.left,\n right: dep.right,\n kind: 'dependency',\n ...(linkLabel ? { label: linkLabel } : {}),\n raw: line,\n lineNo,\n });\n return true;\n }\n if (flow) {\n pendingLinks.push({\n left: flow.left,\n right: flow.right,\n kind: 'flow',\n bidirectional: flow.op === '<>',\n reverse: flow.op === '<',\n ...(flow.value ? { flowValue: flow.value } : {}),\n ...(linkLabel ? { label: linkLabel } : {}),\n raw: line,\n lineNo,\n });\n return true;\n }\n return false;\n };\n const diag = (message: string, atLine = lineNo, text_ = currentLine) =>\n diagnostics.push({ line: atLine, message, text: text_ });\n /** Passthrough for a line that looks like a known construct but cannot be parsed. */\n const failed = (l: string) => {\n rawPassthrough.push(l);\n diag('Line could not be interpreted (kept losslessly in rawPassthrough)');\n };\n /** Clamps a normalized value to [0,1] — with a diagnostic instead of a later validation crash. */\n const clampDiag = (n: number): number => {\n if (n < 0 || n > 1) diag(`Coordinate ${n} is outside [0,1] and was clamped`);\n return n < 0 ? 0 : n > 1 ? 1 : n;\n };\n const pos = (visibility: number, evolution: number) => ({\n visibility: clampDiag(visibility),\n evolution: clampDiag(evolution),\n });\n\n const sourceLines = text.split(/\\r?\\n/);\n for (let i = 0; i < sourceLines.length; i++) {\n const raw = sourceLines[i]!;\n lineNo = i + 1;\n currentLine = raw.trim();\n let working = raw;\n\n // --- Comments (`//`, `/* */`): strip, but keep losslessly in rawPassthrough. ---\n if (inBlockComment) {\n const close = working.indexOf('*/');\n if (close < 0) {\n rawPassthrough.push(raw);\n continue;\n }\n rawPassthrough.push(working.slice(0, close + 2));\n working = working.slice(close + 2);\n inBlockComment = false;\n }\n // OWM rule: url lines are exempt from comment stripping (https://…).\n if (keywordOf(working) !== 'url') {\n let open = indexOfOutsideQuotes(working, '/*');\n while (open >= 0) {\n const close = working.indexOf('*/', open + 2);\n if (close < 0) {\n rawPassthrough.push(working.slice(open));\n working = working.slice(0, open);\n inBlockComment = true;\n break;\n }\n rawPassthrough.push(working.slice(open, close + 2));\n working = `${working.slice(0, open)} ${working.slice(close + 2)}`;\n open = indexOfOutsideQuotes(working, '/*');\n }\n const { code, comment } = splitLineComment(working);\n if (comment !== null) rawPassthrough.push(comment);\n working = code;\n }\n\n const line = working.trim();\n if (!line) continue;\n\n // --- Pipeline block (OWM v2): `pipeline X [..]` followed by `{ component Child [maturity] }` ---\n if (blockPipeline) {\n if (line === '}') {\n blockPipeline = null;\n continue;\n }\n const childKw = keywordOf(line);\n if (childKw === 'component') {\n const child = parseBlockChild(line.slice(childKw.length).trim());\n if (child) {\n blockPipeline.children.push(child);\n continue;\n }\n }\n rawPassthrough.push(line);\n continue;\n }\n if (line.startsWith('{')) {\n if (lastPipeline) {\n blockPipeline = lastPipeline;\n lastPipeline = null;\n continue;\n }\n rawPassthrough.push(line);\n continue;\n }\n\n const kw = keywordOf(line);\n const after = line.slice(kw.length).trim();\n // `{` binds only to the DIRECTLY preceding pipeline line.\n if (kw !== 'pipeline') lastPipeline = null;\n\n // Edges/flows FIRST: element NAMES may begin with a keyword word (the default\n // component is named \"Component\" -> edge `Component -> X`). Declarations ALWAYS carry\n // coordinates `[...]`, edges never do. Without this pre-detection `Component -> X` would be\n // misread as a (broken) `component` declaration and vanish on re-import. Config/\n // special keywords (title/evolution/y-axis/evolve …) are exempt — they use `->` themselves.\n if (!NON_LINK_KEYWORDS.has(kw) && !parseCoords(line) && pushLink(line)) {\n continue;\n }\n\n switch (kw) {\n case 'title':\n config = { ...config, title: after };\n break;\n\n case 'anchor': {\n const node = parseNode(after);\n if (!node) {\n failed(line);\n break;\n }\n const id = ids.alloc('anchor', node.name);\n const anchor: AnchorElement = compact({\n id,\n elementType: 'anchor',\n label: node.name,\n position: pos(node.coords.a, node.coords.b),\n labelOffset: node.labelOffset,\n color: node.color,\n }) as AnchorElement;\n elements.push(anchor);\n register(node.name, id);\n break;\n }\n\n case 'component':\n case 'market':\n case 'ecosystem': {\n const node = parseNode(after);\n if (!node) {\n failed(line);\n break;\n }\n const decorators = mergeLegacy(kw, node.decorators);\n const id = ids.alloc('cmp', node.name);\n const component: ComponentElement = compact({\n id,\n elementType: 'component',\n label: node.name,\n position: pos(node.coords.a, node.coords.b),\n labelOffset: node.labelOffset,\n decorators: Object.keys(decorators).length ? decorators : undefined,\n color: node.color,\n }) as ComponentElement;\n elements.push(component);\n if (node.urlRef) pendingUrlRefs.push({ index: elements.length - 1, ref: node.urlRef });\n register(node.name, id);\n break;\n }\n\n case 'note': {\n const { color, rest } = parseColor(after);\n const coords = parseCoords(rest);\n // Literal `\\n` back into real line breaks (multi-line notes).\n const textPart = stripCoords(rest).trim().replace(/\\\\n/g, '\\n');\n if (!coords) {\n failed(line);\n break;\n }\n const id = ids.alloc('note', textPart || 'note');\n const note: NoteElement = compact({\n id,\n elementType: 'note',\n label: textPart,\n position: pos(coords.a, coords.b),\n color,\n }) as NoteElement;\n elements.push(note);\n break;\n }\n\n case 'pipeline': {\n // `pipeline X [s, e]`, `pipeline X` (block form, range from children) — optionally with `{` at the end.\n let body = after;\n let opensBlock = false;\n if (body.endsWith('{')) {\n opensBlock = true;\n body = body.slice(0, -1).trim();\n }\n const col = parseColor(body);\n // Project extension `(y 0.x)`: the OWM pipeline line has no slot for the height —\n // without it a standalone pipeline snaps back to visibility 0.5 on every round trip.\n const yMatch = /\\(\\s{0,8}y\\s{1,8}([\\d.]+)\\s{0,8}\\)/.exec(col.rest);\n const bodyRest = yMatch ? col.rest.replace(yMatch[0], ' ') : col.rest;\n const coords = parseCoords(bodyRest);\n const name = stripCoords(bodyRest).trim();\n if (!name) {\n failed(line);\n break;\n }\n const pending: PendingPipeline = {\n name,\n ...(coords ? { start: coords.a, end: coords.b } : {}),\n ...(yMatch ? { visibility: clamp01(Number(yMatch[1])) } : {}),\n ...(col.color ? { color: col.color } : {}),\n raw: line,\n children: [],\n };\n pendingPipeline.push(pending);\n if (opensBlock) blockPipeline = pending;\n else lastPipeline = pending;\n break;\n }\n\n case 'evolve': {\n const ev = parseEvolve(after);\n if (!ev) {\n failed(line);\n break;\n }\n pendingEvolve.push({ ...ev, target: clampDiag(ev.target), raw: line, lineNo });\n break;\n }\n\n case 'style': {\n const s = after.toLowerCase();\n if (KNOWN_STYLES.has(s)) config = { ...config, style: s as MapStyle };\n else failed(line);\n break;\n }\n\n case 'size': {\n const coords = parseCoords(after);\n if (coords) config = { ...config, size: { width: coords.a, height: coords.b } };\n else failed(line);\n break;\n }\n\n case 'evolution': {\n // Exactly four positions (the serializer always writes four). Do NOT filter out\n // empty segments, otherwise an empty stage label is lost (the whole line would fall\n // out of the 4-slot grid and land in rawPassthrough -> axis snaps back to default).\n const parts = after.split('->').map((s) => s.trim());\n if (parts.length === 4) {\n config = { ...config, evolutionLabels: [parts[0]!, parts[1]!, parts[2]!, parts[3]!] };\n } else rawPassthrough.push(raw);\n break;\n }\n\n case 'y-axis': {\n // OWM: `y-axis Label->BottomLabel->TopLabel` — keep the end labels losslessly too.\n const parts = after\n .split('->')\n .map((s) => s.trim())\n .filter(Boolean);\n if (parts.length) {\n config = {\n ...config,\n yAxisLabel: parts[0]!,\n ...(parts.length >= 3\n ? { yAxisEndLabels: [parts[1]!, parts[2]!] as [string, string] }\n : {}),\n };\n } else failed(line);\n break;\n }\n\n case 'annotations': {\n const coords = parseCoords(after);\n if (coords) {\n config = {\n ...config,\n annotationsBoxPosition: pos(coords.a, coords.b),\n };\n } else rawPassthrough.push(raw);\n break;\n }\n\n case 'annotation': {\n const numMatch = /^\\s*(\\d+)/.exec(after);\n const number = numMatch ? Number(numMatch[1]) : ++annoCounter;\n const colA = parseColor(after.replace(/^\\s*\\d+\\s*/, ''));\n const afterNum = colA.rest;\n // Try the multi-position form `[[y,x],[y,x]]` FIRST — the single-tuple RE would otherwise\n // match only the first inner tuple and corrupt the rest as text.\n const multi = parseMultiCoords(afterNum);\n let positions: Coordinate[];\n let text: string;\n if (multi) {\n positions = multi.tuples.map((t) => pos(t.a, t.b));\n text = multi.rest.trim();\n } else {\n const coords = parseCoords(afterNum);\n if (!coords) {\n rawPassthrough.push(line);\n break;\n }\n positions = [pos(coords.a, coords.b)];\n text = stripCoords(afterNum).trim();\n }\n const annotation: AnnotationElement = {\n id: ids.alloc('anno', String(number)),\n elementType: 'annotation',\n label: text,\n position: positions[0]!,\n number,\n positions,\n text,\n ...(colA.color ? { color: colA.color } : {}),\n };\n elements.push(annotation);\n break;\n }\n\n case 'line': {\n // Project extension (freeform drawing): `line [[v,e], [v,e], …] (closed) (dashed) (color x)`.\n const col = parseColor(after);\n const multi = parseMultiCoords(col.rest);\n if (!multi || multi.tuples.length < 2) {\n failed(line);\n break;\n }\n const flags = multi.rest.toLowerCase();\n const strokeStyle: DrawingStrokeStyle | undefined = flags.includes('(dashed)')\n ? 'dashed'\n : flags.includes('(dotted)')\n ? 'dotted'\n : undefined;\n const points = multi.tuples.map((t) => pos(t.a, t.b));\n const drawing: DrawingElement = {\n id: ids.alloc('draw', 'line'),\n elementType: 'drawing',\n label: '',\n position: points[0]!,\n points,\n ...(flags.includes('(closed)') ? { closed: true } : {}),\n ...(strokeStyle ? { strokeStyle } : {}),\n ...(col.color ? { color: col.color } : {}),\n };\n elements.push(drawing);\n break;\n }\n\n case 'pioneers':\n case 'settlers':\n case 'townplanners': {\n // Canonical OWM form: `<kind> [vis1, mat1, vis2, mat2]` (two corners, normalized).\n const col = parseColor(after);\n const four = parseCoords4(col.rest);\n if (!four) {\n failed(line);\n break;\n }\n elements.push(\n makeAttitude(ids, kw as AttitudeKind, four.a, four.b, four.c, four.d, col.color),\n );\n break;\n }\n\n case 'url': {\n // OWM: `url Name [https://…]` — definition, referenced via `url(Name)` on elements.\n // Parsed via indexOf (not regex) — immune to backtracking on hostile input.\n const open = after.indexOf('[');\n const close = after.lastIndexOf(']');\n const name = open > 0 ? after.slice(0, open).trim() : '';\n const address = open > 0 && close > open ? after.slice(open + 1, close).trim() : '';\n if (!name || !address || after.slice(close + 1).trim() !== '') {\n failed(line);\n break;\n }\n urlDefs.set(name, address);\n break;\n }\n\n case 'build':\n case 'buy':\n case 'outsource': {\n // Legacy OWM: `buy <Name>` (method on an existing component) or\n // `buy <Name> [vis, mat]` (create a component with a method).\n const node = parseNode(after);\n if (node) {\n const id = ids.alloc('cmp', node.name);\n const component: ComponentElement = compact({\n id,\n elementType: 'component',\n label: node.name,\n position: pos(node.coords.a, node.coords.b),\n labelOffset: node.labelOffset,\n decorators: { ...node.decorators, method: kw as Method },\n color: node.color,\n }) as ComponentElement;\n elements.push(component);\n register(node.name, id);\n } else if (after.trim()) {\n pendingMethod.push({ name: after.trim(), method: kw as Method, raw: line, lineNo });\n } else {\n rawPassthrough.push(line);\n }\n break;\n }\n\n case 'accelerator':\n case 'deaccelerator': {\n const node = parseNode(after);\n if (!node) {\n failed(line);\n break;\n }\n const id = ids.alloc('accel', node.name);\n const accelerator: AcceleratorElement = {\n id,\n elementType: 'accelerator',\n direction: kw === 'deaccelerator' ? 'deaccelerate' : 'accelerate',\n label: node.name,\n position: pos(node.coords.a, node.coords.b),\n ...(node.color ? { color: node.color } : {}),\n };\n elements.push(accelerator);\n register(node.name, id);\n break;\n }\n\n case 'submap': {\n const node = parseNode(after);\n if (!node) {\n failed(line);\n break;\n }\n const id = ids.alloc('submap', node.name);\n const submap: SubmapElement = {\n id,\n elementType: 'submap',\n label: node.name,\n position: pos(node.coords.a, node.coords.b),\n ...(node.color ? { color: node.color } : {}),\n };\n elements.push(submap);\n if (node.urlRef) pendingUrlRefs.push({ index: elements.length - 1, ref: node.urlRef });\n register(node.name, id);\n break;\n }\n\n default: {\n // Unknown keyword: try as a link (e.g. `A -> B; limited by`), otherwise keep raw.\n if (!pushLink(line)) rawPassthrough.push(line);\n }\n }\n }\n\n // --- Resolve pipelines (visibility from the same-named component; children inherit it) ---\n // BEFORE evolve/method so that evolve/buy can reference block children.\n for (const p of pendingPipeline) {\n const refId = nameToId.get(p.name);\n const ref = elements.find((e) => e.id === refId);\n const visibility = p.visibility ?? (ref ? ref.position.visibility : 0.5);\n const id = ids.alloc('pipeline', p.name);\n // Standalone pipelines (no same-named component) are edge endpoints themselves —\n // register() keeps the first entry, so an existing anchor component still wins.\n register(p.name, id);\n\n const childIds: string[] = [];\n const childElements: ComponentElement[] = [];\n for (const c of p.children) {\n const cid = ids.alloc('cmp', c.name);\n childElements.push(\n compact({\n id: cid,\n elementType: 'component',\n label: c.name,\n position: { visibility, evolution: clamp01(c.maturity) },\n labelOffset: c.labelOffset,\n decorators: Object.keys(c.decorators).length ? c.decorators : undefined,\n pipelineId: id,\n color: c.color,\n }) as ComponentElement,\n );\n register(c.name, cid);\n childIds.push(cid);\n }\n\n // Range: explicit, otherwise derived from the child maturities (OWM v2); useless without either.\n let start =\n p.start ?? (p.children.length ? Math.min(...p.children.map((c) => c.maturity)) : NaN);\n let end = p.end ?? (p.children.length ? Math.max(...p.children.map((c) => c.maturity)) : NaN);\n if (Number.isNaN(start) || Number.isNaN(end)) {\n rawPassthrough.push(p.raw);\n continue;\n }\n start = clamp01(start);\n end = clamp01(end);\n if (end <= start) end = Math.min(1, start + 0.05);\n\n const pipeline: PipelineElement = {\n id,\n elementType: 'pipeline',\n label: p.name,\n position: { visibility, evolution: (start + end) / 2 },\n evolutionStart: start,\n evolutionEnd: end,\n childIds,\n ...(p.color ? { color: p.color } : {}),\n };\n elements.push(pipeline, ...childElements);\n }\n\n // --- Resolve evolve ---\n for (const ev of pendingEvolve) {\n const id = nameToId.get(ev.name);\n const idx = elements.findIndex((e) => e.id === id);\n if (idx < 0 || elements[idx]!.elementType !== 'component') {\n rawPassthrough.push(ev.raw);\n diag(`evolve: component \"${ev.name}\" not found`, ev.lineNo, ev.raw);\n continue;\n }\n const movement = compact({\n targetEvolution: ev.target,\n newLabel: ev.newLabel,\n method: ev.method,\n labelOffset: ev.labelOffset,\n }) as Movement;\n elements[idx] = { ...(elements[idx] as ComponentElement), movement };\n }\n\n // --- Resolve legacy standalone methods (`buy <name>`) ---\n for (const pm of pendingMethod) {\n const id = nameToId.get(pm.name);\n const idx = elements.findIndex((e) => e.id === id);\n const el = idx >= 0 ? elements[idx]! : undefined;\n if (!el || el.elementType !== 'component') {\n rawPassthrough.push(pm.raw);\n diag(`${pm.method}: component \"${pm.name}\" not found`, pm.lineNo, pm.raw);\n continue;\n }\n elements[idx] = { ...el, decorators: { ...el.decorators, method: pm.method } };\n }\n\n // --- Resolve url(...) references (the definition may appear before OR after the element) ---\n const usedUrlDefs = new Set<string>();\n for (const { index, ref } of pendingUrlRefs) {\n const fromDef = urlDefs.get(ref);\n if (fromDef) usedUrlDefs.add(ref);\n // Also accept a directly embedded address (`url(https://…)`).\n const address = fromDef ?? (/^[a-z][\\w+.-]*:\\/\\//i.test(ref) ? ref : undefined);\n if (!address) continue;\n const el = elements[index]!;\n if (el.elementType === 'component') {\n elements[index] = { ...el, url: address };\n } else if (el.elementType === 'submap') {\n elements[index] = { ...el, urlRef: address };\n }\n }\n // Keep unreferenced definitions losslessly.\n for (const [name, address] of urlDefs) {\n if (!usedUrlDefs.has(name)) rawPassthrough.push(`url ${name} [${address}]`);\n }\n\n let depN = 0;\n let flowN = 0;\n const edges: MapEdge[] = [];\n for (const link of pendingLinks) {\n const fromId = nameToId.get(link.left);\n const toId = nameToId.get(link.right);\n if (!fromId || !toId) {\n rawPassthrough.push(link.raw);\n diag(\n `Link: ${!fromId ? `\"${link.left}\"` : `\"${link.right}\"`} not found`,\n link.lineNo,\n link.raw,\n );\n continue;\n }\n if (link.kind === 'dependency') {\n edges.push(\n compact({\n id: `dep_${++depN}`,\n edgeType: 'dependency',\n from: fromId,\n to: toId,\n label: link.label,\n }) as MapEdge,\n );\n } else {\n // `+<` reverses the flow direction (right -> left).\n const [f, t] = link.reverse ? [toId, fromId] : [fromId, toId];\n edges.push(\n compact({\n id: `flow_${++flowN}`,\n edgeType: 'flow',\n from: f,\n to: t,\n bidirectional: link.bidirectional ? true : undefined,\n flowValue: link.flowValue,\n label: link.label,\n }) as MapEdge,\n );\n }\n }\n\n const map = compact({\n schemaVersion: CURRENT_SCHEMA_VERSION,\n config,\n elements,\n edges,\n rawPassthrough: rawPassthrough.length ? rawPassthrough : undefined,\n }) as WardleyMap;\n\n return { map: validateMap(map), diagnostics };\n}\n\ninterface ParsedNode {\n readonly name: string;\n readonly coords: { a: number; b: number };\n readonly decorators: InlineDecorators;\n readonly labelOffset?: { dx: number; dy: number };\n /** `url(Name)` reference (definition name, not yet resolved). */\n readonly urlRef?: string;\n /** Project extension `(color …)` — supported on every element line. */\n readonly color?: string;\n}\n\n/**\n * Parses `<name> [a, b] <decorators> [url(Name)] [label [dx,dy]]`. Decorators, url reference and\n * label offset are looked up ONLY in the suffix AFTER the coordinates — parentheses\n * (`Tea (green)`) or words like \"inertia\" inside the name stay untouched.\n */\nfunction parseNode(after: string): ParsedNode | null {\n const split = splitAtCoords(after);\n if (!split || !split.name) return null;\n // Color must be stripped BEFORE the decorators — `(color x)` would otherwise be consumed\n // (and silently dropped) by the decorator parentheses.\n const col = parseColor(split.suffix);\n const url = parseUrlRef(col.rest);\n const lo = parseLabelOffset(url.rest);\n const dec = parseDecorators(lo.rest);\n return compact({\n name: split.name,\n coords: split.coords,\n decorators: dec.decorators,\n labelOffset: lo.labelOffset ?? undefined,\n urlRef: url.urlRef ?? undefined,\n color: col.color ?? undefined,\n }) as ParsedNode;\n}\n\nfunction clamp01(n: number): number {\n return n < 0 ? 0 : n > 1 ? 1 : n;\n}\n\nconst SINGLE_COORD_RE = /\\[\\s*([-\\d.]+)\\s*\\]/;\n\n/** Parses a pipeline block child line: `<name> [maturity]` (+ optional decorators/offset). */\nfunction parseBlockChild(after: string): PipelineChild | null {\n const m = SINGLE_COORD_RE.exec(after);\n if (!m) return null;\n const maturity = Number(m[1]);\n if (Number.isNaN(maturity)) return null;\n const name = after.slice(0, m.index).trim();\n if (!name) return null;\n const suffix = after.slice(m.index + m[0].length);\n const col = parseColor(suffix);\n const lo = parseLabelOffset(col.rest);\n const dec = parseDecorators(lo.rest);\n return compact({\n name,\n maturity,\n decorators: dec.decorators,\n labelOffset: lo.labelOffset ?? undefined,\n color: col.color ?? undefined,\n }) as PipelineChild;\n}\n\n/** Builds an AttitudeElement from two (arbitrarily oriented) corners; normalizes to TL/BR. */\nfunction makeAttitude(\n ids: IdAllocator,\n kind: AttitudeKind,\n v1: number,\n m1: number,\n v2: number,\n m2: number,\n color?: string,\n): AttitudeElement {\n return {\n id: ids.alloc('attitude', kind),\n elementType: 'attitude',\n kind,\n label: '',\n ...(color ? { color } : {}),\n position: {\n visibility: clamp01(Math.max(v1, v2)),\n evolution: clamp01(Math.min(m1, m2)),\n },\n corner2: {\n visibility: clamp01(Math.min(v1, v2)),\n evolution: clamp01(Math.max(m1, m2)),\n },\n };\n}\n\nfunction mergeLegacy(kw: string, dec: InlineDecorators): ComponentDecorators {\n const merged: Record<string, unknown> = { ...dec };\n if (kw === 'market') merged['market'] = true;\n if (kw === 'ecosystem') merged['ecosystem'] = true;\n return compact(merged) as ComponentDecorators;\n}\n\nfunction parseEvolve(after: string): Omit<PendingEvolve, 'raw'> | null {\n // Remove `label [dx, dy]` FIRST — otherwise the last token is `dy]` and Number() fails.\n const lo = parseLabelOffset(after);\n const dec = parseDecorators(lo.rest);\n const tokens = dec.rest.trim().split(/\\s+/);\n if (tokens.length < 2) return null;\n const last = tokens[tokens.length - 1]!;\n const target = Number(last);\n if (Number.isNaN(target)) return null;\n const namePart = tokens.slice(0, -1).join(' ').trim();\n if (!namePart) return null;\n const renameIdx = namePart.indexOf('->');\n const name = renameIdx >= 0 ? namePart.slice(0, renameIdx).trim() : namePart;\n const newLabel = renameIdx >= 0 ? namePart.slice(renameIdx + 2).trim() : undefined;\n return compact({\n name,\n newLabel: newLabel || undefined,\n target,\n method: dec.decorators.method,\n labelOffset: lo.labelOffset ?? undefined,\n }) as Omit<PendingEvolve, 'raw'>;\n}\n","import type {\n ComponentDecorators,\n ComponentElement,\n LabelOffset,\n MapElement,\n WardleyMap,\n} from '@miragon/wardley-schema-model';\n\n/** Address of an element (component.url / submap.urlRef) — or undefined. */\nfunction urlOf(el: MapElement): string | undefined {\n if (el.elementType === 'component') return el.url;\n if (el.elementType === 'submap') return el.urlRef;\n return undefined;\n}\n\nfunction r(n: number): string {\n return String(Math.round(n * 1000) / 1000);\n}\n\n/** Types referenced BY THEIR NAME in the OWM DSL (edge endpoints + namespace). */\nconst NAMED_TYPES: ReadonlySet<string> = new Set(['anchor', 'component', 'accelerator', 'submap']);\n\nfunction defaultName(type: string): string {\n return type === 'anchor'\n ? 'User'\n : type === 'accelerator'\n ? 'Accelerator'\n : type === 'submap'\n ? 'Submap'\n : 'Component';\n}\n\n/**\n * Returns a name per element ID that is UNIQUE within the DSL for the referenceable types\n * (component/anchor/…). Because edges are serialized by name (`A -> B`), duplicate or empty\n * labels would collapse onto the same node on re-import and make arrows disappear. So on\n * collision a suffix (`Name 2`) is assigned and on an empty label a default — consistently for\n * BOTH sides (node line AND edge reference). Unique names stay unchanged.\n */\nfunction uniqueNames(map: WardleyMap): Map<string, string> {\n const used = new Set<string>();\n const byId = new Map<string, string>();\n for (const el of map.elements) {\n if (!NAMED_TYPES.has(el.elementType)) continue;\n const base = el.label.trim().replace(/->/g, '→') || defaultName(el.elementType);\n let name = base;\n let i = 2;\n while (used.has(name)) name = `${base} ${i++}`;\n used.add(name);\n byId.set(el.id, name);\n }\n return byId;\n}\n\nfunction offsetSuffix(lo: LabelOffset | undefined): string {\n return lo ? ` label [${r(lo.dx)}, ${r(lo.dy)}]` : '';\n}\n\n/** Project extension: `(color …)` after the coordinates (the OWM parser ignores it). */\nfunction colorSuffix(el: { color?: string }): string {\n return el.color ? ` (color ${el.color})` : '';\n}\n\nfunction decoratorSuffix(dec: ComponentDecorators | undefined): string {\n if (!dec) return '';\n const paren: string[] = [];\n if (dec.market) paren.push('market');\n if (dec.ecosystem) paren.push('ecosystem');\n if (dec.method) paren.push(dec.method);\n let out = '';\n if (paren.length) out += ` (${paren.join(', ')})`;\n if (dec.inertia) out += ' inertia';\n return out;\n}\n\n/**\n * Serializes a WardleyMap into Online-Wardley-Maps text. Deterministic; writes only\n * syntax the OWM parser reads back. `rawPassthrough` is appended unchanged.\n * Coordinates are keyword-differentiated (component/anchor/note = [visibility, maturity];\n * pipeline = [maturityStart, maturityEnd]).\n */\nexport function serializeDSL(map: WardleyMap): string {\n const lines: string[] = [];\n const names = uniqueNames(map);\n const nameOf = (el: MapElement): string => names.get(el.id) ?? el.label;\n\n lines.push(`title ${map.config.title}`);\n if (map.config.style) lines.push(`style ${map.config.style}`);\n if (map.config.size)\n lines.push(`size [${r(map.config.size.width)}, ${r(map.config.size.height)}]`);\n if (map.config.evolutionLabels) lines.push(`evolution ${map.config.evolutionLabels.join('->')}`);\n if (map.config.yAxisLabel) {\n const ends = map.config.yAxisEndLabels;\n lines.push(`y-axis ${map.config.yAxisLabel}${ends ? `->${ends[0]}->${ends[1]}` : ''}`);\n }\n if (map.config.annotationsBoxPosition) {\n const b = map.config.annotationsBoxPosition;\n lines.push(`annotations [${r(b.visibility)}, ${r(b.evolution)}]`);\n }\n\n // url definitions: one `url <Name> URL [address]` line per element with an address,\n // referenced on the element via `url(<Name> URL)` (OWM form: definition + reference).\n const urlDefNames = new Map<string, string>(); // element ID -> definition name\n for (const el of map.elements) {\n const address = urlOf(el);\n if (!address) continue;\n const defName = `${nameOf(el)} URL`;\n urlDefNames.set(el.id, defName);\n lines.push(`url ${defName} [${address}]`);\n }\n const urlSuffix = (el: MapElement): string => {\n const def = urlDefNames.get(el.id);\n return def ? ` url(${def})` : '';\n };\n\n // Pipeline children (pipelineId set + pipeline exists) are emitted in the pipeline's\n // block form instead of as top-level components (OWM v2).\n const pipelineIds = new Set(\n map.elements.filter((e) => e.elementType === 'pipeline').map((e) => e.id),\n );\n const childrenByPipeline = new Map<string, ComponentElement[]>();\n for (const el of map.elements) {\n if (el.elementType !== 'component' || !el.pipelineId || !pipelineIds.has(el.pipelineId)) {\n continue;\n }\n const list = childrenByPipeline.get(el.pipelineId) ?? [];\n list.push(el);\n childrenByPipeline.set(el.pipelineId, list);\n }\n const isPipelineChild = (el: MapElement): el is ComponentElement =>\n el.elementType === 'component' && !!el.pipelineId && pipelineIds.has(el.pipelineId);\n\n const evolveLines: string[] = [];\n\n // The OWM pipeline line has no slot for the height — emit the project extension `(y 0.x)`\n // whenever the visibility differs from what re-parsing would derive (anchor component or 0.5),\n // so standalone pipelines do not snap back to mid-canvas on every round trip.\n const componentVisByLabel = new Map<string, number>();\n for (const el of map.elements) {\n if (el.elementType === 'component' && !componentVisByLabel.has(el.label)) {\n componentVisByLabel.set(el.label, el.position.visibility);\n }\n }\n const pipelineYSuffix = (el: MapElement): string => {\n if (el.elementType !== 'pipeline') return '';\n const derived = componentVisByLabel.get(el.label) ?? 0.5;\n return Math.abs(el.position.visibility - derived) > 0.0005\n ? ` (y ${r(el.position.visibility)})`\n : '';\n };\n\n for (const el of map.elements) {\n if (el.elementType === 'component' && el.movement) {\n evolveLines.push(evolveLine(el, nameOf(el)));\n }\n if (isPipelineChild(el)) continue; // emitted inside the pipeline block\n lines.push(elementLine(el, nameOf(el)) + pipelineYSuffix(el) + urlSuffix(el));\n if (el.elementType === 'pipeline') {\n const kids = childrenByPipeline.get(el.id) ?? [];\n if (kids.length) {\n lines.push('{');\n for (const k of kids) {\n lines.push(\n ` component ${nameOf(k)} [${r(k.position.evolution)}]` +\n `${decoratorSuffix(k.decorators)}${colorSuffix(k)}${offsetSuffix(k.labelOffset)}`,\n );\n }\n lines.push('}');\n }\n }\n }\n\n for (const line of evolveLines) lines.push(line);\n\n // Edges may also end at a pipeline (its ■ anchor) — fall back to the element label for\n // endpoint types that are not part of the unique-name pass.\n const labelsById = new Map(map.elements.map((el) => [el.id, el.label]));\n for (const edge of map.edges) {\n const from = names.get(edge.from) ?? labelsById.get(edge.from) ?? edge.from;\n const to = names.get(edge.to) ?? labelsById.get(edge.to) ?? edge.to;\n const annotation = edge.label ? `; ${edge.label}` : '';\n if (edge.edgeType === 'dependency') {\n lines.push(`${from} -> ${to}${annotation}`);\n } else {\n const op = edge.flowValue\n ? `+'${edge.flowValue}'${edge.bidirectional ? '<>' : '>'}`\n : edge.bidirectional\n ? '+<>'\n : '+>';\n lines.push(`${from} ${op} ${to}${annotation}`);\n }\n }\n\n // Config keywords were already emitted from the map above. A rawPassthrough entry with the\n // same keyword (e.g. an unparsable `evolution` line from externally-authored DSL) would\n // otherwise produce a contradictory duplicate line — drop it (config is the truth).\n if (map.rawPassthrough) {\n const emitted = new Set<string>();\n if (map.config.evolutionLabels) emitted.add('evolution');\n if (map.config.yAxisLabel) emitted.add('y-axis');\n for (const raw of map.rawPassthrough) {\n if (emitted.has(raw.trim().split(/\\s+/)[0]!)) continue;\n lines.push(raw);\n }\n }\n\n return lines.join('\\n') + '\\n';\n}\n\nfunction elementLine(el: MapElement, name: string): string {\n const p = el.position;\n switch (el.elementType) {\n case 'anchor':\n return `anchor ${name} [${r(p.visibility)}, ${r(p.evolution)}]${colorSuffix(el)}${offsetSuffix(el.labelOffset)}`;\n case 'component':\n return `component ${name} [${r(p.visibility)}, ${r(p.evolution)}]${decoratorSuffix(el.decorators)}${colorSuffix(el)}${offsetSuffix(el.labelOffset)}`;\n case 'note':\n // Encode line breaks as literal `\\n` -> the line-based DSL stays single-line.\n return `note ${name.replace(/\\n/g, '\\\\n')} [${r(p.visibility)}, ${r(p.evolution)}]${colorSuffix(el)}`;\n case 'pipeline':\n return `pipeline ${name} [${r(el.evolutionStart)}, ${r(el.evolutionEnd)}]${colorSuffix(el)}`;\n case 'submap':\n return `submap ${name} [${r(p.visibility)}, ${r(p.evolution)}]${colorSuffix(el)}`;\n case 'annotation': {\n const pos =\n el.positions.length > 1\n ? `[${el.positions.map((q) => `[${r(q.visibility)}, ${r(q.evolution)}]`).join(', ')}]`\n : `[${r(p.visibility)}, ${r(p.evolution)}]`;\n return `annotation ${el.number} ${pos}${colorSuffix(el)} ${el.text}`;\n }\n case 'accelerator':\n return `${el.direction === 'deaccelerate' ? 'deaccelerator' : 'accelerator'} ${name} [${r(p.visibility)}, ${r(p.evolution)}]${colorSuffix(el)}`;\n case 'attitude':\n // OWM canon: two corners, normalized — `pioneers [vis1, mat1, vis2, mat2]`.\n return `${el.kind} [${r(p.visibility)}, ${r(p.evolution)}, ${r(el.corner2.visibility)}, ${r(el.corner2.evolution)}]${colorSuffix(el)}`;\n case 'drawing': {\n // Project extension (freeform drawing): tuple list + style flags.\n const pts = el.points.map((q) => `[${r(q.visibility)}, ${r(q.evolution)}]`).join(', ');\n const closed = el.closed ? ' (closed)' : '';\n const stroke = el.strokeStyle && el.strokeStyle !== 'solid' ? ` (${el.strokeStyle})` : '';\n return `line [${pts}]${closed}${stroke}${colorSuffix(el)}`;\n }\n }\n}\n\nfunction evolveLine(el: ComponentElement, name: string): string {\n const mv = el.movement!;\n const label = mv.newLabel ? `${name}->${mv.newLabel}` : name;\n const method = mv.method ? ` (${mv.method})` : '';\n return `evolve ${label} ${r(mv.targetEvolution)}${method}${offsetSuffix(mv.labelOffset)}`;\n}\n"]}
|
package/package.json
CHANGED