Skip to content

Commit 4357523

Browse files
committed
chore: Normalize release identifier
1 parent 300b469 commit 4357523

File tree

3 files changed

+70
-5
lines changed

3 files changed

+70
-5
lines changed

workers/grouper/src/index.ts

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,10 +110,35 @@ export default class GrouperWorker extends Worker {
110110
// FIX RELEASE TYPE
111111
// TODO: REMOVE AFTER 01.01.2026, after the most of the users update to new js catcher
112112
if (task.payload && task.payload.release !== undefined) {
113+
let normalizedRelease = String(task.payload.release);
114+
115+
// Normalize Date.toString() format to timestamp
116+
if (/GMT|Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec/.test(normalizedRelease)) {
117+
const parsed = Date.parse(normalizedRelease);
118+
119+
if (!isNaN(parsed)) {
120+
normalizedRelease = String(parsed);
121+
}
122+
}
123+
113124
task.payload = {
114125
...task.payload,
115-
release: String(task.payload.release),
126+
release: normalizedRelease,
116127
};
128+
129+
// Ensure release appears in the releases list (used by project.releases in API)
130+
if (task.projectId) {
131+
try {
132+
const releasesCol = this.eventsDb.getConnection().collection('releases');
133+
await releasesCol.updateOne(
134+
{ projectId: task.projectId, release: normalizedRelease },
135+
{ $setOnInsert: { projectId: task.projectId, release: normalizedRelease, commits: [] } },
136+
{ upsert: true },
137+
);
138+
} catch (err) {
139+
this.logger.warn('Failed to ensure release in releases collection', { err, projectId: task.projectId, release: normalizedRelease });
140+
}
141+
}
117142
}
118143

119144
let existedEvent: GroupedEventDBScheme;

workers/javascript/src/index.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,22 @@ export default class JavascriptEventWorker extends EventWorker {
311311
});
312312
}
313313

314+
/**
315+
* Normalize release identifier for DB lookup (same logic as grouper/release worker).
316+
* Converts Date.toString() format to timestamp so lookup matches how releases are stored.
317+
*/
318+
private normalizeRelease(release: string): string {
319+
if (/GMT|Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec/.test(release)) {
320+
const parsed = Date.parse(release);
321+
322+
if (!isNaN(parsed)) {
323+
return String(parsed);
324+
}
325+
}
326+
327+
return release;
328+
}
329+
314330
/**
315331
* Return source map for passed release from DB
316332
* Source Map are delivered at the building-time from client's server to the Source Maps Worker
@@ -319,11 +335,13 @@ export default class JavascriptEventWorker extends EventWorker {
319335
* @param {string} release - bundle version passed with source map and same release passed to the catcher's init
320336
*/
321337
private async getReleaseRecord(projectId: string, release: string): Promise<SourceMapsRecord> {
338+
const normalizedRelease = this.normalizeRelease(release);
339+
322340
try {
323341
const releaseRecord = await this.releasesDbCollection
324342
.findOne({
325343
projectId,
326-
release,
344+
release: normalizedRelease,
327345
}, {
328346
sort: {
329347
_id: -1,

workers/release/src/index.ts

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,14 +79,36 @@ export default class ReleaseWorker extends Worker {
7979
}
8080
}
8181

82+
/**
83+
* Normalize release identifier (convert Date.toString() format to timestamp if needed)
84+
* @param release - raw release value
85+
* @returns normalized release identifier
86+
*/
87+
private normalizeRelease(release: string): string {
88+
// If release looks like Date.toString() output (contains "GMT" or month names)
89+
if (/GMT|Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec/.test(release)) {
90+
const parsed = Date.parse(release);
91+
92+
if (!isNaN(parsed)) {
93+
// Convert to timestamp (milliseconds)
94+
return String(parsed);
95+
}
96+
}
97+
98+
// Return as-is (semantic version, timestamp, or custom identifier)
99+
return release;
100+
}
101+
82102
/**
83103
* Save user's release
84104
*
85105
* @param projectId - project id to bind the corresponding release.
86106
* @param payload - release payload
87107
*/
88108
private async saveRelease(projectId: string, payload: ReleaseWorkerAddReleasePayload): Promise<void> {
89-
this.logger.info(`saveRelease: save release for project: ${projectId}, release: ${payload.release}`);
109+
const normalizedRelease = this.normalizeRelease(payload.release);
110+
111+
this.logger.info(`saveRelease: save release for project: ${projectId}, release: ${payload.release} (normalized: ${normalizedRelease})`);
90112
try {
91113
const commits = payload.commits;
92114

@@ -101,7 +123,7 @@ export default class ReleaseWorker extends Worker {
101123

102124
await this.releasesCollection.updateOne({
103125
projectId: projectId,
104-
release: payload.release,
126+
release: normalizedRelease,
105127
}, {
106128
$set: {
107129
commits: commitsWithParsedDate,
@@ -113,7 +135,7 @@ export default class ReleaseWorker extends Worker {
113135

114136
// save source maps
115137
if (payload.files) {
116-
await this.saveSourceMap(projectId, payload);
138+
await this.saveSourceMap(projectId, { ...payload, release: normalizedRelease });
117139
}
118140
} catch (err) {
119141
this.logger.error(`Couldn't save the release due to: ${err}`);

0 commit comments

Comments
 (0)