@assistkick/create 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/create.d.ts +2 -0
- package/dist/bin/create.js +25 -0
- package/dist/bin/create.js.map +1 -0
- package/dist/src/scaffolder.d.ts +22 -0
- package/dist/src/scaffolder.js +120 -0
- package/dist/src/scaffolder.js.map +1 -0
- package/package.json +24 -0
- package/templates/product-system/.env.example +8 -0
- package/templates/product-system/CLAUDE.md +45 -0
- package/templates/product-system/package.json +32 -0
- package/templates/product-system/packages/backend/package.json +37 -0
- package/templates/product-system/packages/backend/src/middleware/auth_middleware.test.ts +86 -0
- package/templates/product-system/packages/backend/src/middleware/auth_middleware.ts +35 -0
- package/templates/product-system/packages/backend/src/routes/auth.ts +463 -0
- package/templates/product-system/packages/backend/src/routes/coherence.ts +187 -0
- package/templates/product-system/packages/backend/src/routes/graph.ts +67 -0
- package/templates/product-system/packages/backend/src/routes/kanban.ts +201 -0
- package/templates/product-system/packages/backend/src/routes/pipeline.ts +41 -0
- package/templates/product-system/packages/backend/src/routes/projects.ts +122 -0
- package/templates/product-system/packages/backend/src/routes/users.ts +97 -0
- package/templates/product-system/packages/backend/src/server.ts +159 -0
- package/templates/product-system/packages/backend/src/services/auth_service.test.ts +115 -0
- package/templates/product-system/packages/backend/src/services/auth_service.ts +82 -0
- package/templates/product-system/packages/backend/src/services/coherence-review.ts +339 -0
- package/templates/product-system/packages/backend/src/services/email_service.ts +75 -0
- package/templates/product-system/packages/backend/src/services/init.ts +80 -0
- package/templates/product-system/packages/backend/src/services/invitation_service.test.ts +235 -0
- package/templates/product-system/packages/backend/src/services/invitation_service.ts +193 -0
- package/templates/product-system/packages/backend/src/services/password_reset_service.test.ts +151 -0
- package/templates/product-system/packages/backend/src/services/password_reset_service.ts +135 -0
- package/templates/product-system/packages/backend/src/services/project_service.test.ts +215 -0
- package/templates/product-system/packages/backend/src/services/project_service.ts +171 -0
- package/templates/product-system/packages/backend/src/services/pty_session_manager.test.ts +88 -0
- package/templates/product-system/packages/backend/src/services/pty_session_manager.ts +279 -0
- package/templates/product-system/packages/backend/src/services/terminal_ws_handler.ts +133 -0
- package/templates/product-system/packages/backend/src/services/user_management_service.test.ts +158 -0
- package/templates/product-system/packages/backend/src/services/user_management_service.ts +128 -0
- package/templates/product-system/packages/backend/tsconfig.json +22 -0
- package/templates/product-system/packages/frontend/index.html +13 -0
- package/templates/product-system/packages/frontend/package-lock.json +2666 -0
- package/templates/product-system/packages/frontend/package.json +30 -0
- package/templates/product-system/packages/frontend/public/favicon.svg +16 -0
- package/templates/product-system/packages/frontend/src/App.tsx +29 -0
- package/templates/product-system/packages/frontend/src/api/client.ts +386 -0
- package/templates/product-system/packages/frontend/src/api/client_projects.test.ts +104 -0
- package/templates/product-system/packages/frontend/src/api/client_refresh.test.ts +145 -0
- package/templates/product-system/packages/frontend/src/components/CoherenceView.tsx +414 -0
- package/templates/product-system/packages/frontend/src/components/GraphLegend.tsx +124 -0
- package/templates/product-system/packages/frontend/src/components/GraphSettings.tsx +112 -0
- package/templates/product-system/packages/frontend/src/components/GraphView.tsx +370 -0
- package/templates/product-system/packages/frontend/src/components/InviteUserDialog.tsx +85 -0
- package/templates/product-system/packages/frontend/src/components/KanbanView.tsx +470 -0
- package/templates/product-system/packages/frontend/src/components/LoginPage.tsx +116 -0
- package/templates/product-system/packages/frontend/src/components/ProjectSelector.tsx +187 -0
- package/templates/product-system/packages/frontend/src/components/QaIssueSheet.tsx +192 -0
- package/templates/product-system/packages/frontend/src/components/SidePanel.tsx +231 -0
- package/templates/product-system/packages/frontend/src/components/TerminalView.tsx +200 -0
- package/templates/product-system/packages/frontend/src/components/Toolbar.tsx +84 -0
- package/templates/product-system/packages/frontend/src/components/UsersView.tsx +249 -0
- package/templates/product-system/packages/frontend/src/constants/graph.ts +191 -0
- package/templates/product-system/packages/frontend/src/hooks/useAuth.tsx +54 -0
- package/templates/product-system/packages/frontend/src/hooks/useGraph.ts +27 -0
- package/templates/product-system/packages/frontend/src/hooks/useKanban.ts +21 -0
- package/templates/product-system/packages/frontend/src/hooks/useProjects.ts +86 -0
- package/templates/product-system/packages/frontend/src/hooks/useTheme.ts +26 -0
- package/templates/product-system/packages/frontend/src/hooks/useToast.tsx +62 -0
- package/templates/product-system/packages/frontend/src/hooks/use_projects_logic.test.ts +61 -0
- package/templates/product-system/packages/frontend/src/main.tsx +12 -0
- package/templates/product-system/packages/frontend/src/pages/accept_invitation_page.tsx +167 -0
- package/templates/product-system/packages/frontend/src/pages/forgot_password_page.tsx +100 -0
- package/templates/product-system/packages/frontend/src/pages/register_page.tsx +137 -0
- package/templates/product-system/packages/frontend/src/pages/reset_password_page.tsx +146 -0
- package/templates/product-system/packages/frontend/src/routes/ProtectedRoute.tsx +12 -0
- package/templates/product-system/packages/frontend/src/routes/accept_invitation.tsx +14 -0
- package/templates/product-system/packages/frontend/src/routes/dashboard.tsx +221 -0
- package/templates/product-system/packages/frontend/src/routes/forgot_password.tsx +13 -0
- package/templates/product-system/packages/frontend/src/routes/login.tsx +14 -0
- package/templates/product-system/packages/frontend/src/routes/register.tsx +14 -0
- package/templates/product-system/packages/frontend/src/routes/reset_password.tsx +13 -0
- package/templates/product-system/packages/frontend/src/styles/index.css +3358 -0
- package/templates/product-system/packages/frontend/src/utils/auth_validation.test.ts +51 -0
- package/templates/product-system/packages/frontend/src/utils/auth_validation.ts +19 -0
- package/templates/product-system/packages/frontend/src/utils/login_validation.test.ts +61 -0
- package/templates/product-system/packages/frontend/src/utils/login_validation.ts +24 -0
- package/templates/product-system/packages/frontend/src/utils/logout.test.ts +63 -0
- package/templates/product-system/packages/frontend/src/utils/node_sizing.test.ts +62 -0
- package/templates/product-system/packages/frontend/src/utils/node_sizing.ts +24 -0
- package/templates/product-system/packages/frontend/src/utils/task_status.test.ts +53 -0
- package/templates/product-system/packages/frontend/src/utils/task_status.ts +14 -0
- package/templates/product-system/packages/frontend/tsconfig.json +21 -0
- package/templates/product-system/packages/frontend/vite.config.ts +20 -0
- package/templates/product-system/packages/shared/.env.example +3 -0
- package/templates/product-system/packages/shared/README.md +1 -0
- package/templates/product-system/packages/shared/db/migrate.ts +32 -0
- package/templates/product-system/packages/shared/db/migrations/0000_dashing_gorgon.sql +128 -0
- package/templates/product-system/packages/shared/db/migrations/meta/0000_snapshot.json +819 -0
- package/templates/product-system/packages/shared/db/migrations/meta/_journal.json +13 -0
- package/templates/product-system/packages/shared/db/schema.ts +137 -0
- package/templates/product-system/packages/shared/drizzle.config.js +14 -0
- package/templates/product-system/packages/shared/lib/claude-service.ts +215 -0
- package/templates/product-system/packages/shared/lib/coherence.ts +278 -0
- package/templates/product-system/packages/shared/lib/completeness.ts +30 -0
- package/templates/product-system/packages/shared/lib/constants.ts +327 -0
- package/templates/product-system/packages/shared/lib/db.ts +81 -0
- package/templates/product-system/packages/shared/lib/git_workflow.ts +110 -0
- package/templates/product-system/packages/shared/lib/graph.ts +186 -0
- package/templates/product-system/packages/shared/lib/kanban.ts +161 -0
- package/templates/product-system/packages/shared/lib/markdown.ts +205 -0
- package/templates/product-system/packages/shared/lib/pipeline-state-store.ts +124 -0
- package/templates/product-system/packages/shared/lib/pipeline.ts +489 -0
- package/templates/product-system/packages/shared/lib/prompt_builder.ts +170 -0
- package/templates/product-system/packages/shared/lib/relevance_search.ts +159 -0
- package/templates/product-system/packages/shared/lib/session.ts +152 -0
- package/templates/product-system/packages/shared/lib/validator.ts +117 -0
- package/templates/product-system/packages/shared/lib/work_summary_parser.ts +130 -0
- package/templates/product-system/packages/shared/package.json +30 -0
- package/templates/product-system/packages/shared/scripts/assign-project.ts +52 -0
- package/templates/product-system/packages/shared/tools/add_edge.ts +61 -0
- package/templates/product-system/packages/shared/tools/add_node.ts +101 -0
- package/templates/product-system/packages/shared/tools/end_session.ts +87 -0
- package/templates/product-system/packages/shared/tools/get_gaps.ts +87 -0
- package/templates/product-system/packages/shared/tools/get_kanban.ts +125 -0
- package/templates/product-system/packages/shared/tools/get_node.ts +78 -0
- package/templates/product-system/packages/shared/tools/get_status.ts +98 -0
- package/templates/product-system/packages/shared/tools/migrate_to_turso.ts +385 -0
- package/templates/product-system/packages/shared/tools/move_card.ts +143 -0
- package/templates/product-system/packages/shared/tools/rebuild_index.ts +77 -0
- package/templates/product-system/packages/shared/tools/remove_edge.ts +59 -0
- package/templates/product-system/packages/shared/tools/remove_node.ts +96 -0
- package/templates/product-system/packages/shared/tools/resolve_question.ts +75 -0
- package/templates/product-system/packages/shared/tools/search_nodes.ts +106 -0
- package/templates/product-system/packages/shared/tools/start_session.ts +144 -0
- package/templates/product-system/packages/shared/tools/update_node.ts +133 -0
- package/templates/product-system/packages/shared/tsconfig.json +24 -0
- package/templates/product-system/pnpm-workspace.yaml +2 -0
- package/templates/product-system/smoke_test.ts +219 -0
- package/templates/product-system/tests/coherence_review.test.ts +562 -0
- package/templates/product-system/tests/db_sqlite_fallback.test.ts +75 -0
- package/templates/product-system/tests/edge_type_color_coding.test.ts +147 -0
- package/templates/product-system/tests/emit-tool-use-events.test.ts +85 -0
- package/templates/product-system/tests/feature_kind.test.ts +139 -0
- package/templates/product-system/tests/gap_indicators.test.ts +199 -0
- package/templates/product-system/tests/graceful_init.test.ts +142 -0
- package/templates/product-system/tests/graph_legend.test.ts +314 -0
- package/templates/product-system/tests/graph_settings_sheet.test.ts +804 -0
- package/templates/product-system/tests/hide_defined_filter.test.ts +205 -0
- package/templates/product-system/tests/kanban.test.ts +529 -0
- package/templates/product-system/tests/neighborhood_focus.test.ts +132 -0
- package/templates/product-system/tests/node_search.test.ts +340 -0
- package/templates/product-system/tests/node_sizing.test.ts +170 -0
- package/templates/product-system/tests/node_type_toggle_filters.test.ts +285 -0
- package/templates/product-system/tests/node_type_visual_encoding.test.ts +103 -0
- package/templates/product-system/tests/pipeline-state-store.test.ts +268 -0
- package/templates/product-system/tests/pipeline-unit.test.ts +593 -0
- package/templates/product-system/tests/pipeline.test.ts +195 -0
- package/templates/product-system/tests/pipeline_stats_all_cards.test.ts +193 -0
- package/templates/product-system/tests/play_all.test.ts +296 -0
- package/templates/product-system/tests/qa_issue_sheet.test.ts +464 -0
- package/templates/product-system/tests/relevance_search.test.ts +186 -0
- package/templates/product-system/tests/search_reorder.test.ts +88 -0
- package/templates/product-system/tests/serve_ui.test.ts +281 -0
- package/templates/product-system/tests/serve_ui_drizzle.test.ts +114 -0
- package/templates/product-system/tests/session_context_recall.test.ts +135 -0
- package/templates/product-system/tests/side_panel.test.ts +345 -0
- package/templates/product-system/tests/spec_completeness_label.test.ts +69 -0
- package/templates/product-system/tests/url_routing_test.ts +122 -0
- package/templates/product-system/tests/user_login.test.ts +150 -0
- package/templates/product-system/tests/user_registration.test.ts +205 -0
- package/templates/product-system/tests/web_terminal.test.ts +572 -0
- package/templates/product-system/tests/work_summary.test.ts +211 -0
- package/templates/product-system/tests/zoom_pan.test.ts +43 -0
- package/templates/product-system/tsconfig.json +24 -0
- package/templates/skills/product-bootstrap/SKILL.md +312 -0
- package/templates/skills/product-code-reviewer/SKILL.md +147 -0
- package/templates/skills/product-debugger/SKILL.md +206 -0
- package/templates/skills/product-debugger/references/agent-browser.md +1156 -0
- package/templates/skills/product-developer/SKILL.md +182 -0
- package/templates/skills/product-interview/SKILL.md +220 -0
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for Hide Defined Nodes Filter (feat_018).
|
|
3
|
+
* Uses node:test built-in runner.
|
|
4
|
+
* Tests the filtering logic that hides fully defined (status=defined, completeness=1)
|
|
5
|
+
* nodes and their connected edges from the graph.
|
|
6
|
+
*/
|
|
7
|
+
import { describe, it } from 'node:test';
|
|
8
|
+
import assert from 'node:assert/strict';
|
|
9
|
+
|
|
10
|
+
// Minimal renderer mock that replicates the buildNodes and buildLinks logic
|
|
11
|
+
const createRenderer = (hideDefinedActive = false) => {
|
|
12
|
+
const renderer = {
|
|
13
|
+
hideDefinedActive,
|
|
14
|
+
|
|
15
|
+
buildNodes: function (graphData) {
|
|
16
|
+
const edgeCounts = new Map();
|
|
17
|
+
graphData.edges.forEach(e => {
|
|
18
|
+
edgeCounts.set(e.from, (edgeCounts.get(e.from) || 0) + 1);
|
|
19
|
+
edgeCounts.set(e.to, (edgeCounts.get(e.to) || 0) + 1);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
let nodes = graphData.nodes.map(n => ({
|
|
23
|
+
...n,
|
|
24
|
+
edgeCount: edgeCounts.get(n.id) || 0,
|
|
25
|
+
}));
|
|
26
|
+
|
|
27
|
+
if (this.hideDefinedActive) {
|
|
28
|
+
nodes = nodes.filter(n => !(n.status === 'defined' && n.completeness === 1));
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return nodes;
|
|
32
|
+
},
|
|
33
|
+
|
|
34
|
+
buildLinks: function (graphData, nodes) {
|
|
35
|
+
const nodeIds = new Set(nodes.map(n => n.id));
|
|
36
|
+
return graphData.edges
|
|
37
|
+
.filter(e => nodeIds.has(e.from) && nodeIds.has(e.to))
|
|
38
|
+
.map(e => ({
|
|
39
|
+
source: e.from,
|
|
40
|
+
target: e.to,
|
|
41
|
+
relation: e.relation,
|
|
42
|
+
}));
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
return renderer;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
// Test fixtures
|
|
49
|
+
const makeGraphData = () => ({
|
|
50
|
+
nodes: [
|
|
51
|
+
{ id: 'feat_001', type: 'feature', name: 'Defined Feature', status: 'defined', completeness: 1, open_questions_count: 0 },
|
|
52
|
+
{ id: 'feat_002', type: 'feature', name: 'Draft Feature', status: 'draft', completeness: 0.3, open_questions_count: 1 },
|
|
53
|
+
{ id: 'comp_001', type: 'component', name: 'Defined Component', status: 'defined', completeness: 1, open_questions_count: 0 },
|
|
54
|
+
{ id: 'dec_001', type: 'decision', name: 'Partial Decision', status: 'partially_defined', completeness: 0.5, open_questions_count: 0 },
|
|
55
|
+
{ id: 'feat_003', type: 'feature', name: 'Almost Done', status: 'defined', completeness: 0.9, open_questions_count: 0 },
|
|
56
|
+
],
|
|
57
|
+
edges: [
|
|
58
|
+
{ from: 'feat_001', to: 'comp_001', relation: 'contains' },
|
|
59
|
+
{ from: 'feat_002', to: 'dec_001', relation: 'depends_on' },
|
|
60
|
+
{ from: 'feat_001', to: 'dec_001', relation: 'governed_by' },
|
|
61
|
+
{ from: 'feat_003', to: 'comp_001', relation: 'contains' },
|
|
62
|
+
],
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
describe('Hide Defined Nodes Filter', () => {
|
|
66
|
+
|
|
67
|
+
describe('buildNodes filtering', () => {
|
|
68
|
+
it('returns all nodes when filter is inactive', () => {
|
|
69
|
+
const renderer = createRenderer(false);
|
|
70
|
+
const graphData = makeGraphData();
|
|
71
|
+
const nodes = renderer.buildNodes(graphData);
|
|
72
|
+
assert.equal(nodes.length, 5);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it('removes nodes with status=defined and completeness=1 when filter is active', () => {
|
|
76
|
+
const renderer = createRenderer(true);
|
|
77
|
+
const graphData = makeGraphData();
|
|
78
|
+
const nodes = renderer.buildNodes(graphData);
|
|
79
|
+
|
|
80
|
+
assert.equal(nodes.length, 3);
|
|
81
|
+
const ids = nodes.map(n => n.id).sort();
|
|
82
|
+
assert.deepEqual(ids, ['dec_001', 'feat_002', 'feat_003']);
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it('keeps nodes with status=defined but completeness < 1', () => {
|
|
86
|
+
const renderer = createRenderer(true);
|
|
87
|
+
const graphData = makeGraphData();
|
|
88
|
+
const nodes = renderer.buildNodes(graphData);
|
|
89
|
+
|
|
90
|
+
const feat003 = nodes.find(n => n.id === 'feat_003');
|
|
91
|
+
assert.ok(feat003, 'feat_003 should be kept (completeness 0.9)');
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it('keeps draft and partially_defined nodes regardless of completeness', () => {
|
|
95
|
+
const renderer = createRenderer(true);
|
|
96
|
+
const graphData = makeGraphData();
|
|
97
|
+
const nodes = renderer.buildNodes(graphData);
|
|
98
|
+
|
|
99
|
+
const feat002 = nodes.find(n => n.id === 'feat_002');
|
|
100
|
+
const dec001 = nodes.find(n => n.id === 'dec_001');
|
|
101
|
+
assert.ok(feat002, 'feat_002 (draft) should be kept');
|
|
102
|
+
assert.ok(dec001, 'dec_001 (partially_defined) should be kept');
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
it('returns empty array when all nodes are fully defined', () => {
|
|
106
|
+
const renderer = createRenderer(true);
|
|
107
|
+
const graphData = {
|
|
108
|
+
nodes: [
|
|
109
|
+
{ id: 'a', type: 'feature', name: 'A', status: 'defined', completeness: 1, open_questions_count: 0 },
|
|
110
|
+
{ id: 'b', type: 'feature', name: 'B', status: 'defined', completeness: 1, open_questions_count: 0 },
|
|
111
|
+
],
|
|
112
|
+
edges: [],
|
|
113
|
+
};
|
|
114
|
+
const nodes = renderer.buildNodes(graphData);
|
|
115
|
+
assert.equal(nodes.length, 0);
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
describe('edge filtering with hidden nodes', () => {
|
|
120
|
+
it('removes edges connected to hidden nodes', () => {
|
|
121
|
+
const renderer = createRenderer(true);
|
|
122
|
+
const graphData = makeGraphData();
|
|
123
|
+
const nodes = renderer.buildNodes(graphData);
|
|
124
|
+
const links = renderer.buildLinks(graphData, nodes);
|
|
125
|
+
|
|
126
|
+
// feat_001 and comp_001 are hidden (both defined, completeness=1)
|
|
127
|
+
// Only edge feat_002 -> dec_001 should remain
|
|
128
|
+
assert.equal(links.length, 1);
|
|
129
|
+
assert.equal(links[0].source, 'feat_002');
|
|
130
|
+
assert.equal(links[0].target, 'dec_001');
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
it('keeps all edges when filter is inactive', () => {
|
|
134
|
+
const renderer = createRenderer(false);
|
|
135
|
+
const graphData = makeGraphData();
|
|
136
|
+
const nodes = renderer.buildNodes(graphData);
|
|
137
|
+
const links = renderer.buildLinks(graphData, nodes);
|
|
138
|
+
|
|
139
|
+
assert.equal(links.length, 4);
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
it('removes edges where source is hidden', () => {
|
|
143
|
+
const renderer = createRenderer(true);
|
|
144
|
+
const graphData = makeGraphData();
|
|
145
|
+
const nodes = renderer.buildNodes(graphData);
|
|
146
|
+
const links = renderer.buildLinks(graphData, nodes);
|
|
147
|
+
|
|
148
|
+
// feat_001 -> dec_001 edge should be gone (feat_001 is hidden)
|
|
149
|
+
const hasEdgeFromFeat001 = links.some(l => l.source === 'feat_001');
|
|
150
|
+
assert.equal(hasEdgeFromFeat001, false);
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
it('removes edges where target is hidden', () => {
|
|
154
|
+
const renderer = createRenderer(true);
|
|
155
|
+
const graphData = makeGraphData();
|
|
156
|
+
const nodes = renderer.buildNodes(graphData);
|
|
157
|
+
const links = renderer.buildLinks(graphData, nodes);
|
|
158
|
+
|
|
159
|
+
// feat_003 -> comp_001 edge should be gone (comp_001 is hidden)
|
|
160
|
+
const hasEdgeToComp001 = links.some(l => l.target === 'comp_001');
|
|
161
|
+
assert.equal(hasEdgeToComp001, false);
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
describe('toggle state', () => {
|
|
166
|
+
it('starts with filter inactive', () => {
|
|
167
|
+
const renderer = createRenderer();
|
|
168
|
+
assert.equal(renderer.hideDefinedActive, false);
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
it('can be toggled on', () => {
|
|
172
|
+
const renderer = createRenderer(false);
|
|
173
|
+
renderer.hideDefinedActive = true;
|
|
174
|
+
assert.equal(renderer.hideDefinedActive, true);
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
it('toggling changes buildNodes output', () => {
|
|
178
|
+
const renderer = createRenderer(false);
|
|
179
|
+
const graphData = makeGraphData();
|
|
180
|
+
|
|
181
|
+
const nodesBefore = renderer.buildNodes(graphData);
|
|
182
|
+
assert.equal(nodesBefore.length, 5);
|
|
183
|
+
|
|
184
|
+
renderer.hideDefinedActive = true;
|
|
185
|
+
const nodesAfter = renderer.buildNodes(graphData);
|
|
186
|
+
assert.equal(nodesAfter.length, 3);
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
describe('edge count calculation', () => {
|
|
191
|
+
it('calculates edge counts before filtering', () => {
|
|
192
|
+
const renderer = createRenderer(true);
|
|
193
|
+
const graphData = makeGraphData();
|
|
194
|
+
const nodes = renderer.buildNodes(graphData);
|
|
195
|
+
|
|
196
|
+
// feat_002 has 1 edge (feat_002 -> dec_001)
|
|
197
|
+
const feat002 = nodes.find(n => n.id === 'feat_002');
|
|
198
|
+
assert.equal(feat002.edgeCount, 1);
|
|
199
|
+
|
|
200
|
+
// dec_001 has 2 edges (feat_002 -> dec_001, feat_001 -> dec_001)
|
|
201
|
+
const dec001 = nodes.find(n => n.id === 'dec_001');
|
|
202
|
+
assert.equal(dec001.edgeCount, 2);
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
});
|