daily-git-summary 1.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.
package/dist/time.js ADDED
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseTimeString = parseTimeString;
4
+ exports.calculateTimeRange = calculateTimeRange;
5
+ exports.calculateTimeRangeForDate = calculateTimeRangeForDate;
6
+ exports.formatTimeRange = formatTimeRange;
7
+ exports.getDateString = getDateString;
8
+ exports.isValidTimezone = isValidTimezone;
9
+ const date_fns_tz_1 = require("date-fns-tz");
10
+ const date_fns_1 = require("date-fns");
11
+ const DEFAULT_TIMEZONE = 'Asia/Manila';
12
+ const DEFAULT_START_TIME = '18:00'; // 6:00 PM
13
+ const DEFAULT_END_TIME = '18:00'; // 6:00 PM next day
14
+ /**
15
+ * Parses a time string in HH:MM format and returns [hours, minutes]
16
+ */
17
+ function parseTimeString(timeStr) {
18
+ const parts = timeStr.split(':');
19
+ if (parts.length !== 2) {
20
+ throw new Error(`Invalid time format: ${timeStr}. Use HH:MM format (e.g., 09:00)`);
21
+ }
22
+ const hours = parseInt(parts[0], 10);
23
+ const minutes = parseInt(parts[1], 10);
24
+ if (isNaN(hours) || isNaN(minutes) || hours < 0 || hours > 23 || minutes < 0 || minutes > 59) {
25
+ throw new Error(`Invalid time values: ${timeStr}. Hours must be 0-23, minutes 0-59`);
26
+ }
27
+ return [hours, minutes];
28
+ }
29
+ /**
30
+ * Calculates the time range for a daily summary with optional custom times.
31
+ *
32
+ * @param targetDate - The date to calculate the range for (defaults to today)
33
+ * @param config - Optional time configuration (start/end times and timezone)
34
+ * @returns TimeRange object with from and to dates in UTC
35
+ */
36
+ function calculateTimeRange(targetDate, config) {
37
+ const now = targetDate || new Date();
38
+ const timezone = config?.timezone || DEFAULT_TIMEZONE;
39
+ const startTime = config?.startTime || DEFAULT_START_TIME;
40
+ const endTime = config?.endTime || DEFAULT_END_TIME;
41
+ // Parse start and end times
42
+ const [startHour, startMinute] = parseTimeString(startTime);
43
+ const [endHour, endMinute] = parseTimeString(endTime);
44
+ // Get current time in target timezone
45
+ const currentTZ = (0, date_fns_tz_1.utcToZonedTime)(now, timezone);
46
+ // Create end time today in target timezone
47
+ const endTimeTodayTZ = new Date(currentTZ);
48
+ endTimeTodayTZ.setHours(endHour, endMinute, 0, 0);
49
+ // Create start time (could be yesterday if start < end, or earlier today if start > end)
50
+ let startTimeTZ;
51
+ if (startHour < endHour || (startHour === endHour && startMinute < endMinute)) {
52
+ // Normal case: start time is earlier in the same day
53
+ startTimeTZ = new Date(endTimeTodayTZ);
54
+ startTimeTZ.setHours(startHour, startMinute, 0, 0);
55
+ }
56
+ else {
57
+ // Overnight case: start time was yesterday
58
+ startTimeTZ = (0, date_fns_1.subDays)(endTimeTodayTZ, 1);
59
+ startTimeTZ.setHours(startHour, startMinute, 0, 0);
60
+ }
61
+ // Convert to UTC for git querying
62
+ const from = (0, date_fns_tz_1.zonedTimeToUtc)(startTimeTZ, timezone);
63
+ const to = (0, date_fns_tz_1.zonedTimeToUtc)(endTimeTodayTZ, timezone);
64
+ return { from, to };
65
+ }
66
+ /**
67
+ * Calculates the time range for a specific date string (YYYY-MM-DD)
68
+ *
69
+ * @param dateStr - Date string in YYYY-MM-DD format
70
+ * @param config - Optional time configuration
71
+ * @returns TimeRange object with from and to dates in UTC
72
+ */
73
+ function calculateTimeRangeForDate(dateStr, config) {
74
+ const [year, month, day] = dateStr.split('-').map(Number);
75
+ const targetDate = new Date(year, month - 1, day, 12, 0, 0, 0);
76
+ return calculateTimeRange(targetDate, config);
77
+ }
78
+ /**
79
+ * Formats a date range for display
80
+ */
81
+ function formatTimeRange(range, timezone = DEFAULT_TIMEZONE) {
82
+ const fromTZ = (0, date_fns_tz_1.utcToZonedTime)(range.from, timezone);
83
+ const toTZ = (0, date_fns_tz_1.utcToZonedTime)(range.to, timezone);
84
+ const fromFormatted = (0, date_fns_1.format)(fromTZ, 'MMM d, h:mm a');
85
+ const toFormatted = (0, date_fns_1.format)(toTZ, 'MMM d, h:mm a');
86
+ // Extract timezone abbreviation
87
+ const tzAbbr = timezone === 'Asia/Manila' ? 'PHT' : timezone.split('/').pop() || timezone;
88
+ return `${fromFormatted} - ${toFormatted} ${tzAbbr}`;
89
+ }
90
+ /**
91
+ * Gets the date string for the summary filename
92
+ */
93
+ function getDateString(date, timezone = DEFAULT_TIMEZONE) {
94
+ const targetDate = date || new Date();
95
+ const tzDate = (0, date_fns_tz_1.utcToZonedTime)(targetDate, timezone);
96
+ return (0, date_fns_1.format)(tzDate, 'yyyy-MM-dd');
97
+ }
98
+ /**
99
+ * Validates a timezone string
100
+ */
101
+ function isValidTimezone(timezone) {
102
+ try {
103
+ Intl.DateTimeFormat(undefined, { timeZone: timezone });
104
+ return true;
105
+ }
106
+ catch (e) {
107
+ return false;
108
+ }
109
+ }
110
+ //# sourceMappingURL=time.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time.js","sourceRoot":"","sources":["../src/time.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ export interface CommitInfo {
2
+ hash: string;
3
+ message: string;
4
+ author: string;
5
+ timestamp: Date;
6
+ filesChanged: string[];
7
+ }
8
+ export interface ParsedCommit {
9
+ type: string;
10
+ scope?: string;
11
+ description: string;
12
+ isBreaking: boolean;
13
+ issueNumbers: string[];
14
+ raw: CommitInfo;
15
+ }
16
+ export interface GroupedCommits {
17
+ [type: string]: ParsedCommit[];
18
+ }
19
+ export interface TimeRange {
20
+ from: Date;
21
+ to: Date;
22
+ }
23
+ export interface DailySummary {
24
+ date: string;
25
+ timeRange: TimeRange;
26
+ commits: ParsedCommit[];
27
+ groupedCommits: GroupedCommits;
28
+ totalCommits: number;
29
+ totalFilesChanged: number;
30
+ currentBranch: string;
31
+ fileChangeFrequency: Map<string, number>;
32
+ timezone?: string;
33
+ }
34
+ export interface CLIOptions {
35
+ date?: string;
36
+ output?: string;
37
+ file?: boolean;
38
+ verbose?: boolean;
39
+ startTime?: string;
40
+ endTime?: string;
41
+ timezone?: string;
42
+ folder?: string | boolean;
43
+ }
44
+ export interface TimeConfig {
45
+ startTime: string;
46
+ endTime: string;
47
+ timezone: string;
48
+ }
49
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;IAChB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,GAAG,EAAE,UAAU,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,IAAI,CAAC;IACX,EAAE,EAAE,IAAI,CAAC;CACV;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,SAAS,CAAC;IACrB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "daily-git-summary",
3
+ "version": "1.0.0",
4
+ "description": "CLI tool to generate daily git commit summaries for standup meetings",
5
+ "main": "dist/cli.js",
6
+ "bin": {
7
+ "daily-summary": "./bin/daily-summary",
8
+ "ds": "./bin/daily-summary"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "dev": "tsc --watch",
13
+ "start": "node dist/cli.js",
14
+ "prepublish": "npm run build"
15
+ },
16
+ "keywords": [
17
+ "git",
18
+ "commit",
19
+ "summary",
20
+ "standup",
21
+ "daily",
22
+ "cli"
23
+ ],
24
+ "author": "johannus22",
25
+ "license": "MIT",
26
+ "repository": {
27
+ "type": "git",
28
+ "url": "https://github.com/johannus22/daily-git-summary.git"
29
+ },
30
+ "homepage": "https://github.com/johannus22/daily-git-summary#readme",
31
+ "bugs": {
32
+ "url": "https://github.com/johannus22/daily-git-summary/issues"
33
+ },
34
+ "dependencies": {
35
+ "simple-git": "^3.21.0",
36
+ "date-fns": "^2.30.0",
37
+ "date-fns-tz": "^2.0.0",
38
+ "commander": "^11.1.0",
39
+ "chalk": "^4.1.2"
40
+ },
41
+ "devDependencies": {
42
+ "@types/node": "^20.10.6",
43
+ "typescript": "^5.3.3"
44
+ },
45
+ "engines": {
46
+ "node": ">=16.0.0"
47
+ }
48
+ }
49
+