Skip to content

Commit 79682be

Browse files
authored
Merge pull request #289 from tkskto/feature/export-html
Feature/export html
2 parents 1be51f1 + 0ff6c45 commit 79682be

File tree

19 files changed

+345
-69
lines changed

19 files changed

+345
-69
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ npm exec vca -- --dir .
4242

4343
* `--dir` : analyze target directory. default is `src`. `node_modules` will be ignored by default.
4444
* `--silent` : running without almost logs.
45-
* `-f` or `--format` : report type. choose one from [browser | json | both]. default is `browser`.
46-
* `-o` or `--out` : output directory. JSON file will output here.
45+
* `-f` or `--format` : report type. choose one from [browser | json | html]. default is `browser`.
46+
* `-o` or `--out` : output directory. JSON or HTML file will output here.
4747
* `-p` or `--port` : select a port number for the local server.
4848

4949
## API

dist/style.css

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,9 @@ header {
114114
.js .filename {
115115
border: 1px solid #ffff00;
116116
}
117+
.ts .filename {
118+
border: 1px solid #3178c6;
119+
}
117120
details {
118121
line-height: 1.7;
119122
}

rollup.config.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ const banner = `/*!
2929

3030
export default [
3131
{
32-
input: '.temp/index.js',
32+
input: '.temp/server/index.js',
3333
output: [
3434
{
3535
file: 'dist/index.mjs',

src/client/ScreenCapture.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,11 @@ export const setScreenCapture = function (): void {
9393
if (btnCapture) {
9494
btnCapture.addEventListener('click', async () => {
9595
try {
96-
await customDialog.showExportDialog();
96+
customDialog.load();
97+
98+
const img = await capture();
99+
100+
await customDialog.showExportDialog(img);
97101
} catch (err) {
98102
console.error(err);
99103
}

src/client/Seed.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,9 @@ export class Seed {
7676
}
7777

7878
private renderDetails(): string {
79-
return `<details class="detail">
79+
const openAttribute = this._model.env === 'node' ? ' open' : '';
80+
81+
return `<details class="detail"${openAttribute}>
8082
${this.renderSummary()}
8183
${this.renderProps()}
8284
${this.renderMetaData()}
@@ -98,6 +100,10 @@ export class Seed {
98100
seedClassName += ' js';
99101
}
100102

103+
if (this.isTS()) {
104+
seedClassName += ' ts';
105+
}
106+
101107
return `<div class="seed${seedClassName}">
102108
<div class="file">
103109
<div class="filename">
@@ -133,4 +139,11 @@ export class Seed {
133139
isJS(): boolean {
134140
return this._name.endsWith('.js');
135141
}
142+
143+
/**
144+
* @return boolean
145+
*/
146+
isTS(): boolean {
147+
return this._name.endsWith('.ts');
148+
}
136149
}

src/client/SeedOpenStateSwitcher.ts

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
1-
import {Model} from './model';
2-
31
class SeedOpenStateSwitcher {
42
private _isOpen = false;
53

64
private _details: NodeListOf<HTMLDetailsElement> | null = null;
75

86
private _textElement: HTMLElement | null;
97

10-
constructor(_button: HTMLButtonElement, model: Model) {
8+
constructor(_button: HTMLButtonElement) {
119
this._textElement = document.getElementById('btn-toggle-visible-state-text');
12-
_button.addEventListener('click', this.onClick.bind(this));
10+
this._details = document.querySelectorAll<HTMLDetailsElement>('.detail');
1311

14-
model.addEventListener(Model.EVENT.DATA_UPDATE, this.onDataUpdated.bind(this));
12+
_button.addEventListener('click', this.onClick.bind(this));
1513
}
1614

1715
private open() {
@@ -47,16 +45,12 @@ class SeedOpenStateSwitcher {
4745
this.close();
4846
}
4947
}
50-
51-
private onDataUpdated() {
52-
this._details = document.querySelectorAll<HTMLDetailsElement>('.detail');
53-
}
5448
}
5549

56-
export const setSeedOpenStateSwitcher = (model: Model): void => {
50+
export const setSeedOpenStateSwitcher = (): void => {
5751
const btn = document.getElementById('btn-toggle-visible-state');
5852

5953
if (btn) {
60-
new SeedOpenStateSwitcher(btn as HTMLButtonElement, model);
54+
new SeedOpenStateSwitcher(btn as HTMLButtonElement);
6155
}
6256
};

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/dialog/index.ts

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import {capture} from '../ScreenCapture';
21
import {disableTabIndex, resetTabIndex} from '../common';
32

43
class CustomDialog {
@@ -18,33 +17,31 @@ class CustomDialog {
1817
}
1918
}
2019

21-
show() {
20+
private show() {
2221
document.body.classList.add('-dialog-show');
2322
disableTabIndex('#dialog');
2423
}
2524

26-
close() {
25+
private close() {
2726
document.body.classList.remove('-dialog-show');
2827
resetTabIndex();
2928
}
3029

31-
load() {
30+
public load() {
3231
this.show();
3332

3433
if (this._contents) {
3534
this._contents.innerHTML = '<p>now loading...</p>';
3635
}
3736
}
3837

39-
complete(html: string) {
38+
private complete(html: string) {
4039
if (this._contents) {
4140
this._contents.innerHTML = html;
4241
}
4342
}
4443

45-
async showExportDialog() {
46-
this.load();
47-
const img = await capture();
44+
showExportDialog(img: HTMLImageElement) {
4845
this._btnExport.href = img.src;
4946
this.complete(img.outerHTML);
5047
}

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: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@ export class Model extends CustomEventDispatcher {
1212

1313
private _viewType: VIEW_TYPE = 'GRAPH';
1414

15+
private _env: 'browser' | 'node' = 'browser';
16+
1517
public static EVENT = {
16-
DATA_UPDATE: 'dataUpdate',
1718
SETTING_CHANGED: 'settingChanged',
1819
};
1920

@@ -44,7 +45,6 @@ export class Model extends CustomEventDispatcher {
4445

4546
set data(value: AnalyzeReport) {
4647
this._data = value;
47-
this.dispatchEvent(Model.EVENT.DATA_UPDATE);
4848
}
4949

5050
/**
@@ -111,4 +111,12 @@ export class Model extends CustomEventDispatcher {
111111
this._visibleReferenceCount = value;
112112
this.dispatchEvent(Model.EVENT.SETTING_CHANGED);
113113
}
114+
115+
get env(): 'browser' | 'node' {
116+
return this._env;
117+
}
118+
119+
set env(value: 'browser' | 'node') {
120+
this._env = value;
121+
}
114122
}

0 commit comments

Comments
 (0)