Skip to content

Commit c964198

Browse files
committed
Add ER diagram svg image on html document
- add ER diagram svg image on html document - enhance output format pdf, image: temporary file name using uuid format
1 parent 19a451e commit c964198

File tree

6 files changed

+41
-7
lines changed

6 files changed

+41
-7
lines changed

.eslintrc.cjs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ module.exports = {
8888
{
8989
files: ['src/creators/writeToImage.ts'],
9090
rules: {
91+
'@typescript-eslint/no-unsafe-argument': ['off'],
92+
'@typescript-eslint/no-unsafe-return': ['off'],
9193
'@typescript-eslint/no-unsafe-assignment': ['off'],
9294
'@typescript-eslint/no-unsafe-member-access': ['off'],
9395
'@typescript-eslint/no-unsafe-call': ['off'],

src/cli/commands/buildDocumentCommandHandler.ts

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import getDatabaseName from '#common/getDatabaseName';
22
import getMetadata from '#common/getMetadata';
3+
import { CE_MERMAID_THEME } from '#configs/const-enum/CE_MERMAID_THEME';
34
import { CE_OUTPUT_FORMAT } from '#configs/const-enum/CE_OUTPUT_FORMAT';
45
import type IBuildCommandOption from '#configs/interfaces/IBuildCommandOption';
56
import createHtml from '#creators/createHtml';
@@ -33,6 +34,8 @@ export default async function buildDocumentCommandHandler(option: IBuildCommandO
3334
let localDataSource: DataSource | undefined;
3435

3536
try {
37+
consola.info(`connection initialize: "${chalk.yellowBright(`${option.dataSourcePath}`)}"`);
38+
3639
const dataSource = await getDataSource(option);
3740
await dataSource.initialize();
3841

@@ -45,10 +48,11 @@ export default async function buildDocumentCommandHandler(option: IBuildCommandO
4548

4649
const metadata = await getMetadata(dataSource, option);
4750

48-
consola.info(`connection initialize: "${chalk.yellowBright(`${option.dataSourcePath}`)}"`);
49-
consola.info(`extract entities in ${getDatabaseName(dataSource.options)}`);
51+
consola.success('connection initialized');
5052
consola.info(`version: ${metadata.version}`);
5153

54+
consola.info(`extract entities in ${getDatabaseName(dataSource.options)}`);
55+
5256
const entities = getEntityRecords(dataSource, metadata);
5357
const columns = dataSource.entityMetadatas
5458
.map((entity) => entity.columns.map((column) => getColumnRecord(column, option, metadata)))
@@ -69,6 +73,10 @@ export default async function buildDocumentCommandHandler(option: IBuildCommandO
6973

7074
const dedupedRelations = dedupeManaToManyRelationRecord(passRelations);
7175
const records = [...entities, ...columns, ...dedupedRelations];
76+
77+
consola.success('complete extraction');
78+
consola.info('Database open and processing');
79+
7280
const db = await openDatabase(option);
7381
const processedDb = await processDatabase(metadata, db, option);
7482
const compared = compareDatabase(metadata, records, processedDb.prev);
@@ -77,12 +85,23 @@ export default async function buildDocumentCommandHandler(option: IBuildCommandO
7785
const renderData = await getRenderData(nextDb, metadata, option);
7886

7987
await flushDatabase(option, nextDb);
88+
consola.success('Database open and processing completed');
8089

8190
consola.info(`output format: ${option.format}`);
8291

8392
if (option.format === CE_OUTPUT_FORMAT.HTML) {
93+
const imageOption: IBuildCommandOption = {
94+
...option,
95+
format: CE_OUTPUT_FORMAT.IMAGE,
96+
imageFormat: 'svg',
97+
theme: CE_MERMAID_THEME.DARK,
98+
};
8499
const documents = await createHtml(option, renderData);
100+
const imageDocument = await createImageHtml(imageOption, renderData);
101+
102+
await writeToImage(imageDocument, imageOption, renderData);
85103
await Promise.all(documents.map((document) => fs.promises.writeFile(document.filename, document.content)));
104+
86105
return documents.map((document) => document.filename);
87106
}
88107

src/configs/interfaces/IDocumentOption.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type { CE_MERMAID_THEME } from '#configs/const-enum/CE_MERMAID_THEME';
12
import type { CE_OUTPUT_COMPONENT } from '#configs/const-enum/CE_OUTPUT_COMPONENT';
23
import type { CE_OUTPUT_FORMAT } from '#configs/const-enum/CE_OUTPUT_FORMAT';
34
import type { CE_PROJECT_NAME_FROM } from '#configs/const-enum/CE_PROJECT_NAME_FROM';
@@ -41,5 +42,5 @@ export default interface IDocumentOption extends ICommonOption {
4142
*
4243
* @url https://mermaid-js.github.io/mermaid/#/Setup?id=theme
4344
* */
44-
theme: 'default' | 'forest' | 'dark' | 'neutral';
45+
theme: CE_MERMAID_THEME;
4546
}

src/creators/createImageHtml.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
import { CE_DEFAULT_VALUE } from '#configs/const-enum/CE_DEFAULT_VALUE';
21
import type IBuildCommandOption from '#configs/interfaces/IBuildCommandOption';
32
import applyPrettier from '#creators/applyPretter';
43
import type getRenderData from '#creators/getRenderData';
54
import type IErdiaDocument from '#creators/interfaces/IErdiaDocument';
65
import { CE_TEMPLATE_NAME } from '#template/cosnt-enum/CE_TEMPLATE_NAME';
76
import evaluateTemplate from '#template/evaluateTemplate';
87
import { getDirname } from 'my-node-fp';
8+
import { randomUUID } from 'node:crypto';
99
import path from 'path';
1010
import type { AsyncReturnType } from 'type-fest';
1111

@@ -16,7 +16,7 @@ export default async function createImageHtml(
1616
const rawHtml = await evaluateTemplate(CE_TEMPLATE_NAME.IMAGE_DOCUMENT, renderData);
1717
const prettiedHtml = await applyPrettier(rawHtml, 'html');
1818
const outputDir = await getDirname(option.output ?? process.cwd());
19-
const tempFileName = path.join(outputDir, CE_DEFAULT_VALUE.HTML_INDEX_FILENAME);
19+
const tempFileName = path.join(outputDir, `${randomUUID()}.html`);
2020

2121
return {
2222
dirname: path.resolve(outputDir),

src/creators/createPdfHtml.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
import { CE_DEFAULT_VALUE } from '#configs/const-enum/CE_DEFAULT_VALUE';
21
import type IBuildCommandOption from '#configs/interfaces/IBuildCommandOption';
32
import applyPrettier from '#creators/applyPretter';
43
import type getRenderData from '#creators/getRenderData';
54
import type IErdiaDocument from '#creators/interfaces/IErdiaDocument';
65
import { CE_TEMPLATE_NAME } from '#template/cosnt-enum/CE_TEMPLATE_NAME';
76
import evaluateTemplate from '#template/evaluateTemplate';
87
import { getDirname } from 'my-node-fp';
8+
import { randomUUID } from 'node:crypto';
99
import path from 'path';
1010
import type { AsyncReturnType } from 'type-fest';
1111

@@ -16,7 +16,7 @@ export default async function createPdfHtml(
1616
const rawHtml = await evaluateTemplate(CE_TEMPLATE_NAME.PDF_DOCUMENT, renderData);
1717
const prettiedHtml = await applyPrettier(rawHtml, 'html');
1818
const outputDir = await getDirname(option.output ?? process.cwd());
19-
const tempFileName = path.join(outputDir, CE_DEFAULT_VALUE.HTML_INDEX_FILENAME);
19+
const tempFileName = path.join(outputDir, `${randomUUID()}.html`);
2020

2121
return {
2222
dirname: path.resolve(outputDir),

src/template/html/mermaid.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,23 @@ const mermaid = `<!DOCTYPE html>
5454
<a class="anchor-link" href="#entity-relationship-mermiad-diagram" aria-label="Link to this section: Entity Relationship Diagram">#</a>
5555
</h2>
5656
57+
<h3 class="title is-4">Diagram</h3>
5758
<pre class="mermaid">
5859
<% versions.filter((version) => version.latest).forEach((version) => { -%>
5960
<%- include('${CE_TEMPLATE_NAME.MERMAID_DOCUMENT}', { entities: version.entities, option, metadata }); %>
6061
<% }) -%>
6162
</pre>
63+
64+
<h3 class="title is-4">
65+
<a class="anchor-link" href="/<%= metadata.name %>.svg" target="_blank" aria-label="Link to this section: Entity Relationship Diagram Image">Image</a>
66+
</h3>
67+
</section>
68+
69+
<section>
70+
<h2 id="entity-relationship-mermiad-diagram" class="title is-3">
71+
ER Diagram Link
72+
<a class="anchor-link" href="/<%= metadata.name %>.svg" aria-label="Link to this section: Entity Relationship Diagram">#</a>
73+
</h2>
6274
</section>
6375
6476
<div class="mx-auto p-2" style="width: 100%;"></div>

0 commit comments

Comments
 (0)