@allurereport/core 3.3.1 → 3.4.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.
@@ -9,10 +9,11 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
9
9
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
10
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
11
  };
12
- var _DefaultAllureStore_instances, _DefaultAllureStore_testResults, _DefaultAllureStore_attachments, _DefaultAllureStore_attachmentContents, _DefaultAllureStore_testCases, _DefaultAllureStore_metadata, _DefaultAllureStore_history, _DefaultAllureStore_known, _DefaultAllureStore_fixtures, _DefaultAllureStore_defaultLabels, _DefaultAllureStore_environment, _DefaultAllureStore_environmentsConfig, _DefaultAllureStore_reportVariables, _DefaultAllureStore_realtimeDispatcher, _DefaultAllureStore_realtimeSubscriber, _DefaultAllureStore_globalAttachmentIds, _DefaultAllureStore_globalErrors, _DefaultAllureStore_globalExitCode, _DefaultAllureStore_qualityGateResults, _DefaultAllureStore_historyPoints, _DefaultAllureStore_environments, _DefaultAllureStore_addEnvironments;
13
- import { DEFAULT_ENVIRONMENT, compareBy, createDictionary, getWorstStatus, htrsByTr, matchEnvironment, nullsLast, ordinal, reverse, } from "@allurereport/core-api";
14
- import { md5, } from "@allurereport/plugin-api";
12
+ var _DefaultAllureStore_instances, _DefaultAllureStore_testResults, _DefaultAllureStore_environmentDisplayNames, _DefaultAllureStore_environmentNameToId, _DefaultAllureStore_attachments, _DefaultAllureStore_attachmentContents, _DefaultAllureStore_testCases, _DefaultAllureStore_metadata, _DefaultAllureStore_history, _DefaultAllureStore_known, _DefaultAllureStore_fixtures, _DefaultAllureStore_defaultLabels, _DefaultAllureStore_environment, _DefaultAllureStore_environmentsConfig, _DefaultAllureStore_reportVariables, _DefaultAllureStore_realtimeDispatcher, _DefaultAllureStore_realtimeSubscriber, _DefaultAllureStore_globalAttachmentIds, _DefaultAllureStore_globalErrors, _DefaultAllureStore_globalExitCode, _DefaultAllureStore_qualityGateResults, _DefaultAllureStore_historyPoints, _DefaultAllureStore_environments, _DefaultAllureStore_mergeEnvironmentIdentity, _DefaultAllureStore_environmentIdForLookup, _DefaultAllureStore_addEnvironments, _DefaultAllureStore_environmentIdByName, _DefaultAllureStore_setTestResultEnvironmentId, _DefaultAllureStore_environmentIdByTestResult;
15
13
  import { extname } from "node:path";
14
+ import { DEFAULT_ENVIRONMENT, DEFAULT_ENVIRONMENT_IDENTITY, compareBy, createDictionary, getHistoryIdCandidates, getWorstStatus, nullsLast, ordinal, reverse, selectHistoryTestResults, validateEnvironmentId, validateEnvironmentName, } from "@allurereport/core-api";
15
+ import { md5, } from "@allurereport/plugin-api";
16
+ import { environmentIdentityById, normalizeEnvironmentDescriptorMap, resolveEnvironmentIdentity, resolveStoredEnvironmentIdentity, } from "../utils/environment.js";
16
17
  import { isFlaky } from "../utils/flaky.js";
17
18
  import { getStatusTransition } from "../utils/new.js";
18
19
  import { testFixtureResultRawToState, testResultRawToState } from "./convert.js";
@@ -26,14 +27,14 @@ const index = (indexMap, key, ...items) => {
26
27
  }
27
28
  };
28
29
  const wasStartedEarlier = (first, second) => first.start === undefined || second.start === undefined || first.start < second.start;
29
- const hidePreviousAttempt = (state, testResult) => {
30
- const { environment, historyId } = testResult;
31
- if (environment) {
32
- if (!state.has(environment)) {
33
- state.set(environment, new Map());
30
+ const hidePreviousAttemptByEnvironment = (state, testResult, environmentId) => {
31
+ const { historyId } = testResult;
32
+ if (environmentId) {
33
+ if (!state.has(environmentId)) {
34
+ state.set(environmentId, new Map());
34
35
  }
35
36
  if (historyId) {
36
- const historyIdToLastAttemptResult = state.get(environment);
37
+ const historyIdToLastAttemptResult = state.get(environmentId);
37
38
  const currentLastAttemptResult = historyIdToLastAttemptResult.get(historyId);
38
39
  if (currentLastAttemptResult) {
39
40
  if (wasStartedEarlier(currentLastAttemptResult, testResult)) {
@@ -67,6 +68,8 @@ export class DefaultAllureStore {
67
68
  constructor(params) {
68
69
  _DefaultAllureStore_instances.add(this);
69
70
  _DefaultAllureStore_testResults.set(this, void 0);
71
+ _DefaultAllureStore_environmentDisplayNames.set(this, void 0);
72
+ _DefaultAllureStore_environmentNameToId.set(this, void 0);
70
73
  _DefaultAllureStore_attachments.set(this, void 0);
71
74
  _DefaultAllureStore_attachmentContents.set(this, void 0);
72
75
  _DefaultAllureStore_testCases.set(this, void 0);
@@ -81,6 +84,7 @@ export class DefaultAllureStore {
81
84
  _DefaultAllureStore_realtimeDispatcher.set(this, void 0);
82
85
  _DefaultAllureStore_realtimeSubscriber.set(this, void 0);
83
86
  this.indexTestResultByTestCase = new Map();
87
+ this.indexTestResultByEnvironmentId = new Map();
84
88
  this.indexLatestEnvTestResultByHistoryId = new Map();
85
89
  this.indexTestResultByHistoryId = new Map();
86
90
  this.indexAttachmentByTestResult = new Map();
@@ -94,10 +98,24 @@ export class DefaultAllureStore {
94
98
  _DefaultAllureStore_historyPoints.set(this, []);
95
99
  _DefaultAllureStore_environments.set(this, []);
96
100
  const { history, known = [], realtimeDispatcher, realtimeSubscriber, defaultLabels = {}, environment, environmentsConfig = {}, reportVariables = {}, } = params ?? {};
97
- const environments = Object.keys(environmentsConfig)
98
- .concat(environment ?? "")
99
- .filter(Boolean);
101
+ const errors = [];
102
+ const { normalized: normalizedEnvironmentsConfig, identities, errors: configErrors, } = normalizeEnvironmentDescriptorMap(environmentsConfig, "environmentsConfig");
103
+ errors.push(...configErrors);
104
+ const forcedEnvironment = resolveEnvironmentIdentity({
105
+ environment,
106
+ }, normalizedEnvironmentsConfig, "store constructor");
107
+ errors.push(...forcedEnvironment.errors);
108
+ const resolvedEnvironment = forcedEnvironment.identity;
109
+ if (errors.length > 0) {
110
+ throw new Error(errors.join("; "));
111
+ }
112
+ const environments = [...identities];
113
+ if (resolvedEnvironment) {
114
+ environments.push(resolvedEnvironment);
115
+ }
100
116
  __classPrivateFieldSet(this, _DefaultAllureStore_testResults, new Map(), "f");
117
+ __classPrivateFieldSet(this, _DefaultAllureStore_environmentDisplayNames, new Map(), "f");
118
+ __classPrivateFieldSet(this, _DefaultAllureStore_environmentNameToId, new Map(), "f");
101
119
  __classPrivateFieldSet(this, _DefaultAllureStore_attachments, new Map(), "f");
102
120
  __classPrivateFieldSet(this, _DefaultAllureStore_attachmentContents, new Map(), "f");
103
121
  __classPrivateFieldSet(this, _DefaultAllureStore_testCases, new Map(), "f");
@@ -109,12 +127,30 @@ export class DefaultAllureStore {
109
127
  __classPrivateFieldSet(this, _DefaultAllureStore_realtimeDispatcher, realtimeDispatcher, "f");
110
128
  __classPrivateFieldSet(this, _DefaultAllureStore_realtimeSubscriber, realtimeSubscriber, "f");
111
129
  __classPrivateFieldSet(this, _DefaultAllureStore_defaultLabels, defaultLabels, "f");
112
- __classPrivateFieldSet(this, _DefaultAllureStore_environmentsConfig, environmentsConfig, "f");
113
- __classPrivateFieldSet(this, _DefaultAllureStore_environment, environment, "f");
130
+ __classPrivateFieldSet(this, _DefaultAllureStore_environmentsConfig, normalizedEnvironmentsConfig, "f");
131
+ __classPrivateFieldSet(this, _DefaultAllureStore_environment, resolvedEnvironment, "f");
114
132
  __classPrivateFieldSet(this, _DefaultAllureStore_reportVariables, reportVariables, "f");
115
133
  __classPrivateFieldGet(this, _DefaultAllureStore_instances, "m", _DefaultAllureStore_addEnvironments).call(this, environments);
116
134
  __classPrivateFieldGet(this, _DefaultAllureStore_realtimeSubscriber, "f")?.onQualityGateResults(async (results) => {
117
135
  __classPrivateFieldGet(this, _DefaultAllureStore_qualityGateResults, "f").push(...results);
136
+ __classPrivateFieldGet(this, _DefaultAllureStore_instances, "m", _DefaultAllureStore_addEnvironments).call(this, results
137
+ .map((result) => {
138
+ const aliasedEnvironmentId = typeof result.environment === "string" ? __classPrivateFieldGet(this, _DefaultAllureStore_instances, "m", _DefaultAllureStore_environmentIdByName).call(this, result.environment) : undefined;
139
+ if (aliasedEnvironmentId) {
140
+ const aliasedEnvironment = __classPrivateFieldGet(this, _DefaultAllureStore_environments, "f").find(({ id }) => id === aliasedEnvironmentId)?.name ?? aliasedEnvironmentId;
141
+ return {
142
+ id: aliasedEnvironmentId,
143
+ name: aliasedEnvironment,
144
+ };
145
+ }
146
+ return resolveStoredEnvironmentIdentity({
147
+ environmentName: result.environment,
148
+ labels: [],
149
+ }, __classPrivateFieldGet(this, _DefaultAllureStore_environmentsConfig, "f"), {
150
+ forcedEnvironment: __classPrivateFieldGet(this, _DefaultAllureStore_environment, "f"),
151
+ });
152
+ })
153
+ .filter(Boolean));
118
154
  });
119
155
  __classPrivateFieldGet(this, _DefaultAllureStore_realtimeSubscriber, "f")?.onGlobalExitCode(async (exitCode) => {
120
156
  __classPrivateFieldSet(this, _DefaultAllureStore_globalExitCode, exitCode, "f");
@@ -155,18 +191,41 @@ export class DefaultAllureStore {
155
191
  await __classPrivateFieldGet(this, _DefaultAllureStore_history, "f").appendHistory(history);
156
192
  }
157
193
  async qualityGateResults() {
158
- return __classPrivateFieldGet(this, _DefaultAllureStore_qualityGateResults, "f");
194
+ return [...__classPrivateFieldGet(this, _DefaultAllureStore_qualityGateResults, "f")];
159
195
  }
160
196
  async qualityGateResultsByEnv() {
197
+ const resultsById = await this.qualityGateResultsByEnvironmentId();
161
198
  const resultsByEnv = createDictionary();
199
+ Object.entries(resultsById).forEach(([environmentId, results]) => {
200
+ const environmentName = __classPrivateFieldGet(this, _DefaultAllureStore_environments, "f").find(({ id }) => id === environmentId)?.name ?? environmentId;
201
+ resultsByEnv[environmentName] = results;
202
+ });
203
+ return resultsByEnv;
204
+ }
205
+ async qualityGateResultsByEnvironmentId() {
206
+ const resultsById = createDictionary();
162
207
  for (const result of __classPrivateFieldGet(this, _DefaultAllureStore_qualityGateResults, "f")) {
163
- const environment = result.environment || "default";
164
- if (!resultsByEnv[environment]) {
165
- resultsByEnv[environment] = [];
208
+ const aliasedEnvironmentId = typeof result.environment === "string" ? __classPrivateFieldGet(this, _DefaultAllureStore_instances, "m", _DefaultAllureStore_environmentIdByName).call(this, result.environment) : undefined;
209
+ const envIdentity = aliasedEnvironmentId !== undefined
210
+ ? {
211
+ id: aliasedEnvironmentId,
212
+ name: __classPrivateFieldGet(this, _DefaultAllureStore_environments, "f").find(({ id }) => id === aliasedEnvironmentId)?.name ?? aliasedEnvironmentId,
213
+ }
214
+ : resolveStoredEnvironmentIdentity({
215
+ environmentName: result.environment,
216
+ labels: [],
217
+ }, __classPrivateFieldGet(this, _DefaultAllureStore_environmentsConfig, "f"), {
218
+ forcedEnvironment: __classPrivateFieldGet(this, _DefaultAllureStore_environment, "f"),
219
+ });
220
+ if (!envIdentity) {
221
+ continue;
166
222
  }
167
- resultsByEnv[environment].push(result);
223
+ if (!resultsById[envIdentity.id]) {
224
+ resultsById[envIdentity.id] = [];
225
+ }
226
+ resultsById[envIdentity.id].push(result);
168
227
  }
169
- return resultsByEnv;
228
+ return resultsById;
170
229
  }
171
230
  async globalExitCode() {
172
231
  return __classPrivateFieldGet(this, _DefaultAllureStore_globalExitCode, "f");
@@ -205,14 +264,25 @@ export class DefaultAllureStore {
205
264
  }
206
265
  });
207
266
  }
208
- testResult.environment = __classPrivateFieldGet(this, _DefaultAllureStore_environment, "f") || matchEnvironment(__classPrivateFieldGet(this, _DefaultAllureStore_environmentsConfig, "f"), testResult);
267
+ const environmentIdentity = __classPrivateFieldGet(this, _DefaultAllureStore_environment, "f") ??
268
+ (() => {
269
+ const match = Object.entries(__classPrivateFieldGet(this, _DefaultAllureStore_environmentsConfig, "f")).find(([, { matcher }]) => matcher({ labels: testResult.labels }));
270
+ if (!match) {
271
+ return DEFAULT_ENVIRONMENT_IDENTITY;
272
+ }
273
+ const [id, descriptor] = match;
274
+ return { id, name: descriptor.name ?? id };
275
+ })();
276
+ testResult.environment = environmentIdentity.name;
277
+ __classPrivateFieldGet(this, _DefaultAllureStore_instances, "m", _DefaultAllureStore_addEnvironments).call(this, [environmentIdentity]);
209
278
  const trHistory = await this.historyByTr(testResult);
210
279
  if (trHistory !== undefined) {
211
280
  testResult.transition = getStatusTransition(testResult, trHistory);
212
281
  testResult.flaky = isFlaky(testResult, trHistory);
213
282
  }
214
283
  __classPrivateFieldGet(this, _DefaultAllureStore_testResults, "f").set(testResult.id, testResult);
215
- hidePreviousAttempt(this.indexLatestEnvTestResultByHistoryId, testResult);
284
+ __classPrivateFieldGet(this, _DefaultAllureStore_instances, "m", _DefaultAllureStore_setTestResultEnvironmentId).call(this, testResult, environmentIdentity.id);
285
+ hidePreviousAttemptByEnvironment(this.indexLatestEnvTestResultByHistoryId, testResult, environmentIdentity.id);
216
286
  index(this.indexTestResultByTestCase, testResult.testCase?.id, testResult);
217
287
  index(this.indexTestResultByHistoryId, testResult.historyId, testResult);
218
288
  index(this.indexAttachmentByTestResult, testResult.id, ...attachmentLinks);
@@ -323,13 +393,35 @@ export class DefaultAllureStore {
323
393
  return __classPrivateFieldGet(this, _DefaultAllureStore_historyPoints, "f");
324
394
  }
325
395
  async allHistoryDataPointsByEnvironment(environment) {
396
+ const environmentNameValidation = validateEnvironmentName(environment);
397
+ if (!environmentNameValidation.valid) {
398
+ return [];
399
+ }
400
+ const environmentId = __classPrivateFieldGet(this, _DefaultAllureStore_instances, "m", _DefaultAllureStore_environmentIdByName).call(this, environmentNameValidation.normalized);
401
+ if (!environmentId) {
402
+ return [];
403
+ }
404
+ return this.allHistoryDataPointsByEnvironmentId(environmentId);
405
+ }
406
+ async allHistoryDataPointsByEnvironmentId(environmentId) {
407
+ const normalizedEnvironmentId = __classPrivateFieldGet(this, _DefaultAllureStore_instances, "m", _DefaultAllureStore_environmentIdForLookup).call(this, environmentId);
408
+ if (!normalizedEnvironmentId) {
409
+ const validation = validateEnvironmentId(environmentId);
410
+ const reason = validation.valid ? "unknown environment id" : validation.reason;
411
+ throw new Error(`Invalid environmentId ${JSON.stringify(environmentId)}: ${reason}`);
412
+ }
326
413
  return __classPrivateFieldGet(this, _DefaultAllureStore_historyPoints, "f").reduce((result, dp) => {
327
414
  const filteredTestResults = [];
328
415
  for (const tr of Object.values(dp.testResults)) {
329
- const hasLabels = tr.labels && tr.labels.length > 0;
330
- const trEnvironment = tr.environment ??
331
- (hasLabels ? matchEnvironment(__classPrivateFieldGet(this, _DefaultAllureStore_environmentsConfig, "f"), tr) : undefined);
332
- if (trEnvironment === environment) {
416
+ const storedEnvironmentKey = typeof tr.environment === "string" ? tr.environment : undefined;
417
+ const trEnvId = (storedEnvironmentKey ? __classPrivateFieldGet(this, _DefaultAllureStore_instances, "m", _DefaultAllureStore_environmentIdByName).call(this, storedEnvironmentKey) : undefined) ??
418
+ resolveStoredEnvironmentIdentity({
419
+ environment: tr.environment,
420
+ labels: tr.labels ?? [],
421
+ }, __classPrivateFieldGet(this, _DefaultAllureStore_environmentsConfig, "f"), {
422
+ forcedEnvironment: __classPrivateFieldGet(this, _DefaultAllureStore_environment, "f"),
423
+ })?.id;
424
+ if (trEnvId === normalizedEnvironmentId) {
333
425
  filteredTestResults.push(tr);
334
426
  }
335
427
  }
@@ -367,7 +459,8 @@ export class DefaultAllureStore {
367
459
  if (typeof filter === "function" && !filter(tr)) {
368
460
  continue;
369
461
  }
370
- if (!tr.historyId || !historicalIds.has(tr.historyId)) {
462
+ const historyIdCandidates = getHistoryIdCandidates(tr);
463
+ if (historyIdCandidates.length === 0 || historyIdCandidates.every((historyId) => !historicalIds.has(historyId))) {
371
464
  newTrs.push(tr);
372
465
  }
373
466
  }
@@ -391,26 +484,43 @@ export class DefaultAllureStore {
391
484
  async testResultsByTcId(tcId) {
392
485
  return this.indexTestResultByTestCase.get(tcId) ?? [];
393
486
  }
487
+ async environmentIdByTrId(trId) {
488
+ const testResult = __classPrivateFieldGet(this, _DefaultAllureStore_testResults, "f").get(trId);
489
+ return testResult ? __classPrivateFieldGet(this, _DefaultAllureStore_instances, "m", _DefaultAllureStore_environmentIdByTestResult).call(this, testResult) : undefined;
490
+ }
394
491
  async attachmentsByTrId(trId) {
395
492
  return this.indexAttachmentByTestResult.get(trId) ?? [];
396
493
  }
397
494
  async retriesByTr(tr) {
495
+ const retries = [];
398
496
  if (!tr || tr.hidden || !tr.historyId) {
399
- return [];
497
+ return retries;
498
+ }
499
+ const trByHistoryId = this.indexTestResultByHistoryId.get(tr.historyId);
500
+ if (!trByHistoryId) {
501
+ return retries;
400
502
  }
401
- return (this.indexTestResultByHistoryId.get(tr.historyId) ?? [])
402
- .filter((r) => r.hidden)
403
- .sort(nullsLast(compareBy("start", reverse(ordinal()))));
503
+ for (const r of trByHistoryId) {
504
+ if (!r.hidden || tr.environment !== r.environment) {
505
+ continue;
506
+ }
507
+ retries.push(r);
508
+ }
509
+ return retries.sort(nullsLast(compareBy("start", reverse(ordinal()))));
404
510
  }
405
511
  async retriesByTrId(trId) {
406
512
  const tr = await this.testResultById(trId);
407
- return tr ? this.retriesByTr(tr) : [];
513
+ return this.retriesByTr(tr);
408
514
  }
409
515
  async historyByTr(tr) {
410
516
  if (!__classPrivateFieldGet(this, _DefaultAllureStore_history, "f")) {
411
517
  return undefined;
412
518
  }
413
- return htrsByTr(__classPrivateFieldGet(this, _DefaultAllureStore_historyPoints, "f"), tr);
519
+ const historyIdCandidates = getHistoryIdCandidates(tr);
520
+ if (historyIdCandidates.length === 0) {
521
+ return [];
522
+ }
523
+ return selectHistoryTestResults(__classPrivateFieldGet(this, _DefaultAllureStore_historyPoints, "f"), historyIdCandidates);
414
524
  }
415
525
  async historyByTrId(trId) {
416
526
  const tr = await this.testResultById(trId);
@@ -439,8 +549,11 @@ export class DefaultAllureStore {
439
549
  if (!__classPrivateFieldGet(this, _DefaultAllureStore_known, "f")?.length) {
440
550
  return failedTestResults;
441
551
  }
442
- const knownHistoryIds = __classPrivateFieldGet(this, _DefaultAllureStore_known, "f").map((ktf) => ktf.historyId);
443
- return failedTestResults.filter(({ historyId }) => historyId && !knownHistoryIds.includes(historyId));
552
+ const knownHistoryIds = new Set(__classPrivateFieldGet(this, _DefaultAllureStore_known, "f").map((ktf) => ktf.historyId));
553
+ return failedTestResults.filter((tr) => {
554
+ const historyIdCandidates = getHistoryIdCandidates(tr);
555
+ return (historyIdCandidates.length > 0 && historyIdCandidates.every((historyId) => !knownHistoryIds.has(historyId)));
556
+ });
444
557
  }
445
558
  async testResultsByLabel(labelName) {
446
559
  const results = createDictionary();
@@ -491,19 +604,31 @@ export class DefaultAllureStore {
491
604
  return statistic;
492
605
  }
493
606
  async allEnvironments() {
607
+ return __classPrivateFieldGet(this, _DefaultAllureStore_environments, "f").map(({ name }) => name);
608
+ }
609
+ async allEnvironmentIdentities() {
494
610
  return __classPrivateFieldGet(this, _DefaultAllureStore_environments, "f");
495
611
  }
496
612
  async testResultsByEnvironment(env, options = { includeHidden: false }) {
497
- const trs = [];
498
- for (const [, tr] of __classPrivateFieldGet(this, _DefaultAllureStore_testResults, "f")) {
499
- if (!options.includeHidden && tr.hidden) {
500
- continue;
501
- }
502
- if (tr.environment === env) {
503
- trs.push(tr);
504
- }
613
+ const environmentNameValidation = validateEnvironmentName(env);
614
+ if (!environmentNameValidation.valid) {
615
+ return [];
505
616
  }
506
- return trs;
617
+ const environmentId = __classPrivateFieldGet(this, _DefaultAllureStore_instances, "m", _DefaultAllureStore_environmentIdByName).call(this, environmentNameValidation.normalized);
618
+ if (!environmentId) {
619
+ return [];
620
+ }
621
+ return this.testResultsByEnvironmentId(environmentId, options);
622
+ }
623
+ async testResultsByEnvironmentId(envId, options = { includeHidden: false }) {
624
+ const normalizedEnvId = __classPrivateFieldGet(this, _DefaultAllureStore_instances, "m", _DefaultAllureStore_environmentIdForLookup).call(this, envId);
625
+ if (!normalizedEnvId) {
626
+ const validation = validateEnvironmentId(envId);
627
+ const reason = validation.valid ? "unknown environment id" : validation.reason;
628
+ throw new Error(`Invalid environmentId ${JSON.stringify(envId)}: ${reason}`);
629
+ }
630
+ const trs = this.indexTestResultByEnvironmentId.get(normalizedEnvId) ?? [];
631
+ return options.includeHidden ? [...trs] : trs.filter((tr) => !tr.hidden);
507
632
  }
508
633
  async allTestEnvGroups() {
509
634
  const trByTestCaseId = {};
@@ -532,7 +657,7 @@ export class DefaultAllureStore {
532
657
  testResultsByEnv: {},
533
658
  };
534
659
  trs.forEach((tr) => {
535
- const env = tr.environment || __classPrivateFieldGet(this, _DefaultAllureStore_environment, "f") || matchEnvironment(__classPrivateFieldGet(this, _DefaultAllureStore_environmentsConfig, "f"), tr);
660
+ const env = __classPrivateFieldGet(this, _DefaultAllureStore_instances, "m", _DefaultAllureStore_environmentIdByTestResult).call(this, tr) ?? DEFAULT_ENVIRONMENT;
536
661
  envGroup.testResultsByEnv[env] = tr.id;
537
662
  });
538
663
  acc.push(envGroup);
@@ -543,9 +668,33 @@ export class DefaultAllureStore {
543
668
  return __classPrivateFieldGet(this, _DefaultAllureStore_reportVariables, "f");
544
669
  }
545
670
  async envVariables(env) {
671
+ const environmentNameValidation = validateEnvironmentName(env);
672
+ if (!environmentNameValidation.valid) {
673
+ return {
674
+ ...__classPrivateFieldGet(this, _DefaultAllureStore_reportVariables, "f"),
675
+ };
676
+ }
677
+ const environmentId = __classPrivateFieldGet(this, _DefaultAllureStore_instances, "m", _DefaultAllureStore_environmentIdByName).call(this, environmentNameValidation.normalized);
678
+ if (!environmentId) {
679
+ return {
680
+ ...__classPrivateFieldGet(this, _DefaultAllureStore_reportVariables, "f"),
681
+ };
682
+ }
683
+ return this.envVariablesByEnvironmentId(environmentId);
684
+ }
685
+ async envVariablesByEnvironmentId(envId) {
686
+ const normalizedEnvId = __classPrivateFieldGet(this, _DefaultAllureStore_instances, "m", _DefaultAllureStore_environmentIdForLookup).call(this, envId);
687
+ if (!normalizedEnvId) {
688
+ const validation = validateEnvironmentId(envId);
689
+ const reason = validation.valid ? "unknown environment id" : validation.reason;
690
+ throw new Error(`Invalid environmentId ${JSON.stringify(envId)}: ${reason}`);
691
+ }
692
+ const envDescriptor = Object.prototype.hasOwnProperty.call(__classPrivateFieldGet(this, _DefaultAllureStore_environmentsConfig, "f"), normalizedEnvId)
693
+ ? __classPrivateFieldGet(this, _DefaultAllureStore_environmentsConfig, "f")[normalizedEnvId]
694
+ : undefined;
546
695
  return {
547
696
  ...__classPrivateFieldGet(this, _DefaultAllureStore_reportVariables, "f"),
548
- ...(__classPrivateFieldGet(this, _DefaultAllureStore_environmentsConfig, "f")?.[env]?.variables ?? {}),
697
+ ...(envDescriptor?.variables ?? {}),
549
698
  };
550
699
  }
551
700
  dumpState() {
@@ -567,9 +716,12 @@ export class DefaultAllureStore {
567
716
  indexKnownByHistoryId: {},
568
717
  qualityGateResults: __classPrivateFieldGet(this, _DefaultAllureStore_qualityGateResults, "f"),
569
718
  };
570
- this.indexLatestEnvTestResultByHistoryId.forEach((envMap) => {
719
+ this.indexLatestEnvTestResultByHistoryId.forEach((envMap, environmentId) => {
720
+ if (!storeDump.indexLatestEnvTestResultByHistoryId[environmentId]) {
721
+ storeDump.indexLatestEnvTestResultByHistoryId[environmentId] = {};
722
+ }
571
723
  envMap.forEach((tr, historyId) => {
572
- storeDump.indexLatestEnvTestResultByHistoryId[historyId] = tr.id;
724
+ storeDump.indexLatestEnvTestResultByHistoryId[environmentId][historyId] = tr.id;
573
725
  });
574
726
  });
575
727
  this.indexAttachmentByFixture.forEach((link, fxId) => {
@@ -594,12 +746,56 @@ export class DefaultAllureStore {
594
746
  }
595
747
  async restoreState(stateDump, attachmentsContents = {}) {
596
748
  const { testResults, attachments, testCases, fixtures, reportVariables, environments, globalAttachmentIds = [], globalErrors = [], indexAttachmentByTestResult = {}, indexTestResultByHistoryId = {}, indexTestResultByTestCase = {}, indexLatestEnvTestResultByHistoryId = {}, indexAttachmentByFixture = {}, indexFixturesByTestResult = {}, indexKnownByHistoryId = {}, qualityGateResults = [], } = stateDump;
597
- updateMapWithRecord(__classPrivateFieldGet(this, _DefaultAllureStore_testResults, "f"), testResults);
749
+ const storedEnvironmentAliases = environments.flatMap((environmentValue) => {
750
+ if (typeof environmentValue === "string") {
751
+ return [{ id: environmentValue, name: environmentValue }];
752
+ }
753
+ const idValidation = validateEnvironmentId(environmentValue.id);
754
+ if (!idValidation.valid) {
755
+ return [];
756
+ }
757
+ return [
758
+ {
759
+ id: idValidation.normalized,
760
+ name: environmentValue.name ?? idValidation.normalized,
761
+ },
762
+ ];
763
+ });
764
+ const normalizedEnvironments = environments
765
+ .map((environmentValue) => {
766
+ if (typeof environmentValue === "string") {
767
+ return resolveStoredEnvironmentIdentity({
768
+ environmentName: environmentValue,
769
+ }, __classPrivateFieldGet(this, _DefaultAllureStore_environmentsConfig, "f"), {
770
+ forcedEnvironment: __classPrivateFieldGet(this, _DefaultAllureStore_environment, "f"),
771
+ fallbackToMatch: false,
772
+ });
773
+ }
774
+ return resolveStoredEnvironmentIdentity({
775
+ environment: environmentValue.id,
776
+ environmentName: environmentValue.name,
777
+ }, __classPrivateFieldGet(this, _DefaultAllureStore_environmentsConfig, "f"), {
778
+ forcedEnvironment: __classPrivateFieldGet(this, _DefaultAllureStore_environment, "f"),
779
+ fallbackToMatch: false,
780
+ });
781
+ })
782
+ .filter(Boolean);
783
+ __classPrivateFieldGet(this, _DefaultAllureStore_instances, "m", _DefaultAllureStore_addEnvironments).call(this, [...storedEnvironmentAliases, ...normalizedEnvironments]);
784
+ const envNameToId = new Map();
785
+ for (const { id, name } of __classPrivateFieldGet(this, _DefaultAllureStore_environments, "f")) {
786
+ envNameToId.set(name, id);
787
+ envNameToId.set(id, id);
788
+ }
789
+ Object.values(testResults).forEach((testResult) => {
790
+ __classPrivateFieldGet(this, _DefaultAllureStore_testResults, "f").set(testResult.id, testResult);
791
+ const storedEnvKey = typeof testResult.environment === "string" ? testResult.environment : undefined;
792
+ const envId = (storedEnvKey ? envNameToId.get(storedEnvKey) : undefined) ?? __classPrivateFieldGet(this, _DefaultAllureStore_instances, "m", _DefaultAllureStore_environmentIdByTestResult).call(this, testResult);
793
+ __classPrivateFieldGet(this, _DefaultAllureStore_instances, "m", _DefaultAllureStore_setTestResultEnvironmentId).call(this, testResult, envId);
794
+ });
598
795
  updateMapWithRecord(__classPrivateFieldGet(this, _DefaultAllureStore_attachments, "f"), attachments);
599
796
  updateMapWithRecord(__classPrivateFieldGet(this, _DefaultAllureStore_testCases, "f"), testCases);
600
797
  updateMapWithRecord(__classPrivateFieldGet(this, _DefaultAllureStore_fixtures, "f"), fixtures);
601
798
  updateMapWithRecord(__classPrivateFieldGet(this, _DefaultAllureStore_attachmentContents, "f"), attachmentsContents);
602
- __classPrivateFieldGet(this, _DefaultAllureStore_instances, "m", _DefaultAllureStore_addEnvironments).call(this, environments);
603
799
  __classPrivateFieldGet(this, _DefaultAllureStore_globalAttachmentIds, "f").push(...globalAttachmentIds);
604
800
  __classPrivateFieldGet(this, _DefaultAllureStore_globalErrors, "f").push(...globalErrors);
605
801
  Object.assign(__classPrivateFieldGet(this, _DefaultAllureStore_reportVariables, "f"), reportVariables);
@@ -671,24 +867,133 @@ export class DefaultAllureStore {
671
867
  }
672
868
  existingKnown.push(...knownFailures);
673
869
  });
674
- Object.values(indexLatestEnvTestResultByHistoryId).forEach((trId) => {
675
- const tr = __classPrivateFieldGet(this, _DefaultAllureStore_testResults, "f").get(trId);
676
- if (!tr) {
677
- return;
870
+ __classPrivateFieldGet(this, _DefaultAllureStore_environments, "f").forEach(({ id }) => {
871
+ if (!this.indexLatestEnvTestResultByHistoryId.has(id)) {
872
+ this.indexLatestEnvTestResultByHistoryId.set(id, new Map());
678
873
  }
679
- hidePreviousAttempt(this.indexLatestEnvTestResultByHistoryId, tr);
680
874
  });
875
+ const latestAttemptsEntries = Object.entries(indexLatestEnvTestResultByHistoryId);
876
+ const hasNestedLatestAttempts = latestAttemptsEntries.some(([, value]) => typeof value === "object" && value !== null);
877
+ if (hasNestedLatestAttempts) {
878
+ latestAttemptsEntries.forEach(([environmentId, historyIds]) => {
879
+ const environmentIdValidation = validateEnvironmentId(environmentId);
880
+ if (!environmentIdValidation.valid || typeof historyIds !== "object" || historyIds === null) {
881
+ return;
882
+ }
883
+ const normalizedEnvironmentId = environmentIdValidation.normalized;
884
+ Object.values(historyIds).forEach((trId) => {
885
+ const tr = __classPrivateFieldGet(this, _DefaultAllureStore_testResults, "f").get(trId);
886
+ if (!tr) {
887
+ return;
888
+ }
889
+ hidePreviousAttemptByEnvironment(this.indexLatestEnvTestResultByHistoryId, tr, normalizedEnvironmentId);
890
+ });
891
+ });
892
+ }
893
+ else {
894
+ Object.entries(indexLatestEnvTestResultByHistoryId).forEach(([historyId, latestTrId]) => {
895
+ const trIdsForHistory = indexTestResultByHistoryId[historyId] ?? [];
896
+ const storedLatestTr = __classPrivateFieldGet(this, _DefaultAllureStore_testResults, "f").get(latestTrId);
897
+ const storedLatestEnvironmentId = storedLatestTr
898
+ ? (__classPrivateFieldGet(this, _DefaultAllureStore_instances, "m", _DefaultAllureStore_environmentIdByTestResult).call(this, storedLatestTr) ?? DEFAULT_ENVIRONMENT)
899
+ : undefined;
900
+ if (storedLatestTr && storedLatestEnvironmentId) {
901
+ hidePreviousAttemptByEnvironment(this.indexLatestEnvTestResultByHistoryId, storedLatestTr, storedLatestEnvironmentId);
902
+ }
903
+ for (const trId of trIdsForHistory) {
904
+ if (trId === latestTrId) {
905
+ continue;
906
+ }
907
+ const tr = __classPrivateFieldGet(this, _DefaultAllureStore_testResults, "f").get(trId);
908
+ if (!tr) {
909
+ continue;
910
+ }
911
+ const environmentId = __classPrivateFieldGet(this, _DefaultAllureStore_instances, "m", _DefaultAllureStore_environmentIdByTestResult).call(this, tr) ?? DEFAULT_ENVIRONMENT;
912
+ if (storedLatestEnvironmentId && environmentId === storedLatestEnvironmentId) {
913
+ continue;
914
+ }
915
+ hidePreviousAttemptByEnvironment(this.indexLatestEnvTestResultByHistoryId, tr, environmentId);
916
+ }
917
+ });
918
+ }
681
919
  __classPrivateFieldGet(this, _DefaultAllureStore_qualityGateResults, "f").push(...qualityGateResults);
682
920
  }
683
921
  }
684
- _DefaultAllureStore_testResults = new WeakMap(), _DefaultAllureStore_attachments = new WeakMap(), _DefaultAllureStore_attachmentContents = new WeakMap(), _DefaultAllureStore_testCases = new WeakMap(), _DefaultAllureStore_metadata = new WeakMap(), _DefaultAllureStore_history = new WeakMap(), _DefaultAllureStore_known = new WeakMap(), _DefaultAllureStore_fixtures = new WeakMap(), _DefaultAllureStore_defaultLabels = new WeakMap(), _DefaultAllureStore_environment = new WeakMap(), _DefaultAllureStore_environmentsConfig = new WeakMap(), _DefaultAllureStore_reportVariables = new WeakMap(), _DefaultAllureStore_realtimeDispatcher = new WeakMap(), _DefaultAllureStore_realtimeSubscriber = new WeakMap(), _DefaultAllureStore_globalAttachmentIds = new WeakMap(), _DefaultAllureStore_globalErrors = new WeakMap(), _DefaultAllureStore_globalExitCode = new WeakMap(), _DefaultAllureStore_qualityGateResults = new WeakMap(), _DefaultAllureStore_historyPoints = new WeakMap(), _DefaultAllureStore_environments = new WeakMap(), _DefaultAllureStore_instances = new WeakSet(), _DefaultAllureStore_addEnvironments = function _DefaultAllureStore_addEnvironments(envs) {
922
+ _DefaultAllureStore_testResults = new WeakMap(), _DefaultAllureStore_environmentDisplayNames = new WeakMap(), _DefaultAllureStore_environmentNameToId = new WeakMap(), _DefaultAllureStore_attachments = new WeakMap(), _DefaultAllureStore_attachmentContents = new WeakMap(), _DefaultAllureStore_testCases = new WeakMap(), _DefaultAllureStore_metadata = new WeakMap(), _DefaultAllureStore_history = new WeakMap(), _DefaultAllureStore_known = new WeakMap(), _DefaultAllureStore_fixtures = new WeakMap(), _DefaultAllureStore_defaultLabels = new WeakMap(), _DefaultAllureStore_environment = new WeakMap(), _DefaultAllureStore_environmentsConfig = new WeakMap(), _DefaultAllureStore_reportVariables = new WeakMap(), _DefaultAllureStore_realtimeDispatcher = new WeakMap(), _DefaultAllureStore_realtimeSubscriber = new WeakMap(), _DefaultAllureStore_globalAttachmentIds = new WeakMap(), _DefaultAllureStore_globalErrors = new WeakMap(), _DefaultAllureStore_globalExitCode = new WeakMap(), _DefaultAllureStore_qualityGateResults = new WeakMap(), _DefaultAllureStore_historyPoints = new WeakMap(), _DefaultAllureStore_environments = new WeakMap(), _DefaultAllureStore_instances = new WeakSet(), _DefaultAllureStore_mergeEnvironmentIdentity = function _DefaultAllureStore_mergeEnvironmentIdentity(existingEnvironment, incomingEnvironment) {
923
+ const configuredEnvironment = environmentIdentityById(__classPrivateFieldGet(this, _DefaultAllureStore_environmentsConfig, "f"), incomingEnvironment.id);
924
+ if (configuredEnvironment) {
925
+ return configuredEnvironment;
926
+ }
927
+ if (existingEnvironment) {
928
+ const existingNameValidation = validateEnvironmentName(existingEnvironment.name);
929
+ if (existingNameValidation.valid) {
930
+ return {
931
+ id: existingEnvironment.id,
932
+ name: existingNameValidation.normalized,
933
+ };
934
+ }
935
+ }
936
+ const incomingNameValidation = validateEnvironmentName(incomingEnvironment.name);
937
+ if (incomingNameValidation.valid) {
938
+ return {
939
+ id: incomingEnvironment.id,
940
+ name: incomingNameValidation.normalized,
941
+ };
942
+ }
943
+ return {
944
+ id: incomingEnvironment.id,
945
+ name: incomingEnvironment.id,
946
+ };
947
+ }, _DefaultAllureStore_environmentIdForLookup = function _DefaultAllureStore_environmentIdForLookup(environmentKey) {
948
+ const aliasedEnvironmentId = __classPrivateFieldGet(this, _DefaultAllureStore_instances, "m", _DefaultAllureStore_environmentIdByName).call(this, environmentKey);
949
+ if (aliasedEnvironmentId) {
950
+ return aliasedEnvironmentId;
951
+ }
952
+ const environmentIdValidation = validateEnvironmentId(environmentKey);
953
+ return environmentIdValidation.valid ? environmentIdValidation.normalized : undefined;
954
+ }, _DefaultAllureStore_addEnvironments = function _DefaultAllureStore_addEnvironments(envs) {
685
955
  if (__classPrivateFieldGet(this, _DefaultAllureStore_environments, "f").length === 0) {
686
- __classPrivateFieldGet(this, _DefaultAllureStore_environments, "f").push(DEFAULT_ENVIRONMENT);
956
+ __classPrivateFieldGet(this, _DefaultAllureStore_environments, "f").push(DEFAULT_ENVIRONMENT_IDENTITY);
687
957
  }
688
- __classPrivateFieldSet(this, _DefaultAllureStore_environments, Array.from(new Set([...__classPrivateFieldGet(this, _DefaultAllureStore_environments, "f"), ...envs])), "f");
689
- envs.forEach((key) => {
690
- if (!this.indexLatestEnvTestResultByHistoryId.has(key)) {
691
- this.indexLatestEnvTestResultByHistoryId.set(key, new Map());
958
+ const nextById = new Map(__classPrivateFieldGet(this, _DefaultAllureStore_environments, "f").map((environment) => [environment.id, environment]));
959
+ envs.forEach((environment) => {
960
+ nextById.set(environment.id, __classPrivateFieldGet(this, _DefaultAllureStore_instances, "m", _DefaultAllureStore_mergeEnvironmentIdentity).call(this, nextById.get(environment.id), environment));
961
+ });
962
+ __classPrivateFieldSet(this, _DefaultAllureStore_environments, Array.from(nextById.values()), "f");
963
+ __classPrivateFieldGet(this, _DefaultAllureStore_environmentNameToId, "f").clear();
964
+ __classPrivateFieldGet(this, _DefaultAllureStore_environments, "f").forEach(({ id, name }) => {
965
+ __classPrivateFieldGet(this, _DefaultAllureStore_environmentNameToId, "f").set(name, id);
966
+ });
967
+ envs.forEach(({ id, name }) => {
968
+ __classPrivateFieldGet(this, _DefaultAllureStore_environmentDisplayNames, "f").set(name, id);
969
+ });
970
+ envs.forEach(({ id }) => {
971
+ if (!this.indexLatestEnvTestResultByHistoryId.has(id)) {
972
+ this.indexLatestEnvTestResultByHistoryId.set(id, new Map());
692
973
  }
693
974
  });
975
+ }, _DefaultAllureStore_environmentIdByName = function _DefaultAllureStore_environmentIdByName(environmentName) {
976
+ const canonicalId = __classPrivateFieldGet(this, _DefaultAllureStore_environmentNameToId, "f").get(environmentName);
977
+ if (canonicalId) {
978
+ return canonicalId;
979
+ }
980
+ return __classPrivateFieldGet(this, _DefaultAllureStore_environmentDisplayNames, "f").get(environmentName);
981
+ }, _DefaultAllureStore_setTestResultEnvironmentId = function _DefaultAllureStore_setTestResultEnvironmentId(testResult, environmentId) {
982
+ if (!environmentId) {
983
+ return;
984
+ }
985
+ const existing = this.indexTestResultByEnvironmentId.get(environmentId);
986
+ if (existing?.some((tr) => tr.id === testResult.id)) {
987
+ return;
988
+ }
989
+ index(this.indexTestResultByEnvironmentId, environmentId, testResult);
990
+ }, _DefaultAllureStore_environmentIdByTestResult = function _DefaultAllureStore_environmentIdByTestResult(testResult) {
991
+ const storedEnvironmentKey = typeof testResult.environment === "string" ? testResult.environment : undefined;
992
+ return ((storedEnvironmentKey ? __classPrivateFieldGet(this, _DefaultAllureStore_instances, "m", _DefaultAllureStore_environmentIdByName).call(this, storedEnvironmentKey) : undefined) ??
993
+ resolveStoredEnvironmentIdentity({
994
+ environment: testResult.environment,
995
+ labels: testResult.labels,
996
+ }, __classPrivateFieldGet(this, _DefaultAllureStore_environmentsConfig, "f"), {
997
+ forcedEnvironment: __classPrivateFieldGet(this, _DefaultAllureStore_environment, "f"),
998
+ })?.id);
694
999
  };
@@ -0,0 +1,24 @@
1
+ import { type EnvironmentIdentity, type EnvironmentsConfig, type TestResult } from "@allurereport/core-api";
2
+ export type NormalizedEnvironmentsResult = {
3
+ normalized: EnvironmentsConfig;
4
+ identities: EnvironmentIdentity[];
5
+ errors: string[];
6
+ };
7
+ export declare const normalizeEnvironmentDescriptorMap: (input: EnvironmentsConfig, sourcePath: string) => NormalizedEnvironmentsResult;
8
+ export declare const environmentIdentityById: (environmentsConfig: EnvironmentsConfig, environmentId: string) => EnvironmentIdentity | undefined;
9
+ export declare const environmentIdentityByName: (environmentsConfig: EnvironmentsConfig, environmentName: string) => EnvironmentIdentity | undefined;
10
+ export declare const resolveStoredEnvironmentIdentity: (params: {
11
+ environment?: unknown;
12
+ environmentName?: unknown;
13
+ labels?: TestResult["labels"];
14
+ }, environmentsConfig: EnvironmentsConfig, options?: {
15
+ forcedEnvironment?: EnvironmentIdentity;
16
+ fallbackToMatch?: boolean;
17
+ }) => EnvironmentIdentity | undefined;
18
+ export declare const resolveEnvironmentIdentity: (params: {
19
+ environment?: string;
20
+ environmentName?: string;
21
+ }, environmentsConfig: EnvironmentsConfig, sourcePath: string) => {
22
+ identity?: EnvironmentIdentity;
23
+ errors: string[];
24
+ };