@empiricalrun/playwright-utils 0.23.0 → 0.23.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/CHANGELOG.md +6 -0
- package/package.json +2 -2
- package/bundled/test-gen/actions/assert.d.ts +0 -4
- package/bundled/test-gen/actions/assert.d.ts.map +0 -1
- package/bundled/test-gen/actions/assert.js +0 -50
- package/bundled/test-gen/actions/click.d.ts +0 -4
- package/bundled/test-gen/actions/click.d.ts.map +0 -1
- package/bundled/test-gen/actions/click.js +0 -51
- package/bundled/test-gen/actions/constants/index.d.ts +0 -2
- package/bundled/test-gen/actions/constants/index.d.ts.map +0 -1
- package/bundled/test-gen/actions/constants/index.js +0 -4
- package/bundled/test-gen/actions/done.d.ts +0 -4
- package/bundled/test-gen/actions/done.d.ts.map +0 -1
- package/bundled/test-gen/actions/done.js +0 -30
- package/bundled/test-gen/actions/fill.d.ts +0 -4
- package/bundled/test-gen/actions/fill.d.ts.map +0 -1
- package/bundled/test-gen/actions/fill.js +0 -82
- package/bundled/test-gen/actions/goto.d.ts +0 -4
- package/bundled/test-gen/actions/goto.d.ts.map +0 -1
- package/bundled/test-gen/actions/goto.js +0 -47
- package/bundled/test-gen/actions/hover.d.ts +0 -4
- package/bundled/test-gen/actions/hover.d.ts.map +0 -1
- package/bundled/test-gen/actions/hover.js +0 -51
- package/bundled/test-gen/actions/index.d.ts +0 -30
- package/bundled/test-gen/actions/index.d.ts.map +0 -1
- package/bundled/test-gen/actions/index.js +0 -159
- package/bundled/test-gen/actions/next-task.d.ts +0 -53
- package/bundled/test-gen/actions/next-task.d.ts.map +0 -1
- package/bundled/test-gen/actions/next-task.js +0 -58
- package/bundled/test-gen/actions/press.d.ts +0 -4
- package/bundled/test-gen/actions/press.d.ts.map +0 -1
- package/bundled/test-gen/actions/press.js +0 -56
- package/bundled/test-gen/actions/skill.d.ts +0 -21
- package/bundled/test-gen/actions/skill.d.ts.map +0 -1
- package/bundled/test-gen/actions/skill.js +0 -127
- package/bundled/test-gen/actions/text-content.d.ts +0 -4
- package/bundled/test-gen/actions/text-content.d.ts.map +0 -1
- package/bundled/test-gen/actions/text-content.js +0 -58
- package/bundled/test-gen/actions/utils/index.d.ts +0 -10
- package/bundled/test-gen/actions/utils/index.d.ts.map +0 -1
- package/bundled/test-gen/actions/utils/index.js +0 -109
- package/bundled/test-gen/agent/browsing/index.d.ts +0 -15
- package/bundled/test-gen/agent/browsing/index.d.ts.map +0 -1
- package/bundled/test-gen/agent/browsing/index.js +0 -68
- package/bundled/test-gen/agent/browsing/run.d.ts +0 -19
- package/bundled/test-gen/agent/browsing/run.d.ts.map +0 -1
- package/bundled/test-gen/agent/browsing/run.js +0 -88
- package/bundled/test-gen/agent/browsing/utils.d.ts +0 -41
- package/bundled/test-gen/agent/browsing/utils.d.ts.map +0 -1
- package/bundled/test-gen/agent/browsing/utils.js +0 -406
- package/bundled/test-gen/agent/codegen/create-test-block.d.ts +0 -9
- package/bundled/test-gen/agent/codegen/create-test-block.d.ts.map +0 -1
- package/bundled/test-gen/agent/codegen/create-test-block.js +0 -63
- package/bundled/test-gen/agent/codegen/fix-ts-errors.d.ts +0 -13
- package/bundled/test-gen/agent/codegen/fix-ts-errors.d.ts.map +0 -1
- package/bundled/test-gen/agent/codegen/fix-ts-errors.js +0 -80
- package/bundled/test-gen/agent/codegen/generate-code-apply-changes.d.ts +0 -13
- package/bundled/test-gen/agent/codegen/generate-code-apply-changes.d.ts.map +0 -1
- package/bundled/test-gen/agent/codegen/generate-code-apply-changes.js +0 -381
- package/bundled/test-gen/agent/codegen/lexical-scoped-vars.d.ts +0 -9
- package/bundled/test-gen/agent/codegen/lexical-scoped-vars.d.ts.map +0 -1
- package/bundled/test-gen/agent/codegen/lexical-scoped-vars.js +0 -56
- package/bundled/test-gen/agent/codegen/repo-edit.d.ts +0 -23
- package/bundled/test-gen/agent/codegen/repo-edit.d.ts.map +0 -1
- package/bundled/test-gen/agent/codegen/repo-edit.js +0 -86
- package/bundled/test-gen/agent/codegen/run.d.ts +0 -16
- package/bundled/test-gen/agent/codegen/run.d.ts.map +0 -1
- package/bundled/test-gen/agent/codegen/run.js +0 -119
- package/bundled/test-gen/agent/codegen/skills-retriever.d.ts +0 -26
- package/bundled/test-gen/agent/codegen/skills-retriever.d.ts.map +0 -1
- package/bundled/test-gen/agent/codegen/skills-retriever.js +0 -93
- package/bundled/test-gen/agent/codegen/test-update-feedback.d.ts +0 -12
- package/bundled/test-gen/agent/codegen/test-update-feedback.d.ts.map +0 -1
- package/bundled/test-gen/agent/codegen/test-update-feedback.js +0 -50
- package/bundled/test-gen/agent/codegen/types.d.ts +0 -25
- package/bundled/test-gen/agent/codegen/types.d.ts.map +0 -1
- package/bundled/test-gen/agent/codegen/types.js +0 -8
- package/bundled/test-gen/agent/codegen/update-flow.d.ts +0 -34
- package/bundled/test-gen/agent/codegen/update-flow.d.ts.map +0 -1
- package/bundled/test-gen/agent/codegen/update-flow.js +0 -300
- package/bundled/test-gen/agent/codegen/use-skill.d.ts +0 -11
- package/bundled/test-gen/agent/codegen/use-skill.d.ts.map +0 -1
- package/bundled/test-gen/agent/codegen/use-skill.js +0 -54
- package/bundled/test-gen/agent/codegen/utils.d.ts +0 -126
- package/bundled/test-gen/agent/codegen/utils.d.ts.map +0 -1
- package/bundled/test-gen/agent/codegen/utils.js +0 -416
- package/bundled/test-gen/agent/diagnosis-agent/index.d.ts +0 -18
- package/bundled/test-gen/agent/diagnosis-agent/index.d.ts.map +0 -1
- package/bundled/test-gen/agent/diagnosis-agent/index.js +0 -105
- package/bundled/test-gen/agent/diagnosis-agent/strict-mode-violation.d.ts +0 -9
- package/bundled/test-gen/agent/diagnosis-agent/strict-mode-violation.d.ts.map +0 -1
- package/bundled/test-gen/agent/diagnosis-agent/strict-mode-violation.js +0 -31
- package/bundled/test-gen/agent/enrich-prompt/index.d.ts +0 -12
- package/bundled/test-gen/agent/enrich-prompt/index.d.ts.map +0 -1
- package/bundled/test-gen/agent/enrich-prompt/index.js +0 -81
- package/bundled/test-gen/agent/enrich-prompt/utils.d.ts +0 -6
- package/bundled/test-gen/agent/enrich-prompt/utils.d.ts.map +0 -1
- package/bundled/test-gen/agent/enrich-prompt/utils.js +0 -12
- package/bundled/test-gen/agent/infer-agent/index.d.ts +0 -10
- package/bundled/test-gen/agent/infer-agent/index.d.ts.map +0 -1
- package/bundled/test-gen/agent/infer-agent/index.js +0 -70
- package/bundled/test-gen/agent/master/action-tool-calls.d.ts +0 -42
- package/bundled/test-gen/agent/master/action-tool-calls.d.ts.map +0 -1
- package/bundled/test-gen/agent/master/action-tool-calls.js +0 -87
- package/bundled/test-gen/agent/master/browser-tests/fixtures.d.ts +0 -9
- package/bundled/test-gen/agent/master/browser-tests/fixtures.d.ts.map +0 -1
- package/bundled/test-gen/agent/master/browser-tests/fixtures.js +0 -33
- package/bundled/test-gen/agent/master/browser-tests/index.spec.d.ts +0 -2
- package/bundled/test-gen/agent/master/browser-tests/index.spec.d.ts.map +0 -1
- package/bundled/test-gen/agent/master/browser-tests/index.spec.js +0 -113
- package/bundled/test-gen/agent/master/browser-tests/skills.spec.d.ts +0 -2
- package/bundled/test-gen/agent/master/browser-tests/skills.spec.d.ts.map +0 -1
- package/bundled/test-gen/agent/master/browser-tests/skills.spec.js +0 -109
- package/bundled/test-gen/agent/master/element-annotation.d.ts +0 -30
- package/bundled/test-gen/agent/master/element-annotation.d.ts.map +0 -1
- package/bundled/test-gen/agent/master/element-annotation.js +0 -195
- package/bundled/test-gen/agent/master/execute-browser-action.d.ts +0 -24
- package/bundled/test-gen/agent/master/execute-browser-action.d.ts.map +0 -1
- package/bundled/test-gen/agent/master/execute-browser-action.js +0 -124
- package/bundled/test-gen/agent/master/execute-skill-action.d.ts +0 -11
- package/bundled/test-gen/agent/master/execute-skill-action.d.ts.map +0 -1
- package/bundled/test-gen/agent/master/execute-skill-action.js +0 -25
- package/bundled/test-gen/agent/master/icon-descriptor/index.d.ts +0 -22
- package/bundled/test-gen/agent/master/icon-descriptor/index.d.ts.map +0 -1
- package/bundled/test-gen/agent/master/icon-descriptor/index.js +0 -250
- package/bundled/test-gen/agent/master/icon-descriptor/normalize-svg.d.ts +0 -2
- package/bundled/test-gen/agent/master/icon-descriptor/normalize-svg.d.ts.map +0 -1
- package/bundled/test-gen/agent/master/icon-descriptor/normalize-svg.js +0 -248
- package/bundled/test-gen/agent/master/next-action.d.ts +0 -22
- package/bundled/test-gen/agent/master/next-action.d.ts.map +0 -1
- package/bundled/test-gen/agent/master/next-action.js +0 -104
- package/bundled/test-gen/agent/master/planner.d.ts +0 -15
- package/bundled/test-gen/agent/master/planner.d.ts.map +0 -1
- package/bundled/test-gen/agent/master/planner.js +0 -144
- package/bundled/test-gen/agent/master/run.d.ts +0 -15
- package/bundled/test-gen/agent/master/run.d.ts.map +0 -1
- package/bundled/test-gen/agent/master/run.js +0 -274
- package/bundled/test-gen/agent/master/scroller.d.ts +0 -15
- package/bundled/test-gen/agent/master/scroller.d.ts.map +0 -1
- package/bundled/test-gen/agent/master/scroller.js +0 -375
- package/bundled/test-gen/agent/master/with-hints.d.ts +0 -17
- package/bundled/test-gen/agent/master/with-hints.d.ts.map +0 -1
- package/bundled/test-gen/agent/master/with-hints.js +0 -102
- package/bundled/test-gen/agent/planner/run-time-planner.d.ts +0 -15
- package/bundled/test-gen/agent/planner/run-time-planner.d.ts.map +0 -1
- package/bundled/test-gen/agent/planner/run-time-planner.js +0 -100
- package/bundled/test-gen/agent/planner/run.d.ts +0 -7
- package/bundled/test-gen/agent/planner/run.d.ts.map +0 -1
- package/bundled/test-gen/agent/planner/run.js +0 -127
- package/bundled/test-gen/agent/utils.d.ts +0 -2
- package/bundled/test-gen/agent/utils.d.ts.map +0 -1
- package/bundled/test-gen/agent/utils.js +0 -12
- package/bundled/test-gen/bin/index.d.ts +0 -3
- package/bundled/test-gen/bin/index.d.ts.map +0 -1
- package/bundled/test-gen/bin/index.js +0 -212
- package/bundled/test-gen/bin/logger/index.d.ts +0 -14
- package/bundled/test-gen/bin/logger/index.d.ts.map +0 -1
- package/bundled/test-gen/bin/logger/index.js +0 -57
- package/bundled/test-gen/bin/utils/context.d.ts +0 -13
- package/bundled/test-gen/bin/utils/context.d.ts.map +0 -1
- package/bundled/test-gen/bin/utils/context.js +0 -67
- package/bundled/test-gen/bin/utils/fs/index.d.ts +0 -6
- package/bundled/test-gen/bin/utils/fs/index.d.ts.map +0 -1
- package/bundled/test-gen/bin/utils/fs/index.js +0 -63
- package/bundled/test-gen/bin/utils/index.d.ts +0 -9
- package/bundled/test-gen/bin/utils/index.d.ts.map +0 -1
- package/bundled/test-gen/bin/utils/index.js +0 -64
- package/bundled/test-gen/bin/utils/platform/web/index.d.ts +0 -78
- package/bundled/test-gen/bin/utils/platform/web/index.d.ts.map +0 -1
- package/bundled/test-gen/bin/utils/platform/web/index.js +0 -544
- package/bundled/test-gen/bin/utils/platform/web/test-files/ts-path-import-validate.d.ts +0 -2
- package/bundled/test-gen/bin/utils/platform/web/test-files/ts-path-import-validate.d.ts.map +0 -1
- package/bundled/test-gen/bin/utils/platform/web/test-files/ts-path-import-validate.js +0 -7
- package/bundled/test-gen/bin/utils/scenarios/index.d.ts +0 -6
- package/bundled/test-gen/bin/utils/scenarios/index.d.ts.map +0 -1
- package/bundled/test-gen/bin/utils/scenarios/index.js +0 -57
- package/bundled/test-gen/browser-injected-scripts/annotate-elements.js +0 -615
- package/bundled/test-gen/browser-injected-scripts/annotate-elements.spec.d.ts +0 -2
- package/bundled/test-gen/browser-injected-scripts/annotate-elements.spec.d.ts.map +0 -1
- package/bundled/test-gen/browser-injected-scripts/annotate-elements.spec.js +0 -207
- package/bundled/test-gen/browser-injected-scripts/annotate-elements.spec.ts +0 -332
- package/bundled/test-gen/constants/index.d.ts +0 -7
- package/bundled/test-gen/constants/index.d.ts.map +0 -1
- package/bundled/test-gen/constants/index.js +0 -18
- package/bundled/test-gen/errors/index.d.ts +0 -5
- package/bundled/test-gen/errors/index.d.ts.map +0 -1
- package/bundled/test-gen/errors/index.js +0 -9
- package/bundled/test-gen/evals/add-scenario-agent.evals.d.ts +0 -4
- package/bundled/test-gen/evals/add-scenario-agent.evals.d.ts.map +0 -1
- package/bundled/test-gen/evals/add-scenario-agent.evals.js +0 -44
- package/bundled/test-gen/evals/append-create-test-agent.evals.d.ts +0 -4
- package/bundled/test-gen/evals/append-create-test-agent.evals.d.ts.map +0 -1
- package/bundled/test-gen/evals/append-create-test-agent.evals.js +0 -117
- package/bundled/test-gen/evals/fetch-pom-skills-agent.evals.d.ts +0 -4
- package/bundled/test-gen/evals/fetch-pom-skills-agent.evals.d.ts.map +0 -1
- package/bundled/test-gen/evals/fetch-pom-skills-agent.evals.js +0 -36
- package/bundled/test-gen/evals/infer-master-or-code-agent.evals.d.ts +0 -4
- package/bundled/test-gen/evals/infer-master-or-code-agent.evals.d.ts.map +0 -1
- package/bundled/test-gen/evals/infer-master-or-code-agent.evals.js +0 -22
- package/bundled/test-gen/evals/master-agent.evals.d.ts +0 -4
- package/bundled/test-gen/evals/master-agent.evals.d.ts.map +0 -1
- package/bundled/test-gen/evals/master-agent.evals.js +0 -35
- package/bundled/test-gen/evals/type.d.ts +0 -12
- package/bundled/test-gen/evals/type.d.ts.map +0 -1
- package/bundled/test-gen/evals/type.js +0 -2
- package/bundled/test-gen/evals/update-scenario-agent.evals.d.ts +0 -4
- package/bundled/test-gen/evals/update-scenario-agent.evals.d.ts.map +0 -1
- package/bundled/test-gen/evals/update-scenario-agent.evals.js +0 -47
- package/bundled/test-gen/file/client.d.ts +0 -14
- package/bundled/test-gen/file/client.d.ts.map +0 -1
- package/bundled/test-gen/file/client.js +0 -48
- package/bundled/test-gen/file/server.d.ts +0 -13
- package/bundled/test-gen/file/server.d.ts.map +0 -1
- package/bundled/test-gen/file/server.js +0 -52
- package/bundled/test-gen/human-in-the-loop/cli.d.ts +0 -2
- package/bundled/test-gen/human-in-the-loop/cli.d.ts.map +0 -1
- package/bundled/test-gen/human-in-the-loop/cli.js +0 -24
- package/bundled/test-gen/human-in-the-loop/index.d.ts +0 -12
- package/bundled/test-gen/human-in-the-loop/index.d.ts.map +0 -1
- package/bundled/test-gen/human-in-the-loop/index.js +0 -30
- package/bundled/test-gen/human-in-the-loop/ipc.d.ts +0 -4
- package/bundled/test-gen/human-in-the-loop/ipc.d.ts.map +0 -1
- package/bundled/test-gen/human-in-the-loop/ipc.js +0 -47
- package/bundled/test-gen/index.d.ts +0 -4
- package/bundled/test-gen/index.d.ts.map +0 -1
- package/bundled/test-gen/index.js +0 -55
- package/bundled/test-gen/package.json +0 -106
- package/bundled/test-gen/page/index.d.ts +0 -11
- package/bundled/test-gen/page/index.d.ts.map +0 -1
- package/bundled/test-gen/page/index.js +0 -16
- package/bundled/test-gen/prompts/lib/ts-transformer.d.ts +0 -4
- package/bundled/test-gen/prompts/lib/ts-transformer.d.ts.map +0 -1
- package/bundled/test-gen/prompts/lib/ts-transformer.js +0 -92
- package/bundled/test-gen/reporter/index.d.ts +0 -33
- package/bundled/test-gen/reporter/index.d.ts.map +0 -1
- package/bundled/test-gen/reporter/index.js +0 -161
- package/bundled/test-gen/session/index.d.ts +0 -20
- package/bundled/test-gen/session/index.d.ts.map +0 -1
- package/bundled/test-gen/session/index.js +0 -105
- package/bundled/test-gen/test-build/index.d.ts +0 -10
- package/bundled/test-gen/test-build/index.d.ts.map +0 -1
- package/bundled/test-gen/test-build/index.js +0 -30
- package/bundled/test-gen/types/index.d.ts +0 -69
- package/bundled/test-gen/types/index.d.ts.map +0 -1
- package/bundled/test-gen/types/index.js +0 -2
- package/bundled/test-gen/uploader/index.d.ts +0 -26
- package/bundled/test-gen/uploader/index.d.ts.map +0 -1
- package/bundled/test-gen/uploader/index.js +0 -102
- package/bundled/test-gen/utils/env.d.ts +0 -2
- package/bundled/test-gen/utils/env.d.ts.map +0 -1
- package/bundled/test-gen/utils/env.js +0 -9
- package/bundled/test-gen/utils/exec.d.ts +0 -4
- package/bundled/test-gen/utils/exec.d.ts.map +0 -1
- package/bundled/test-gen/utils/exec.js +0 -45
- package/bundled/test-gen/utils/file.d.ts +0 -2
- package/bundled/test-gen/utils/file.d.ts.map +0 -1
- package/bundled/test-gen/utils/file.js +0 -25
- package/bundled/test-gen/utils/html.d.ts +0 -4
- package/bundled/test-gen/utils/html.d.ts.map +0 -1
- package/bundled/test-gen/utils/html.js +0 -46
- package/bundled/test-gen/utils/index.d.ts +0 -2
- package/bundled/test-gen/utils/index.d.ts.map +0 -1
- package/bundled/test-gen/utils/index.js +0 -5
- package/bundled/test-gen/utils/pw-test.d.ts +0 -3
- package/bundled/test-gen/utils/pw-test.d.ts.map +0 -1
- package/bundled/test-gen/utils/pw-test.js +0 -26
- package/bundled/test-gen/utils/slug.d.ts +0 -2
- package/bundled/test-gen/utils/slug.d.ts.map +0 -1
- package/bundled/test-gen/utils/slug.js +0 -18
- package/bundled/test-gen/utils/string.d.ts +0 -2
- package/bundled/test-gen/utils/string.d.ts.map +0 -1
- package/bundled/test-gen/utils/string.js +0 -9
- package/scripts/prepare-publish.js +0 -42
|
@@ -1,544 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.isSyntaxValid = exports.getVariableDeclarationsFromCode = exports.buildTestNamePrompt = exports.isTestPresent = exports.appendScopeToCreateTest = exports.addUserContextFixture = exports.importAllExportsStmtFromFilePaths = exports.injectCodeSnippetBySuiteChain = exports.replaceCreateTestWithNewCode = exports.getPageVariableNameFromCreateTest = exports.getFixtureImportPath = exports.removeTestOnly = exports.addNewImport = exports.formatCode = exports.lintErrors = exports.stripAndPrependImports = exports.validateTypescript = exports.appendToTestBlock = exports.findFirstSerialDescribeBlock = exports.hasTopLevelDescribeConfigureWithSerialMode = exports.getTypescriptTestBlock = exports.getTestModuleAliasFromSourceFile = void 0;
|
|
7
|
-
const parser_1 = require("@babel/parser");
|
|
8
|
-
const eslint_1 = require("eslint");
|
|
9
|
-
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
10
|
-
const lodash_isequal_1 = __importDefault(require("lodash.isequal"));
|
|
11
|
-
const path_1 = __importDefault(require("path"));
|
|
12
|
-
const prettier_1 = __importDefault(require("prettier"));
|
|
13
|
-
const ts_morph_1 = require("ts-morph");
|
|
14
|
-
const typescript_1 = __importDefault(require("typescript"));
|
|
15
|
-
const getTestModuleAliasFromSourceFile = (sourceFile) => {
|
|
16
|
-
return (sourceFile
|
|
17
|
-
.getImportDeclarations()
|
|
18
|
-
// Look for any import that includes "test" as a named import, regardless of module path
|
|
19
|
-
// "test" can be imported from "@playwright/test" or "<some-fixture>"
|
|
20
|
-
.find((importDecl) => importDecl
|
|
21
|
-
.getNamedImports()
|
|
22
|
-
.some((namedImport) => namedImport.getName() === "test"))
|
|
23
|
-
?.getNamedImports()
|
|
24
|
-
.find((namedImport) => namedImport.getName() === "test")
|
|
25
|
-
?.getAliasNode()
|
|
26
|
-
?.getText() || "test");
|
|
27
|
-
};
|
|
28
|
-
exports.getTestModuleAliasFromSourceFile = getTestModuleAliasFromSourceFile;
|
|
29
|
-
/**
|
|
30
|
-
* function to get the test block and test node for the scenario
|
|
31
|
-
* @export
|
|
32
|
-
* @param {string} scenarioName
|
|
33
|
-
* @param {string} content
|
|
34
|
-
* @return { testBlock: string; parentDescribe: string; } testBlock - the test block content, testNode - the test function node
|
|
35
|
-
*/
|
|
36
|
-
function getTypescriptTestBlock({ scenarioName, suites, content, }) {
|
|
37
|
-
const project = new ts_morph_1.Project();
|
|
38
|
-
const sourceFile = project.createSourceFile("test.ts", content);
|
|
39
|
-
const testAlias = (0, exports.getTestModuleAliasFromSourceFile)(sourceFile);
|
|
40
|
-
// Get all test function nodes that match the scenario name
|
|
41
|
-
const matchingTestFunctionNodes = sourceFile
|
|
42
|
-
.getDescendantsOfKind(ts_morph_1.SyntaxKind.CallExpression)
|
|
43
|
-
.filter((node) => {
|
|
44
|
-
return Boolean(node.getExpression().getText() === testAlias &&
|
|
45
|
-
node.getArguments()[0]?.getText().includes(scenarioName));
|
|
46
|
-
});
|
|
47
|
-
if (!suites?.length) {
|
|
48
|
-
const firstNode = matchingTestFunctionNodes?.[0];
|
|
49
|
-
return {
|
|
50
|
-
testBlock: firstNode?.getText(),
|
|
51
|
-
testNode: firstNode,
|
|
52
|
-
testAlias,
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
// Iterate over each test function node and check if the suites match
|
|
56
|
-
for (const testNode of matchingTestFunctionNodes) {
|
|
57
|
-
const parentDescribes = getParentDescribeNames(testNode);
|
|
58
|
-
if ((0, lodash_isequal_1.default)(parentDescribes, suites)) {
|
|
59
|
-
// Found the matching test block
|
|
60
|
-
return {
|
|
61
|
-
testBlock: testNode.getText(),
|
|
62
|
-
testNode,
|
|
63
|
-
testAlias,
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
// No matching test block found
|
|
68
|
-
return {
|
|
69
|
-
testBlock: undefined,
|
|
70
|
-
testNode: undefined,
|
|
71
|
-
testAlias,
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
exports.getTypescriptTestBlock = getTypescriptTestBlock;
|
|
75
|
-
// get the names of parent describe blocks
|
|
76
|
-
function getParentDescribeNames(node) {
|
|
77
|
-
const names = [];
|
|
78
|
-
let current = node.getParent();
|
|
79
|
-
while (current) {
|
|
80
|
-
if (ts_morph_1.Node.isCallExpression(current)) {
|
|
81
|
-
const expr = current.getExpression();
|
|
82
|
-
if (expr.getText() === "test.describe") {
|
|
83
|
-
const describeBlockArguments = current.getArguments();
|
|
84
|
-
if (describeBlockArguments.length > 0) {
|
|
85
|
-
const describeBlockName = describeBlockArguments[0];
|
|
86
|
-
if (ts_morph_1.Node.isStringLiteral(describeBlockName)) {
|
|
87
|
-
names.push(describeBlockName.getLiteralText());
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
current = current.getParent();
|
|
93
|
-
}
|
|
94
|
-
return names.reverse(); // Reverse to get from outermost to innermost
|
|
95
|
-
}
|
|
96
|
-
async function hasTopLevelDescribeConfigureWithSerialMode(filePath) {
|
|
97
|
-
const project = new ts_morph_1.Project();
|
|
98
|
-
const content = await fs_extra_1.default.readFile(filePath, "utf-8");
|
|
99
|
-
const sourceFile = project.createSourceFile("test.ts", content);
|
|
100
|
-
const statements = sourceFile.getStatements();
|
|
101
|
-
for (const statement of statements) {
|
|
102
|
-
// Check if the statement is an expression statement
|
|
103
|
-
if (statement.getKind() === ts_morph_1.SyntaxKind.ExpressionStatement) {
|
|
104
|
-
const expression = statement.getFirstChildByKind(ts_morph_1.SyntaxKind.CallExpression);
|
|
105
|
-
if (expression) {
|
|
106
|
-
const expressionText = expression.getExpression().getText();
|
|
107
|
-
// Check if it's `test.describe.configure`
|
|
108
|
-
if (expressionText === "test.describe.configure") {
|
|
109
|
-
// Check if arguments exist and if the first argument is an object literal with mode serial
|
|
110
|
-
const args = expression.getArguments();
|
|
111
|
-
const firstArgText = args[0]?.getText();
|
|
112
|
-
if (firstArgText &&
|
|
113
|
-
firstArgText.includes("serial") &&
|
|
114
|
-
firstArgText.includes("mode")) {
|
|
115
|
-
return true;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
return false;
|
|
122
|
-
}
|
|
123
|
-
exports.hasTopLevelDescribeConfigureWithSerialMode = hasTopLevelDescribeConfigureWithSerialMode;
|
|
124
|
-
/**
|
|
125
|
-
* Function to find the first 'describe' block configured with 'serial: true'
|
|
126
|
-
*
|
|
127
|
-
* e.g.
|
|
128
|
-
*
|
|
129
|
-
* test.describe("foo", () => {
|
|
130
|
-
*
|
|
131
|
-
* test.describe.configure({ mode: "serial" });
|
|
132
|
-
*
|
|
133
|
-
* test.describe("bar", () => {
|
|
134
|
-
*
|
|
135
|
-
* test.describe.configure({ mode: "serial" });
|
|
136
|
-
*
|
|
137
|
-
* })
|
|
138
|
-
*
|
|
139
|
-
* })
|
|
140
|
-
*
|
|
141
|
-
* for the above example,
|
|
142
|
-
* this function will return the first 'describe' block which is named "foo"
|
|
143
|
-
*
|
|
144
|
-
* @param {(Node | undefined)} node
|
|
145
|
-
* @return {(Node | undefined)}
|
|
146
|
-
*/
|
|
147
|
-
function findFirstSerialDescribeBlock(node) {
|
|
148
|
-
let currentNode = node;
|
|
149
|
-
// Traverse upwards until we find a 'describe' block with 'serial: true'
|
|
150
|
-
while (currentNode) {
|
|
151
|
-
const parentDescribe = currentNode.getFirstAncestorByKind(ts_morph_1.SyntaxKind.CallExpression);
|
|
152
|
-
if (parentDescribe) {
|
|
153
|
-
const isDescribe = parentDescribe.getFirstChild()?.getText() === "test.describe";
|
|
154
|
-
if (isDescribe) {
|
|
155
|
-
const configureCall = parentDescribe
|
|
156
|
-
.getDescendantsOfKind(ts_morph_1.SyntaxKind.CallExpression)
|
|
157
|
-
.find((call) => call.getText().includes("configure"));
|
|
158
|
-
if (configureCall) {
|
|
159
|
-
// Check if 'serial: true' exists
|
|
160
|
-
if (configureCall.getText().includes("serial")) {
|
|
161
|
-
return parentDescribe;
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
currentNode = parentDescribe; // Move up the tree
|
|
167
|
-
}
|
|
168
|
-
return undefined; // Return undefined if no 'describe' with serial: true is found
|
|
169
|
-
}
|
|
170
|
-
exports.findFirstSerialDescribeBlock = findFirstSerialDescribeBlock;
|
|
171
|
-
function appendToTestBlock(testBlock, content) {
|
|
172
|
-
const updateTestBlock = testBlock.replace(/\}\)$/, `\n\n${content}\n\n })`);
|
|
173
|
-
return updateTestBlock;
|
|
174
|
-
}
|
|
175
|
-
exports.appendToTestBlock = appendToTestBlock;
|
|
176
|
-
function validateTypescript(filePath) {
|
|
177
|
-
// Create a compiler host to read files
|
|
178
|
-
const compilerHost = typescript_1.default.createCompilerHost({});
|
|
179
|
-
compilerHost.readFile = (file) => fs_extra_1.default.readFileSync(file, "utf8");
|
|
180
|
-
// Create a program with a single source file
|
|
181
|
-
const program = typescript_1.default.createProgram([filePath], {
|
|
182
|
-
esModuleInterop: true,
|
|
183
|
-
allowSyntheticDefaultImports: true,
|
|
184
|
-
}, compilerHost);
|
|
185
|
-
// Get the source file
|
|
186
|
-
const sourceFile = program.getSourceFile(filePath);
|
|
187
|
-
// Get and report any syntactic errors
|
|
188
|
-
const errors = [];
|
|
189
|
-
const syntacticDiagnostics = program.getSyntacticDiagnostics(sourceFile);
|
|
190
|
-
if (syntacticDiagnostics.length > 0) {
|
|
191
|
-
syntacticDiagnostics.forEach((diagnostic) => {
|
|
192
|
-
if (typeof diagnostic.messageText === "string") {
|
|
193
|
-
errors.push(diagnostic.messageText);
|
|
194
|
-
}
|
|
195
|
-
});
|
|
196
|
-
}
|
|
197
|
-
// Get and report any semantic errors
|
|
198
|
-
const semanticDiagnostics = program.getSemanticDiagnostics(sourceFile);
|
|
199
|
-
if (semanticDiagnostics.length > 0) {
|
|
200
|
-
semanticDiagnostics.forEach((diagnostic) => {
|
|
201
|
-
if (typeof diagnostic.messageText === "string") {
|
|
202
|
-
errors.push(diagnostic.messageText);
|
|
203
|
-
}
|
|
204
|
-
else {
|
|
205
|
-
let messageChain = diagnostic.messageText;
|
|
206
|
-
errors.push(messageChain.messageText);
|
|
207
|
-
while (messageChain?.next) {
|
|
208
|
-
messageChain = messageChain.next[0];
|
|
209
|
-
errors.push(messageChain?.messageText);
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
});
|
|
213
|
-
}
|
|
214
|
-
return errors;
|
|
215
|
-
}
|
|
216
|
-
exports.validateTypescript = validateTypescript;
|
|
217
|
-
async function stripAndPrependImports(content, testName) {
|
|
218
|
-
const importRegexp = /import\s+\{[^}]*\}\s+from\s+["'][^"']+["'];?/g;
|
|
219
|
-
const imports = content.match(importRegexp);
|
|
220
|
-
const { testBlock: strippedContent } = getTypescriptTestBlock({
|
|
221
|
-
scenarioName: testName,
|
|
222
|
-
content,
|
|
223
|
-
suites: [], // since this method is called on the generated content, not the whole file
|
|
224
|
-
});
|
|
225
|
-
const prependContent = (imports?.join("\n") || "") + "\n\n";
|
|
226
|
-
return [prependContent, strippedContent];
|
|
227
|
-
}
|
|
228
|
-
exports.stripAndPrependImports = stripAndPrependImports;
|
|
229
|
-
async function lintErrors(filePath) {
|
|
230
|
-
const eslint = new eslint_1.ESLint({
|
|
231
|
-
fix: true,
|
|
232
|
-
useEslintrc: true,
|
|
233
|
-
});
|
|
234
|
-
const [result] = await eslint.lintFiles(filePath);
|
|
235
|
-
if (result?.output) {
|
|
236
|
-
await fs_extra_1.default.writeFile(filePath, result.output);
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
exports.lintErrors = lintErrors;
|
|
240
|
-
async function formatCode(filePath, trace) {
|
|
241
|
-
const fileContent = fs_extra_1.default.readFileSync(filePath, "utf8");
|
|
242
|
-
if (!fileContent) {
|
|
243
|
-
trace?.span({
|
|
244
|
-
name: "prettier-format-output",
|
|
245
|
-
output: `${filePath} file is empty`,
|
|
246
|
-
});
|
|
247
|
-
return;
|
|
248
|
-
}
|
|
249
|
-
const prettierConfig = {};
|
|
250
|
-
const formattedContent = await prettier_1.default.format(fileContent, {
|
|
251
|
-
...prettierConfig,
|
|
252
|
-
filepath: filePath,
|
|
253
|
-
});
|
|
254
|
-
trace?.span({ name: "prettier-format-output", output: formattedContent });
|
|
255
|
-
await fs_extra_1.default.writeFile(filePath, formattedContent);
|
|
256
|
-
}
|
|
257
|
-
exports.formatCode = formatCode;
|
|
258
|
-
function addNewImport(contents, modules, pkg) {
|
|
259
|
-
return `import { ${modules.join(", ")} } from "${pkg}";\n${contents}`;
|
|
260
|
-
}
|
|
261
|
-
exports.addNewImport = addNewImport;
|
|
262
|
-
async function removeTestOnly(filePath) {
|
|
263
|
-
const contents = await fs_extra_1.default.readFile(filePath, "utf8");
|
|
264
|
-
const updatedContent = contents
|
|
265
|
-
.replace("test.only(", "test(")
|
|
266
|
-
.replace("test.describe.only(", "test.describe(");
|
|
267
|
-
return fs_extra_1.default.writeFile(filePath, updatedContent);
|
|
268
|
-
}
|
|
269
|
-
exports.removeTestOnly = removeTestOnly;
|
|
270
|
-
function getFixtureImportPath(filePath) {
|
|
271
|
-
// get the depth from the tests folder
|
|
272
|
-
// assumption fixtures are always int the folder tests/fixtures
|
|
273
|
-
const subFolder = filePath.split("/tests/")[1];
|
|
274
|
-
const subFolderDepth = subFolder?.split("/").length
|
|
275
|
-
? subFolder?.split("/").length - 1
|
|
276
|
-
: 0;
|
|
277
|
-
// create an array of path segments to the fixtures file
|
|
278
|
-
const fixturesPath = [
|
|
279
|
-
"./",
|
|
280
|
-
subFolderDepth ? new Array(subFolderDepth).fill("../").join("") : "",
|
|
281
|
-
"fixtures",
|
|
282
|
-
].join("");
|
|
283
|
-
return fixturesPath;
|
|
284
|
-
}
|
|
285
|
-
exports.getFixtureImportPath = getFixtureImportPath;
|
|
286
|
-
async function getPageVariableNameFromCreateTest(filePath) {
|
|
287
|
-
const contents = await fs_extra_1.default.readFile(filePath, "utf-8");
|
|
288
|
-
const project = new ts_morph_1.Project();
|
|
289
|
-
const sourceFile = project.createSourceFile("test.ts", contents);
|
|
290
|
-
const createTestNode = sourceFile.getFirstDescendant((node) => !!(node.isKind(ts_morph_1.SyntaxKind.CallExpression) &&
|
|
291
|
-
node.getExpression().getText() === "createTest"));
|
|
292
|
-
if (!createTestNode) {
|
|
293
|
-
throw new Error("createTest not found in file");
|
|
294
|
-
}
|
|
295
|
-
const descendants = createTestNode?.getDescendants();
|
|
296
|
-
const descendentTexts = descendants.map((d) => d.getText());
|
|
297
|
-
const parameterSeparatorIdx = descendentTexts.findIndex((s) => s === ",");
|
|
298
|
-
const pageVariableName = descendentTexts[parameterSeparatorIdx + 1];
|
|
299
|
-
// handle cases like "page as Page"
|
|
300
|
-
return pageVariableName?.split(" ")[0];
|
|
301
|
-
}
|
|
302
|
-
exports.getPageVariableNameFromCreateTest = getPageVariableNameFromCreateTest;
|
|
303
|
-
function resolveImportsFromFixtures({ fixtureImportNode, testAlias, filePath, updatedTestFile, }) {
|
|
304
|
-
const imports = {};
|
|
305
|
-
const importClause = fixtureImportNode.getImportClause();
|
|
306
|
-
if (!importClause) {
|
|
307
|
-
return updatedTestFile;
|
|
308
|
-
}
|
|
309
|
-
const namedImports = importClause.getNamedImports().map((imp) => {
|
|
310
|
-
// aliasNode is truthy if the import is aliased (e.g. import { test as setup } ...)
|
|
311
|
-
const aliasNode = imp.getAliasNode();
|
|
312
|
-
const originalImportName = imp.getName();
|
|
313
|
-
const aliasImportName = aliasNode?.getText();
|
|
314
|
-
const importName = aliasImportName || originalImportName;
|
|
315
|
-
imports[originalImportName] = imp.getText();
|
|
316
|
-
return importName;
|
|
317
|
-
});
|
|
318
|
-
const isComplete = namedImports.includes(testAlias) && namedImports.includes("expect");
|
|
319
|
-
if (!isComplete) {
|
|
320
|
-
if (!Object.keys(imports).includes("test")) {
|
|
321
|
-
imports["test"] = "test";
|
|
322
|
-
}
|
|
323
|
-
if (!Object.keys(imports).includes("expect")) {
|
|
324
|
-
imports["expect"] = "expect";
|
|
325
|
-
}
|
|
326
|
-
const expectedImports = `import { ${Object.values(imports).join(", ")} } from "${getFixtureImportPath(filePath)}";`;
|
|
327
|
-
updatedTestFile = updatedTestFile.replace(fixtureImportNode.getText(), expectedImports);
|
|
328
|
-
}
|
|
329
|
-
return updatedTestFile;
|
|
330
|
-
}
|
|
331
|
-
function replaceCreateTestWithNewCode(filePath, contents, generatedCode) {
|
|
332
|
-
const project = new ts_morph_1.Project();
|
|
333
|
-
const sourceFile = project.createSourceFile("test.ts", contents);
|
|
334
|
-
const testAlias = (0, exports.getTestModuleAliasFromSourceFile)(sourceFile);
|
|
335
|
-
const createTestNode = sourceFile.getFirstDescendant((node) => !!(node.isKind(ts_morph_1.SyntaxKind.CallExpression) &&
|
|
336
|
-
node.getExpression().getText() === "createTest"));
|
|
337
|
-
const createTestWithAwait = `await ${createTestNode?.getText()}`;
|
|
338
|
-
let updatedTestFile = contents.replace(createTestWithAwait, function () {
|
|
339
|
-
// str.replace treats characters like $ differently
|
|
340
|
-
// Using a function helps us avoid special handling
|
|
341
|
-
// https://stackoverflow.com/a/28103073
|
|
342
|
-
return "\n" + generatedCode;
|
|
343
|
-
});
|
|
344
|
-
const fixtureImportNode = sourceFile.getFirstDescendant((node) => !!(node.isKind(ts_morph_1.SyntaxKind.ImportDeclaration) &&
|
|
345
|
-
node.getText().includes("fixtures")));
|
|
346
|
-
if (fixtureImportNode) {
|
|
347
|
-
updatedTestFile = resolveImportsFromFixtures({
|
|
348
|
-
fixtureImportNode,
|
|
349
|
-
testAlias,
|
|
350
|
-
filePath,
|
|
351
|
-
updatedTestFile,
|
|
352
|
-
});
|
|
353
|
-
}
|
|
354
|
-
return updatedTestFile;
|
|
355
|
-
}
|
|
356
|
-
exports.replaceCreateTestWithNewCode = replaceCreateTestWithNewCode;
|
|
357
|
-
const injectCodeSnippetBySuiteChain = ({ testFileContent, codeSnippet, suites, }) => {
|
|
358
|
-
const project = new ts_morph_1.Project();
|
|
359
|
-
// Add the source file content directly into memory
|
|
360
|
-
const sourceFile = project.createSourceFile("test-file.ts", testFileContent);
|
|
361
|
-
// Function to insert the test into the appropriate describe block
|
|
362
|
-
let parentNode = sourceFile;
|
|
363
|
-
if (!suites.length) {
|
|
364
|
-
parentNode.addStatements(codeSnippet);
|
|
365
|
-
return sourceFile.getFullText();
|
|
366
|
-
}
|
|
367
|
-
suites.forEach((suiteName, index) => {
|
|
368
|
-
// Try to find the describe block with the given name
|
|
369
|
-
let describeBlock = parentNode
|
|
370
|
-
.getDescendantsOfKind(ts_morph_1.SyntaxKind.CallExpression)
|
|
371
|
-
.find((callExpr) => {
|
|
372
|
-
const expression = callExpr.getExpression();
|
|
373
|
-
const firstArg = callExpr?.getArguments()?.[0];
|
|
374
|
-
return (expression?.getText() === "test.describe" &&
|
|
375
|
-
firstArg?.getLiteralText() === suiteName);
|
|
376
|
-
});
|
|
377
|
-
// If the describe block doesn't exist, create it
|
|
378
|
-
if (!describeBlock) {
|
|
379
|
-
const newDescribe = `\n\ntest.describe("${suiteName}", () => {});`;
|
|
380
|
-
parentNode.addStatements(newDescribe);
|
|
381
|
-
describeBlock = parentNode
|
|
382
|
-
.getDescendantsOfKind(ts_morph_1.SyntaxKind.CallExpression)
|
|
383
|
-
.find((callExpr) => {
|
|
384
|
-
const expression = callExpr.getExpression();
|
|
385
|
-
const firstArg = callExpr?.getArguments()?.[0];
|
|
386
|
-
return (expression?.getText() === "test.describe" &&
|
|
387
|
-
firstArg?.getLiteralText() === suiteName);
|
|
388
|
-
});
|
|
389
|
-
}
|
|
390
|
-
// If it's the last in the chain, add the test block inside this describe
|
|
391
|
-
if (index === suites.length - 1) {
|
|
392
|
-
const block = describeBlock?.getArguments()[1];
|
|
393
|
-
block.addStatements(codeSnippet);
|
|
394
|
-
}
|
|
395
|
-
// Update parentNode to navigate deeper into nested describe blocks
|
|
396
|
-
parentNode = describeBlock.getArguments()[1];
|
|
397
|
-
});
|
|
398
|
-
return sourceFile.getFullText();
|
|
399
|
-
};
|
|
400
|
-
exports.injectCodeSnippetBySuiteChain = injectCodeSnippetBySuiteChain;
|
|
401
|
-
const importAllExportsStmtFromFilePaths = async (repoDir, filePaths, testFilePath) => {
|
|
402
|
-
const statements = [];
|
|
403
|
-
for (const filePath of filePaths) {
|
|
404
|
-
const fullPath = path_1.default.resolve(repoDir, filePath);
|
|
405
|
-
let importPath = path_1.default.relative(path_1.default.dirname(testFilePath), filePath);
|
|
406
|
-
if (!importPath.startsWith(".")) {
|
|
407
|
-
importPath = "./" + importPath;
|
|
408
|
-
}
|
|
409
|
-
const file = await fs_extra_1.default.readFile(fullPath, "utf-8");
|
|
410
|
-
const project = new ts_morph_1.Project();
|
|
411
|
-
const sourceFile = project.createSourceFile("index.ts", file);
|
|
412
|
-
const exportedFunctions = sourceFile
|
|
413
|
-
.getFunctions()
|
|
414
|
-
.filter((fn) => fn.isExported())
|
|
415
|
-
.map((fn) => fn.getName());
|
|
416
|
-
const exportedVariables = sourceFile
|
|
417
|
-
.getVariableDeclarations()
|
|
418
|
-
.filter((v) => v.isExported())
|
|
419
|
-
.map((fn) => fn.getName());
|
|
420
|
-
const imports = [...exportedFunctions, ...exportedVariables];
|
|
421
|
-
const importStatement = `import { ${imports.join(",")} } from '${importPath.replace(".ts", "")}';`;
|
|
422
|
-
statements.push(importStatement);
|
|
423
|
-
}
|
|
424
|
-
return statements;
|
|
425
|
-
};
|
|
426
|
-
exports.importAllExportsStmtFromFilePaths = importAllExportsStmtFromFilePaths;
|
|
427
|
-
async function addUserContextFixture({ scenarioName, filePath, suites, }) {
|
|
428
|
-
// TODO: remove this check when we support user context across repos
|
|
429
|
-
let fixtureContent = "";
|
|
430
|
-
try {
|
|
431
|
-
fixtureContent = await fs_extra_1.default.readFile("./tests/fixtures.ts", "utf-8");
|
|
432
|
-
}
|
|
433
|
-
catch (e) {
|
|
434
|
-
// do nothing
|
|
435
|
-
}
|
|
436
|
-
if (!fixtureContent || !fixtureContent.includes("userContext")) {
|
|
437
|
-
return;
|
|
438
|
-
}
|
|
439
|
-
const fileContent = await fs_extra_1.default.readFile(filePath, "utf-8");
|
|
440
|
-
const { testNode } = getTypescriptTestBlock({
|
|
441
|
-
scenarioName,
|
|
442
|
-
content: fileContent,
|
|
443
|
-
suites,
|
|
444
|
-
});
|
|
445
|
-
const currentBlock = testNode?.getText();
|
|
446
|
-
const arrowFunction = testNode?.getFirstDescendantByKind(ts_morph_1.SyntaxKind.ArrowFunction);
|
|
447
|
-
if (arrowFunction) {
|
|
448
|
-
const param = arrowFunction.getParameters()[0]; // Get the first parameter
|
|
449
|
-
const destructuringParam = param?.getFirstDescendantByKind(ts_morph_1.SyntaxKind.ObjectBindingPattern);
|
|
450
|
-
if (destructuringParam) {
|
|
451
|
-
const elements = destructuringParam.getElements();
|
|
452
|
-
const userContextExists = elements.some((e) => e.getText().includes("userContext"));
|
|
453
|
-
if (!userContextExists) {
|
|
454
|
-
const updatedImport = destructuringParam
|
|
455
|
-
.getText()
|
|
456
|
-
.replace(/\s+/g, "") // Replace all whitespace
|
|
457
|
-
.replace(",}", "}") // Remove any trailing commas
|
|
458
|
-
.replace("}", ", userContext }");
|
|
459
|
-
destructuringParam.replaceWithText(updatedImport);
|
|
460
|
-
await fs_extra_1.default.writeFile(filePath, fileContent.replace(currentBlock, testNode.getText()), "utf-8");
|
|
461
|
-
}
|
|
462
|
-
}
|
|
463
|
-
}
|
|
464
|
-
}
|
|
465
|
-
exports.addUserContextFixture = addUserContextFixture;
|
|
466
|
-
async function appendScopeToCreateTest(filePath, scopeVariables) {
|
|
467
|
-
const contents = await fs_extra_1.default.readFile(filePath, "utf-8");
|
|
468
|
-
const project = new ts_morph_1.Project();
|
|
469
|
-
const sourceFile = project.createSourceFile("test.ts", contents);
|
|
470
|
-
const createTestNode = sourceFile
|
|
471
|
-
.getDescendantsOfKind(ts_morph_1.SyntaxKind.CallExpression)
|
|
472
|
-
.find((node) => {
|
|
473
|
-
const expression = node.getExpression();
|
|
474
|
-
return expression && expression.getText() === "createTest";
|
|
475
|
-
});
|
|
476
|
-
if (!createTestNode) {
|
|
477
|
-
throw new Error("No createTest call found in the file.");
|
|
478
|
-
}
|
|
479
|
-
const args = createTestNode.getArguments();
|
|
480
|
-
const scopeArgStr = `{ ${scopeVariables.join(", ")} }`;
|
|
481
|
-
createTestNode.insertArgument(args.length, scopeArgStr);
|
|
482
|
-
await fs_extra_1.default.writeFile(filePath, sourceFile.getFullText());
|
|
483
|
-
}
|
|
484
|
-
exports.appendScopeToCreateTest = appendScopeToCreateTest;
|
|
485
|
-
function isTestPresent({ specPath, testCase, }) {
|
|
486
|
-
let isTestPresent = true;
|
|
487
|
-
isTestPresent = fs_extra_1.default.existsSync(specPath);
|
|
488
|
-
if (isTestPresent) {
|
|
489
|
-
const { testBlock } = getTypescriptTestBlock({
|
|
490
|
-
suites: testCase.suites,
|
|
491
|
-
scenarioName: testCase.name,
|
|
492
|
-
content: fs_extra_1.default.readFileSync(specPath, "utf-8"),
|
|
493
|
-
});
|
|
494
|
-
isTestPresent = Boolean(testBlock);
|
|
495
|
-
}
|
|
496
|
-
return isTestPresent;
|
|
497
|
-
}
|
|
498
|
-
exports.isTestPresent = isTestPresent;
|
|
499
|
-
function buildTestNamePrompt({ testName, suites, }) {
|
|
500
|
-
return suites?.length
|
|
501
|
-
? suites.reduce((text, suite) => {
|
|
502
|
-
text += `Describe block: ${suite} ----> `;
|
|
503
|
-
return text;
|
|
504
|
-
}, "") + testName
|
|
505
|
-
: testName;
|
|
506
|
-
}
|
|
507
|
-
exports.buildTestNamePrompt = buildTestNamePrompt;
|
|
508
|
-
function getVariableDeclarationsFromCode(sourceCode) {
|
|
509
|
-
const project = new ts_morph_1.Project();
|
|
510
|
-
const sourceFile = project.createSourceFile("temp.ts", sourceCode);
|
|
511
|
-
// Extract variable declarations
|
|
512
|
-
const variables = sourceFile.getDescendantsOfKind(ts_morph_1.SyntaxKind.VariableDeclaration);
|
|
513
|
-
// Function to extract individual variables from destructured declarations
|
|
514
|
-
function extractVariables(variable) {
|
|
515
|
-
const nameNode = variable.getNameNode();
|
|
516
|
-
if (nameNode.getKind() === ts_morph_1.SyntaxKind.ObjectBindingPattern) {
|
|
517
|
-
// For object destructuring
|
|
518
|
-
return nameNode.getElements().map((element) => element.getName());
|
|
519
|
-
}
|
|
520
|
-
else if (nameNode.getKind() === ts_morph_1.SyntaxKind.ArrayBindingPattern) {
|
|
521
|
-
// For array destructuring
|
|
522
|
-
return nameNode.getElements().map((element) => element.getText());
|
|
523
|
-
}
|
|
524
|
-
else {
|
|
525
|
-
// For regular variable declarations
|
|
526
|
-
return [variable.getName()];
|
|
527
|
-
}
|
|
528
|
-
}
|
|
529
|
-
// Collect all variable names
|
|
530
|
-
const allVariables = variables.flatMap((variable) => extractVariables(variable));
|
|
531
|
-
return allVariables;
|
|
532
|
-
}
|
|
533
|
-
exports.getVariableDeclarationsFromCode = getVariableDeclarationsFromCode;
|
|
534
|
-
function isSyntaxValid(code) {
|
|
535
|
-
let isSyntaxValid = true;
|
|
536
|
-
try {
|
|
537
|
-
(0, parser_1.parse)(code, { sourceType: "module", plugins: ["typescript"] }); // Attempt to parse the code
|
|
538
|
-
}
|
|
539
|
-
catch (error) {
|
|
540
|
-
isSyntaxValid = false;
|
|
541
|
-
}
|
|
542
|
-
return isSyntaxValid;
|
|
543
|
-
}
|
|
544
|
-
exports.isSyntaxValid = isSyntaxValid;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ts-path-import-validate.d.ts","sourceRoot":"","sources":["../../../../../../src/bin/utils/platform/web/test-files/ts-path-import-validate.ts"],"names":[],"mappings":""}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const path_1 = __importDefault(require("path"));
|
|
7
|
-
console.log(path_1.default);
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import type { TestGenConfig } from "@empiricalrun/shared-types";
|
|
2
|
-
import { CliOptions } from "../index";
|
|
3
|
-
export declare function buildTokenFromOptions(options: Omit<CliOptions, "token">): string;
|
|
4
|
-
export declare function buildTestConfigFromOptions(options: Omit<CliOptions, "token">): TestGenConfig;
|
|
5
|
-
export declare function loadTestConfigs(testGenToken: string): TestGenConfig;
|
|
6
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/bin/utils/scenarios/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,aAAa,EAEd,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAetC,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,GACjC,MAAM,CAgBR;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,GACjC,aAAa,CAaf;AAED,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,aAAa,CAmBnE"}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.loadTestConfigs = exports.buildTestConfigFromOptions = exports.buildTokenFromOptions = void 0;
|
|
4
|
-
function buildTokenFromOptions(options) {
|
|
5
|
-
const genConfig = buildTestConfigFromOptions(options);
|
|
6
|
-
const requestConfig = {
|
|
7
|
-
specPath: genConfig.specPath,
|
|
8
|
-
id: genConfig.testCase.id,
|
|
9
|
-
name: genConfig.testCase.name,
|
|
10
|
-
steps: genConfig.testCase.steps,
|
|
11
|
-
filePath: genConfig.testCase.filePath,
|
|
12
|
-
suites: genConfig.testCase.suites,
|
|
13
|
-
ai_gist: genConfig.testCase.ai_gist,
|
|
14
|
-
build: genConfig.build,
|
|
15
|
-
options: genConfig.options,
|
|
16
|
-
environment: genConfig.environment,
|
|
17
|
-
testErrorDiagnosis: genConfig.testErrorDiagnosis,
|
|
18
|
-
};
|
|
19
|
-
return btoa(encodeURIComponent(JSON.stringify(requestConfig)));
|
|
20
|
-
}
|
|
21
|
-
exports.buildTokenFromOptions = buildTokenFromOptions;
|
|
22
|
-
function buildTestConfigFromOptions(options) {
|
|
23
|
-
return {
|
|
24
|
-
specPath: `./tests/${options.file}`,
|
|
25
|
-
testCase: {
|
|
26
|
-
id: 0,
|
|
27
|
-
name: options.name,
|
|
28
|
-
steps: [options.prompt],
|
|
29
|
-
filePath: options.file,
|
|
30
|
-
suites: options.suites
|
|
31
|
-
? options.suites.split(",").map((s) => s.trim())
|
|
32
|
-
: [],
|
|
33
|
-
},
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
exports.buildTestConfigFromOptions = buildTestConfigFromOptions;
|
|
37
|
-
function loadTestConfigs(testGenToken) {
|
|
38
|
-
const str = decodeURIComponent(atob(testGenToken));
|
|
39
|
-
const config = JSON.parse(str);
|
|
40
|
-
const specPath = `./tests/${config.filePath || "index.spec.ts"}`;
|
|
41
|
-
return {
|
|
42
|
-
specPath,
|
|
43
|
-
testCase: {
|
|
44
|
-
id: config.id,
|
|
45
|
-
name: config.name,
|
|
46
|
-
steps: config.steps.filter((s) => !!s),
|
|
47
|
-
filePath: config.filePath,
|
|
48
|
-
suites: config.suites,
|
|
49
|
-
ai_gist: config.ai_gist,
|
|
50
|
-
},
|
|
51
|
-
testErrorDiagnosis: config.testErrorDiagnosis,
|
|
52
|
-
build: config.build,
|
|
53
|
-
options: config.options,
|
|
54
|
-
environment: config.environment,
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
exports.loadTestConfigs = loadTestConfigs;
|