@zohodesk/testinglibrary 0.1.9-exp-actors → 0.1.12-experimental
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/.babelrc +4 -2
- package/.claude/settings.local.json +14 -0
- package/.gitlab-ci.yml +206 -0
- package/README.md +264 -1
- package/build/common/data-generator/steps/DataGenerator.spec.js +19 -0
- package/build/common/data-generator/steps/DataGeneratorStepsHelper.js +21 -0
- package/build/common/multi-actor/steps/multiActorHandling.spec.js +26 -0
- package/build/common/searchFake/helpers/rpcRequestHelper.js +52 -0
- package/build/common/searchFake/steps/searchFake.spec.js +85 -0
- package/build/core/dataGenerator/DataGenerator.js +161 -0
- package/build/core/dataGenerator/DataGeneratorError.js +60 -0
- package/build/core/dataGenerator/DataGeneratorHelper.js +121 -0
- package/build/core/dataGenerator/authenticator/Authenticator.js +37 -0
- package/build/core/dataGenerator/authenticator/CookieAuthenticator.js +48 -0
- package/build/core/dataGenerator/authenticator/JWTauthenticator.js +59 -0
- package/build/core/dataGenerator/authenticator/OAuthAuthenticator.js +26 -0
- package/build/core/dataGenerator/authenticator/OrgOAuthAuthenticator.js +26 -0
- package/build/core/dataGenerator/authenticator/cookieAuthConfig.js +11 -0
- package/build/core/jest/preprocessor/jsPreprocessor.js +2 -7
- package/build/core/jest/setup/index.js +1 -7
- package/build/core/playwright/builtInFixtures/actorContext.js +78 -0
- package/build/core/playwright/builtInFixtures/caseTimeout.js +20 -0
- package/build/core/playwright/builtInFixtures/context.js +34 -16
- package/build/core/playwright/builtInFixtures/executionContext.js +17 -0
- package/build/core/playwright/builtInFixtures/i18N.js +8 -0
- package/build/core/playwright/builtInFixtures/index.js +7 -1
- package/build/core/playwright/builtInFixtures/page.js +22 -84
- package/build/core/playwright/clear-caches.js +17 -5
- package/build/core/playwright/codegen.js +4 -21
- package/build/core/playwright/configuration/Configuration.js +25 -0
- package/build/core/playwright/configuration/ConfigurationHelper.js +45 -0
- package/build/core/playwright/configuration/UserArgs.js +12 -0
- package/build/core/playwright/constants/configConstants.js +17 -0
- package/build/core/playwright/constants/failureTagConstants.js +17 -0
- package/build/core/playwright/constants/fileMutexConfig.js +9 -0
- package/build/core/playwright/constants/reporterConstants.js +20 -0
- package/build/core/playwright/constants/retryConstants.js +8 -0
- package/build/core/playwright/custom-commands.js +1 -1
- package/build/core/playwright/env-initializer.js +26 -7
- package/build/core/playwright/fixtures.js +24 -0
- package/build/core/playwright/helpers/additionalProfiles.js +25 -0
- package/build/core/playwright/helpers/auth/accountLogin.js +4 -1
- package/build/core/playwright/helpers/auth/checkAuthCookies.js +20 -19
- package/build/core/playwright/helpers/auth/getUsers.js +57 -49
- package/build/core/playwright/helpers/auth/index.js +14 -1
- package/build/core/playwright/helpers/auth/loginDefaultStepsHelper.js +62 -0
- package/build/core/playwright/helpers/auth/loginSteps.js +40 -22
- package/build/core/playwright/helpers/browserTimeoutFactor.js +16 -0
- package/build/core/playwright/helpers/caseTimeoutResolver.js +37 -0
- package/build/core/playwright/helpers/checkAuthDirectory.js +27 -0
- package/build/core/playwright/helpers/configFileNameProvider.js +21 -7
- package/build/core/playwright/helpers/configPathResolver.js +38 -0
- package/build/core/playwright/helpers/contextFailureHandler.js +81 -0
- package/build/core/playwright/helpers/customFixturesHelper.js +58 -0
- package/build/core/playwright/helpers/failureTagClassifier.js +197 -0
- package/build/core/playwright/helpers/fileMutex.js +71 -0
- package/build/core/playwright/helpers/logCollector.js +147 -0
- package/build/core/playwright/helpers/parseUserArgs.js +2 -3
- package/build/core/playwright/helpers/runtimeLogAnnotator.js +140 -0
- package/build/core/playwright/helpers/runtimeLogPath.js +61 -0
- package/build/core/playwright/helpers/runtimeLogReader.js +54 -0
- package/build/core/playwright/helpers/thirdPartyLib.js +13 -0
- package/build/core/playwright/index.js +8 -88
- package/build/core/playwright/patterns/casePatterns.js +9 -0
- package/build/core/playwright/patterns/codePatterns.js +9 -0
- package/build/core/playwright/patterns/environmentPatterns.js +15 -0
- package/build/core/playwright/patterns/index.js +33 -0
- package/build/core/playwright/patterns/logCollectorIgnorePatterns.js +15 -0
- package/build/core/playwright/patterns/toolPatterns.js +26 -0
- package/build/core/playwright/readConfigFile.js +49 -16
- package/build/core/playwright/reporter/PlaywrightReporter.js +58 -0
- package/build/core/playwright/reporter/Reporter.js +65 -0
- package/build/core/playwright/reporter/ShardReporter.js +58 -0
- package/build/core/playwright/reporter/UnitReporter.js +27 -0
- package/build/core/playwright/reporter/helpers/mergeAbortedTests.js +78 -0
- package/build/core/playwright/runner/Runner.js +22 -0
- package/build/core/playwright/runner/RunnerHelper.js +43 -0
- package/build/core/playwright/runner/RunnerTypes.js +17 -0
- package/build/core/playwright/runner/SpawnRunner.js +93 -0
- package/build/core/playwright/setup/Project.js +35 -0
- package/build/core/playwright/setup/ProjectConfiguration.js +66 -0
- package/build/core/playwright/setup/config-creator.js +58 -40
- package/build/core/playwright/setup/config-utils.js +68 -37
- package/build/core/playwright/setup/custom-reporter.js +137 -14
- package/build/core/playwright/setup/merge-config.js +32 -0
- package/build/core/playwright/setup/qc-custom-reporter.js +342 -0
- package/build/core/playwright/spawnInheritChild.js +71 -0
- package/build/core/playwright/tagProcessor.js +69 -0
- package/build/core/playwright/test-runner.js +44 -97
- package/build/core/playwright/types.js +4 -1
- package/build/core/playwright/validateFeature.js +28 -0
- package/build/decorators.d.ts +1 -1
- package/build/decorators.js +1 -1
- package/build/index.d.ts +2 -22
- package/build/index.js +12 -2
- package/build/lib/cli.js +42 -7
- package/build/setup-folder-structure/helper.js +2 -0
- package/build/setup-folder-structure/samples/accountLogin-sample.js +19 -0
- package/build/setup-folder-structure/samples/actors-index.js +2 -0
- package/build/setup-folder-structure/samples/auth-setup-sample.js +10 -66
- package/build/setup-folder-structure/samples/editions-index.js +3 -0
- package/build/setup-folder-structure/samples/free-sample.json +25 -0
- package/build/setup-folder-structure/samples/settings.json +7 -0
- package/build/setup-folder-structure/samples/testSetup-sample.js +14 -0
- package/build/setup-folder-structure/samples/uat-config-sample.js +7 -2
- package/build/setup-folder-structure/setupProject.js +23 -5
- package/build/test/core/dataGenerator/__tests__/DataGenerator.test.js +311 -0
- package/build/test/core/dataGenerator/__tests__/DataGeneratorHelper.test.js +204 -0
- package/build/test/core/dataGenerator/__tests__/DataGeneratorResolution.test.js +126 -0
- package/build/test/core/dataGenerator/authenticator/__tests__/Authenticator.test.js +88 -0
- package/build/test/core/dataGenerator/authenticator/__tests__/JWTauthenticator.test.js +136 -0
- package/build/test/core/dataGenerator/authenticator/__tests__/OAuthAuthenticator.test.js +39 -0
- package/build/test/core/dataGenerator/authenticator/__tests__/OrgOAuthAuthenticator.test.js +39 -0
- package/build/test/core/playwright/__tests__/spawnInheritChild.test.js +148 -0
- package/build/test/core/playwright/__tests__/tagProcessor.test.js +94 -0
- package/build/test/core/playwright/__tests__/validateFeature.test.js +72 -0
- package/build/test/core/playwright/buildInFixtures/__tests__/caseTimeout.test.js +96 -0
- package/build/test/core/playwright/buildInFixtures/__tests__/executionContext.test.js +27 -0
- package/build/test/core/playwright/configuration/__tests__/Configuration.test.js +53 -0
- package/build/test/core/playwright/helpers/__tests__/additionalProfiles.test.js +45 -0
- package/build/test/core/playwright/helpers/__tests__/configFileNameProvider.test.js +75 -0
- package/build/test/core/playwright/helpers/__tests__/configPathResolver.test.js +55 -0
- package/build/test/core/playwright/helpers/__tests__/customFixturesHelper.test.js +51 -0
- package/build/test/core/playwright/helpers/__tests__/failureTagClassifier.test.js +604 -0
- package/build/test/core/playwright/helpers/__tests__/fileMutex.test.js +79 -0
- package/build/test/core/playwright/helpers/__tests__/getUsers_ListOfActors.test.js +83 -0
- package/build/test/core/playwright/helpers/__tests__/logCollector.test.js +163 -0
- package/build/test/core/playwright/helpers/__tests__/runtimeLogReader.test.js +112 -0
- package/build/test/core/playwright/helpers/auth/__tests__/checkAuthCookies.test.js +92 -0
- package/build/test/core/playwright/runner/__tests__/RunnerHelper.test.js +19 -0
- package/build/test/core/playwright/runner/__tests__/SpawnRunner.test.js +30 -0
- package/build/utils/cliArgsToObject.js +3 -0
- package/build/utils/commonUtils.js +20 -0
- package/build/utils/fileUtils.js +43 -1
- package/build/utils/logger.js +1 -30
- package/changelog.md +23 -0
- package/docs/CODE-REVIEW-AGENT.md +399 -0
- package/docs/code-review-instructions.md +157 -0
- package/jest.config.js +29 -11
- package/npm-shrinkwrap.json +14994 -4793
- package/package.json +39 -28
- package/playwright.config.js +13 -57
- package/unit_reports/unit-report.html +277 -0
- package/build/bdd-framework/cli/commands/env.js +0 -42
- package/build/bdd-framework/cli/commands/export.js +0 -47
- package/build/bdd-framework/cli/commands/test.js +0 -64
- package/build/bdd-framework/cli/index.js +0 -11
- package/build/bdd-framework/cli/options.js +0 -19
- package/build/bdd-framework/cli/worker.js +0 -13
- package/build/bdd-framework/config/configDir.js +0 -35
- package/build/bdd-framework/config/enrichReporterData.js +0 -23
- package/build/bdd-framework/config/env.js +0 -50
- package/build/bdd-framework/config/index.js +0 -94
- package/build/bdd-framework/config/lang.js +0 -14
- package/build/bdd-framework/cucumber/buildStepDefinition.js +0 -43
- package/build/bdd-framework/cucumber/createTestStep.js +0 -43
- package/build/bdd-framework/cucumber/formatter/EventDataCollector.js +0 -126
- package/build/bdd-framework/cucumber/formatter/GherkinDocumentParser.js +0 -72
- package/build/bdd-framework/cucumber/formatter/PickleParser.js +0 -25
- package/build/bdd-framework/cucumber/formatter/durationHelpers.js +0 -13
- package/build/bdd-framework/cucumber/formatter/getColorFns.js +0 -57
- package/build/bdd-framework/cucumber/formatter/index.js +0 -16
- package/build/bdd-framework/cucumber/formatter/locationHelpers.js +0 -16
- package/build/bdd-framework/cucumber/loadConfig.js +0 -17
- package/build/bdd-framework/cucumber/loadFeatures.js +0 -70
- package/build/bdd-framework/cucumber/loadSnippetBuilder.js +0 -20
- package/build/bdd-framework/cucumber/loadSteps.js +0 -47
- package/build/bdd-framework/cucumber/resolveFeaturePaths.js +0 -62
- package/build/bdd-framework/cucumber/stepArguments.js +0 -21
- package/build/bdd-framework/cucumber/types.js +0 -5
- package/build/bdd-framework/cucumber/valueChecker.js +0 -23
- package/build/bdd-framework/decorators.js +0 -18
- package/build/bdd-framework/gen/fixtures.js +0 -48
- package/build/bdd-framework/gen/formatter.js +0 -123
- package/build/bdd-framework/gen/i18n.js +0 -39
- package/build/bdd-framework/gen/index.js +0 -185
- package/build/bdd-framework/gen/testFile.js +0 -465
- package/build/bdd-framework/gen/testMeta.js +0 -60
- package/build/bdd-framework/gen/testNode.js +0 -60
- package/build/bdd-framework/gen/testPoms.js +0 -133
- package/build/bdd-framework/hooks/scenario.js +0 -130
- package/build/bdd-framework/hooks/worker.js +0 -89
- package/build/bdd-framework/index.js +0 -52
- package/build/bdd-framework/playwright/fixtureParameterNames.js +0 -93
- package/build/bdd-framework/playwright/getLocationInFile.js +0 -79
- package/build/bdd-framework/playwright/loadConfig.js +0 -42
- package/build/bdd-framework/playwright/loadUtils.js +0 -33
- package/build/bdd-framework/playwright/testTypeImpl.js +0 -61
- package/build/bdd-framework/playwright/transform.js +0 -88
- package/build/bdd-framework/playwright/types.js +0 -5
- package/build/bdd-framework/playwright/utils.js +0 -34
- package/build/bdd-framework/reporter/cucumber/base.js +0 -57
- package/build/bdd-framework/reporter/cucumber/custom.js +0 -73
- package/build/bdd-framework/reporter/cucumber/helper.js +0 -12
- package/build/bdd-framework/reporter/cucumber/html.js +0 -35
- package/build/bdd-framework/reporter/cucumber/index.js +0 -74
- package/build/bdd-framework/reporter/cucumber/json.js +0 -312
- package/build/bdd-framework/reporter/cucumber/junit.js +0 -205
- package/build/bdd-framework/reporter/cucumber/message.js +0 -20
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/AttachmentMapper.js +0 -64
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/Builder.js +0 -196
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/GherkinDocument.js +0 -43
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/GherkinDocumentClone.js +0 -52
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/GherkinDocuments.js +0 -105
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/Hook.js +0 -70
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/Meta.js +0 -45
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/Pickles.js +0 -27
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/Projects.js +0 -38
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/TestCase.js +0 -128
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/TestCaseRun.js +0 -126
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/TestCaseRunHooks.js +0 -102
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/TestStepAttachments.js +0 -50
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/TestStepRun.js +0 -88
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/index.js +0 -30
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/pwUtils.js +0 -51
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/timing.js +0 -35
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/types.js +0 -5
- package/build/bdd-framework/run/StepInvoker.js +0 -68
- package/build/bdd-framework/run/bddDataAttachment.js +0 -46
- package/build/bdd-framework/run/bddFixtures.js +0 -191
- package/build/bdd-framework/run/bddWorld.js +0 -79
- package/build/bdd-framework/run/bddWorldInternal.js +0 -15
- package/build/bdd-framework/snippets/index.js +0 -132
- package/build/bdd-framework/snippets/snippetSyntax.js +0 -43
- package/build/bdd-framework/snippets/snippetSyntaxDecorators.js +0 -26
- package/build/bdd-framework/snippets/snippetSyntaxTs.js +0 -18
- package/build/bdd-framework/stepDefinitions/createBdd.js +0 -66
- package/build/bdd-framework/stepDefinitions/decorators/class.js +0 -68
- package/build/bdd-framework/stepDefinitions/decorators/steps.js +0 -99
- package/build/bdd-framework/stepDefinitions/defineStep.js +0 -62
- package/build/bdd-framework/stepDefinitions/stepConfig.js +0 -24
- package/build/bdd-framework/utils/AutofillMap.js +0 -20
- package/build/bdd-framework/utils/exit.js +0 -62
- package/build/bdd-framework/utils/index.js +0 -93
- package/build/bdd-framework/utils/jsStringWrap.js +0 -44
- package/build/bdd-framework/utils/logger.js +0 -30
- package/build/bdd-framework/utils/stripAnsiEscapes.js +0 -20
- package/build/core/playwright/report-generator.js +0 -42
- package/build/core/playwright/tag-processor.js +0 -68
- package/build/setup-folder-structure/samples/authUsers-sample.json +0 -9
- package/build/setup-folder-structure/samples/env-config-sample.json +0 -21
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.handleContextFailureSegregation = handleContextFailureSegregation;
|
|
7
|
+
exports.performDefaultContextSteps = performDefaultContextSteps;
|
|
8
|
+
var _failureTagClassifier = require("./failureTagClassifier");
|
|
9
|
+
var _runtimeLogPath = require("./runtimeLogPath");
|
|
10
|
+
var _logger = require("../../../utils/logger");
|
|
11
|
+
async function performDefaultContextSteps({
|
|
12
|
+
context,
|
|
13
|
+
testSetup
|
|
14
|
+
}) {
|
|
15
|
+
if (testSetup.context && typeof testSetup.context === 'function') {
|
|
16
|
+
await testSetup.context({
|
|
17
|
+
context
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Fixture teardown has no Playwright result.stdout/stderr; use the thrown
|
|
23
|
+
// error text so TOOL/CASE stdio patterns (e.g. data-generator failures) match.
|
|
24
|
+
function buildStdioTextFromTestInfo(testInfo) {
|
|
25
|
+
// A stack already starts with the message, so emitting both would halve the
|
|
26
|
+
// truncation budget the recorded match evidence gets.
|
|
27
|
+
return (testInfo.errors || []).map(err => (err === null || err === void 0 ? void 0 : err.stack) || (err === null || err === void 0 ? void 0 : err.message) || (err === null || err === void 0 ? void 0 : err.value) || '').filter(Boolean).join('\n');
|
|
28
|
+
}
|
|
29
|
+
function splitTagList(description = '') {
|
|
30
|
+
return description.split(',').map(tag => tag.trim()).filter(Boolean);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Prepends TOOL_failure (etc.) into the "tags" annotation so Playwright HTML
|
|
34
|
+
// shows: tags: TOOL_failure, @edition_enterprise, @profile_admin
|
|
35
|
+
function prependFailureTagsToAnnotations(testInfo, failureTags) {
|
|
36
|
+
const annotations = testInfo.annotations ?? (testInfo.annotations = []);
|
|
37
|
+
const tagsAnnotation = annotations.find(annotation => annotation.type === 'tags');
|
|
38
|
+
const description = (0, _failureTagClassifier.mergeFailureTags)(splitTagList(tagsAnnotation === null || tagsAnnotation === void 0 ? void 0 : tagsAnnotation.description), failureTags).join(', ');
|
|
39
|
+
if (tagsAnnotation) {
|
|
40
|
+
tagsAnnotation.description = description;
|
|
41
|
+
} else {
|
|
42
|
+
annotations.push({
|
|
43
|
+
type: 'tags',
|
|
44
|
+
description
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Failure-only: write runtime logs and attach failure-tag metadata.
|
|
50
|
+
async function handleContextFailureSegregation({
|
|
51
|
+
collector,
|
|
52
|
+
testInfo,
|
|
53
|
+
logsDir
|
|
54
|
+
}) {
|
|
55
|
+
const isFailure = testInfo.status && testInfo.status !== testInfo.expectedStatus;
|
|
56
|
+
if (!isFailure) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
try {
|
|
60
|
+
const base = (0, _runtimeLogPath.resolveRuntimeLogBaseName)({
|
|
61
|
+
workerIndex: testInfo.workerIndex,
|
|
62
|
+
retry: testInfo.retry,
|
|
63
|
+
title: testInfo.title,
|
|
64
|
+
titlePath: testInfo.titlePath
|
|
65
|
+
});
|
|
66
|
+
collector.flushToFile(logsDir, base);
|
|
67
|
+
const metadata = (0, _failureTagClassifier.classifyFailureDetailsFromEvents)(collector.events, buildStdioTextFromTestInfo(testInfo));
|
|
68
|
+
prependFailureTagsToAnnotations(testInfo, metadata.tags);
|
|
69
|
+
|
|
70
|
+
// classifyFailureDetailsFromEvents always yields at least CODE, so attachment is non-null.
|
|
71
|
+
const attachment = (0, _failureTagClassifier.buildFailureTagMetadataAttachment)(metadata);
|
|
72
|
+
await testInfo.attach(attachment.name, {
|
|
73
|
+
contentType: attachment.contentType,
|
|
74
|
+
body: attachment.body
|
|
75
|
+
});
|
|
76
|
+
} catch (err) {
|
|
77
|
+
// Runs from the fixture's finally after a failure; a throw here would
|
|
78
|
+
// replace the real test error with a bookkeeping error.
|
|
79
|
+
_logger.Logger.error(err);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.extractTagInfo = extractTagInfo;
|
|
7
|
+
exports.getCustomAccountDetails = getCustomAccountDetails;
|
|
8
|
+
var _auth = require("../helpers/auth");
|
|
9
|
+
var _logger = require("../../../utils/logger");
|
|
10
|
+
/* eslint-disable global-require */
|
|
11
|
+
|
|
12
|
+
function getTagInputFromSelectedTags(tags, inputString) {
|
|
13
|
+
const selectedTag = [...tags].reverse().find(tag => tag.startsWith(inputString));
|
|
14
|
+
let tagInput = null;
|
|
15
|
+
if (selectedTag) {
|
|
16
|
+
tagInput = selectedTag.split(`${inputString}_`).pop().toLowerCase();
|
|
17
|
+
}
|
|
18
|
+
return tagInput;
|
|
19
|
+
}
|
|
20
|
+
function extractTagInfo(tags) {
|
|
21
|
+
const tagsTobeFiltered = ['@profile', '@edition', '@beta', '@portal'];
|
|
22
|
+
const filteredTags = tags.filter(tag => tagsTobeFiltered.some(prefix => tag.startsWith(prefix)));
|
|
23
|
+
if (!filteredTags.length) {
|
|
24
|
+
return {
|
|
25
|
+
portalInfo: null,
|
|
26
|
+
betaFeature: null,
|
|
27
|
+
profileInfo: null,
|
|
28
|
+
editionInfo: null
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
const portalInfo = getTagInputFromSelectedTags(filteredTags, '@portal');
|
|
32
|
+
const betaFeature = getTagInputFromSelectedTags(filteredTags, '@beta');
|
|
33
|
+
const profileInfo = getTagInputFromSelectedTags(filteredTags, '@profile');
|
|
34
|
+
const editionInfo = getTagInputFromSelectedTags(filteredTags, '@edition');
|
|
35
|
+
return {
|
|
36
|
+
portalInfo,
|
|
37
|
+
betaFeature,
|
|
38
|
+
profileInfo,
|
|
39
|
+
editionInfo
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function getCustomAccountDetails(tags) {
|
|
43
|
+
try {
|
|
44
|
+
const {
|
|
45
|
+
portalInfo,
|
|
46
|
+
betaFeature,
|
|
47
|
+
profileInfo,
|
|
48
|
+
editionInfo
|
|
49
|
+
} = extractTagInfo(tags);
|
|
50
|
+
if (portalInfo || betaFeature || profileInfo || editionInfo) {
|
|
51
|
+
const user = (0, _auth.getUserForSelectedEditionAndProfile)(editionInfo, profileInfo, betaFeature, portalInfo);
|
|
52
|
+
return user;
|
|
53
|
+
}
|
|
54
|
+
return (0, _auth.getDefaultActor)();
|
|
55
|
+
} catch (err) {
|
|
56
|
+
_logger.Logger.log(_logger.Logger.FAILURE_TYPE, 'Error while getting accounts details:', err);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.buildFailureTagMetadataAttachment = buildFailureTagMetadataAttachment;
|
|
8
|
+
exports.classifyFailureDetails = classifyFailureDetails;
|
|
9
|
+
exports.classifyFailureDetailsFromEvents = classifyFailureDetailsFromEvents;
|
|
10
|
+
exports.classifyFailureDetailsFromResult = classifyFailureDetailsFromResult;
|
|
11
|
+
exports.classifyFailureTags = classifyFailureTags;
|
|
12
|
+
exports.isFailingResultStatus = isFailingResultStatus;
|
|
13
|
+
exports.mergeFailureTags = mergeFailureTags;
|
|
14
|
+
exports.upsertFailureTagMetadataAttachment = upsertFailureTagMetadataAttachment;
|
|
15
|
+
var _path = _interopRequireDefault(require("path"));
|
|
16
|
+
var _failureTagConstants = require("../constants/failureTagConstants");
|
|
17
|
+
var _patterns = require("../patterns");
|
|
18
|
+
var _readConfigFile = require("../readConfigFile");
|
|
19
|
+
var _runtimeLogReader = require("./runtimeLogReader");
|
|
20
|
+
var _runtimeLogAnnotator = require("./runtimeLogAnnotator");
|
|
21
|
+
// A failing test resolves to a SINGLE category tag by strict priority:
|
|
22
|
+
// TOOL > CASE > CODE > ENVIRONMENT. If several categories match, only the
|
|
23
|
+
// highest-priority one is emitted (e.g. CODE + ENVIRONMENT -> CODE only).
|
|
24
|
+
// Metadata `matches` keeps only that winning category's unique hits (deduped by
|
|
25
|
+
// tag + pattern + text). CODE/ENVIRONMENT patterns are matched against the
|
|
26
|
+
// runtime log; TOOL/CASE against stdout/stderr. If a failure matches no
|
|
27
|
+
// category at all it defaults to CODE. Retry-passed (flaky) outcomes are not tagged.
|
|
28
|
+
|
|
29
|
+
const UNEXPECTED_OUTCOME = 'unexpected';
|
|
30
|
+
function isFailingResultStatus(status) {
|
|
31
|
+
return !['passed', 'skipped'].includes(status);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Single-tag priority: the highest-ranked matched category wins.
|
|
35
|
+
const CATEGORY_PRIORITY = [_failureTagConstants.FAILURE_TAGS.TOOL, _failureTagConstants.FAILURE_TAGS.CASE, _failureTagConstants.FAILURE_TAGS.CODE, _failureTagConstants.FAILURE_TAGS.ENVIRONMENT];
|
|
36
|
+
const STDIO_RULES = [{
|
|
37
|
+
tag: _failureTagConstants.FAILURE_TAGS.TOOL,
|
|
38
|
+
patterns: _patterns.TOOL_PATTERNS
|
|
39
|
+
}, {
|
|
40
|
+
tag: _failureTagConstants.FAILURE_TAGS.CASE,
|
|
41
|
+
patterns: _patterns.CASE_PATTERNS
|
|
42
|
+
}];
|
|
43
|
+
function resolveLogsDir() {
|
|
44
|
+
const {
|
|
45
|
+
reportPath
|
|
46
|
+
} = (0, _readConfigFile.generateConfigFromFile)();
|
|
47
|
+
return _path.default.join(reportPath, 'runtime-logs');
|
|
48
|
+
}
|
|
49
|
+
function stdioToText(entries = []) {
|
|
50
|
+
return entries.map(entry => {
|
|
51
|
+
if (typeof entry === 'string') {
|
|
52
|
+
return entry;
|
|
53
|
+
}
|
|
54
|
+
if (!entry || typeof entry !== 'object') {
|
|
55
|
+
return '';
|
|
56
|
+
}
|
|
57
|
+
if (entry.text) {
|
|
58
|
+
return entry.text;
|
|
59
|
+
}
|
|
60
|
+
if (entry.buffer) {
|
|
61
|
+
try {
|
|
62
|
+
return Buffer.from(entry.buffer, 'base64').toString('utf8');
|
|
63
|
+
} catch {
|
|
64
|
+
return '';
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return '';
|
|
68
|
+
}).join('\n');
|
|
69
|
+
}
|
|
70
|
+
function buildStdioText(result = {}) {
|
|
71
|
+
return `${stdioToText(result.stdout)}\n${stdioToText(result.stderr)}`;
|
|
72
|
+
}
|
|
73
|
+
function findStdioMatch(stdio, patterns, tag) {
|
|
74
|
+
for (const pattern of patterns) {
|
|
75
|
+
if ((0, _runtimeLogAnnotator.testPattern)(pattern, stdio)) {
|
|
76
|
+
return {
|
|
77
|
+
tag,
|
|
78
|
+
pattern: (0, _runtimeLogAnnotator.patternLabel)(pattern),
|
|
79
|
+
source: 'stdio',
|
|
80
|
+
text: (0, _runtimeLogAnnotator.truncateText)(stdio)
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
function collectStdioMatches(stdio) {
|
|
87
|
+
const matches = [];
|
|
88
|
+
for (const rule of STDIO_RULES) {
|
|
89
|
+
const match = findStdioMatch(stdio, rule.patterns, rule.tag);
|
|
90
|
+
if (match) {
|
|
91
|
+
matches.push(match);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return matches;
|
|
95
|
+
}
|
|
96
|
+
function matchKey(match) {
|
|
97
|
+
return `${match.tag}\0${match.pattern}\0${match.text}`;
|
|
98
|
+
}
|
|
99
|
+
function uniqueMatchesByEvidence(matches = []) {
|
|
100
|
+
const uniqueMatches = [];
|
|
101
|
+
const seen = new Set();
|
|
102
|
+
for (const match of matches) {
|
|
103
|
+
const key = matchKey(match);
|
|
104
|
+
if (seen.has(key)) {
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
seen.add(key);
|
|
108
|
+
uniqueMatches.push(match);
|
|
109
|
+
}
|
|
110
|
+
return uniqueMatches;
|
|
111
|
+
}
|
|
112
|
+
function collectMatchesFromResult(result, testTitle) {
|
|
113
|
+
const events = (0, _runtimeLogAnnotator.normalizeRuntimeLogEvents)((0, _runtimeLogReader.readRuntimeLogEventsForResult)(result, testTitle, resolveLogsDir()));
|
|
114
|
+
return [...(0, _runtimeLogAnnotator.collectRuntimeLogMatches)(events), ...collectStdioMatches(buildStdioText(result))];
|
|
115
|
+
}
|
|
116
|
+
function buildFailureTagMetadata(matches = []) {
|
|
117
|
+
// Collapse the matched categories to the single highest-priority winner.
|
|
118
|
+
// When a failure matched no category, fall back to CODE.
|
|
119
|
+
const winningCategory = CATEGORY_PRIORITY.find(tag => matches.some(match => match.tag === tag)) || _failureTagConstants.FAILURE_TAGS.CODE;
|
|
120
|
+
|
|
121
|
+
// Only the winning category's evidence is surfaced; drop lower-priority
|
|
122
|
+
// categories (e.g. ENVIRONMENT when CODE wins) and identical duplicates.
|
|
123
|
+
const winningMatches = uniqueMatchesByEvidence(matches.filter(match => match.tag === winningCategory));
|
|
124
|
+
return {
|
|
125
|
+
tags: [winningCategory],
|
|
126
|
+
matches: winningMatches
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// events = browser runtime log; stdioText = stdout/stderr or test error text
|
|
131
|
+
// (TOOL/CASE patterns only match against stdioText).
|
|
132
|
+
function classifyFailureDetailsFromEvents(events = [], stdioText = '') {
|
|
133
|
+
return buildFailureTagMetadata([...(0, _runtimeLogAnnotator.collectRuntimeLogMatches)((0, _runtimeLogAnnotator.normalizeRuntimeLogEvents)(events)), ...collectStdioMatches(stdioText)]);
|
|
134
|
+
}
|
|
135
|
+
function classifyFailureDetailsFromResult(result, testTitle) {
|
|
136
|
+
return buildFailureTagMetadata(collectMatchesFromResult(result, testTitle));
|
|
137
|
+
}
|
|
138
|
+
function classifyFailureDetails(testDetails = [], testTitle = 'test') {
|
|
139
|
+
const unexpectedDetails = testDetails.filter(detail => detail.status === UNEXPECTED_OUTCOME);
|
|
140
|
+
if (unexpectedDetails.length === 0) {
|
|
141
|
+
return {
|
|
142
|
+
tags: [],
|
|
143
|
+
matches: []
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
const matches = [];
|
|
147
|
+
for (const detail of unexpectedDetails) {
|
|
148
|
+
const failingResult = pickFailingResult(detail.results);
|
|
149
|
+
if (!failingResult) {
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
matches.push(...collectMatchesFromResult(failingResult, testTitle));
|
|
153
|
+
}
|
|
154
|
+
return buildFailureTagMetadata(matches);
|
|
155
|
+
}
|
|
156
|
+
function classifyFailureTags(testDetails = [], testTitle = 'test') {
|
|
157
|
+
return classifyFailureDetails(testDetails, testTitle).tags;
|
|
158
|
+
}
|
|
159
|
+
function pickFailingResult(results = []) {
|
|
160
|
+
const failing = results.filter(result => isFailingResultStatus(result.status));
|
|
161
|
+
if (failing.length === 0) {
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
return failing[failing.length - 1];
|
|
165
|
+
}
|
|
166
|
+
function formatFailureTag(tag) {
|
|
167
|
+
return `${tag}${_failureTagConstants.FAILURE_TAG_SUFFIX}`;
|
|
168
|
+
}
|
|
169
|
+
function mergeFailureTags(existingTags = [], failureTags = []) {
|
|
170
|
+
const formatted = failureTags.map(formatFailureTag);
|
|
171
|
+
const merged = [...formatted];
|
|
172
|
+
for (const tag of existingTags) {
|
|
173
|
+
if (!merged.includes(tag)) {
|
|
174
|
+
merged.push(tag);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return merged;
|
|
178
|
+
}
|
|
179
|
+
function buildFailureTagMetadataAttachment(details) {
|
|
180
|
+
var _details$tags;
|
|
181
|
+
if (!(details !== null && details !== void 0 && (_details$tags = details.tags) !== null && _details$tags !== void 0 && _details$tags.length)) {
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
return {
|
|
185
|
+
name: _failureTagConstants.FAILURE_TAG_METADATA_ATTACHMENT,
|
|
186
|
+
contentType: 'application/json',
|
|
187
|
+
body: Buffer.from(JSON.stringify(details, null, 2))
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
function upsertFailureTagMetadataAttachment(attachments = [], details) {
|
|
191
|
+
const metadataAttachment = buildFailureTagMetadataAttachment(details);
|
|
192
|
+
if (!metadataAttachment) {
|
|
193
|
+
return attachments;
|
|
194
|
+
}
|
|
195
|
+
const withoutMetadata = attachments.filter(item => item.name !== _failureTagConstants.FAILURE_TAG_METADATA_ATTACHMENT);
|
|
196
|
+
return [...withoutMetadata, metadataAttachment];
|
|
197
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = void 0;
|
|
8
|
+
var _path = _interopRequireDefault(require("path"));
|
|
9
|
+
var _fs = require("fs");
|
|
10
|
+
function _classPrivateMethodInitSpec(e, a) { _checkPrivateRedeclaration(e, a), a.add(e); }
|
|
11
|
+
function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); }
|
|
12
|
+
function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); }
|
|
13
|
+
var _FileMutex_brand = /*#__PURE__*/new WeakSet();
|
|
14
|
+
class FileMutex {
|
|
15
|
+
constructor(directory, lockFileName, fileDeletionTimeoutConfig) {
|
|
16
|
+
_classPrivateMethodInitSpec(this, _FileMutex_brand);
|
|
17
|
+
this.directory = directory;
|
|
18
|
+
this.lockFileName = lockFileName + ".lock";
|
|
19
|
+
this.fileDeletionTimeout = fileDeletionTimeoutConfig.timeout;
|
|
20
|
+
this.lockFilePath = _assertClassBrand(_FileMutex_brand, this, _getLockFilePath).call(this);
|
|
21
|
+
_assertClassBrand(_FileMutex_brand, this, _createDirectoryIfNotExist).call(this);
|
|
22
|
+
}
|
|
23
|
+
async acquire() {
|
|
24
|
+
return new Promise((resolve, reject) => {
|
|
25
|
+
if (!(0, _fs.existsSync)(this.lockFilePath)) {
|
|
26
|
+
(0, _fs.writeFileSync)(this.lockFilePath, 'locked');
|
|
27
|
+
console.log(`Lock file created: ${this.lockFilePath}, worker index - ${process.env.TEST_WORKER_INDEX}`);
|
|
28
|
+
return resolve();
|
|
29
|
+
}
|
|
30
|
+
const timeout = setTimeout(() => {
|
|
31
|
+
watcher.close();
|
|
32
|
+
reject(new Error('Watch timeout exceeded'));
|
|
33
|
+
}, this.fileDeletionTimeout);
|
|
34
|
+
const watcher = (0, _fs.watch)(this.directory, (eventType, filename) => {
|
|
35
|
+
try {
|
|
36
|
+
if (eventType === 'rename' && filename === this.lockFileName) {
|
|
37
|
+
clearTimeout(timeout);
|
|
38
|
+
console.log(`Lock file deleted! Proceeding, worker index - ${process.env.TEST_WORKER_INDEX}`);
|
|
39
|
+
watcher.close();
|
|
40
|
+
resolve();
|
|
41
|
+
}
|
|
42
|
+
} catch (err) {
|
|
43
|
+
console.error(`Error watching for lock file deletion: ${err.message}`);
|
|
44
|
+
watcher.close();
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
async release() {
|
|
50
|
+
try {
|
|
51
|
+
if ((0, _fs.existsSync)(this.lockFilePath)) {
|
|
52
|
+
(0, _fs.unlinkSync)(this.lockFilePath);
|
|
53
|
+
console.log(`Lock file deleted: ${this.lockFilePath}, worker index - ${process.env.TEST_WORKER_INDEX}`);
|
|
54
|
+
}
|
|
55
|
+
} catch (err) {
|
|
56
|
+
console.error(`Error deleting lock file: ${err.message}, worker index - ${process.env.TEST_WORKER_INDEX}`);
|
|
57
|
+
throw err;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function _getLockFilePath() {
|
|
62
|
+
return _path.default.resolve(_path.default.join(this.directory, this.lockFileName));
|
|
63
|
+
}
|
|
64
|
+
async function _createDirectoryIfNotExist() {
|
|
65
|
+
if (!(0, _fs.existsSync)(this.directory)) {
|
|
66
|
+
(0, _fs.mkdirSync)(this.directory, {
|
|
67
|
+
recursive: true
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
var _default = exports.default = FileMutex;
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.LogCollector = void 0;
|
|
8
|
+
var _path = _interopRequireDefault(require("path"));
|
|
9
|
+
var _fileUtils = require("../../../utils/fileUtils");
|
|
10
|
+
var _logCollectorIgnorePatterns = require("../patterns/logCollectorIgnorePatterns");
|
|
11
|
+
var _runtimeLogAnnotator = require("./runtimeLogAnnotator");
|
|
12
|
+
// Per-context Playwright runtime event collector — network failures,
|
|
13
|
+
// console errors, page errors and crashes. Buffered in-memory and flushed
|
|
14
|
+
// to the project runtime-logs folder per test.
|
|
15
|
+
|
|
16
|
+
const DEFAULT_CONFIG = {
|
|
17
|
+
maxEvents: 2000,
|
|
18
|
+
ignoreMessagePatterns: _logCollectorIgnorePatterns.IGNORE_MESSAGE_PATTERNS,
|
|
19
|
+
ignoreUrlPatterns: _logCollectorIgnorePatterns.IGNORE_URL_PATTERNS
|
|
20
|
+
};
|
|
21
|
+
class LogCollector {
|
|
22
|
+
constructor(config = {}) {
|
|
23
|
+
this.config = {
|
|
24
|
+
...DEFAULT_CONFIG,
|
|
25
|
+
...config
|
|
26
|
+
};
|
|
27
|
+
this.events = [];
|
|
28
|
+
this._bound = [];
|
|
29
|
+
}
|
|
30
|
+
_push(evt) {
|
|
31
|
+
if (this.events.length >= this.config.maxEvents) {
|
|
32
|
+
this.events.shift();
|
|
33
|
+
}
|
|
34
|
+
this.events.push({
|
|
35
|
+
ts: Date.now(),
|
|
36
|
+
...evt
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
_shouldIgnore(url) {
|
|
40
|
+
if (!url) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
return this.config.ignoreUrlPatterns.some(re => re.test(url));
|
|
44
|
+
}
|
|
45
|
+
_shouldIgnoreMessage(message) {
|
|
46
|
+
if (!message) {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
return this.config.ignoreMessagePatterns.some(re => re.test(message));
|
|
50
|
+
}
|
|
51
|
+
_bind(target, event, handler) {
|
|
52
|
+
target.on(event, handler);
|
|
53
|
+
this._bound.push([target, event, handler]);
|
|
54
|
+
}
|
|
55
|
+
attachToContext(context) {
|
|
56
|
+
context.pages().forEach(p => this._attachPage(p));
|
|
57
|
+
this._bind(context, 'page', p => this._attachPage(p));
|
|
58
|
+
this._bind(context, 'response', res => {
|
|
59
|
+
const url = res.url();
|
|
60
|
+
if (this._shouldIgnore(url)) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (res.status() >= 400) {
|
|
64
|
+
this._push({
|
|
65
|
+
kind: 'response',
|
|
66
|
+
status: res.status(),
|
|
67
|
+
method: res.request().method(),
|
|
68
|
+
url,
|
|
69
|
+
fromCache: res.fromServiceWorker()
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
this._bind(context, 'requestfailed', req => {
|
|
74
|
+
var _req$failure;
|
|
75
|
+
const url = req.url();
|
|
76
|
+
const failure = (_req$failure = req.failure()) === null || _req$failure === void 0 ? void 0 : _req$failure.errorText;
|
|
77
|
+
if (this._shouldIgnore(url) || this._shouldIgnoreMessage(failure)) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
this._push({
|
|
81
|
+
kind: 'requestfailed',
|
|
82
|
+
method: req.method(),
|
|
83
|
+
url,
|
|
84
|
+
failure,
|
|
85
|
+
resourceType: req.resourceType()
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
_attachPage(page) {
|
|
90
|
+
this._bind(page, 'console', msg => {
|
|
91
|
+
const type = msg.type();
|
|
92
|
+
if (type !== 'error') {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
const text = msg.text();
|
|
96
|
+
const location = msg.location();
|
|
97
|
+
if (this._shouldIgnoreMessage(text) || this._shouldIgnore(location === null || location === void 0 ? void 0 : location.url)) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
this._push({
|
|
101
|
+
kind: 'console',
|
|
102
|
+
level: type,
|
|
103
|
+
text,
|
|
104
|
+
location
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
this._bind(page, 'pageerror', err => {
|
|
108
|
+
if (this._shouldIgnoreMessage(err.message)) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
this._push({
|
|
112
|
+
kind: 'pageerror',
|
|
113
|
+
name: err.name,
|
|
114
|
+
message: err.message,
|
|
115
|
+
stack: err.stack
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
this._bind(page, 'crash', () => {
|
|
119
|
+
this._push({
|
|
120
|
+
kind: 'crash',
|
|
121
|
+
url: page.url()
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
detach() {
|
|
126
|
+
for (const [target, event, handler] of this._bound) {
|
|
127
|
+
try {
|
|
128
|
+
target.removeListener(event, handler);
|
|
129
|
+
} catch {
|
|
130
|
+
// context may already be closed
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
this._bound.length = 0;
|
|
134
|
+
}
|
|
135
|
+
flushToFile(dir, baseName) {
|
|
136
|
+
if (this.events.length === 0) {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
const file = _path.default.join(dir, `${baseName}.jsonl`);
|
|
140
|
+
// Keep in-memory events raw; annotate category matches only on disk.
|
|
141
|
+
const lines = (0, _runtimeLogAnnotator.annotateRuntimeLogEvents)(this.events);
|
|
142
|
+
const body = lines.map(e => JSON.stringify(e)).join('\n') + '\n';
|
|
143
|
+
(0, _fileUtils.writeFileContents)(file, body);
|
|
144
|
+
return file;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
exports.LogCollector = LogCollector;
|
|
@@ -3,9 +3,8 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.
|
|
6
|
+
exports.parseUserArgs = parseUserArgs;
|
|
7
7
|
var _cliArgsToObject = require("../../../utils/cliArgsToObject");
|
|
8
8
|
function parseUserArgs() {
|
|
9
9
|
return (0, _cliArgsToObject.cliArgsToObject)(process.argv.slice(2));
|
|
10
|
-
}
|
|
11
|
-
var _default = exports.default = parseUserArgs;
|
|
10
|
+
}
|