From 8d5cc8ae31349701ab5864953df53c41ee43fb97 Mon Sep 17 00:00:00 2001 From: irof Date: Sat, 7 Feb 2026 01:49:41 +0900 Subject: [PATCH 1/8] Limit context usage in diagram render --- .../resources/templates/assets/package.js | 27 +++++++++---------- jig-core/src/test/js/package.test.js | 7 ++--- 2 files changed, 14 insertions(+), 20 deletions(-) diff --git a/jig-core/src/main/resources/templates/assets/package.js b/jig-core/src/main/resources/templates/assets/package.js index 367e82571..b9b977378 100644 --- a/jig-core/src/main/resources/templates/assets/package.js +++ b/jig-core/src/main/resources/templates/assets/package.js @@ -881,8 +881,7 @@ function getOrCreateDiagramErrorBox(diagram) { return dom.createDiagramErrorBox(diagram); } -function showDiagramErrorMessage(message, withAction, err, hash, context) { - const diagram = context.diagramElement; +function showDiagramErrorMessage(diagram, message, withAction, err, hash, context) { if (!diagram) return; console.error(message); if (err) { @@ -900,7 +899,7 @@ function showDiagramErrorMessage(message, withAction, err, hash, context) { if (withAction) { dom.setNodeOnClick(actionNode, function () { if (!context.pendingDiagramRender) return; - renderDiagramWithMermaid(context.pendingDiagramRender.text, context.pendingDiagramRender.maxEdges, context); + renderDiagramWithMermaid(diagram, context.pendingDiagramRender.text, context.pendingDiagramRender.maxEdges); context.pendingDiagramRender = null; }); } else { @@ -922,8 +921,7 @@ function hideDiagramErrorMessage(diagram) { dom.setDiagramElementDisplay(diagram, ''); } -function renderDiagramWithMermaid(text, maxEdges, context) { - const diagram = context.diagramElement; +function renderDiagramWithMermaid(diagram, text, maxEdges) { if (!diagram || !window.mermaid) return; hideDiagramErrorMessage(diagram); dom.removeDiagramAttribute(diagram, 'data-processed'); @@ -970,13 +968,12 @@ function renderMutualDependencyList(mutualPairs, causeRelationEvidence, context) function renderPackageDiagram(context, packageFilterFqn, relatedFilterFqn) { const diagram = dom.getDiagram(); if (!diagram) return; - context.diagramElement = diagram; const renderPlan = buildDiagramRenderPlan(context, packageFilterFqn, relatedFilterFqn); applyDiagramRenderPlan(context, renderPlan); - if (shouldSkipDiagramRenderByEdgeLimit(context)) return; + if (shouldSkipDiagramRenderByEdgeLimit(diagram, context)) return; setDiagramSource(diagram, context.lastDiagramSource); - renderDiagramWithMermaidIfAvailable(context); + renderDiagramWithMermaidIfAvailable(diagram, context); } function buildDiagramRenderPlan(context, packageFilterFqn, relatedFilterFqn) { @@ -1018,7 +1015,7 @@ function applyDiagramRenderPlan(context, renderPlan) { context.lastDiagramEdgeCount = renderPlan.uniqueRelations.length; } -function shouldSkipDiagramRenderByEdgeLimit(context) { +function shouldSkipDiagramRenderByEdgeLimit(diagram, context) { if (context.lastDiagramEdgeCount <= context.DEFAULT_MAX_EDGES) return false; context.pendingDiagramRender = {text: context.lastDiagramSource, maxEdges: context.lastDiagramEdgeCount}; const message = [ @@ -1026,7 +1023,7 @@ function shouldSkipDiagramRenderByEdgeLimit(context) { `エッジ数: ${context.lastDiagramEdgeCount}(上限: ${context.DEFAULT_MAX_EDGES})`, '描画する場合はボタンを押してください。', ].join('\n'); - showDiagramErrorMessage(message, true, null, null, context); + showDiagramErrorMessage(diagram, message, true, null, null, context); return true; } @@ -1035,13 +1032,13 @@ function setDiagramSource(diagram, source) { diagram.textContent = source; } -function renderDiagramWithMermaidIfAvailable(context) { +function renderDiagramWithMermaidIfAvailable(diagram, context) { if (!window.mermaid) return; - ensureMermaidParseErrorHandler(context); - renderDiagramWithMermaid(context.lastDiagramSource, context.DEFAULT_MAX_EDGES, context); + ensureMermaidParseErrorHandler(diagram, context); + renderDiagramWithMermaid(diagram, context.lastDiagramSource, context.DEFAULT_MAX_EDGES); } -function ensureMermaidParseErrorHandler(context) { +function ensureMermaidParseErrorHandler(diagram, context) { if (mermaid.parseError) return; mermaid.parseError = function (err, hash) { const message = err && err.message ? err.message : String(err); @@ -1050,7 +1047,7 @@ function ensureMermaidParseErrorHandler(context) { if (isEdgeLimit) { context.pendingDiagramRender = {text: context.lastDiagramSource, maxEdges: context.lastDiagramEdgeCount}; } - showDiagramErrorMessage(`Mermaid parse error: ${message}${location}`, isEdgeLimit, err, hash, context); + showDiagramErrorMessage(diagram, `Mermaid parse error: ${message}${location}`, isEdgeLimit, err, hash, context); }; } diff --git a/jig-core/src/test/js/package.test.js b/jig-core/src/test/js/package.test.js index e69dc326a..83a39e329 100644 --- a/jig-core/src/test/js/package.test.js +++ b/jig-core/src/test/js/package.test.js @@ -231,7 +231,6 @@ function setupDiagramEnvironment(doc, context) { const diagram = doc.createElement('div'); diagram.id = 'package-relation-diagram'; container.appendChild(diagram); - context.diagramElement = diagram; const mutual = doc.createElement('div'); mutual.id = 'mutual-dependency-list'; doc.elementsById.set('mutual-dependency-list', mutual); @@ -254,7 +253,6 @@ test.describe('package.js', () => { packageSummaryCache: null, diagramNodeIdToFqn: new Map(), aggregationDepth: 0, - diagramElement: null, pendingDiagramRender: null, lastDiagramSource: '', lastDiagramEdgeCount: 0, @@ -906,9 +904,8 @@ test.describe('package.js', () => { test('renderPackageDiagram: エッジ数超過時は保留/エラー表示する', () => { const doc = setupDocument(); - // setupDiagramEnvironmentはtestContext.diagramElementを設定する。 - // そのdiagramElementがdomヘルパーによって操作されることをモックする。 - const diagramMock = setupDiagramEnvironment(doc, testContext); // testContext.diagramElementも設定される + // setupDiagramEnvironmentが作るdiagramをdomヘルパーが操作することをモックする。 + const diagramMock = setupDiagramEnvironment(doc, testContext); // Mock dom helpers used by showDiagramErrorMessage internally const errorBoxMock = { style: { display: 'none' } }; From 313cf60241ec94715021d73c91b6e03d23a33110 Mon Sep 17 00:00:00 2001 From: irof Date: Sat, 7 Feb 2026 01:53:07 +0900 Subject: [PATCH 2/8] Drop unused diagramElement from context --- jig-core/src/main/resources/templates/assets/package.js | 1 - 1 file changed, 1 deletion(-) diff --git a/jig-core/src/main/resources/templates/assets/package.js b/jig-core/src/main/resources/templates/assets/package.js index b9b977378..57ed2d0a2 100644 --- a/jig-core/src/main/resources/templates/assets/package.js +++ b/jig-core/src/main/resources/templates/assets/package.js @@ -3,7 +3,6 @@ const packageContext = { packageSummaryCache: null, diagramNodeIdToFqn: new Map(), aggregationDepth: 0, - diagramElement: null, pendingDiagramRender: null, lastDiagramSource: '', lastDiagramEdgeCount: 0, From e55daef299f57d92c7d57f615724d5b24ab8be47 Mon Sep 17 00:00:00 2001 From: irof Date: Sat, 7 Feb 2026 01:54:04 +0900 Subject: [PATCH 3/8] Decouple mutual dependency rendering from context --- jig-core/src/main/resources/templates/assets/package.js | 6 +++--- jig-core/src/test/js/package.test.js | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/jig-core/src/main/resources/templates/assets/package.js b/jig-core/src/main/resources/templates/assets/package.js index 57ed2d0a2..62614e558 100644 --- a/jig-core/src/main/resources/templates/assets/package.js +++ b/jig-core/src/main/resources/templates/assets/package.js @@ -930,10 +930,10 @@ function renderDiagramWithMermaid(diagram, text, maxEdges) { } // 描画/更新 -function renderMutualDependencyList(mutualPairs, causeRelationEvidence, context) { +function renderMutualDependencyList(mutualPairs, causeRelationEvidence, aggregationDepth) { const container = dom.getMutualDependencyList(); if (!container) return; - const items = buildMutualDependencyItems(mutualPairs, causeRelationEvidence, context.aggregationDepth); + const items = buildMutualDependencyItems(mutualPairs, causeRelationEvidence, aggregationDepth); if (items.length === 0) { container.style.display = 'none'; container.innerHTML = ''; @@ -1009,7 +1009,7 @@ function buildDiagramRenderPlan(context, packageFilterFqn, relatedFilterFqn) { function applyDiagramRenderPlan(context, renderPlan) { context.diagramNodeIdToFqn = renderPlan.nodeIdToFqn; - renderMutualDependencyList(renderPlan.mutualPairs, renderPlan.filteredCauseRelationEvidence, context); + renderMutualDependencyList(renderPlan.mutualPairs, renderPlan.filteredCauseRelationEvidence, context.aggregationDepth); context.lastDiagramSource = renderPlan.source; context.lastDiagramEdgeCount = renderPlan.uniqueRelations.length; } diff --git a/jig-core/src/test/js/package.test.js b/jig-core/src/test/js/package.test.js index 83a39e329..b112da732 100644 --- a/jig-core/src/test/js/package.test.js +++ b/jig-core/src/test/js/package.test.js @@ -870,7 +870,7 @@ test.describe('package.js', () => { {from: 'app.alpha.A', to: 'app.beta.B'}, {from: 'app.beta.B', to: 'app.alpha.A'}, ], - testContext + testContext.aggregationDepth ); assert.equal(container.style.display, ''); From ff35f710cfe59bfed4c9c02f46e3352dca0ffa04 Mon Sep 17 00:00:00 2001 From: irof Date: Sat, 7 Feb 2026 01:58:30 +0900 Subject: [PATCH 4/8] Remove transient diagram state from context --- .../resources/templates/assets/package.js | 30 ++++++++----------- jig-core/src/test/js/package.test.js | 2 -- 2 files changed, 13 insertions(+), 19 deletions(-) diff --git a/jig-core/src/main/resources/templates/assets/package.js b/jig-core/src/main/resources/templates/assets/package.js index 62614e558..436c2acde 100644 --- a/jig-core/src/main/resources/templates/assets/package.js +++ b/jig-core/src/main/resources/templates/assets/package.js @@ -4,8 +4,6 @@ const packageContext = { diagramNodeIdToFqn: new Map(), aggregationDepth: 0, pendingDiagramRender: null, - lastDiagramSource: '', - lastDiagramEdgeCount: 0, DEFAULT_MAX_EDGES: 500, packageFilterFqn: null, relatedFilterMode: 'direct', @@ -970,9 +968,10 @@ function renderPackageDiagram(context, packageFilterFqn, relatedFilterFqn) { const renderPlan = buildDiagramRenderPlan(context, packageFilterFqn, relatedFilterFqn); applyDiagramRenderPlan(context, renderPlan); - if (shouldSkipDiagramRenderByEdgeLimit(diagram, context)) return; - setDiagramSource(diagram, context.lastDiagramSource); - renderDiagramWithMermaidIfAvailable(diagram, context); + const edgeCount = renderPlan.uniqueRelations.length; + if (shouldSkipDiagramRenderByEdgeLimit(diagram, renderPlan.source, edgeCount, context)) return; + setDiagramSource(diagram, renderPlan.source); + renderDiagramWithMermaidIfAvailable(diagram, renderPlan.source, edgeCount, context); } function buildDiagramRenderPlan(context, packageFilterFqn, relatedFilterFqn) { @@ -1010,16 +1009,14 @@ function buildDiagramRenderPlan(context, packageFilterFqn, relatedFilterFqn) { function applyDiagramRenderPlan(context, renderPlan) { context.diagramNodeIdToFqn = renderPlan.nodeIdToFqn; renderMutualDependencyList(renderPlan.mutualPairs, renderPlan.filteredCauseRelationEvidence, context.aggregationDepth); - context.lastDiagramSource = renderPlan.source; - context.lastDiagramEdgeCount = renderPlan.uniqueRelations.length; } -function shouldSkipDiagramRenderByEdgeLimit(diagram, context) { - if (context.lastDiagramEdgeCount <= context.DEFAULT_MAX_EDGES) return false; - context.pendingDiagramRender = {text: context.lastDiagramSource, maxEdges: context.lastDiagramEdgeCount}; +function shouldSkipDiagramRenderByEdgeLimit(diagram, source, edgeCount, context) { + if (edgeCount <= context.DEFAULT_MAX_EDGES) return false; + context.pendingDiagramRender = {text: source, maxEdges: edgeCount}; const message = [ '関連数が多すぎるため描画を省略しました。', - `エッジ数: ${context.lastDiagramEdgeCount}(上限: ${context.DEFAULT_MAX_EDGES})`, + `エッジ数: ${edgeCount}(上限: ${context.DEFAULT_MAX_EDGES})`, '描画する場合はボタンを押してください。', ].join('\n'); showDiagramErrorMessage(diagram, message, true, null, null, context); @@ -1031,20 +1028,19 @@ function setDiagramSource(diagram, source) { diagram.textContent = source; } -function renderDiagramWithMermaidIfAvailable(diagram, context) { +function renderDiagramWithMermaidIfAvailable(diagram, source, edgeCount, context) { if (!window.mermaid) return; - ensureMermaidParseErrorHandler(diagram, context); - renderDiagramWithMermaid(diagram, context.lastDiagramSource, context.DEFAULT_MAX_EDGES); + ensureMermaidParseErrorHandler(diagram, source, edgeCount, context); + renderDiagramWithMermaid(diagram, source, context.DEFAULT_MAX_EDGES); } -function ensureMermaidParseErrorHandler(diagram, context) { - if (mermaid.parseError) return; +function ensureMermaidParseErrorHandler(diagram, source, edgeCount, context) { mermaid.parseError = function (err, hash) { const message = err && err.message ? err.message : String(err); const location = hash ? `\nLine: ${hash.line} Column: ${hash.loc}` : ''; const isEdgeLimit = message.includes('Edge limit exceeded'); if (isEdgeLimit) { - context.pendingDiagramRender = {text: context.lastDiagramSource, maxEdges: context.lastDiagramEdgeCount}; + context.pendingDiagramRender = {text: source, maxEdges: edgeCount}; } showDiagramErrorMessage(diagram, `Mermaid parse error: ${message}${location}`, isEdgeLimit, err, hash, context); }; diff --git a/jig-core/src/test/js/package.test.js b/jig-core/src/test/js/package.test.js index b112da732..158720088 100644 --- a/jig-core/src/test/js/package.test.js +++ b/jig-core/src/test/js/package.test.js @@ -254,8 +254,6 @@ test.describe('package.js', () => { diagramNodeIdToFqn: new Map(), aggregationDepth: 0, pendingDiagramRender: null, - lastDiagramSource: '', - lastDiagramEdgeCount: 0, DEFAULT_MAX_EDGES: 500, packageFilterFqn: null, relatedFilterMode: 'direct', From ec9e3069200aa50a7e6ee487d9f57b5ace76ce63 Mon Sep 17 00:00:00 2001 From: irof Date: Sat, 7 Feb 2026 02:04:53 +0900 Subject: [PATCH 5/8] Thread render plan through diagram render --- .../resources/templates/assets/package.js | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/jig-core/src/main/resources/templates/assets/package.js b/jig-core/src/main/resources/templates/assets/package.js index 436c2acde..fc349dd6c 100644 --- a/jig-core/src/main/resources/templates/assets/package.js +++ b/jig-core/src/main/resources/templates/assets/package.js @@ -968,10 +968,9 @@ function renderPackageDiagram(context, packageFilterFqn, relatedFilterFqn) { const renderPlan = buildDiagramRenderPlan(context, packageFilterFqn, relatedFilterFqn); applyDiagramRenderPlan(context, renderPlan); - const edgeCount = renderPlan.uniqueRelations.length; - if (shouldSkipDiagramRenderByEdgeLimit(diagram, renderPlan.source, edgeCount, context)) return; + if (shouldSkipDiagramRenderByEdgeLimit(diagram, renderPlan, context)) return; setDiagramSource(diagram, renderPlan.source); - renderDiagramWithMermaidIfAvailable(diagram, renderPlan.source, edgeCount, context); + renderDiagramWithMermaidIfAvailable(diagram, renderPlan, context); } function buildDiagramRenderPlan(context, packageFilterFqn, relatedFilterFqn) { @@ -1011,9 +1010,10 @@ function applyDiagramRenderPlan(context, renderPlan) { renderMutualDependencyList(renderPlan.mutualPairs, renderPlan.filteredCauseRelationEvidence, context.aggregationDepth); } -function shouldSkipDiagramRenderByEdgeLimit(diagram, source, edgeCount, context) { +function shouldSkipDiagramRenderByEdgeLimit(diagram, renderPlan, context) { + const edgeCount = renderPlan.uniqueRelations.length; if (edgeCount <= context.DEFAULT_MAX_EDGES) return false; - context.pendingDiagramRender = {text: source, maxEdges: edgeCount}; + context.pendingDiagramRender = {text: renderPlan.source, maxEdges: edgeCount}; const message = [ '関連数が多すぎるため描画を省略しました。', `エッジ数: ${edgeCount}(上限: ${context.DEFAULT_MAX_EDGES})`, @@ -1028,19 +1028,20 @@ function setDiagramSource(diagram, source) { diagram.textContent = source; } -function renderDiagramWithMermaidIfAvailable(diagram, source, edgeCount, context) { +function renderDiagramWithMermaidIfAvailable(diagram, renderPlan, context) { if (!window.mermaid) return; - ensureMermaidParseErrorHandler(diagram, source, edgeCount, context); - renderDiagramWithMermaid(diagram, source, context.DEFAULT_MAX_EDGES); + ensureMermaidParseErrorHandler(diagram, renderPlan, context); + renderDiagramWithMermaid(diagram, renderPlan.source, context.DEFAULT_MAX_EDGES); } -function ensureMermaidParseErrorHandler(diagram, source, edgeCount, context) { +function ensureMermaidParseErrorHandler(diagram, renderPlan, context) { mermaid.parseError = function (err, hash) { const message = err && err.message ? err.message : String(err); const location = hash ? `\nLine: ${hash.line} Column: ${hash.loc}` : ''; const isEdgeLimit = message.includes('Edge limit exceeded'); if (isEdgeLimit) { - context.pendingDiagramRender = {text: source, maxEdges: edgeCount}; + const edgeCount = renderPlan.uniqueRelations.length; + context.pendingDiagramRender = {text: renderPlan.source, maxEdges: edgeCount}; } showDiagramErrorMessage(diagram, `Mermaid parse error: ${message}${location}`, isEdgeLimit, err, hash, context); }; From a9cecc1472be5d3edeb14c42b3e936961b08c689 Mon Sep 17 00:00:00 2001 From: irof Date: Sat, 7 Feb 2026 02:07:44 +0900 Subject: [PATCH 6/8] Promote max edges to constant --- jig-core/src/main/resources/templates/assets/package.js | 8 ++++---- jig-core/src/test/js/package.test.js | 1 - 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/jig-core/src/main/resources/templates/assets/package.js b/jig-core/src/main/resources/templates/assets/package.js index fc349dd6c..f2d13f7b4 100644 --- a/jig-core/src/main/resources/templates/assets/package.js +++ b/jig-core/src/main/resources/templates/assets/package.js @@ -4,7 +4,6 @@ const packageContext = { diagramNodeIdToFqn: new Map(), aggregationDepth: 0, pendingDiagramRender: null, - DEFAULT_MAX_EDGES: 500, packageFilterFqn: null, relatedFilterMode: 'direct', relatedFilterFqn: null, @@ -13,6 +12,7 @@ const packageContext = { }; const DIAGRAM_CLICK_HANDLER_NAME = 'filterPackageDiagram'; +const DEFAULT_MAX_EDGES = 500; const dom = { getRelatedFilterTarget: () => document.getElementById('related-filter-target'), @@ -1012,11 +1012,11 @@ function applyDiagramRenderPlan(context, renderPlan) { function shouldSkipDiagramRenderByEdgeLimit(diagram, renderPlan, context) { const edgeCount = renderPlan.uniqueRelations.length; - if (edgeCount <= context.DEFAULT_MAX_EDGES) return false; + if (edgeCount <= DEFAULT_MAX_EDGES) return false; context.pendingDiagramRender = {text: renderPlan.source, maxEdges: edgeCount}; const message = [ '関連数が多すぎるため描画を省略しました。', - `エッジ数: ${edgeCount}(上限: ${context.DEFAULT_MAX_EDGES})`, + `エッジ数: ${edgeCount}(上限: ${DEFAULT_MAX_EDGES})`, '描画する場合はボタンを押してください。', ].join('\n'); showDiagramErrorMessage(diagram, message, true, null, null, context); @@ -1031,7 +1031,7 @@ function setDiagramSource(diagram, source) { function renderDiagramWithMermaidIfAvailable(diagram, renderPlan, context) { if (!window.mermaid) return; ensureMermaidParseErrorHandler(diagram, renderPlan, context); - renderDiagramWithMermaid(diagram, renderPlan.source, context.DEFAULT_MAX_EDGES); + renderDiagramWithMermaid(diagram, renderPlan.source, DEFAULT_MAX_EDGES); } function ensureMermaidParseErrorHandler(diagram, renderPlan, context) { diff --git a/jig-core/src/test/js/package.test.js b/jig-core/src/test/js/package.test.js index 158720088..c97669bb2 100644 --- a/jig-core/src/test/js/package.test.js +++ b/jig-core/src/test/js/package.test.js @@ -254,7 +254,6 @@ test.describe('package.js', () => { diagramNodeIdToFqn: new Map(), aggregationDepth: 0, pendingDiagramRender: null, - DEFAULT_MAX_EDGES: 500, packageFilterFqn: null, relatedFilterMode: 'direct', relatedFilterFqn: null, From f2042a501626b5e15ee2f53dbc89b909626b3e78 Mon Sep 17 00:00:00 2001 From: irof Date: Sat, 7 Feb 2026 02:11:03 +0900 Subject: [PATCH 7/8] Remove pending diagram render from context --- .../resources/templates/assets/package.js | 25 ++++++++----------- jig-core/src/test/js/package.test.js | 1 - 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/jig-core/src/main/resources/templates/assets/package.js b/jig-core/src/main/resources/templates/assets/package.js index f2d13f7b4..f3f8ce170 100644 --- a/jig-core/src/main/resources/templates/assets/package.js +++ b/jig-core/src/main/resources/templates/assets/package.js @@ -3,7 +3,6 @@ const packageContext = { packageSummaryCache: null, diagramNodeIdToFqn: new Map(), aggregationDepth: 0, - pendingDiagramRender: null, packageFilterFqn: null, relatedFilterMode: 'direct', relatedFilterFqn: null, @@ -878,7 +877,7 @@ function getOrCreateDiagramErrorBox(diagram) { return dom.createDiagramErrorBox(diagram); } -function showDiagramErrorMessage(diagram, message, withAction, err, hash, context) { +function showDiagramErrorMessage(diagram, message, pendingRender, err, hash) { if (!diagram) return; console.error(message); if (err) { @@ -892,12 +891,11 @@ function showDiagramErrorMessage(diagram, message, withAction, err, hash, contex const actionNode = dom.getDiagramErrorActionNode(); dom.setNodeTextContent(messageNode, message); if (actionNode) { - dom.setNodeDisplay(actionNode, withAction ? '' : 'none'); - if (withAction) { + const hasAction = Boolean(pendingRender); + dom.setNodeDisplay(actionNode, hasAction ? '' : 'none'); + if (hasAction) { dom.setNodeOnClick(actionNode, function () { - if (!context.pendingDiagramRender) return; - renderDiagramWithMermaid(diagram, context.pendingDiagramRender.text, context.pendingDiagramRender.maxEdges); - context.pendingDiagramRender = null; + renderDiagramWithMermaid(diagram, pendingRender.text, pendingRender.maxEdges); }); } else { dom.setNodeOnClick(actionNode, null); @@ -1013,13 +1011,13 @@ function applyDiagramRenderPlan(context, renderPlan) { function shouldSkipDiagramRenderByEdgeLimit(diagram, renderPlan, context) { const edgeCount = renderPlan.uniqueRelations.length; if (edgeCount <= DEFAULT_MAX_EDGES) return false; - context.pendingDiagramRender = {text: renderPlan.source, maxEdges: edgeCount}; + const pendingRender = {text: renderPlan.source, maxEdges: edgeCount}; const message = [ '関連数が多すぎるため描画を省略しました。', `エッジ数: ${edgeCount}(上限: ${DEFAULT_MAX_EDGES})`, '描画する場合はボタンを押してください。', ].join('\n'); - showDiagramErrorMessage(diagram, message, true, null, null, context); + showDiagramErrorMessage(diagram, message, pendingRender, null, null); return true; } @@ -1039,11 +1037,10 @@ function ensureMermaidParseErrorHandler(diagram, renderPlan, context) { const message = err && err.message ? err.message : String(err); const location = hash ? `\nLine: ${hash.line} Column: ${hash.loc}` : ''; const isEdgeLimit = message.includes('Edge limit exceeded'); - if (isEdgeLimit) { - const edgeCount = renderPlan.uniqueRelations.length; - context.pendingDiagramRender = {text: renderPlan.source, maxEdges: edgeCount}; - } - showDiagramErrorMessage(diagram, `Mermaid parse error: ${message}${location}`, isEdgeLimit, err, hash, context); + const pendingRender = isEdgeLimit + ? {text: renderPlan.source, maxEdges: renderPlan.uniqueRelations.length} + : null; + showDiagramErrorMessage(diagram, `Mermaid parse error: ${message}${location}`, pendingRender, err, hash); }; } diff --git a/jig-core/src/test/js/package.test.js b/jig-core/src/test/js/package.test.js index c97669bb2..c0303dc53 100644 --- a/jig-core/src/test/js/package.test.js +++ b/jig-core/src/test/js/package.test.js @@ -253,7 +253,6 @@ test.describe('package.js', () => { packageSummaryCache: null, diagramNodeIdToFqn: new Map(), aggregationDepth: 0, - pendingDiagramRender: null, packageFilterFqn: null, relatedFilterMode: 'direct', relatedFilterFqn: null, From bafc1a55a62540ca82c06b1c99481c80d8efc43b Mon Sep 17 00:00:00 2001 From: irof Date: Sat, 7 Feb 2026 02:14:41 +0900 Subject: [PATCH 8/8] Document context usage policy --- jig-core/src/main/resources/templates/assets/package.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/jig-core/src/main/resources/templates/assets/package.js b/jig-core/src/main/resources/templates/assets/package.js index f3f8ce170..a4bba8784 100644 --- a/jig-core/src/main/resources/templates/assets/package.js +++ b/jig-core/src/main/resources/templates/assets/package.js @@ -1,4 +1,6 @@ // 状態/DOMヘルパー +// contextは「UI状態・設定値など長期的に保持する値」に限定する。 +// 一時的な中間データはcontextに保存せず、関数内のローカル変数で扱う。 const packageContext = { packageSummaryCache: null, diagramNodeIdToFqn: new Map(),