@empiricalrun/playwright-utils 0.22.7 → 0.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/bundled/test-gen/actions/assert.d.ts +4 -0
- package/bundled/test-gen/actions/assert.d.ts.map +1 -0
- package/bundled/test-gen/actions/assert.js +50 -0
- package/bundled/test-gen/actions/click.d.ts +4 -0
- package/bundled/test-gen/actions/click.d.ts.map +1 -0
- package/bundled/test-gen/actions/click.js +51 -0
- package/bundled/test-gen/actions/constants/index.d.ts +2 -0
- package/bundled/test-gen/actions/constants/index.d.ts.map +1 -0
- package/bundled/test-gen/actions/constants/index.js +4 -0
- package/bundled/test-gen/actions/done.d.ts +4 -0
- package/bundled/test-gen/actions/done.d.ts.map +1 -0
- package/bundled/test-gen/actions/done.js +30 -0
- package/bundled/test-gen/actions/fill.d.ts +4 -0
- package/bundled/test-gen/actions/fill.d.ts.map +1 -0
- package/bundled/test-gen/actions/fill.js +82 -0
- package/bundled/test-gen/actions/goto.d.ts +4 -0
- package/bundled/test-gen/actions/goto.d.ts.map +1 -0
- package/bundled/test-gen/actions/goto.js +47 -0
- package/bundled/test-gen/actions/hover.d.ts +4 -0
- package/bundled/test-gen/actions/hover.d.ts.map +1 -0
- package/bundled/test-gen/actions/hover.js +51 -0
- package/bundled/test-gen/actions/index.d.ts +30 -0
- package/bundled/test-gen/actions/index.d.ts.map +1 -0
- package/bundled/test-gen/actions/index.js +159 -0
- package/bundled/test-gen/actions/next-task.d.ts +53 -0
- package/bundled/test-gen/actions/next-task.d.ts.map +1 -0
- package/bundled/test-gen/actions/next-task.js +58 -0
- package/bundled/test-gen/actions/press.d.ts +4 -0
- package/bundled/test-gen/actions/press.d.ts.map +1 -0
- package/bundled/test-gen/actions/press.js +56 -0
- package/bundled/test-gen/actions/skill.d.ts +21 -0
- package/bundled/test-gen/actions/skill.d.ts.map +1 -0
- package/bundled/test-gen/actions/skill.js +127 -0
- package/bundled/test-gen/actions/text-content.d.ts +4 -0
- package/bundled/test-gen/actions/text-content.d.ts.map +1 -0
- package/bundled/test-gen/actions/text-content.js +58 -0
- package/bundled/test-gen/actions/utils/index.d.ts +10 -0
- package/bundled/test-gen/actions/utils/index.d.ts.map +1 -0
- package/bundled/test-gen/actions/utils/index.js +109 -0
- package/bundled/test-gen/agent/browsing/index.d.ts +15 -0
- package/bundled/test-gen/agent/browsing/index.d.ts.map +1 -0
- package/bundled/test-gen/agent/browsing/index.js +68 -0
- package/bundled/test-gen/agent/browsing/run.d.ts +19 -0
- package/bundled/test-gen/agent/browsing/run.d.ts.map +1 -0
- package/bundled/test-gen/agent/browsing/run.js +88 -0
- package/bundled/test-gen/agent/browsing/utils.d.ts +41 -0
- package/bundled/test-gen/agent/browsing/utils.d.ts.map +1 -0
- package/bundled/test-gen/agent/browsing/utils.js +406 -0
- package/bundled/test-gen/agent/codegen/create-test-block.d.ts +9 -0
- package/bundled/test-gen/agent/codegen/create-test-block.d.ts.map +1 -0
- package/bundled/test-gen/agent/codegen/create-test-block.js +63 -0
- package/bundled/test-gen/agent/codegen/fix-ts-errors.d.ts +13 -0
- package/bundled/test-gen/agent/codegen/fix-ts-errors.d.ts.map +1 -0
- package/bundled/test-gen/agent/codegen/fix-ts-errors.js +80 -0
- package/bundled/test-gen/agent/codegen/generate-code-apply-changes.d.ts +13 -0
- package/bundled/test-gen/agent/codegen/generate-code-apply-changes.d.ts.map +1 -0
- package/bundled/test-gen/agent/codegen/generate-code-apply-changes.js +381 -0
- package/bundled/test-gen/agent/codegen/lexical-scoped-vars.d.ts +9 -0
- package/bundled/test-gen/agent/codegen/lexical-scoped-vars.d.ts.map +1 -0
- package/bundled/test-gen/agent/codegen/lexical-scoped-vars.js +56 -0
- package/bundled/test-gen/agent/codegen/repo-edit.d.ts +23 -0
- package/bundled/test-gen/agent/codegen/repo-edit.d.ts.map +1 -0
- package/bundled/test-gen/agent/codegen/repo-edit.js +86 -0
- package/bundled/test-gen/agent/codegen/run.d.ts +16 -0
- package/bundled/test-gen/agent/codegen/run.d.ts.map +1 -0
- package/bundled/test-gen/agent/codegen/run.js +119 -0
- package/bundled/test-gen/agent/codegen/skills-retriever.d.ts +26 -0
- package/bundled/test-gen/agent/codegen/skills-retriever.d.ts.map +1 -0
- package/bundled/test-gen/agent/codegen/skills-retriever.js +93 -0
- package/bundled/test-gen/agent/codegen/test-update-feedback.d.ts +12 -0
- package/bundled/test-gen/agent/codegen/test-update-feedback.d.ts.map +1 -0
- package/bundled/test-gen/agent/codegen/test-update-feedback.js +50 -0
- package/bundled/test-gen/agent/codegen/types.d.ts +25 -0
- package/bundled/test-gen/agent/codegen/types.d.ts.map +1 -0
- package/bundled/test-gen/agent/codegen/types.js +8 -0
- package/bundled/test-gen/agent/codegen/update-flow.d.ts +34 -0
- package/bundled/test-gen/agent/codegen/update-flow.d.ts.map +1 -0
- package/bundled/test-gen/agent/codegen/update-flow.js +300 -0
- package/bundled/test-gen/agent/codegen/use-skill.d.ts +11 -0
- package/bundled/test-gen/agent/codegen/use-skill.d.ts.map +1 -0
- package/bundled/test-gen/agent/codegen/use-skill.js +54 -0
- package/bundled/test-gen/agent/codegen/utils.d.ts +126 -0
- package/bundled/test-gen/agent/codegen/utils.d.ts.map +1 -0
- package/bundled/test-gen/agent/codegen/utils.js +416 -0
- package/bundled/test-gen/agent/diagnosis-agent/index.d.ts +18 -0
- package/bundled/test-gen/agent/diagnosis-agent/index.d.ts.map +1 -0
- package/bundled/test-gen/agent/diagnosis-agent/index.js +105 -0
- package/bundled/test-gen/agent/diagnosis-agent/strict-mode-violation.d.ts +9 -0
- package/bundled/test-gen/agent/diagnosis-agent/strict-mode-violation.d.ts.map +1 -0
- package/bundled/test-gen/agent/diagnosis-agent/strict-mode-violation.js +31 -0
- package/bundled/test-gen/agent/enrich-prompt/index.d.ts +12 -0
- package/bundled/test-gen/agent/enrich-prompt/index.d.ts.map +1 -0
- package/bundled/test-gen/agent/enrich-prompt/index.js +81 -0
- package/bundled/test-gen/agent/enrich-prompt/utils.d.ts +6 -0
- package/bundled/test-gen/agent/enrich-prompt/utils.d.ts.map +1 -0
- package/bundled/test-gen/agent/enrich-prompt/utils.js +12 -0
- package/bundled/test-gen/agent/infer-agent/index.d.ts +10 -0
- package/bundled/test-gen/agent/infer-agent/index.d.ts.map +1 -0
- package/bundled/test-gen/agent/infer-agent/index.js +70 -0
- package/bundled/test-gen/agent/master/action-tool-calls.d.ts +42 -0
- package/bundled/test-gen/agent/master/action-tool-calls.d.ts.map +1 -0
- package/bundled/test-gen/agent/master/action-tool-calls.js +87 -0
- package/bundled/test-gen/agent/master/browser-tests/fixtures.d.ts +9 -0
- package/bundled/test-gen/agent/master/browser-tests/fixtures.d.ts.map +1 -0
- package/bundled/test-gen/agent/master/browser-tests/fixtures.js +33 -0
- package/bundled/test-gen/agent/master/browser-tests/index.spec.d.ts +2 -0
- package/bundled/test-gen/agent/master/browser-tests/index.spec.d.ts.map +1 -0
- package/bundled/test-gen/agent/master/browser-tests/index.spec.js +113 -0
- package/bundled/test-gen/agent/master/browser-tests/skills.spec.d.ts +2 -0
- package/bundled/test-gen/agent/master/browser-tests/skills.spec.d.ts.map +1 -0
- package/bundled/test-gen/agent/master/browser-tests/skills.spec.js +109 -0
- package/bundled/test-gen/agent/master/element-annotation.d.ts +30 -0
- package/bundled/test-gen/agent/master/element-annotation.d.ts.map +1 -0
- package/bundled/test-gen/agent/master/element-annotation.js +195 -0
- package/bundled/test-gen/agent/master/execute-browser-action.d.ts +24 -0
- package/bundled/test-gen/agent/master/execute-browser-action.d.ts.map +1 -0
- package/bundled/test-gen/agent/master/execute-browser-action.js +124 -0
- package/bundled/test-gen/agent/master/execute-skill-action.d.ts +11 -0
- package/bundled/test-gen/agent/master/execute-skill-action.d.ts.map +1 -0
- package/bundled/test-gen/agent/master/execute-skill-action.js +25 -0
- package/bundled/test-gen/agent/master/icon-descriptor/index.d.ts +22 -0
- package/bundled/test-gen/agent/master/icon-descriptor/index.d.ts.map +1 -0
- package/bundled/test-gen/agent/master/icon-descriptor/index.js +250 -0
- package/bundled/test-gen/agent/master/icon-descriptor/normalize-svg.d.ts +2 -0
- package/bundled/test-gen/agent/master/icon-descriptor/normalize-svg.d.ts.map +1 -0
- package/bundled/test-gen/agent/master/icon-descriptor/normalize-svg.js +248 -0
- package/bundled/test-gen/agent/master/next-action.d.ts +22 -0
- package/bundled/test-gen/agent/master/next-action.d.ts.map +1 -0
- package/bundled/test-gen/agent/master/next-action.js +104 -0
- package/bundled/test-gen/agent/master/planner.d.ts +15 -0
- package/bundled/test-gen/agent/master/planner.d.ts.map +1 -0
- package/bundled/test-gen/agent/master/planner.js +144 -0
- package/bundled/test-gen/agent/master/run.d.ts +15 -0
- package/bundled/test-gen/agent/master/run.d.ts.map +1 -0
- package/bundled/test-gen/agent/master/run.js +274 -0
- package/bundled/test-gen/agent/master/scroller.d.ts +15 -0
- package/bundled/test-gen/agent/master/scroller.d.ts.map +1 -0
- package/bundled/test-gen/agent/master/scroller.js +375 -0
- package/bundled/test-gen/agent/master/with-hints.d.ts +17 -0
- package/bundled/test-gen/agent/master/with-hints.d.ts.map +1 -0
- package/bundled/test-gen/agent/master/with-hints.js +102 -0
- package/bundled/test-gen/agent/planner/run-time-planner.d.ts +15 -0
- package/bundled/test-gen/agent/planner/run-time-planner.d.ts.map +1 -0
- package/bundled/test-gen/agent/planner/run-time-planner.js +100 -0
- package/bundled/test-gen/agent/planner/run.d.ts +7 -0
- package/bundled/test-gen/agent/planner/run.d.ts.map +1 -0
- package/bundled/test-gen/agent/planner/run.js +127 -0
- package/bundled/test-gen/agent/utils.d.ts +2 -0
- package/bundled/test-gen/agent/utils.d.ts.map +1 -0
- package/bundled/test-gen/agent/utils.js +12 -0
- package/bundled/test-gen/bin/index.d.ts +3 -0
- package/bundled/test-gen/bin/index.d.ts.map +1 -0
- package/bundled/test-gen/bin/index.js +212 -0
- package/bundled/test-gen/bin/logger/index.d.ts +14 -0
- package/bundled/test-gen/bin/logger/index.d.ts.map +1 -0
- package/bundled/test-gen/bin/logger/index.js +57 -0
- package/bundled/test-gen/bin/utils/context.d.ts +13 -0
- package/bundled/test-gen/bin/utils/context.d.ts.map +1 -0
- package/bundled/test-gen/bin/utils/context.js +67 -0
- package/bundled/test-gen/bin/utils/fs/index.d.ts +6 -0
- package/bundled/test-gen/bin/utils/fs/index.d.ts.map +1 -0
- package/bundled/test-gen/bin/utils/fs/index.js +63 -0
- package/bundled/test-gen/bin/utils/index.d.ts +9 -0
- package/bundled/test-gen/bin/utils/index.d.ts.map +1 -0
- package/bundled/test-gen/bin/utils/index.js +64 -0
- package/bundled/test-gen/bin/utils/platform/web/index.d.ts +78 -0
- package/bundled/test-gen/bin/utils/platform/web/index.d.ts.map +1 -0
- package/bundled/test-gen/bin/utils/platform/web/index.js +544 -0
- package/bundled/test-gen/bin/utils/platform/web/test-files/ts-path-import-validate.d.ts +2 -0
- package/bundled/test-gen/bin/utils/platform/web/test-files/ts-path-import-validate.d.ts.map +1 -0
- package/bundled/test-gen/bin/utils/platform/web/test-files/ts-path-import-validate.js +7 -0
- package/bundled/test-gen/bin/utils/scenarios/index.d.ts +6 -0
- package/bundled/test-gen/bin/utils/scenarios/index.d.ts.map +1 -0
- package/bundled/test-gen/bin/utils/scenarios/index.js +57 -0
- package/bundled/test-gen/browser-injected-scripts/annotate-elements.js +615 -0
- package/bundled/test-gen/browser-injected-scripts/annotate-elements.spec.d.ts +2 -0
- package/bundled/test-gen/browser-injected-scripts/annotate-elements.spec.d.ts.map +1 -0
- package/bundled/test-gen/browser-injected-scripts/annotate-elements.spec.js +207 -0
- package/bundled/test-gen/browser-injected-scripts/annotate-elements.spec.ts +332 -0
- package/bundled/test-gen/constants/index.d.ts +7 -0
- package/bundled/test-gen/constants/index.d.ts.map +1 -0
- package/bundled/test-gen/constants/index.js +18 -0
- package/bundled/test-gen/errors/index.d.ts +5 -0
- package/bundled/test-gen/errors/index.d.ts.map +1 -0
- package/bundled/test-gen/errors/index.js +9 -0
- package/bundled/test-gen/evals/add-scenario-agent.evals.d.ts +4 -0
- package/bundled/test-gen/evals/add-scenario-agent.evals.d.ts.map +1 -0
- package/bundled/test-gen/evals/add-scenario-agent.evals.js +44 -0
- package/bundled/test-gen/evals/append-create-test-agent.evals.d.ts +4 -0
- package/bundled/test-gen/evals/append-create-test-agent.evals.d.ts.map +1 -0
- package/bundled/test-gen/evals/append-create-test-agent.evals.js +117 -0
- package/bundled/test-gen/evals/fetch-pom-skills-agent.evals.d.ts +4 -0
- package/bundled/test-gen/evals/fetch-pom-skills-agent.evals.d.ts.map +1 -0
- package/bundled/test-gen/evals/fetch-pom-skills-agent.evals.js +36 -0
- package/bundled/test-gen/evals/infer-master-or-code-agent.evals.d.ts +4 -0
- package/bundled/test-gen/evals/infer-master-or-code-agent.evals.d.ts.map +1 -0
- package/bundled/test-gen/evals/infer-master-or-code-agent.evals.js +22 -0
- package/bundled/test-gen/evals/master-agent.evals.d.ts +4 -0
- package/bundled/test-gen/evals/master-agent.evals.d.ts.map +1 -0
- package/bundled/test-gen/evals/master-agent.evals.js +35 -0
- package/bundled/test-gen/evals/type.d.ts +12 -0
- package/bundled/test-gen/evals/type.d.ts.map +1 -0
- package/bundled/test-gen/evals/type.js +2 -0
- package/bundled/test-gen/evals/update-scenario-agent.evals.d.ts +4 -0
- package/bundled/test-gen/evals/update-scenario-agent.evals.d.ts.map +1 -0
- package/bundled/test-gen/evals/update-scenario-agent.evals.js +47 -0
- package/bundled/test-gen/file/client.d.ts +14 -0
- package/bundled/test-gen/file/client.d.ts.map +1 -0
- package/bundled/test-gen/file/client.js +48 -0
- package/bundled/test-gen/file/server.d.ts +13 -0
- package/bundled/test-gen/file/server.d.ts.map +1 -0
- package/bundled/test-gen/file/server.js +52 -0
- package/bundled/test-gen/human-in-the-loop/cli.d.ts +2 -0
- package/bundled/test-gen/human-in-the-loop/cli.d.ts.map +1 -0
- package/bundled/test-gen/human-in-the-loop/cli.js +24 -0
- package/bundled/test-gen/human-in-the-loop/index.d.ts +12 -0
- package/bundled/test-gen/human-in-the-loop/index.d.ts.map +1 -0
- package/bundled/test-gen/human-in-the-loop/index.js +30 -0
- package/bundled/test-gen/human-in-the-loop/ipc.d.ts +4 -0
- package/bundled/test-gen/human-in-the-loop/ipc.d.ts.map +1 -0
- package/bundled/test-gen/human-in-the-loop/ipc.js +47 -0
- package/bundled/test-gen/index.d.ts +4 -0
- package/bundled/test-gen/index.d.ts.map +1 -0
- package/bundled/test-gen/index.js +55 -0
- package/bundled/test-gen/package.json +106 -0
- package/bundled/test-gen/page/index.d.ts +11 -0
- package/bundled/test-gen/page/index.d.ts.map +1 -0
- package/bundled/test-gen/page/index.js +16 -0
- package/bundled/test-gen/prompts/lib/ts-transformer.d.ts +4 -0
- package/bundled/test-gen/prompts/lib/ts-transformer.d.ts.map +1 -0
- package/bundled/test-gen/prompts/lib/ts-transformer.js +92 -0
- package/bundled/test-gen/reporter/index.d.ts +33 -0
- package/bundled/test-gen/reporter/index.d.ts.map +1 -0
- package/bundled/test-gen/reporter/index.js +161 -0
- package/bundled/test-gen/session/index.d.ts +20 -0
- package/bundled/test-gen/session/index.d.ts.map +1 -0
- package/bundled/test-gen/session/index.js +105 -0
- package/bundled/test-gen/test-build/index.d.ts +10 -0
- package/bundled/test-gen/test-build/index.d.ts.map +1 -0
- package/bundled/test-gen/test-build/index.js +30 -0
- package/bundled/test-gen/types/index.d.ts +69 -0
- package/bundled/test-gen/types/index.d.ts.map +1 -0
- package/bundled/test-gen/types/index.js +2 -0
- package/bundled/test-gen/uploader/index.d.ts +26 -0
- package/bundled/test-gen/uploader/index.d.ts.map +1 -0
- package/bundled/test-gen/uploader/index.js +102 -0
- package/bundled/test-gen/utils/env.d.ts +2 -0
- package/bundled/test-gen/utils/env.d.ts.map +1 -0
- package/bundled/test-gen/utils/env.js +9 -0
- package/bundled/test-gen/utils/exec.d.ts +4 -0
- package/bundled/test-gen/utils/exec.d.ts.map +1 -0
- package/bundled/test-gen/utils/exec.js +45 -0
- package/bundled/test-gen/utils/file.d.ts +2 -0
- package/bundled/test-gen/utils/file.d.ts.map +1 -0
- package/bundled/test-gen/utils/file.js +25 -0
- package/bundled/test-gen/utils/html.d.ts +4 -0
- package/bundled/test-gen/utils/html.d.ts.map +1 -0
- package/bundled/test-gen/utils/html.js +46 -0
- package/bundled/test-gen/utils/index.d.ts +2 -0
- package/bundled/test-gen/utils/index.d.ts.map +1 -0
- package/bundled/test-gen/utils/index.js +5 -0
- package/bundled/test-gen/utils/pw-test.d.ts +3 -0
- package/bundled/test-gen/utils/pw-test.d.ts.map +1 -0
- package/bundled/test-gen/utils/pw-test.js +26 -0
- package/bundled/test-gen/utils/slug.d.ts +2 -0
- package/bundled/test-gen/utils/slug.d.ts.map +1 -0
- package/bundled/test-gen/utils/slug.js +18 -0
- package/bundled/test-gen/utils/string.d.ts +2 -0
- package/bundled/test-gen/utils/string.d.ts.map +1 -0
- package/bundled/test-gen/utils/string.js +9 -0
- package/dist/overlay-tests/click.spec.js +1 -1
- package/package.json +3 -3
- package/scripts/prepare-publish.js +42 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.waitForLogsToFlush = exports.CustomLogger = void 0;
|
|
4
|
+
const reporter_1 = require("@empiricalrun/reporter");
|
|
5
|
+
const picocolors_1 = require("picocolors");
|
|
6
|
+
const reporter_2 = require("../../reporter");
|
|
7
|
+
let queuedReporterMessages = [];
|
|
8
|
+
class CustomLogger {
|
|
9
|
+
useReporter = false;
|
|
10
|
+
constructor({ useReporter = true } = {}) {
|
|
11
|
+
this.useReporter = useReporter;
|
|
12
|
+
}
|
|
13
|
+
logToReporter(message) {
|
|
14
|
+
if (this.useReporter) {
|
|
15
|
+
(() => {
|
|
16
|
+
const promise = (0, reporter_2.getReporter)()?.report(new reporter_1.ProcessLogMessageBuilder({ type: "message", message: message }));
|
|
17
|
+
if (promise) {
|
|
18
|
+
queuedReporterMessages.push(promise);
|
|
19
|
+
}
|
|
20
|
+
})();
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
log(message, ...optionalParams) {
|
|
24
|
+
console.log("🪵", (0, picocolors_1.cyan)(message), ...optionalParams);
|
|
25
|
+
this.logToReporter(message);
|
|
26
|
+
}
|
|
27
|
+
warn(message, ...optionalParams) {
|
|
28
|
+
console.log("🟡", (0, picocolors_1.yellow)(message), ...optionalParams);
|
|
29
|
+
this.logToReporter(message);
|
|
30
|
+
}
|
|
31
|
+
success(message, ...optionalParams) {
|
|
32
|
+
console.log("✅", (0, picocolors_1.green)(message), ...optionalParams);
|
|
33
|
+
this.logToReporter(message);
|
|
34
|
+
}
|
|
35
|
+
error(message, ...optionalParams) {
|
|
36
|
+
console.error("🚨", (0, picocolors_1.red)(message), ...optionalParams);
|
|
37
|
+
this.logToReporter(message);
|
|
38
|
+
}
|
|
39
|
+
logEmptyLine() {
|
|
40
|
+
console.log("\n\n");
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
exports.CustomLogger = CustomLogger;
|
|
44
|
+
async function waitForLogsToFlush() {
|
|
45
|
+
if (queuedReporterMessages.length === 0) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
await Promise.all(queuedReporterMessages);
|
|
50
|
+
}
|
|
51
|
+
catch (e) {
|
|
52
|
+
console.warn("Error while flushing logs", e);
|
|
53
|
+
// resolving this as this is not a critical operation
|
|
54
|
+
return Promise.resolve();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
exports.waitForLogsToFlush = waitForLogsToFlush;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare function createGitIgnoreFileFilter(): Promise<(pathname: string) => boolean>;
|
|
2
|
+
export declare function contextForGeneration(file?: string): Promise<{
|
|
3
|
+
codePrompt: string | undefined;
|
|
4
|
+
pomPrompt: string | undefined;
|
|
5
|
+
nonSpecFilePrompt: string | undefined;
|
|
6
|
+
testFileContent: string;
|
|
7
|
+
}>;
|
|
8
|
+
export declare function createRepoEditFilter(): Promise<(filePath: string) => boolean>;
|
|
9
|
+
export declare function generateTxtForRepository(): Promise<{
|
|
10
|
+
prompt: string | undefined;
|
|
11
|
+
}>;
|
|
12
|
+
export declare function fetchAppKnowledge(): Promise<string>;
|
|
13
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/bin/utils/context.ts"],"names":[],"mappings":"AAQA,wBAAsB,yBAAyB,2CAe9C;AAED,wBAAsB,oBAAoB,CAAC,IAAI,CAAC,EAAE,MAAM;;;;;GAQvD;AAED,wBAAsB,oBAAoB,uBAItB,MAAM,cAMzB;AAED,wBAAsB,wBAAwB;;GAK7C;AAED,wBAAsB,iBAAiB,oBAYtC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
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.fetchAppKnowledge = exports.generateTxtForRepository = exports.createRepoEditFilter = exports.contextForGeneration = exports.createGitIgnoreFileFilter = void 0;
|
|
7
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
8
|
+
const ignore_1 = __importDefault(require("ignore"));
|
|
9
|
+
const fs_1 = require("./fs");
|
|
10
|
+
async function createGitIgnoreFileFilter() {
|
|
11
|
+
const ignoreFn = (0, ignore_1.default)();
|
|
12
|
+
if (fs_extra_1.default.existsSync(".gitignore")) {
|
|
13
|
+
// Not checking for nested gitignore
|
|
14
|
+
let gitignore = (await fs_extra_1.default.readFile(".gitignore")).toString();
|
|
15
|
+
gitignore = `
|
|
16
|
+
${gitignore}
|
|
17
|
+
.git/
|
|
18
|
+
.github/
|
|
19
|
+
package-lock.json
|
|
20
|
+
`;
|
|
21
|
+
ignoreFn.add(gitignore);
|
|
22
|
+
}
|
|
23
|
+
const filter = ignoreFn.createFilter();
|
|
24
|
+
return filter;
|
|
25
|
+
}
|
|
26
|
+
exports.createGitIgnoreFileFilter = createGitIgnoreFileFilter;
|
|
27
|
+
async function contextForGeneration(file) {
|
|
28
|
+
const filter = await createGitIgnoreFileFilter();
|
|
29
|
+
return {
|
|
30
|
+
codePrompt: await (0, fs_1.generatePromptFromDirectory)("./tests", filter),
|
|
31
|
+
pomPrompt: await (0, fs_1.generatePromptFromDirectory)("./pages", filter),
|
|
32
|
+
nonSpecFilePrompt: await (0, fs_1.generatePromptFromNonSpecFiles)("./tests", filter),
|
|
33
|
+
testFileContent: file ? await fs_extra_1.default.readFile(file, "utf-8") : "",
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
exports.contextForGeneration = contextForGeneration;
|
|
37
|
+
async function createRepoEditFilter() {
|
|
38
|
+
const allowedExtensions = /\.(ts|js|mjs|json|md)$/i;
|
|
39
|
+
const gitIgnoreFilter = await createGitIgnoreFileFilter();
|
|
40
|
+
return (filePath) => {
|
|
41
|
+
return (gitIgnoreFilter(filePath) &&
|
|
42
|
+
(fs_extra_1.default.statSync(filePath).isDirectory() || allowedExtensions.test(filePath)));
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
exports.createRepoEditFilter = createRepoEditFilter;
|
|
46
|
+
async function generateTxtForRepository() {
|
|
47
|
+
const filter = await createRepoEditFilter();
|
|
48
|
+
return {
|
|
49
|
+
prompt: await (0, fs_1.generatePromptFromDirectory)(".", filter),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
exports.generateTxtForRepository = generateTxtForRepository;
|
|
53
|
+
async function fetchAppKnowledge() {
|
|
54
|
+
let fileExists = true;
|
|
55
|
+
const appKnowledgePath = "./app_knowledge.md";
|
|
56
|
+
try {
|
|
57
|
+
await fs_extra_1.default.access(appKnowledgePath);
|
|
58
|
+
}
|
|
59
|
+
catch (e) {
|
|
60
|
+
fileExists = false;
|
|
61
|
+
}
|
|
62
|
+
if (!fileExists) {
|
|
63
|
+
return "";
|
|
64
|
+
}
|
|
65
|
+
return await fs_extra_1.default.readFile(appKnowledgePath, "utf-8");
|
|
66
|
+
}
|
|
67
|
+
exports.fetchAppKnowledge = fetchAppKnowledge;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { FileContent } from "@empiricalrun/shared-types";
|
|
2
|
+
export declare function readFilesInDirectory(dir: string | undefined, filterFunc: (file: string) => boolean): Promise<FileContent[]>;
|
|
3
|
+
export declare function convertFileContentsToString(files?: FileContent[]): string;
|
|
4
|
+
export declare function generatePromptFromDirectory(dir: string | undefined, filterFunc: (file: string) => boolean): Promise<string | undefined>;
|
|
5
|
+
export declare function generatePromptFromNonSpecFiles(dir: string | undefined, filterFunc: (file: string) => boolean): Promise<string | undefined>;
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/bin/utils/fs/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAI9D,wBAAsB,oBAAoB,CACxC,GAAG,oBAAa,EAChB,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,0BAgBtC;AAED,wBAAgB,2BAA2B,CAAC,KAAK,GAAE,WAAW,EAAO,UAQpE;AAED,wBAAsB,2BAA2B,CAC/C,GAAG,oBAAK,EACR,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,+BAStC;AAED,wBAAsB,8BAA8B,CAClD,GAAG,oBAAa,EAChB,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,+BAgBtC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
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.generatePromptFromNonSpecFiles = exports.generatePromptFromDirectory = exports.convertFileContentsToString = exports.readFilesInDirectory = void 0;
|
|
7
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
async function readFilesInDirectory(dir = "", filterFunc) {
|
|
10
|
+
let files = [];
|
|
11
|
+
const items = await fs_extra_1.default.readdir(dir);
|
|
12
|
+
const filteredItems = items.map((i) => path_1.default.join(dir, i)).filter(filterFunc);
|
|
13
|
+
for (const item of filteredItems) {
|
|
14
|
+
const stat = await fs_extra_1.default.stat(item);
|
|
15
|
+
if (stat.isDirectory()) {
|
|
16
|
+
files = files.concat(await readFilesInDirectory(item, filterFunc));
|
|
17
|
+
}
|
|
18
|
+
else if (stat.isFile()) {
|
|
19
|
+
const content = await fs_extra_1.default.readFile(item, "utf-8");
|
|
20
|
+
files.push({ filePath: item, content });
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return files;
|
|
24
|
+
}
|
|
25
|
+
exports.readFilesInDirectory = readFilesInDirectory;
|
|
26
|
+
function convertFileContentsToString(files = []) {
|
|
27
|
+
let prompt = "";
|
|
28
|
+
files.forEach((file) => {
|
|
29
|
+
prompt += `File Path: ${file.filePath}\n`;
|
|
30
|
+
prompt += `File:\n`;
|
|
31
|
+
prompt += `${file.content}\n\n------\n\n`;
|
|
32
|
+
});
|
|
33
|
+
return prompt;
|
|
34
|
+
}
|
|
35
|
+
exports.convertFileContentsToString = convertFileContentsToString;
|
|
36
|
+
async function generatePromptFromDirectory(dir = "", filterFunc) {
|
|
37
|
+
try {
|
|
38
|
+
const files = await readFilesInDirectory(dir, filterFunc);
|
|
39
|
+
const prompt = convertFileContentsToString(files);
|
|
40
|
+
return prompt;
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
console.error("Error reading directory:", error);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
exports.generatePromptFromDirectory = generatePromptFromDirectory;
|
|
47
|
+
async function generatePromptFromNonSpecFiles(dir = "", filterFunc) {
|
|
48
|
+
try {
|
|
49
|
+
let nonSpecFiles = [];
|
|
50
|
+
const files = await readFilesInDirectory(dir, filterFunc);
|
|
51
|
+
for (const file of files) {
|
|
52
|
+
if (!file.filePath.endsWith(".spec.ts")) {
|
|
53
|
+
nonSpecFiles.push(file);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const prompt = convertFileContentsToString(nonSpecFiles);
|
|
57
|
+
return prompt;
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
console.error("Error reading directory:", error);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
exports.generatePromptFromNonSpecFiles = generatePromptFromNonSpecFiles;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/bin/utils/index.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AASD,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,UAAU,CAAC,CAiErB"}
|
|
@@ -0,0 +1,64 @@
|
|
|
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.validateAndCompleteCliOptions = void 0;
|
|
7
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
8
|
+
async function validateAndCompleteCliOptions(options) {
|
|
9
|
+
const hasToken = !!options.token;
|
|
10
|
+
if (hasToken) {
|
|
11
|
+
return options;
|
|
12
|
+
}
|
|
13
|
+
const questions = [];
|
|
14
|
+
if (!options.name) {
|
|
15
|
+
questions.push({
|
|
16
|
+
type: "input",
|
|
17
|
+
name: "name",
|
|
18
|
+
message: "Enter the test name:",
|
|
19
|
+
validate: (input) => input.trim().length > 0 || "Test name is required",
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
if (!options.file) {
|
|
23
|
+
questions.push({
|
|
24
|
+
type: "input",
|
|
25
|
+
name: "file",
|
|
26
|
+
message: "Enter the test file path (inside tests dir):",
|
|
27
|
+
validate: (input) => input.trim().length > 0 || "Test file path is required",
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
if (!options.prompt) {
|
|
31
|
+
questions.push({
|
|
32
|
+
type: "editor",
|
|
33
|
+
name: "prompt",
|
|
34
|
+
message: "Enter the test prompt (opens in your editor):",
|
|
35
|
+
validate: (input) => input.trim().length > 0 || "Test prompt is required",
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
if (!options.suites) {
|
|
39
|
+
questions.push({
|
|
40
|
+
type: "input",
|
|
41
|
+
name: "suites",
|
|
42
|
+
message: "Enter comma-separated test suites (optional):",
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
if (questions.length > 0) {
|
|
46
|
+
// Ask each question individually to avoid type issues
|
|
47
|
+
const answers = {};
|
|
48
|
+
for (const question of questions) {
|
|
49
|
+
const answer = await inquirer_1.default.prompt({
|
|
50
|
+
type: question.type,
|
|
51
|
+
name: "value",
|
|
52
|
+
message: question.message,
|
|
53
|
+
validate: question.validate,
|
|
54
|
+
});
|
|
55
|
+
answers[question.name] = answer.value;
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
...options,
|
|
59
|
+
...answers,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
return options;
|
|
63
|
+
}
|
|
64
|
+
exports.validateAndCompleteCliOptions = validateAndCompleteCliOptions;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { TraceClient } from "@empiricalrun/llm";
|
|
2
|
+
import type { TestCase } from "@empiricalrun/shared-types";
|
|
3
|
+
import { Node, SourceFile } from "ts-morph";
|
|
4
|
+
export declare const getTestModuleAliasFromSourceFile: (sourceFile: SourceFile) => string;
|
|
5
|
+
/**
|
|
6
|
+
* function to get the test block and test node for the scenario
|
|
7
|
+
* @export
|
|
8
|
+
* @param {string} scenarioName
|
|
9
|
+
* @param {string} content
|
|
10
|
+
* @return { testBlock: string; parentDescribe: string; } testBlock - the test block content, testNode - the test function node
|
|
11
|
+
*/
|
|
12
|
+
export declare function getTypescriptTestBlock({ scenarioName, suites, content, }: {
|
|
13
|
+
scenarioName: string;
|
|
14
|
+
suites?: string[];
|
|
15
|
+
content: string;
|
|
16
|
+
}): {
|
|
17
|
+
testBlock: string | undefined;
|
|
18
|
+
testNode: Node | undefined;
|
|
19
|
+
testAlias: string;
|
|
20
|
+
};
|
|
21
|
+
export declare function hasTopLevelDescribeConfigureWithSerialMode(filePath: string): Promise<boolean>;
|
|
22
|
+
/**
|
|
23
|
+
* Function to find the first 'describe' block configured with 'serial: true'
|
|
24
|
+
*
|
|
25
|
+
* e.g.
|
|
26
|
+
*
|
|
27
|
+
* test.describe("foo", () => {
|
|
28
|
+
*
|
|
29
|
+
* test.describe.configure({ mode: "serial" });
|
|
30
|
+
*
|
|
31
|
+
* test.describe("bar", () => {
|
|
32
|
+
*
|
|
33
|
+
* test.describe.configure({ mode: "serial" });
|
|
34
|
+
*
|
|
35
|
+
* })
|
|
36
|
+
*
|
|
37
|
+
* })
|
|
38
|
+
*
|
|
39
|
+
* for the above example,
|
|
40
|
+
* this function will return the first 'describe' block which is named "foo"
|
|
41
|
+
*
|
|
42
|
+
* @param {(Node | undefined)} node
|
|
43
|
+
* @return {(Node | undefined)}
|
|
44
|
+
*/
|
|
45
|
+
export declare function findFirstSerialDescribeBlock(node: Node | undefined): Node | undefined;
|
|
46
|
+
export declare function appendToTestBlock(testBlock: string, content: string): string;
|
|
47
|
+
export declare function validateTypescript(filePath: string): string[];
|
|
48
|
+
export declare function stripAndPrependImports(content: string, testName: string): Promise<(string | undefined)[]>;
|
|
49
|
+
export declare function lintErrors(filePath: string): Promise<void>;
|
|
50
|
+
export declare function formatCode(filePath: string, trace?: TraceClient): Promise<void>;
|
|
51
|
+
export declare function addNewImport(contents: string, modules: string[], pkg: string): string;
|
|
52
|
+
export declare function removeTestOnly(filePath: string): Promise<void>;
|
|
53
|
+
export declare function getFixtureImportPath(filePath: string): string;
|
|
54
|
+
export declare function getPageVariableNameFromCreateTest(filePath: string): Promise<string | undefined>;
|
|
55
|
+
export declare function replaceCreateTestWithNewCode(filePath: string, contents: string, generatedCode: string): string;
|
|
56
|
+
export declare const injectCodeSnippetBySuiteChain: ({ testFileContent, codeSnippet, suites, }: {
|
|
57
|
+
testFileContent: string;
|
|
58
|
+
codeSnippet: string;
|
|
59
|
+
suites: string[];
|
|
60
|
+
}) => string;
|
|
61
|
+
export declare const importAllExportsStmtFromFilePaths: (repoDir: string, filePaths: string[], testFilePath: string) => Promise<string[]>;
|
|
62
|
+
export declare function addUserContextFixture({ scenarioName, filePath, suites, }: {
|
|
63
|
+
scenarioName: string;
|
|
64
|
+
filePath: string;
|
|
65
|
+
suites: string[];
|
|
66
|
+
}): Promise<void>;
|
|
67
|
+
export declare function appendScopeToCreateTest(filePath: string, scopeVariables: string[]): Promise<void>;
|
|
68
|
+
export declare function isTestPresent({ specPath, testCase, }: {
|
|
69
|
+
specPath: string;
|
|
70
|
+
testCase: TestCase;
|
|
71
|
+
}): boolean;
|
|
72
|
+
export declare function buildTestNamePrompt({ testName, suites, }: {
|
|
73
|
+
testName: string;
|
|
74
|
+
suites: string[];
|
|
75
|
+
}): string;
|
|
76
|
+
export declare function getVariableDeclarationsFromCode(sourceCode: string): string[];
|
|
77
|
+
export declare function isSyntaxValid(code: string): boolean;
|
|
78
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/bin/utils/platform/web/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAM3D,OAAO,EAGL,IAAI,EAEJ,UAAU,EAEX,MAAM,UAAU,CAAC;AAGlB,eAAO,MAAM,gCAAgC,eAC/B,UAAU,KACrB,MAgBF,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,YAAY,EACZ,MAAM,EACN,OAAO,GACR,EAAE;IACD,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG;IACF,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,QAAQ,EAAE,IAAI,GAAG,SAAS,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB,CA2CA;AAwBD,wBAAsB,0CAA0C,CAC9D,QAAQ,EAAE,MAAM,oBA+BjB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,IAAI,GAAG,SAAS,GACrB,IAAI,GAAG,SAAS,CA4BlB;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAG5E;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CA8C7D;AAED,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,mCAWjB;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,iBAShD;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,WAAW,iBAgBrE;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,UAE5E;AAED,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,iBAMpD;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,UAcpD;AAED,wBAAsB,iCAAiC,CAAC,QAAQ,EAAE,MAAM,+BAoBvE;AA+CD,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,UAoCtB;AAED,eAAO,MAAM,6BAA6B;qBAKvB,MAAM;iBACV,MAAM;YACX,MAAM,EAAE;YA2DjB,CAAC;AAEF,eAAO,MAAM,iCAAiC,YACnC,MAAM,aACJ,MAAM,EAAE,gBACL,MAAM,sBAyBrB,CAAC;AAEF,wBAAsB,qBAAqB,CAAC,EAC1C,YAAY,EACZ,QAAQ,EACR,MAAM,GACP,EAAE;IACD,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,iBAgDA;AAED,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,EAAE,iBAsBzB;AAED,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,QAAQ,GACT,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;CACpB,WAYA;AAED,wBAAgB,mBAAmB,CAAC,EAClC,QAAQ,EACR,MAAM,GACP,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,UAOA;AAED,wBAAgB,+BAA+B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CA4B5E;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAQnD"}
|