git-history-ui 1.0.5 → 2.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.
Files changed (38) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/README.md +7 -0
  3. package/build/frontend/index.html +13 -10
  4. package/build/frontend/main-7AXSFTJM.js +11 -0
  5. package/build/frontend/styles-YQ73RJ2V.css +1 -0
  6. package/dist/backend/dev-server.d.ts +0 -1
  7. package/dist/backend/dev-server.js +8 -4
  8. package/dist/backend/dev-server.js.map +1 -1
  9. package/dist/backend/gitService.d.ts +36 -11
  10. package/dist/backend/gitService.js +341 -197
  11. package/dist/backend/gitService.js.map +1 -1
  12. package/dist/backend/server.d.ts +8 -2
  13. package/dist/backend/server.js +145 -111
  14. package/dist/backend/server.js.map +1 -1
  15. package/dist/cli.d.ts +0 -1
  16. package/dist/cli.js +44 -22
  17. package/dist/cli.js.map +1 -1
  18. package/package.json +43 -27
  19. package/build/frontend/main-44CFNHDH.js +0 -8
  20. package/build/frontend/main-YHO6NCZZ.js +0 -8
  21. package/build/frontend/styles-26JPPBSI.css +0 -1
  22. package/build/frontend/styles-J5I4DBTU.css +0 -1
  23. package/dist/__tests__/gitService.test.d.ts +0 -2
  24. package/dist/__tests__/gitService.test.d.ts.map +0 -1
  25. package/dist/__tests__/gitService.test.js +0 -427
  26. package/dist/__tests__/gitService.test.js.map +0 -1
  27. package/dist/__tests__/setup.d.ts +0 -2
  28. package/dist/__tests__/setup.d.ts.map +0 -1
  29. package/dist/__tests__/setup.js +0 -24
  30. package/dist/__tests__/setup.js.map +0 -1
  31. package/dist/backend/dev-server.d.ts.map +0 -1
  32. package/dist/backend/gitService.d.ts.map +0 -1
  33. package/dist/backend/server.d.ts.map +0 -1
  34. package/dist/cli.d.ts.map +0 -1
  35. package/dist/config/paths.d.ts +0 -14
  36. package/dist/config/paths.d.ts.map +0 -1
  37. package/dist/config/paths.js +0 -35
  38. package/dist/config/paths.js.map +0 -1
@@ -6,133 +6,167 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.startServer = startServer;
7
7
  const express_1 = __importDefault(require("express"));
8
8
  const cors_1 = __importDefault(require("cors"));
9
+ const helmet_1 = __importDefault(require("helmet"));
10
+ const compression_1 = __importDefault(require("compression"));
11
+ const express_rate_limit_1 = __importDefault(require("express-rate-limit"));
9
12
  const http_1 = require("http");
10
- const socket_io_1 = require("socket.io");
11
13
  const path_1 = __importDefault(require("path"));
14
+ const fs_1 = __importDefault(require("fs"));
12
15
  const gitService_1 = require("./gitService");
13
- async function startServer(port = 3000, host = 'localhost', options = {}) {
16
+ const DEFAULT_PORT = 3000;
17
+ const DEFAULT_HOST = 'localhost';
18
+ async function startServer(port = DEFAULT_PORT, host = DEFAULT_HOST, options = {}) {
19
+ const cwd = options.cwd ?? process.cwd();
14
20
  const app = (0, express_1.default)();
15
- const server = (0, http_1.createServer)(app);
16
- // CORS configuration
17
- const corsOptions = {
18
- origin: process.env.NODE_ENV === 'production'
19
- ? ['http://localhost:4200', 'http://localhost:3000', 'http://127.0.0.1:4200', 'http://127.0.0.1:3000']
20
- : true,
21
- credentials: true,
22
- methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
23
- allowedHeaders: ['Content-Type', 'Authorization', 'X-Requested-With']
24
- };
25
- const io = new socket_io_1.Server(server, {
26
- cors: corsOptions
21
+ app.disable('x-powered-by');
22
+ app.set('trust proxy', 'loopback');
23
+ app.use((0, helmet_1.default)({
24
+ contentSecurityPolicy: false,
25
+ crossOriginEmbedderPolicy: false,
26
+ crossOriginResourcePolicy: { policy: 'same-origin' }
27
+ }));
28
+ app.use((0, cors_1.default)({
29
+ origin: (origin, cb) => {
30
+ if (!origin)
31
+ return cb(null, true);
32
+ if (/^https?:\/\/(localhost|127\.0\.0\.1)(:\d+)?$/.test(origin)) {
33
+ return cb(null, true);
34
+ }
35
+ return cb(new Error('CORS not allowed'), false);
36
+ },
37
+ methods: ['GET'],
38
+ allowedHeaders: ['Content-Type', 'X-Requested-With']
39
+ }));
40
+ app.use((0, compression_1.default)());
41
+ app.use(express_1.default.json({ limit: '128kb' }));
42
+ const apiLimiter = (0, express_rate_limit_1.default)({
43
+ windowMs: 60_000,
44
+ max: 600,
45
+ standardHeaders: true,
46
+ legacyHeaders: false
27
47
  });
28
- const gitService = new gitService_1.GitService();
29
- // Middleware
30
- app.use((0, cors_1.default)(corsOptions));
31
- app.use(express_1.default.json());
32
- // Check if Angular build exists, otherwise use public folder
48
+ app.use('/api', apiLimiter);
49
+ const gitService = new gitService_1.GitService(cwd);
33
50
  const angularBuildPath = path_1.default.join(__dirname, '../../build/frontend');
34
51
  const publicPath = path_1.default.join(__dirname, '../../public');
35
- if (require('fs').existsSync(angularBuildPath)) {
36
- // Serve Angular build files
37
- app.use(express_1.default.static(angularBuildPath));
38
- }
39
- else {
40
- // Serve public folder as fallback
41
- app.use(express_1.default.static(publicPath));
42
- }
43
- // API Routes
44
- app.get('/api/commits', async (req, res) => {
45
- try {
46
- const { file, since, author, limit = '100' } = req.query;
47
- const commits = await gitService.getCommits({
48
- file: file,
49
- since: since,
50
- author: author,
51
- limit: parseInt(limit)
52
- });
53
- res.json(commits);
54
- }
55
- catch (error) {
56
- const errorMessage = error instanceof Error ? error.message : 'Unknown error';
57
- res.status(500).json({ error: errorMessage });
58
- }
59
- });
60
- app.get('/api/commit/:hash', async (req, res) => {
61
- try {
62
- const { hash } = req.params;
63
- const commit = await gitService.getCommit(hash);
64
- res.json(commit);
65
- }
66
- catch (error) {
67
- const errorMessage = error instanceof Error ? error.message : 'Unknown error';
68
- res.status(500).json({ error: errorMessage });
69
- }
52
+ const staticDir = fs_1.default.existsSync(angularBuildPath) ? angularBuildPath : publicPath;
53
+ const indexFile = path_1.default.join(staticDir, 'index.html');
54
+ app.use(express_1.default.static(staticDir, { etag: true, maxAge: '1h' }));
55
+ app.get('/api/health', (_req, res) => {
56
+ res.json({ status: 'ok', uptime: process.uptime(), pid: process.pid });
70
57
  });
71
- app.get('/api/diff/:hash', async (req, res) => {
72
- try {
73
- const { hash } = req.params;
74
- const diff = await gitService.getDiff(hash);
75
- res.json(diff);
76
- }
77
- catch (error) {
78
- const errorMessage = error instanceof Error ? error.message : 'Unknown error';
79
- res.status(500).json({ error: errorMessage });
80
- }
81
- });
82
- app.get('/api/blame/:file', async (req, res) => {
83
- try {
84
- const { file } = req.params;
85
- const blame = await gitService.getBlame(file);
86
- res.json(blame);
87
- }
88
- catch (error) {
89
- const errorMessage = error instanceof Error ? error.message : 'Unknown error';
90
- res.status(500).json({ error: errorMessage });
91
- }
58
+ app.get('/api/version', (_req, res) => {
59
+ res.json({ name: 'git-history-ui', version: pkgVersion() });
92
60
  });
93
- app.get('/api/tags', async (req, res) => {
94
- try {
95
- const tags = await gitService.getTags();
96
- res.json(tags);
97
- }
98
- catch (error) {
99
- const errorMessage = error instanceof Error ? error.message : 'Unknown error';
100
- res.status(500).json({ error: errorMessage });
61
+ app.get('/api/commits', wrap(async (req, res) => {
62
+ const result = await gitService.getCommits({
63
+ file: stringParam(req.query.file),
64
+ since: stringParam(req.query.since),
65
+ until: stringParam(req.query.until),
66
+ author: stringParam(req.query.author),
67
+ search: stringParam(req.query.search ?? req.query.q),
68
+ page: numberParam(req.query.page, 1),
69
+ pageSize: numberParam(req.query.pageSize, 25)
70
+ });
71
+ res.json(result);
72
+ }));
73
+ app.get('/api/commit/:hash', wrap(async (req, res) => {
74
+ const commit = await gitService.getCommit(req.params.hash);
75
+ res.json(commit);
76
+ }));
77
+ app.get('/api/diff/:hash', wrap(async (req, res) => {
78
+ const diff = await gitService.getDiff(req.params.hash);
79
+ res.json(diff);
80
+ }));
81
+ app.get('/api/blame', wrap(async (req, res) => {
82
+ const file = stringParam(req.query.file);
83
+ if (!file) {
84
+ res.status(400).json({ error: 'file query param is required' });
85
+ return;
101
86
  }
87
+ const blame = await gitService.getBlame(file);
88
+ res.json(blame);
89
+ }));
90
+ app.get('/api/tags', wrap(async (_req, res) => res.json(await gitService.getTags())));
91
+ app.get('/api/branches', wrap(async (_req, res) => res.json(await gitService.getBranches())));
92
+ app.get('/api/authors', wrap(async (_req, res) => res.json(await gitService.getAuthors())));
93
+ app.all('/api/*', (_req, res) => {
94
+ res.status(404).json({ error: 'Not Found' });
102
95
  });
103
- app.get('/api/branches', async (req, res) => {
104
- try {
105
- const branches = await gitService.getBranches();
106
- res.json(branches);
107
- }
108
- catch (error) {
109
- const errorMessage = error instanceof Error ? error.message : 'Unknown error';
110
- res.status(500).json({ error: errorMessage });
111
- }
96
+ app.get('*', (_req, res) => {
97
+ res.sendFile(indexFile, (err) => {
98
+ if (err)
99
+ res.status(404).end();
100
+ });
112
101
  });
113
- // Serve the main HTML file for Angular routing
114
- app.get('*', (req, res) => {
115
- const angularIndexPath = path_1.default.join(__dirname, '../../build/frontend/index.html');
116
- const publicIndexPath = path_1.default.join(__dirname, '../../public/index.html');
117
- if (require('fs').existsSync(angularIndexPath)) {
118
- res.sendFile(angularIndexPath);
102
+ app.use((err, _req, res, _next) => {
103
+ if (err instanceof gitService_1.NotARepositoryError) {
104
+ res.status(400).json({ error: err.message });
105
+ return;
119
106
  }
120
- else {
121
- res.sendFile(publicIndexPath);
122
- }
123
- });
124
- // Socket.IO for real-time updates
125
- io.on('connection', (socket) => {
126
- console.log('Client connected');
127
- socket.on('disconnect', () => {
128
- console.log('Client disconnected');
129
- });
107
+ const message = err instanceof Error ? err.message : 'Unknown error';
108
+ // eslint-disable-next-line no-console
109
+ console.error('API error:', message);
110
+ res.status(500).json({ error: message });
130
111
  });
131
- return new Promise((resolve) => {
132
- server.listen(port, host, () => {
133
- console.log(`Server running on http://${host}:${port}`);
112
+ const httpServer = (0, http_1.createServer)(app);
113
+ await new Promise((resolve, reject) => {
114
+ httpServer.once('error', reject);
115
+ httpServer.listen(port, host, () => {
116
+ httpServer.off('error', reject);
134
117
  resolve();
135
118
  });
136
119
  });
120
+ const url = `http://${host}:${port}`;
121
+ const close = () => new Promise((resolve) => {
122
+ httpServer.close(() => resolve());
123
+ setTimeout(() => resolve(), 5_000).unref();
124
+ });
125
+ return { server: httpServer, url, close };
126
+ }
127
+ function wrap(handler) {
128
+ return (req, res, next) => {
129
+ handler(req, res, next).catch(next);
130
+ };
131
+ }
132
+ function stringParam(v) {
133
+ if (typeof v === 'string' && v.length > 0)
134
+ return v;
135
+ return undefined;
136
+ }
137
+ function numberParam(v, fallback) {
138
+ const n = typeof v === 'string' ? parseInt(v, 10) : NaN;
139
+ return Number.isFinite(n) ? n : fallback;
140
+ }
141
+ function pkgVersion() {
142
+ try {
143
+ const raw = fs_1.default.readFileSync(path_1.default.join(__dirname, '..', '..', 'package.json'), 'utf8');
144
+ return JSON.parse(raw).version;
145
+ }
146
+ catch {
147
+ return '0.0.0';
148
+ }
149
+ }
150
+ if (require.main === module) {
151
+ const port = parseInt(process.env.PORT || '', 10) || DEFAULT_PORT;
152
+ const host = process.env.HOST || DEFAULT_HOST;
153
+ startServer(port, host)
154
+ .then(({ url, close }) => {
155
+ // eslint-disable-next-line no-console
156
+ console.log(`git-history-ui listening on ${url}`);
157
+ const shutdown = (sig) => {
158
+ // eslint-disable-next-line no-console
159
+ console.log(`\nReceived ${sig}, shutting down...`);
160
+ close().then(() => process.exit(0));
161
+ setTimeout(() => process.exit(1), 10_000).unref();
162
+ };
163
+ process.on('SIGINT', () => shutdown('SIGINT'));
164
+ process.on('SIGTERM', () => shutdown('SIGTERM'));
165
+ })
166
+ .catch((err) => {
167
+ // eslint-disable-next-line no-console
168
+ console.error('Failed to start server:', err);
169
+ process.exit(1);
170
+ });
137
171
  }
138
172
  //# sourceMappingURL=server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/backend/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/backend/server.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts CHANGED
@@ -1,3 +1,2 @@
1
1
  #!/usr/bin/env node
2
2
  export {};
3
- //# sourceMappingURL=cli.d.ts.map
package/dist/cli.js CHANGED
@@ -7,43 +7,65 @@ Object.defineProperty(exports, "__esModule", { value: true });
7
7
  const commander_1 = require("commander");
8
8
  const chalk_1 = __importDefault(require("chalk"));
9
9
  const open_1 = __importDefault(require("open"));
10
+ const fs_1 = require("fs");
11
+ const path_1 = require("path");
10
12
  const server_1 = require("./backend/server");
13
+ const pkg = JSON.parse((0, fs_1.readFileSync)((0, path_1.join)(__dirname, '..', 'package.json'), 'utf8'));
11
14
  const program = new commander_1.Command();
12
15
  program
13
16
  .name('git-history-ui')
14
17
  .description('Beautiful git history visualization in your browser')
15
- .version('1.0.0');
16
- program
18
+ .version(pkg.version, '-v, --version', 'output the version number')
17
19
  .option('-p, --port <number>', 'port to run server on', '3000')
18
- .option('-f, --file <path>', 'show history only for a specific file')
19
- .option('-s, --since <ref>', 'show commits since a specific reference (e.g., v2.0.0)')
20
+ .option('-H, --host <host>', 'host to bind to', 'localhost')
21
+ .option('-f, --file <path>', 'filter commits by a specific file')
22
+ .option('-s, --since <date>', 'filter commits since a date (YYYY-MM-DD)')
20
23
  .option('-a, --author <name>', 'filter commits by author')
21
24
  .option('--no-open', 'do not automatically open browser')
22
- .option('--host <host>', 'host to bind to', 'localhost');
23
- program.parse();
25
+ .option('--cwd <path>', 'path to the git repository (defaults to cwd)')
26
+ .parse();
24
27
  const options = program.opts();
25
28
  async function main() {
29
+ const port = parseInt(options.port, 10);
30
+ if (!Number.isFinite(port) || port < 1 || port > 65535) {
31
+ console.error(chalk_1.default.red(`Invalid port: ${options.port}`));
32
+ process.exit(1);
33
+ }
34
+ console.log(chalk_1.default.blue('Starting git-history-ui...'));
35
+ let close = () => Promise.resolve();
26
36
  try {
27
- console.log(chalk_1.default.blue('🚀 Starting Git History UI...'));
28
- const port = parseInt(options.port);
29
- const serverUrl = `http://${options.host}:${port}`;
30
- // Start the server
31
- await (0, server_1.startServer)(port, options.host);
32
- console.log(chalk_1.default.green(`✅ Server running at ${serverUrl}`));
33
- if (options.open !== false) {
34
- console.log(chalk_1.default.yellow('🌐 Opening browser...'));
35
- await (0, open_1.default)(serverUrl);
37
+ const result = await (0, server_1.startServer)(port, options.host, {
38
+ file: options.file,
39
+ since: options.since,
40
+ author: options.author,
41
+ cwd: options.cwd
42
+ });
43
+ close = result.close;
44
+ console.log(chalk_1.default.green(`Listening on ${result.url}`));
45
+ if (options.open) {
46
+ try {
47
+ await (0, open_1.default)(result.url);
48
+ }
49
+ catch {
50
+ console.log(chalk_1.default.yellow(`(Could not open browser automatically — visit ${result.url})`));
51
+ }
36
52
  }
37
- console.log(chalk_1.default.cyan('\n📝 Usage:'));
38
- console.log(chalk_1.default.white(' • Use the search bar to filter commits'));
39
- console.log(chalk_1.default.white(' • Click on commits to view diffs'));
40
- console.log(chalk_1.default.white(' • Use the graph view to see branch structure'));
41
- console.log(chalk_1.default.white(' • Press Ctrl+C to stop the server'));
53
+ console.log(chalk_1.default.gray('\nTips:\n' +
54
+ ' • Press Cmd/Ctrl+K in the UI to open the command palette\n' +
55
+ ' • Press ? to view keyboard shortcuts\n' +
56
+ ' • Press Ctrl+C to stop the server\n'));
42
57
  }
43
- catch (error) {
44
- console.error(chalk_1.default.red(' Error starting server:'), error);
58
+ catch (err) {
59
+ console.error(chalk_1.default.red('Failed to start server:'), err instanceof Error ? err.message : err);
45
60
  process.exit(1);
46
61
  }
62
+ const shutdown = (signal) => {
63
+ console.log(chalk_1.default.gray(`\n${signal} received, shutting down...`));
64
+ close().finally(() => process.exit(0));
65
+ setTimeout(() => process.exit(1), 10_000).unref();
66
+ };
67
+ process.on('SIGINT', () => shutdown('SIGINT'));
68
+ process.on('SIGTERM', () => shutdown('SIGTERM'));
47
69
  }
48
70
  main();
49
71
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;AAEA,yCAAoC;AACpC,kDAA0B;AAC1B,gDAAwB;AACxB,6CAA+C;AAE/C,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,gBAAgB,CAAC;KACtB,WAAW,CAAC,qDAAqD,CAAC;KAClE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,MAAM,CAAC,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,CAAC;KAC9D,MAAM,CAAC,mBAAmB,EAAE,uCAAuC,CAAC;KACpE,MAAM,CAAC,mBAAmB,EAAE,wDAAwD,CAAC;KACrF,MAAM,CAAC,qBAAqB,EAAE,0BAA0B,CAAC;KACzD,MAAM,CAAC,WAAW,EAAE,mCAAmC,CAAC;KACxD,MAAM,CAAC,eAAe,EAAE,iBAAiB,EAAE,WAAW,CAAC,CAAC;AAE3D,OAAO,CAAC,KAAK,EAAE,CAAC;AAEhB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;AAE/B,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,CAAC;QAEzD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,SAAS,GAAG,UAAU,OAAO,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;QAEnD,mBAAmB;QACnB,MAAM,IAAA,oBAAW,EAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAEtC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,uBAAuB,SAAS,EAAE,CAAC,CAAC,CAAC;QAE7D,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC;YACnD,MAAM,IAAA,cAAI,EAAC,SAAS,CAAC,CAAC;QACxB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC,CAAC;QAC3E,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC,CAAC;IAElE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,EAAE,KAAK,CAAC,CAAC;QAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "git-history-ui",
3
- "version": "1.0.5",
4
- "description": "Beautiful git history visualization in your browser",
3
+ "version": "2.0.0",
4
+ "description": "Beautiful, fast git history visualization in your browser \u2014 with deterministic swim-lane graphs, virtualized diffs, and a command palette.",
5
5
  "main": "dist/cli.js",
6
6
  "bin": {
7
7
  "git-history-ui": "dist/cli.js"
@@ -9,24 +9,32 @@
9
9
  "files": [
10
10
  "dist/**/*",
11
11
  "build/**/*",
12
- "public/**/*"
12
+ "public/**/*",
13
+ "README.md",
14
+ "LICENSE",
15
+ "CHANGELOG.md"
13
16
  ],
14
17
  "scripts": {
15
18
  "build": "npm run build:backend && npm run build:frontend && npm run copy-frontend",
16
19
  "build:backend": "tsc -p tsconfig.json",
17
- "build:frontend": "cd frontend && ng build --configuration production",
20
+ "build:frontend": "npm run --prefix frontend -s build -- --configuration production",
18
21
  "build:production": "NODE_ENV=production npm run build",
19
- "dev": "concurrently \"npm run dev:backend\" \"npm run dev:frontend\"",
22
+ "dev": "concurrently -n backend,frontend -c blue,magenta \"npm:dev:backend\" \"npm:dev:frontend\"",
20
23
  "dev:backend": "ts-node-dev --respawn --transpile-only src/backend/dev-server.ts",
21
- "dev:frontend": "cd frontend && ng serve --port 4200",
24
+ "dev:frontend": "npm run --prefix frontend start -- --port 4200 --proxy-config proxy.conf.json",
22
25
  "start": "node dist/backend/server.js",
23
26
  "start:production": "NODE_ENV=production node dist/backend/server.js",
24
27
  "test": "jest",
25
28
  "test:coverage": "jest --coverage",
26
29
  "test:watch": "jest --watch",
27
- "lint": "eslint src/**/*.ts",
30
+ "lint": "eslint \"src/**/*.ts\"",
31
+ "lint:fix": "eslint \"src/**/*.ts\" --fix",
32
+ "format": "prettier --write \"src/**/*.{ts,js}\" \"frontend/src/**/*.{ts,html,css}\"",
33
+ "format:check": "prettier --check \"src/**/*.{ts,js}\" \"frontend/src/**/*.{ts,html,css}\"",
34
+ "typecheck": "tsc -p tsconfig.json --noEmit",
35
+ "clean": "rm -rf dist build coverage frontend/dist frontend/.angular",
28
36
  "copy-frontend": "mkdir -p build/frontend && cp -r frontend/dist/frontend/browser/* build/frontend/",
29
- "prepare": "npm run build"
37
+ "prepublishOnly": "npm run clean && npm run lint && npm run typecheck && npm test -- --ci && npm run build"
30
38
  },
31
39
  "keywords": [
32
40
  "git",
@@ -37,41 +45,49 @@
37
45
  "commit",
38
46
  "graph",
39
47
  "diff",
40
- "angular"
48
+ "angular",
49
+ "developer-tools",
50
+ "git-graph",
51
+ "git-log",
52
+ "command-palette"
41
53
  ],
42
- "author": "beingmartinbmc",
54
+ "author": "Ankit Sharma <ankit.sharma199803@gmail.com>",
43
55
  "license": "MIT",
44
56
  "dependencies": {
45
- "chalk": "^5.3.0",
46
- "commander": "^11.1.0",
57
+ "chalk": "^4.1.2",
58
+ "commander": "^12.1.0",
59
+ "compression": "^1.7.4",
47
60
  "cors": "^2.8.5",
48
- "express": "^4.18.2",
49
- "open": "^9.1.0",
50
- "simple-git": "^3.20.0",
51
- "socket.io": "^4.7.4"
61
+ "express": "^4.21.0",
62
+ "express-rate-limit": "^7.4.0",
63
+ "helmet": "^8.0.0",
64
+ "open": "^8.4.2"
52
65
  },
53
66
  "devDependencies": {
54
- "@types/commander": "^2.12.2",
67
+ "@types/compression": "^1.7.5",
55
68
  "@types/cors": "^2.8.17",
56
69
  "@types/express": "^4.17.21",
57
- "@types/jest": "^29.5.0",
58
- "@types/node": "^20.10.0",
59
- "@types/open": "^6.2.1",
60
- "@typescript-eslint/eslint-plugin": "^6.13.0",
61
- "@typescript-eslint/parser": "^6.13.0",
62
- "concurrently": "^8.2.2",
63
- "eslint": "^8.55.0",
70
+ "@types/jest": "^29.5.13",
71
+ "@types/node": "^20.16.10",
72
+ "@types/supertest": "^6.0.2",
73
+ "@typescript-eslint/eslint-plugin": "^8.8.0",
74
+ "@typescript-eslint/parser": "^8.8.0",
75
+ "concurrently": "^9.0.0",
76
+ "eslint": "^8.57.1",
77
+ "eslint-config-prettier": "^9.1.0",
64
78
  "jest": "^29.7.0",
65
- "ts-jest": "^29.1.0",
79
+ "prettier": "^3.3.3",
80
+ "supertest": "^7.0.0",
81
+ "ts-jest": "^29.2.5",
66
82
  "ts-node-dev": "^2.0.0",
67
- "typescript": "^5.3.0"
83
+ "typescript": "^5.6.2"
68
84
  },
69
85
  "engines": {
70
86
  "node": ">=18.0.0"
71
87
  },
72
88
  "repository": {
73
89
  "type": "git",
74
- "url": "https://github.com/beingmartinbmc/git-history-ui.git"
90
+ "url": "git+https://github.com/beingmartinbmc/git-history-ui.git"
75
91
  },
76
92
  "bugs": {
77
93
  "url": "https://github.com/beingmartinbmc/git-history-ui/issues"