@allurereport/reader 3.0.0-beta.9 → 3.0.1
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/allure2/index.js +3 -0
- package/dist/allure2/model.d.ts +3 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/xcresult/bundle.d.ts +7 -0
- package/dist/xcresult/bundle.js +68 -0
- package/dist/xcresult/index.d.ts +2 -0
- package/dist/xcresult/index.js +91 -0
- package/dist/xcresult/model.d.ts +61 -0
- package/dist/xcresult/model.js +1 -0
- package/dist/xcresult/utils.d.ts +42 -0
- package/dist/xcresult/utils.js +378 -0
- package/dist/xcresult/xcresulttool/cli.d.ts +10 -0
- package/dist/xcresult/xcresulttool/cli.js +42 -0
- package/dist/xcresult/xcresulttool/index.d.ts +7 -0
- package/dist/xcresult/xcresulttool/index.js +311 -0
- package/dist/xcresult/xcresulttool/legacy/index.d.ts +10 -0
- package/dist/xcresult/xcresulttool/legacy/index.js +455 -0
- package/dist/xcresult/xcresulttool/legacy/model.d.ts +74 -0
- package/dist/xcresult/xcresulttool/legacy/model.js +1 -0
- package/dist/xcresult/xcresulttool/legacy/parsing.d.ts +15 -0
- package/dist/xcresult/xcresulttool/legacy/parsing.js +41 -0
- package/dist/xcresult/xcresulttool/legacy/utils.d.ts +7 -0
- package/dist/xcresult/xcresulttool/legacy/utils.js +33 -0
- package/dist/xcresult/xcresulttool/legacy/xcModel.d.ts +357 -0
- package/dist/xcresult/xcresulttool/legacy/xcModel.js +5 -0
- package/dist/xcresult/xcresulttool/model.d.ts +17 -0
- package/dist/xcresult/xcresulttool/model.js +6 -0
- package/dist/xcresult/xcresulttool/utils.d.ts +3 -0
- package/dist/xcresult/xcresulttool/utils.js +74 -0
- package/dist/xcresult/xcresulttool/xcModel.d.ts +96 -0
- package/dist/xcresult/xcresulttool/xcModel.js +18 -0
- package/package.json +10 -8
package/dist/allure2/index.js
CHANGED
|
@@ -109,6 +109,7 @@ export const allure2 = {
|
|
|
109
109
|
const processTestResult = async (visitor, result, originalFileName) => {
|
|
110
110
|
const dest = {
|
|
111
111
|
uuid: ensureString(result.uuid),
|
|
112
|
+
titlePath: result?.titlePath?.length ? result.titlePath : [],
|
|
112
113
|
fullName: ensureString(result.fullName),
|
|
113
114
|
name: ensureString(result.name),
|
|
114
115
|
testId: ensureString(result.testCaseId),
|
|
@@ -120,6 +121,8 @@ const processTestResult = async (visitor, result, originalFileName) => {
|
|
|
120
121
|
status: convertStatus(result.status),
|
|
121
122
|
message: ensureString(result?.statusDetails?.message),
|
|
122
123
|
trace: ensureString(result?.statusDetails?.trace),
|
|
124
|
+
actual: ensureString(result?.statusDetails?.actual, ""),
|
|
125
|
+
expected: ensureString(result?.statusDetails?.expected, ""),
|
|
123
126
|
flaky: ensureBoolean(result?.statusDetails?.flaky),
|
|
124
127
|
known: ensureBoolean(result?.statusDetails?.known),
|
|
125
128
|
muted: ensureBoolean(result?.statusDetails?.muted),
|
package/dist/allure2/model.d.ts
CHANGED
|
@@ -42,6 +42,8 @@ export interface StatusDetails {
|
|
|
42
42
|
known?: boolean;
|
|
43
43
|
muted?: boolean;
|
|
44
44
|
flaky?: boolean;
|
|
45
|
+
actual?: string;
|
|
46
|
+
expected?: string;
|
|
45
47
|
}
|
|
46
48
|
interface ExecutableItem {
|
|
47
49
|
name?: string;
|
|
@@ -65,6 +67,7 @@ export interface TestResult extends ExecutableItem {
|
|
|
65
67
|
testCaseId?: string;
|
|
66
68
|
labels?: Label[];
|
|
67
69
|
links?: Link[];
|
|
70
|
+
titlePath?: string[];
|
|
68
71
|
}
|
|
69
72
|
export interface TestResultContainer {
|
|
70
73
|
uuid?: string;
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const XCRESULTTOOL_MISSING_MESSAGE = "'xcresulttool' is required to parse Xcode Result bundles, but we can't access it on this machine. This tool is a part of Xcode. Please make sure Xcode is installed. Visit this page to learn more about the installation:\n\n https://developer.apple.com/documentation/safari-developer-tools/installing-xcode-and-simulators\n\nNote that 'xcresulttool' doesn't come with Command Line Tools for Xcode. You need to install the full Xcode package to get it. If you have both installed, make sure the full installation is selected. Switch to it with xcode-select if necessary (the path to Xcode's Developer directory might be different on your machine):\n\n sudo xcode-select -s /Applications/Xcode.app/Contents/Developer\n\nThe original error that led to this message is shown below.\n";
|
|
2
|
+
export declare const IS_MAC: boolean;
|
|
3
|
+
export declare const isXcResultBundle: (directory: string) => Promise<boolean>;
|
|
4
|
+
export declare const checkUniformTypeIdentifier: (itemPath: string, uti: string) => Promise<boolean | undefined>;
|
|
5
|
+
export declare const isMostProbablyXcResultBundle: (directory: string) => Promise<boolean>;
|
|
6
|
+
export declare const followsXcResultNaming: (directory: string) => boolean;
|
|
7
|
+
export declare const findBundleInfoFile: (directory: string) => Promise<string | undefined>;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { invokeStdoutCliTool, isDefined } from "@allurereport/reader-api";
|
|
2
|
+
import { lstat } from "node:fs/promises";
|
|
3
|
+
import { platform } from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
const XCODE_INSTALL_URL = "https://developer.apple.com/documentation/safari-developer-tools/installing-xcode-and-simulators";
|
|
6
|
+
const XCODE_SWITCH_COMMAND = "sudo xcode-select -s /Applications/Xcode.app/Contents/Developer";
|
|
7
|
+
export const XCRESULTTOOL_MISSING_MESSAGE = `'xcresulttool' is required to parse Xcode Result bundles, but we can't \
|
|
8
|
+
access it on this machine. This tool is a part of Xcode. Please make sure Xcode is installed. Visit this page to learn \
|
|
9
|
+
more about the installation:
|
|
10
|
+
|
|
11
|
+
${XCODE_INSTALL_URL}
|
|
12
|
+
|
|
13
|
+
Note that 'xcresulttool' doesn't come with Command Line Tools for Xcode. You need to install the full Xcode package to \
|
|
14
|
+
get it. If you have both installed, make sure the full installation is selected. Switch to it with xcode-select if \
|
|
15
|
+
necessary (the path to Xcode's Developer directory might be different on your machine):
|
|
16
|
+
|
|
17
|
+
${XCODE_SWITCH_COMMAND}
|
|
18
|
+
|
|
19
|
+
The original error that led to this message is shown below.
|
|
20
|
+
`;
|
|
21
|
+
const MDLS_CONTENT_TYPE_PATTERN = /\s*"(?<uti>[^"]+)"/;
|
|
22
|
+
const bundleInfoFilePaths = new Set([
|
|
23
|
+
"Info.plist",
|
|
24
|
+
"Contents/Info.plist",
|
|
25
|
+
"Support Files/Info.plist",
|
|
26
|
+
"Resources/Info.plist",
|
|
27
|
+
]);
|
|
28
|
+
export const IS_MAC = platform() === "darwin";
|
|
29
|
+
export const isXcResultBundle = async (directory) => {
|
|
30
|
+
const hasXcResultUti = IS_MAC
|
|
31
|
+
? await checkUniformTypeIdentifier(directory, "com.apple.xcode.resultbundle")
|
|
32
|
+
: undefined;
|
|
33
|
+
return hasXcResultUti ?? (await isMostProbablyXcResultBundle(directory));
|
|
34
|
+
};
|
|
35
|
+
export const checkUniformTypeIdentifier = async (itemPath, uti) => {
|
|
36
|
+
const mdlsArgs = ["-raw", "-attr", "kMDItemContentTypeTree", itemPath];
|
|
37
|
+
let contentTypeTreeAvailable = false;
|
|
38
|
+
try {
|
|
39
|
+
for await (const line of invokeStdoutCliTool("mdls", mdlsArgs, { encoding: "utf-8" })) {
|
|
40
|
+
const match = MDLS_CONTENT_TYPE_PATTERN.exec(line);
|
|
41
|
+
if (match) {
|
|
42
|
+
contentTypeTreeAvailable = true;
|
|
43
|
+
const [, matchedUti] = match;
|
|
44
|
+
if (matchedUti === uti) {
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
return contentTypeTreeAvailable ? false : undefined;
|
|
54
|
+
};
|
|
55
|
+
export const isMostProbablyXcResultBundle = async (directory) => isDefined(await findBundleInfoFile(directory)) || followsXcResultNaming(directory);
|
|
56
|
+
export const followsXcResultNaming = (directory) => directory.endsWith(".xcresult");
|
|
57
|
+
export const findBundleInfoFile = async (directory) => {
|
|
58
|
+
for (const infoFilePath of bundleInfoFilePaths) {
|
|
59
|
+
const infoFileAbsPath = path.join(directory, infoFilePath);
|
|
60
|
+
try {
|
|
61
|
+
const stat = await lstat(infoFileAbsPath);
|
|
62
|
+
if (stat.isFile()) {
|
|
63
|
+
return infoFileAbsPath;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch { }
|
|
67
|
+
}
|
|
68
|
+
};
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import console from "node:console";
|
|
2
|
+
import { IS_MAC, XCRESULTTOOL_MISSING_MESSAGE, isXcResultBundle } from "./bundle.js";
|
|
3
|
+
import { version } from "./xcresulttool/cli.js";
|
|
4
|
+
import LegacyApiParser from "./xcresulttool/legacy/index.js";
|
|
5
|
+
import { parseWithExportedAttachments } from "./xcresulttool/utils.js";
|
|
6
|
+
const readerId = "xcresult";
|
|
7
|
+
export const readXcResultBundle = async (visitor, directory) => {
|
|
8
|
+
if (await isXcResultBundle(directory)) {
|
|
9
|
+
if (!IS_MAC) {
|
|
10
|
+
console.warn(`It looks like ${directory} is a Mac OS bundle. Allure 3 can only parse such bundles on a Mac OS machine.`);
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
const xcResultToolVersion = await maybeGetXcResultToolVersion();
|
|
14
|
+
if (xcResultToolVersion) {
|
|
15
|
+
return await parseBundleWithXcResultTool(visitor, directory, xcResultToolVersion);
|
|
16
|
+
}
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
return false;
|
|
20
|
+
};
|
|
21
|
+
const maybeGetXcResultToolVersion = async () => {
|
|
22
|
+
try {
|
|
23
|
+
return await version();
|
|
24
|
+
}
|
|
25
|
+
catch (e) {
|
|
26
|
+
console.error(XCRESULTTOOL_MISSING_MESSAGE);
|
|
27
|
+
console.error(e);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
const parseBundleWithXcResultTool = async (visitor, xcResultPath, xcResultToolVersion) => {
|
|
31
|
+
try {
|
|
32
|
+
if (isXcode16OrNewer(xcResultToolVersion)) {
|
|
33
|
+
await parseWithXcode16OrNewer(visitor, xcResultPath, xcResultToolVersion);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
await parseWithXcode15OrOlder(visitor, xcResultPath);
|
|
37
|
+
}
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
console.error("error parsing", xcResultPath, e);
|
|
42
|
+
}
|
|
43
|
+
return false;
|
|
44
|
+
};
|
|
45
|
+
const parseWithXcode15OrOlder = async (visitor, xcResultPath) => {
|
|
46
|
+
const legacyApiParser = new LegacyApiParser({
|
|
47
|
+
xcResultPath,
|
|
48
|
+
xcode16Plus: false,
|
|
49
|
+
});
|
|
50
|
+
await tryApi(visitor, xcResultPath, legacyApiParser);
|
|
51
|
+
};
|
|
52
|
+
const parseWithXcode16OrNewer = async (visitor, xcResultPath, xcResultToolVersion) => {
|
|
53
|
+
await parseWithExportedAttachments(xcResultPath, async (createAttachmentFile) => {
|
|
54
|
+
const legacyApiParser = new LegacyApiParser({
|
|
55
|
+
xcResultPath,
|
|
56
|
+
createAttachmentFile,
|
|
57
|
+
xcode16Plus: true,
|
|
58
|
+
});
|
|
59
|
+
try {
|
|
60
|
+
await tryApi(visitor, xcResultPath, legacyApiParser);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
catch (e) {
|
|
64
|
+
console.error(e);
|
|
65
|
+
if (legacyApiParser.legacyApiSucceeded()) {
|
|
66
|
+
throw e;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
throw new Error(`The legacy xcresulttool API can't be accessed in ${xcResultToolVersion}. ` +
|
|
70
|
+
"The new API is not yet supported by the reader. " +
|
|
71
|
+
"Please, see https://github.com/allure-framework/allure3/issues/110 for more details");
|
|
72
|
+
});
|
|
73
|
+
};
|
|
74
|
+
const tryApi = async (visitor, originalFileName, apiParser) => {
|
|
75
|
+
for await (const x of apiParser.parse()) {
|
|
76
|
+
if ("readContent" in x) {
|
|
77
|
+
await visitor.visitAttachmentFile(x, { readerId });
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
visitor.visitTestResult(x, { readerId, metadata: { originalFileName } });
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
const isXcode16OrNewer = (versionText) => {
|
|
85
|
+
const versionMatch = versionText.match(/xcresulttool version (\d+)/);
|
|
86
|
+
if (versionMatch) {
|
|
87
|
+
const xcResultToolVersion = parseInt(versionMatch[1], 10);
|
|
88
|
+
return xcResultToolVersion >= 23000;
|
|
89
|
+
}
|
|
90
|
+
return false;
|
|
91
|
+
};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { RawTestLabel, RawTestLink, RawTestParameter } from "@allurereport/reader-api";
|
|
2
|
+
import type { XcTestResult } from "./xcresulttool/xcModel.js";
|
|
3
|
+
export type XcAttachments = Map<string, XcAttachmentMetadata[]>;
|
|
4
|
+
export type XcAttachmentMetadata = {
|
|
5
|
+
path: string;
|
|
6
|
+
name?: string;
|
|
7
|
+
timestamp?: number;
|
|
8
|
+
};
|
|
9
|
+
export type TestDetailsRunData = {
|
|
10
|
+
duration?: number;
|
|
11
|
+
result?: XcTestResult;
|
|
12
|
+
parameters?: (string | undefined)[];
|
|
13
|
+
emitted?: boolean;
|
|
14
|
+
};
|
|
15
|
+
export type TestRunCoordinates = {
|
|
16
|
+
device?: string;
|
|
17
|
+
testPlan?: string;
|
|
18
|
+
attempt?: number;
|
|
19
|
+
args?: TestRunArgs;
|
|
20
|
+
};
|
|
21
|
+
export type TestRunArgs = ({
|
|
22
|
+
parameter: string;
|
|
23
|
+
value: string;
|
|
24
|
+
} | undefined)[];
|
|
25
|
+
export type TestRunSelector = {
|
|
26
|
+
device?: string;
|
|
27
|
+
testPlan?: string;
|
|
28
|
+
attempt?: number;
|
|
29
|
+
args?: (string | undefined)[];
|
|
30
|
+
};
|
|
31
|
+
export type TestRunLookup<Data> = Map<string, Map<string, Map<string, Data[]>>>;
|
|
32
|
+
export type TargetDescriptor = {
|
|
33
|
+
model?: string;
|
|
34
|
+
architecture?: string;
|
|
35
|
+
platform?: string;
|
|
36
|
+
osVersion?: string;
|
|
37
|
+
};
|
|
38
|
+
export type AllureApiCallBase<Type extends string, Value> = {
|
|
39
|
+
type: Type;
|
|
40
|
+
value: Value;
|
|
41
|
+
};
|
|
42
|
+
export type AllureNameApiCall = AllureApiCallBase<"name", string>;
|
|
43
|
+
export type AllureDescriptionApiCall = AllureApiCallBase<"description", string>;
|
|
44
|
+
export type AllurePreconditionApiCall = AllureApiCallBase<"precondition", string>;
|
|
45
|
+
export type AllureExpectedResultApiCall = AllureApiCallBase<"expectedResult", string>;
|
|
46
|
+
export type AllureLabelApiCall = AllureApiCallBase<"label", RawTestLabel>;
|
|
47
|
+
export type AllureLinkApiCall = AllureApiCallBase<"link", RawTestLink>;
|
|
48
|
+
export type AllureParameterApiCall = AllureApiCallBase<"parameter", RawTestParameter>;
|
|
49
|
+
export type AllureFlakyApiCall = AllureApiCallBase<"flaky", boolean>;
|
|
50
|
+
export type AllureMutedApiCall = AllureApiCallBase<"muted", boolean>;
|
|
51
|
+
export type AllureKnownApiCall = AllureApiCallBase<"known", boolean>;
|
|
52
|
+
export type AllureApiCall = AllureNameApiCall | AllureDescriptionApiCall | AllurePreconditionApiCall | AllureExpectedResultApiCall | AllureLabelApiCall | AllureLinkApiCall | AllureParameterApiCall | AllureFlakyApiCall | AllureMutedApiCall | AllureKnownApiCall;
|
|
53
|
+
export type LabelsInputData = {
|
|
54
|
+
hostName: string | undefined;
|
|
55
|
+
projectName: string | undefined;
|
|
56
|
+
bundle: string | undefined;
|
|
57
|
+
suites: readonly string[];
|
|
58
|
+
className: string | undefined;
|
|
59
|
+
functionName: string | undefined;
|
|
60
|
+
tags: readonly string[];
|
|
61
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { RawStep, RawTestLabel, RawTestResult, RawTestStatus, RawTestStepResult, Unknown } from "@allurereport/reader-api";
|
|
2
|
+
import type { AllureApiCall, LabelsInputData, TargetDescriptor, TestRunArgs, TestRunCoordinates, TestRunLookup, TestRunSelector } from "./model.js";
|
|
3
|
+
export declare const MS_IN_S = 1000;
|
|
4
|
+
export declare const ALLURE_API_ACTIVITY_PREFIX = "allure.";
|
|
5
|
+
export declare const statusPriorities: Map<RawTestStatus, number>;
|
|
6
|
+
export declare const utiToMediaType: Record<string, string>;
|
|
7
|
+
export declare const getMediaTypeByUti: (uti: string | undefined) => string | undefined;
|
|
8
|
+
export declare const prependTitle: (title: string, text: string, spaces: number) => string;
|
|
9
|
+
export declare const getWorstStatusWithDetails: (failureSteps: readonly RawTestStepResult[]) => Pick<RawTestStepResult, "status" | "message" | "trace">;
|
|
10
|
+
export declare const countExpectedFailures: (failureSteps: readonly RawTestStepResult[]) => number;
|
|
11
|
+
export declare const resolveFailureMessage: (firstFailureMessage: string | undefined, failuresCount: number, expectedFailuresCount: number) => string | undefined;
|
|
12
|
+
export declare const getAggregatedFailureMessage: (message: string | undefined, failures: number, expected: number) => string;
|
|
13
|
+
export declare const DEFAULT_BUNDLE_NAME = "The test bundle name is not defined";
|
|
14
|
+
export declare const DEFAULT_SUITE_ID = "__unknown__";
|
|
15
|
+
export declare const DEFAULT_SUITE_NAME = "The test suite name is not defined";
|
|
16
|
+
export declare const DEFAULT_TEST_NAME = "The test name is not defined";
|
|
17
|
+
export declare const DEFAULT_STEP_NAME = "The test name is not defined";
|
|
18
|
+
export declare const DEFAULT_ATTACHMENT_NAME = "Attachment";
|
|
19
|
+
export declare const DEFAULT_EXPECTED_FAILURE_REASON = "Expected failure";
|
|
20
|
+
export declare const SURROGATE_DEVICE_ID: `${string}-${string}-${string}-${string}-${string}`;
|
|
21
|
+
export declare const SURROGATE_TEST_PLAN_ID: `${string}-${string}-${string}-${string}-${string}`;
|
|
22
|
+
export declare const SURROGATE_ARGS_ID: `${string}-${string}-${string}-${string}-${string}`;
|
|
23
|
+
export declare const getArgsKeyByValues: (values: readonly (string | undefined)[]) => string;
|
|
24
|
+
export declare const getArgsKey: (args: TestRunArgs) => string;
|
|
25
|
+
export declare const createTestRunLookup: <T>(entries: readonly (readonly [TestRunCoordinates, T])[]) => TestRunLookup<T>;
|
|
26
|
+
export declare const lookupTestAttempts: <T>(lookup: TestRunLookup<T>, { args, device, testPlan }: TestRunSelector) => T[] | undefined;
|
|
27
|
+
export declare const lookupTestAttempt: <Data>(lookup: TestRunLookup<Data>, selector: TestRunSelector) => Data | undefined;
|
|
28
|
+
export declare const lookupNextTestAttempt: <Data>(lookup: TestRunLookup<Data>, selector: TestRunSelector, pred: (data: Data) => boolean) => Data | undefined;
|
|
29
|
+
export declare const groupBy: <T, K>(values: readonly T[], keyFn: (v: T) => K) => Map<K, T[]>;
|
|
30
|
+
export declare const mappedGroupBy: <T, K, G>(values: readonly T[], keyFn: (v: T) => K, groupMapFn: (group: T[]) => G) => Map<K, G>;
|
|
31
|
+
export declare const getTargetDetails: ({ architecture, model, platform, osVersion }?: TargetDescriptor) => string | undefined;
|
|
32
|
+
export declare const compareChronologically: ({ start: startA, stop: stopA }: RawStep, { start: startB, stop: stopB }: RawStep) => number;
|
|
33
|
+
export declare const toSortedSteps: <T extends RawStep>(...stepArrays: readonly (readonly T[])[]) => T[];
|
|
34
|
+
export declare const secondsToMilliseconds: (seconds: Unknown<number>) => number | undefined;
|
|
35
|
+
export declare const parseAsAllureApiActivity: (title: string | undefined) => AllureApiCall | undefined;
|
|
36
|
+
export declare const splitApiCallAndValue: (text: string) => {
|
|
37
|
+
apiCall: string;
|
|
38
|
+
value: string;
|
|
39
|
+
};
|
|
40
|
+
export declare const applyApiCalls: (testResult: RawTestResult, apiCalls: readonly AllureApiCall[]) => void;
|
|
41
|
+
export declare const createTestLabels: ({ hostName, projectName, bundle, suites, className, functionName, tags, }: LabelsInputData) => RawTestLabel[];
|
|
42
|
+
export declare const getDefaultAttachmentName: (index: number, length: number) => string;
|