Skip to content

Commit 5197adb

Browse files
committed
feat: add function for export html file.
1 parent bf9a5b5 commit 5197adb

File tree

9 files changed

+295
-41
lines changed

9 files changed

+295
-41
lines changed

src/client/client.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {setSeedOpenStateSwitcher} from './SeedOpenStateSwitcher';
66
import {setScreenCapture} from './ScreenCapture';
77

88
const model = new Model();
9-
new Renderer(model);
9+
const renderer = new Renderer(model);
1010
let ws: WebSocket;
1111

1212
try {
@@ -21,13 +21,21 @@ document.addEventListener('DOMContentLoaded', () => {
2121
if (ws) {
2222
ws.addEventListener('message', (event) => {
2323
const msg = JSON.parse(event.data);
24+
const app = document.querySelector<HTMLElement>('#app');
2425

25-
setSeedOpenStateSwitcher(model);
26+
if (!app) {
27+
return;
28+
}
2629

27-
model.data = msg; // emit Model.EVENT.DATA_UPDATE event
30+
model.data = msg;
31+
32+
const html = renderer.render();
33+
34+
app.innerHTML = html;
2835

2936
setSettings(model);
3037
setScreenCapture();
38+
setSeedOpenStateSwitcher();
3139
});
3240
} else {
3341
console.warn('Couldn\'t connect to analyzer websocket server so you\'ll have to reload page manually to see updates in the treemap');

src/client/eventDispatcher.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ export class CustomEventDispatcher {
5959
e = new MyCustomEvent(type);
6060
}
6161

62-
if (this.listeners[type] !== null) {
62+
if (this.listeners[type] !== null && this.listeners[type] !== undefined) {
6363
const len: number = this.listeners[type].length;
6464
e.currentTarget = this;
6565

src/client/model.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ export class Model extends CustomEventDispatcher {
1313
private _viewType: VIEW_TYPE = 'GRAPH';
1414

1515
public static EVENT = {
16-
DATA_UPDATE: 'dataUpdate',
1716
SETTING_CHANGED: 'settingChanged',
1817
};
1918

@@ -44,7 +43,6 @@ export class Model extends CustomEventDispatcher {
4443

4544
set data(value: AnalyzeReport) {
4645
this._data = value;
47-
this.dispatchEvent(Model.EVENT.DATA_UPDATE);
4846
}
4947

5048
/**

src/client/renderer.ts

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,12 @@ import {Seed} from './Seed';
55
import {Model} from './model';
66

77
export class Renderer {
8-
private readonly _app: HTMLElement | null;
8+
private _model: Model;
99

1010
private _tree: Seed[][] = [];
1111

12-
constructor(private _model: Model) {
13-
this._app = document.getElementById('app');
14-
15-
_model.addEventListener(Model.EVENT.DATA_UPDATE, this.ready);
12+
constructor(_model: Model) {
13+
this._model = _model;
1614
}
1715

1816
/**
@@ -42,23 +40,22 @@ export class Renderer {
4240
return tree;
4341
}
4442

43+
/**
44+
* transform json to Tree data for rendering
45+
*/
4546
private ready = () => {
46-
if ('GRAPH' === this._model.viewType) {
47-
const {data} = this._model;
48-
const {entries} = data;
47+
const {data} = this._model;
48+
const {entries} = data;
4949

50-
for (let i = 0, len = entries.length; i < len; i++) {
51-
const entry = entries[i];
50+
for (let i = 0, len = entries.length; i < len; i++) {
51+
const entry = entries[i];
5252

53-
if (data) {
54-
const root = new Seed(entry, 0, this._model);
53+
if (data) {
54+
const root = new Seed(entry, 0, this._model);
5555

56-
this._tree.push(this.generateSeed(entry, root));
57-
}
56+
this._tree.push(this.generateSeed(entry, root));
5857
}
5958
}
60-
61-
this.render();
6259
};
6360

6461
private renderLine(name: string, level: number, isLast: boolean): string {
@@ -91,9 +88,11 @@ export class Renderer {
9188
* rendering DOM from tree.
9289
* @private
9390
*/
94-
public render():void {
91+
public render(): string {
9592
let html = '';
9693

94+
this.ready();
95+
9796
for (let i = 0, len = this._tree.length; i < len; i++) {
9897
const [root] = this._tree[i];
9998

@@ -118,8 +117,6 @@ export class Renderer {
118117

119118
text = `<div class="root text"><pre class="tree">${text}</pre></div>`;
120119

121-
if (this._app) {
122-
this._app.innerHTML = html + text;
123-
}
120+
return html + text;
124121
}
125122
}

src/server/Commander.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ export const getOptions = (_argv: string[]): {
99
silent: boolean,
1010
} => {
1111
program.option('--dir [dir]', 'root directory of src.', 'src');
12-
program.option('-f, --format [type]', 'Add the specified type of report [browser, json or both]', FORMAT.BROWSER);
13-
program.option('-o, --out [dir]', 'output directory (enable with setting --format option to "json" or "both")', 'out');
12+
program.option('-f, --format [type]', 'Add the specified type of report [browser, json, html)]', FORMAT.BROWSER);
13+
program.option('-o, --out [dir]', 'output directory (enable with setting --format option to "json" or "html")', 'out');
1414
program.option('-p, --port [number]', 'select a port number for the local server', '8888');
1515
program.option('--silent', 'do not show logs with silent flag');
1616
program.parse(_argv);

src/server/Constant.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@ export const FORMAT = {
22
BROWSER: 'browser',
33
JSON: 'json',
44
BOTH: 'both',
5+
HTML: 'html',
56
};

src/server/Output.ts

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import {AnalyzeReport} from '../../types';
2+
import {Renderer} from '../client/renderer';
3+
import {Model} from '../client/model';
4+
import mkdirp from 'mkdirp';
5+
import path from 'path';
6+
import {writeFileSync} from 'fs';
7+
import {render} from 'ejs';
8+
import {fileURLToPath} from 'url';
9+
10+
const __filename = fileURLToPath(import.meta.url);
11+
const __dirname = path.dirname(__filename);
12+
const projectRoot = path.resolve(__dirname, '..');
13+
14+
export async function writeFileExtra(_filename: string, data: string) {
15+
const filename = _filename.endsWith('.json') ? _filename : `${_filename}/result.json`;
16+
17+
try {
18+
await mkdirp(path.dirname(filename));
19+
20+
writeFileSync(filename, data);
21+
console.log(`output completed ${filename}`);
22+
} catch (err: unknown) {
23+
if (err instanceof Error) {
24+
throw new Error(err.message);
25+
}
26+
}
27+
}
28+
29+
export async function writeHTML(_filename: string, result: AnalyzeReport) {
30+
const filename = _filename.endsWith('.html') ? _filename : `${_filename}/result.html`;
31+
32+
try {
33+
await mkdirp(path.dirname(filename));
34+
35+
const clientModel = new Model();
36+
37+
clientModel.data = result;
38+
39+
const renderer = new Renderer(clientModel);
40+
const htmlString = renderer.render();
41+
const html = render('<%- include("/views/static.ejs", {html: html}); %>', {html: htmlString}, {root: `${projectRoot}`});
42+
43+
writeFileSync(filename, html);
44+
console.log(`output completed ${filename}`);
45+
} catch (err: unknown) {
46+
if (err instanceof Error) {
47+
throw new Error(err.message);
48+
}
49+
}
50+
}

src/server/index.ts

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,13 @@ import {getOptions} from './Commander';
66
import {getImportDeclarationTree} from './Analyzer';
77
import {startServer} from './server';
88
import {fileCounter} from './FileCounter';
9-
import {writeFileSync} from 'fs';
9+
import {writeFileExtra, writeHTML} from './Output';
1010
import {globby} from 'globby';
1111
import path from 'path';
12-
import mkdirp from 'mkdirp';
1312

1413
// TODO: add log system
1514
// TODO: add error system
1615

17-
function writeFileExtra(filename: string, data: string) {
18-
mkdirp(path.dirname(filename)).then(() => {
19-
writeFileSync(filename, data);
20-
}).catch((err: Error) => {
21-
if (err) {
22-
throw new Error(err.message);
23-
}
24-
});
25-
}
2616

2717
const analyze = (entries: string[]): Promise<AnalyzeReport> => {
2818
return new Promise((resolve, reject) => {
@@ -80,11 +70,13 @@ export const analyzeFromCLI = async (): Promise<void> => {
8070

8171
if (argv.format === FORMAT.BOTH) {
8272
startServer(argv.port, result);
83-
writeFileExtra(path.resolve(process.cwd(), `${argv.out}/result.json`), JSON.stringify(result, null, 4));
73+
await writeFileExtra(path.resolve(process.cwd(), argv.out), JSON.stringify(result, null, 4));
8474
} else if (argv.format === FORMAT.BROWSER) {
8575
startServer(argv.port, result);
8676
} else if (argv.format === FORMAT.JSON) {
87-
writeFileExtra(path.resolve(process.cwd(), `${argv.out}/result.json`), JSON.stringify(result, null, 4));
77+
await writeFileExtra(path.resolve(process.cwd(), argv.out), JSON.stringify(result, null, 4));
78+
} else if (argv.format === FORMAT.HTML) {
79+
await writeHTML(path.resolve(process.cwd(), argv.out), result);
8880
}
8981

9082
console.log('finished analyzing.');

0 commit comments

Comments
 (0)