@imolko/create-ultra-reporter 2.1.33 → 2.1.34

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.
@@ -118,21 +118,27 @@ function copyTemplateFiles(srcDir, destDir) {
118
118
  'docs/.gitkeep',
119
119
  SCAFFOLD_VERSION_FILE,
120
120
  ]);
121
- copyDirRecursive(srcDir, destDir, skipFiles);
121
+ // Also skip test files from the template (they're for library testing, not user projects)
122
+ const skipPatterns = [/\.spec\./, /\.test\./];
123
+ copyDirRecursive(srcDir, destDir, skipFiles, skipPatterns);
122
124
  }
123
- function copyDirRecursive(src, dest, skipFiles) {
125
+ function copyDirRecursive(src, dest, skipFiles, skipPatterns = []) {
124
126
  fs.mkdirSync(dest, { recursive: true });
125
127
  const entries = fs.readdirSync(src, { withFileTypes: true });
126
128
  for (const entry of entries) {
127
129
  const srcPath = path.join(src, entry.name);
128
130
  const destPath = path.join(dest, entry.name);
131
+ // Skip test files (spec, test) to prevent polluting user projects
132
+ if (!entry.isDirectory() && skipPatterns.some((p) => p.test(entry.name))) {
133
+ continue;
134
+ }
129
135
  // Compute relative path for skip check
130
136
  const relPath = path.relative(src, srcPath);
131
137
  if (skipFiles.has(entry.name) || skipFiles.has(relPath)) {
132
138
  continue;
133
139
  }
134
140
  if (entry.isDirectory()) {
135
- copyDirRecursive(srcPath, destPath, skipFiles);
141
+ copyDirRecursive(srcPath, destPath, skipFiles, skipPatterns);
136
142
  }
137
143
  else {
138
144
  fs.copyFileSync(srcPath, destPath);
@@ -147,14 +153,14 @@ function copyDirRecursive(src, dest, skipFiles) {
147
153
  */
148
154
  function generateDocusaurusConfig(config, docusaurusDir) {
149
155
  const domainName = config.domain.name;
150
- const title = `${domainName.charAt(0).toUpperCase() + domainName.slice(1)} Docs`;
156
+ const title = `${domainName.charAt(0).toUpperCase() + domainName.slice(1)}`;
151
157
  const content = `import { themes as prismThemes } from "prism-react-renderer";
152
158
  import type { Config } from "@docusaurus/types";
153
159
  import type * as Preset from "@docusaurus/preset-classic";
154
160
 
155
161
  const config: Config = {
156
162
  title: "${title}",
157
- tagline: "${domainName} Documentation",
163
+ tagline: "Domain Documentation",
158
164
  favicon: "img/favicon.ico",
159
165
 
160
166
  url: "https://your-docusaurus-site.example.com",
@@ -195,10 +201,9 @@ const config: Config = {
195
201
  },
196
202
  items: [
197
203
  {
198
- type: "docSidebar",
199
- sidebarId: "tutorialSidebar",
200
- position: "left",
201
- label: "Documentation",
204
+ to: '/docs/intro',
205
+ position: 'left',
206
+ label: 'Getting Started',
202
207
  },
203
208
  ],
204
209
  },
@@ -206,20 +211,24 @@ const config: Config = {
206
211
  style: "dark",
207
212
  links: [
208
213
  {
209
- title: "Docs",
214
+ title: "Explore",
210
215
  items: [
216
+ {
217
+ label: "Context Overview",
218
+ to: "/docs/intro",
219
+ },
220
+ {
221
+ label: "Use Cases",
222
+ to: "/docs/use-cases",
223
+ },
211
224
  {
212
225
  label: "Aggregates",
213
226
  to: "/docs/aggregates",
214
227
  },
215
228
  {
216
- label: "Domain Artifacts",
229
+ label: "Artifacts",
217
230
  to: "/docs/domain",
218
231
  },
219
- {
220
- label: "Intro",
221
- to: "/docs/intro",
222
- },
223
232
  ],
224
233
  },
225
234
  ],
@@ -290,10 +299,33 @@ function generateSidebars(config, docusaurusDir) {
290
299
  const hasUserDocs = !!config.docs;
291
300
  const docsDir = path.join(docusaurusDir, 'docs');
292
301
  const sections = [];
293
- // Aggregates section use 'doc' link to the custom index.mdx with ArtifactTable
302
+ // Project overview (README) section
303
+ if (config.includeReadme) {
304
+ sections.push(` {
305
+ type: 'doc' as const,
306
+ id: 'overview',
307
+ }`);
308
+ }
309
+ // Context Overview — always include as the entry point
294
310
  sections.push(` {
311
+ type: 'doc' as const,
312
+ id: 'intro',
313
+ label: 'Context Overview',
314
+ }`);
315
+ // Use-cases section
316
+ if (hasUseCases) {
317
+ sections.push(` {
295
318
  type: 'category' as const,
296
- label: '${domainName} Aggregates',
319
+ label: 'Use Cases',
320
+ items: [
321
+ ${formatDocItems('use-cases', docsDir)}
322
+ ],
323
+ }`);
324
+ }
325
+ // Aggregates section
326
+ sections.push(` {
327
+ type: 'category' as const,
328
+ label: 'Aggregates',
297
329
  link: {
298
330
  type: 'doc',
299
331
  id: 'aggregates/index',
@@ -302,10 +334,10 @@ function generateSidebars(config, docusaurusDir) {
302
334
  ${formatDocItems('aggregates', docsDir)}
303
335
  ],
304
336
  }`);
305
- // Domain artifacts section — use 'doc' link to the custom index.mdx with ArtifactTable
337
+ // Artifacts section
306
338
  sections.push(` {
307
339
  type: 'category' as const,
308
- label: '${domainName} Domain Artifacts',
340
+ label: 'Artifacts',
309
341
  link: {
310
342
  type: 'doc',
311
343
  id: 'domain/index',
@@ -314,16 +346,6 @@ ${formatDocItems('aggregates', docsDir)}
314
346
  ${formatDocItems('domain', docsDir)}
315
347
  ],
316
348
  }`);
317
- // Use-cases section
318
- if (hasUseCases) {
319
- sections.push(` {
320
- type: 'category' as const,
321
- label: '${config.useCases.title}',
322
- items: [
323
- ${formatDocItems('use-cases', docsDir)}
324
- ],
325
- }`);
326
- }
327
349
  // User docs section
328
350
  if (hasUserDocs) {
329
351
  sections.push(` {
@@ -1 +1 @@
1
- {"version":3,"file":"assembler.js","sourceRoot":"","sources":["../../src/scaffold/assembler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"assembler.js","sourceRoot":"","sources":["../../src/scaffold/assembler.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@imolko/create-ultra-reporter",
3
- "version": "2.1.33",
3
+ "version": "2.1.34",
4
4
  "description": "Reporter and documentation for: domain, use-cases and tests",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -1,77 +1,406 @@
1
1
  import clsx from 'clsx';
2
+ import Link from '@docusaurus/Link';
2
3
  import Heading from '@theme/Heading';
3
4
  import styles from './styles.module.css';
4
- import { useEffect } from 'react';
5
+ import { useEffect, useState } from 'react';
6
+
7
+ // ---------------------------------------------------------------------------
8
+ // Types
9
+ // ---------------------------------------------------------------------------
5
10
 
6
11
  type FeatureItem = {
7
12
  title: string;
8
13
  Svg: React.ComponentType<React.ComponentProps<'svg'>>;
9
14
  description: JSX.Element;
15
+ link?: string;
16
+ };
17
+
18
+ type TypeBreakdownEntry = {
19
+ count: number;
20
+ label: string;
21
+ };
22
+
23
+ type DashboardTestStats = {
24
+ total: number;
25
+ passed: number;
26
+ failed: number;
27
+ skipped: number;
28
+ todo: number;
29
+ suites: number;
30
+ };
31
+
32
+ type DashboardSummary = {
33
+ artifactCount: number;
34
+ contextCount: number;
35
+ testStats: DashboardTestStats;
36
+ typeBreakdown: Record<string, TypeBreakdownEntry>;
37
+ tags: Record<string, number>;
38
+ readmeHtml?: string;
39
+ readmeExcerptHtml?: string;
10
40
  };
11
41
 
42
+ // ---------------------------------------------------------------------------
43
+ // Static quick-link cards
44
+ // ---------------------------------------------------------------------------
45
+
12
46
  const FeatureList: FeatureItem[] = [
13
47
  {
14
- title: 'Easy to Use',
15
- Svg: require('@site/static/img/undraw_docusaurus_mountain.svg').default,
48
+ title: 'Context Overview',
49
+ Svg: require('@site/static/img/undraw_docusaurus_react.svg').default,
16
50
  description: (
17
51
  <>
18
- Docusaurus was designed from the ground up to be easily installed and
19
- used to get your website up and running quickly.
52
+ Read the bounded context introduction and design decisions.
20
53
  </>
21
54
  ),
55
+ link: '/docs/intro',
22
56
  },
23
57
  {
24
- title: 'Focus on What Matters',
58
+ title: 'Use Cases',
59
+ Svg: require('@site/static/img/undraw_docusaurus_react.svg').default,
60
+ description: (
61
+ <>
62
+ Review use cases and their test coverage.
63
+ </>
64
+ ),
65
+ link: '/docs/use-cases',
66
+ },
67
+ {
68
+ title: 'Aggregates',
25
69
  Svg: require('@site/static/img/undraw_docusaurus_tree.svg').default,
26
70
  description: (
27
71
  <>
28
- Docusaurus lets you focus on your docs, and we&apos;ll do the chores. Go
29
- ahead and move your docs into the <code>docs</code> directory.
72
+ Explore aggregate roots and their lifecycle.
30
73
  </>
31
74
  ),
75
+ link: '/docs/aggregates',
32
76
  },
33
77
  {
34
- title: 'Powered by React',
35
- Svg: require('@site/static/img/undraw_docusaurus_react.svg').default,
78
+ title: 'Artifacts',
79
+ Svg: require('@site/static/img/undraw_docusaurus_mountain.svg').default,
36
80
  description: (
37
81
  <>
38
- Extend or customize your website layout by reusing React. Docusaurus can
39
- be extended while reusing the same header and footer.
82
+ Browse all value-objects, entities, aggregates, and domain events.
40
83
  </>
41
84
  ),
85
+ link: '/docs/domain',
42
86
  },
43
87
  ];
44
88
 
45
- function Feature({title, Svg, description}: FeatureItem) {
89
+ // ---------------------------------------------------------------------------
90
+ // Feature card (with optional link wrapper)
91
+ // ---------------------------------------------------------------------------
92
+
93
+ function Feature({ title, Svg, description, link }: FeatureItem) {
94
+ const content = (
95
+ <div className="text--center">
96
+ <Svg className={styles.featureSvg} role="img" />
97
+ <Heading as="h3">{title}</Heading>
98
+ <p>{description}</p>
99
+ </div>
100
+ );
101
+
46
102
  return (
47
- <div className={clsx('col col--4')}>
48
- <div className="text--center">
49
- <Svg className={styles.featureSvg} role="img" />
103
+ <div className={clsx('col col--3')}>
104
+ <div
105
+ className="card"
106
+ style={{
107
+ padding: '2rem 1rem',
108
+ height: '100%',
109
+ transition: 'box-shadow 0.2s ease',
110
+ }}
111
+ >
112
+ {link ? (
113
+ <Link
114
+ to={link}
115
+ style={{ textDecoration: 'none', color: 'inherit', display: 'block' }}
116
+ >
117
+ {content}
118
+ </Link>
119
+ ) : (
120
+ content
121
+ )}
50
122
  </div>
51
- <div className="text--center padding-horiz--md">
52
- <Heading as="h3">{title}</Heading>
53
- <p>{description}</p>
123
+ </div>
124
+ );
125
+ }
126
+
127
+ // ---------------------------------------------------------------------------
128
+ // Color map for artifact types
129
+ // ---------------------------------------------------------------------------
130
+
131
+ const TYPE_COLORS: Record<string, string> = {
132
+ 'aggregate': '#2563eb',
133
+ 'entity': '#0891b2',
134
+ 'value-object': '#059669',
135
+ 'event': '#6366f1',
136
+ 'service': '#7c3aed',
137
+ 'repository': '#0d9488',
138
+ 'enum': '#4f46e5',
139
+ };
140
+
141
+ function typeColor(key: string): string {
142
+ return TYPE_COLORS[key] ?? 'var(--ifm-color-emphasis-500)';
143
+ }
144
+
145
+ // ---------------------------------------------------------------------------
146
+ // Stat card
147
+ // ---------------------------------------------------------------------------
148
+
149
+ function StatCard({
150
+ value,
151
+ label,
152
+ detail,
153
+ icon,
154
+ barChart,
155
+ stackedBar,
156
+ }: {
157
+ value: string | number;
158
+ label: string;
159
+ detail?: string;
160
+ icon: string;
161
+ barChart?: { passed: number; failed: number; skipped: number; todo: number; total: number };
162
+ stackedBar?: { label: string; count: number; color: string }[];
163
+ }) {
164
+ return (
165
+ <div className="col col--4" style={{ display: 'flex' }}>
166
+ <div
167
+ className="card"
168
+ style={{
169
+ flex: 1,
170
+ textAlign: 'center',
171
+ padding: '1.5rem',
172
+ marginBottom: '1rem',
173
+ }}
174
+ >
175
+ <div style={{ fontSize: '2.5rem', marginBottom: '0.5rem' }}>{icon}</div>
176
+ <div style={{ fontSize: '2rem', fontWeight: 'bold' }}>{value}</div>
177
+ <div style={{ color: 'var(--ifm-color-emphasis-700)', fontWeight: 500 }}>{label}</div>
178
+ {stackedBar && stackedBar.length > 0 && (() => {
179
+ const max = Math.max(...stackedBar.map((s) => s.count));
180
+ return (
181
+ <div style={{ marginTop: '0.75rem' }}>
182
+ <div style={{ display: 'flex', flexDirection: 'column', gap: '2px' }}>
183
+ {stackedBar.map((seg) => (
184
+ <div key={seg.label} style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>
185
+ <span style={{ fontSize: '0.75rem', minWidth: '5.5rem', textAlign: 'right', color: 'var(--ifm-color-emphasis-700)' }}>
186
+ {seg.label}
187
+ </span>
188
+ <div
189
+ style={{
190
+ flex: 1,
191
+ height: '0.5rem',
192
+ borderRadius: 'var(--ifm-global-radius)',
193
+ backgroundColor: seg.color,
194
+ width: max > 0 ? `${Math.round((seg.count / max) * 100)}%` : '0%',
195
+ transition: 'width 0.5s ease',
196
+ }}
197
+ />
198
+ <span style={{ fontSize: '0.75rem', fontWeight: 600, minWidth: '1.5rem' }}>
199
+ {seg.count}
200
+ </span>
201
+ </div>
202
+ ))}
203
+ </div>
204
+ </div>
205
+ );
206
+ })()}
207
+ {barChart && barChart.total > 0 && (
208
+ <div style={{ marginTop: '0.75rem' }}>
209
+ <div
210
+ style={{
211
+ display: 'flex',
212
+ height: '0.5rem',
213
+ borderRadius: 'var(--ifm-global-radius)',
214
+ overflow: 'hidden',
215
+ marginBottom: '0.5rem',
216
+ }}
217
+ >
218
+ {barChart.passed > 0 && (
219
+ <div
220
+ style={{
221
+ width: `${Math.round((barChart.passed / barChart.total) * 100)}%`,
222
+ backgroundColor: 'var(--ifm-color-success)',
223
+ }}
224
+ />
225
+ )}
226
+ {barChart.failed > 0 && (
227
+ <div
228
+ style={{
229
+ width: `${Math.round((barChart.failed / barChart.total) * 100)}%`,
230
+ backgroundColor: 'var(--ifm-color-danger)',
231
+ }}
232
+ />
233
+ )}
234
+ {barChart.skipped > 0 && (
235
+ <div
236
+ style={{
237
+ width: `${Math.round((barChart.skipped / barChart.total) * 100)}%`,
238
+ backgroundColor: 'var(--ifm-color-warning)',
239
+ }}
240
+ />
241
+ )}
242
+ {barChart.todo > 0 && (
243
+ <div
244
+ style={{
245
+ width: `${Math.round((barChart.todo / barChart.total) * 100)}%`,
246
+ backgroundColor: 'var(--ifm-color-emphasis-400)',
247
+ }}
248
+ />
249
+ )}
250
+ </div>
251
+ <div style={{ fontSize: '0.8rem', color: 'var(--ifm-color-emphasis-600)' }}>
252
+ <span style={{ color: 'var(--ifm-color-success)', fontWeight: 600 }}>
253
+ {barChart.passed}
254
+ </span>
255
+ {' passed'}
256
+ {barChart.failed > 0 && (
257
+ <>
258
+ {' / '}
259
+ <span style={{ color: 'var(--ifm-color-danger)', fontWeight: 600 }}>
260
+ {barChart.failed}
261
+ </span>
262
+ {' failed'}
263
+ </>
264
+ )}
265
+ {barChart.skipped > 0 && (
266
+ <>
267
+ {' / '}
268
+ <span style={{ color: 'var(--ifm-color-warning)', fontWeight: 600 }}>
269
+ {barChart.skipped}
270
+ </span>
271
+ {' skipped'}
272
+ </>
273
+ )}
274
+ {barChart.todo > 0 && (
275
+ <>
276
+ {' / '}
277
+ <span style={{ color: 'var(--ifm-color-emphasis-600)', fontWeight: 600 }}>
278
+ {barChart.todo}
279
+ </span>
280
+ {' todo'}
281
+ </>
282
+ )}
283
+ </div>
284
+ </div>
285
+ )}
286
+ {detail && !barChart && (
287
+ <div
288
+ style={{
289
+ fontSize: '0.85rem',
290
+ color: 'var(--ifm-color-secondary-darkest)',
291
+ marginTop: '0.5rem',
292
+ }}
293
+ >
294
+ {detail}
295
+ </div>
296
+ )}
54
297
  </div>
55
298
  </div>
56
299
  );
57
300
  }
58
301
 
59
- export default function HomepageFeatures(): JSX.Element {
302
+ // ---------------------------------------------------------------------------
303
+ // Dashboard section (dynamic)
304
+ // ---------------------------------------------------------------------------
305
+
306
+ function DashboardSection() {
307
+ const [data, setData] = useState<DashboardSummary | null>(null);
308
+ const [loading, setLoading] = useState(true);
309
+ const [error, setError] = useState(false);
310
+
60
311
  useEffect(() => {
61
- (async () => {
62
- const { default: mermaid } = await import('mermaid');
63
- mermaid.initialize({ startOnLoad: true });
64
- })();
312
+ fetch('/data/dashboard-summary.json')
313
+ .then((res) => {
314
+ if (!res.ok) {
315
+ throw new Error(`HTTP ${res.status}`);
316
+ }
317
+ return res.json();
318
+ })
319
+ .then((json) => {
320
+ setData(json);
321
+ setLoading(false);
322
+ })
323
+ .catch(() => {
324
+ setError(true);
325
+ setLoading(false);
326
+ });
65
327
  }, []);
328
+
329
+ if (loading) {
330
+ return null;
331
+ }
332
+
333
+ if (error || !data) {
334
+ return null;
335
+ }
336
+
337
+ const { artifactCount, contextCount, testStats, typeBreakdown } = data;
338
+ const artifactBars = Object.entries(typeBreakdown)
339
+ .sort(([, a], [, b]) => b.count - a.count)
340
+ .map(([type, entry]) => ({
341
+ label: entry.label,
342
+ count: entry.count,
343
+ color: typeColor(type),
344
+ }));
345
+
66
346
  return (
67
347
  <section className={styles.features}>
68
348
  <div className="container">
69
- <div className="row">
70
- {FeatureList.map((props, idx) => (
71
- <Feature key={idx} {...props} />
72
- ))}
349
+ {/* Stats row */}
350
+ <div className="row margin-bottom--lg">
351
+ <StatCard
352
+ value={contextCount}
353
+ label={`context${contextCount !== 1 ? 's' : ''}`}
354
+ icon="🧩"
355
+ />
356
+ <StatCard
357
+ value={artifactCount}
358
+ label="artifacts"
359
+ icon="📦"
360
+ stackedBar={artifactBars}
361
+ />
362
+ {testStats.total > 0 && (
363
+ <StatCard
364
+ value={testStats.total}
365
+ label="tests"
366
+ icon="🧪"
367
+ barChart={{
368
+ passed: testStats.passed,
369
+ failed: testStats.failed,
370
+ skipped: testStats.skipped,
371
+ todo: testStats.todo,
372
+ total: testStats.total,
373
+ }}
374
+ />
375
+ )}
73
376
  </div>
377
+
378
+ {/* README excerpt now lives in the hero banner (index.tsx) */}
74
379
  </div>
75
380
  </section>
76
381
  );
77
382
  }
383
+
384
+ // ---------------------------------------------------------------------------
385
+ // HomepageFeatures — static cards + dynamic dashboard
386
+ // ---------------------------------------------------------------------------
387
+
388
+ export default function HomepageFeatures(): JSX.Element {
389
+ return (
390
+ <>
391
+ {/* Static quick-link cards */}
392
+ <section className={styles.features}>
393
+ <div className="container">
394
+ <div className="row">
395
+ {FeatureList.map((props, idx) => (
396
+ <Feature key={idx} {...props} />
397
+ ))}
398
+ </div>
399
+ </div>
400
+ </section>
401
+
402
+ {/* Dynamic dashboard section */}
403
+ <DashboardSection />
404
+ </>
405
+ );
406
+ }
@@ -6,6 +6,8 @@
6
6
  }
7
7
 
8
8
  .featureSvg {
9
- height: 200px;
10
- width: 200px;
9
+ height: 120px;
10
+ width: 120px;
11
+ max-width: 100%;
12
+ margin-bottom: 1rem;
11
13
  }
@@ -20,4 +20,14 @@
20
20
  display: flex;
21
21
  align-items: center;
22
22
  justify-content: center;
23
+ flex-wrap: wrap;
24
+ gap: 0.5rem;
25
+ }
26
+
27
+ .heroExcerpt {
28
+ max-width: 40rem;
29
+ margin: 1.5rem auto 0;
30
+ font-size: 1.05rem;
31
+ line-height: 1.6;
32
+ opacity: 0.9;
23
33
  }