automation_model 1.0.784-dev → 1.0.785-dev
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/lib/file_checker.js +129 -25
- package/lib/file_checker.js.map +1 -1
- package/package.json +1 -1
package/lib/file_checker.js
CHANGED
|
@@ -1,54 +1,158 @@
|
|
|
1
|
-
import fs from "fs";
|
|
1
|
+
import * as fs from "fs"; // sync fs
|
|
2
|
+
import * as path from "path";
|
|
3
|
+
import { promises as fsAsync } from "fs"; // async fs
|
|
2
4
|
import { _commandError, _commandFinally, _preCommand } from "./command_common.js";
|
|
3
5
|
import { Types } from "./stable_browser.js";
|
|
4
6
|
const checkFileAccess = (filePath, accessMode) => {
|
|
5
|
-
return new Promise((resolve
|
|
7
|
+
return new Promise((resolve) => {
|
|
6
8
|
fs.access(filePath, accessMode, (err) => {
|
|
7
|
-
|
|
8
|
-
resolve(false);
|
|
9
|
-
}
|
|
10
|
-
else {
|
|
11
|
-
resolve(true);
|
|
12
|
-
}
|
|
9
|
+
resolve(!err);
|
|
13
10
|
});
|
|
14
11
|
});
|
|
15
12
|
};
|
|
16
13
|
const getFileName = (filePath) => {
|
|
17
14
|
const platform = process.platform;
|
|
18
|
-
|
|
19
|
-
if (platform === "win32") {
|
|
20
|
-
fileName = filePath.split("\\").pop() || "";
|
|
21
|
-
}
|
|
22
|
-
else {
|
|
23
|
-
fileName = filePath.split("/").pop() || "";
|
|
24
|
-
}
|
|
25
|
-
return fileName;
|
|
15
|
+
return platform === "win32" ? filePath.split("\\").pop() || "" : filePath.split("/").pop() || "";
|
|
26
16
|
};
|
|
17
|
+
// Simplified regex check
|
|
18
|
+
function testForRegex(text) {
|
|
19
|
+
return text.startsWith("regex:");
|
|
20
|
+
}
|
|
27
21
|
export const verifyFileExists = async (filePath, options, context, world) => {
|
|
28
|
-
|
|
29
|
-
if (!options) {
|
|
22
|
+
if (!options)
|
|
30
23
|
options = {};
|
|
31
|
-
}
|
|
32
24
|
const fileName = getFileName(filePath);
|
|
25
|
+
let isSoft = false;
|
|
26
|
+
const match = filePath.match(/(soft:)?(regex:|exact:|contains:)(.*)/);
|
|
27
|
+
if (match) {
|
|
28
|
+
isSoft = !!match[1]; // true if 'soft:' is present
|
|
29
|
+
}
|
|
33
30
|
const state = {
|
|
34
31
|
locate: false,
|
|
35
32
|
scroll: false,
|
|
36
33
|
screenshot: false,
|
|
37
34
|
highlight: false,
|
|
38
|
-
throwError:
|
|
35
|
+
throwError: !isSoft, // don't throw error for soft assertions
|
|
39
36
|
operation: "verifyFileExists",
|
|
40
37
|
value: filePath,
|
|
41
38
|
text: `Verify file ${fileName} exists`,
|
|
42
39
|
options,
|
|
43
40
|
type: Types.VERIFY_FILE_EXISTS,
|
|
44
|
-
world
|
|
41
|
+
world,
|
|
45
42
|
};
|
|
46
43
|
await _preCommand(state, context.web);
|
|
47
|
-
let fileAccessible = false;
|
|
48
44
|
try {
|
|
49
|
-
|
|
50
|
-
if (
|
|
51
|
-
|
|
45
|
+
let pathToMatch = filePath;
|
|
46
|
+
if (isSoft) {
|
|
47
|
+
pathToMatch = filePath.replace(/^soft:/, ""); // remove soft: prefix for parsing
|
|
48
|
+
}
|
|
49
|
+
let dir;
|
|
50
|
+
let input;
|
|
51
|
+
console.log("pathSeparator", path.sep);
|
|
52
|
+
if (pathToMatch.includes("regex:")) {
|
|
53
|
+
const regexIndex = pathToMatch.indexOf("regex:");
|
|
54
|
+
// Handle both forward slashes and backslashes before regex:
|
|
55
|
+
let dirPart = pathToMatch.substring(0, regexIndex);
|
|
56
|
+
// Remove trailing slash/backslash
|
|
57
|
+
if (dirPart.endsWith("/") || dirPart.endsWith("\\")) {
|
|
58
|
+
dirPart = dirPart.slice(0, -1);
|
|
59
|
+
}
|
|
60
|
+
dir = dirPart;
|
|
61
|
+
input = pathToMatch.substring(regexIndex);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
// Use path.sep to handle both forward and backward slashes
|
|
65
|
+
const pathSeparator = path.sep;
|
|
66
|
+
const lastSlashIndex = pathToMatch.lastIndexOf(pathSeparator);
|
|
67
|
+
// If no separator found, try the other separator (for mixed paths)
|
|
68
|
+
if (lastSlashIndex === -1) {
|
|
69
|
+
const alternativeSeparator = pathSeparator === "/" ? "\\" : "/";
|
|
70
|
+
const altLastSlashIndex = pathToMatch.lastIndexOf(alternativeSeparator);
|
|
71
|
+
if (altLastSlashIndex !== -1) {
|
|
72
|
+
dir = pathToMatch.substring(0, altLastSlashIndex);
|
|
73
|
+
input = pathToMatch.substring(altLastSlashIndex + 1);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
// No separator found, assume current directory
|
|
77
|
+
dir = ".";
|
|
78
|
+
input = pathToMatch;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
dir = pathToMatch.substring(0, lastSlashIndex);
|
|
83
|
+
input = pathToMatch.substring(lastSlashIndex + 1);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (isSoft) {
|
|
87
|
+
dir = dir.slice(0, -5);
|
|
88
|
+
}
|
|
89
|
+
console.log(`Directory to check: ${dir}`);
|
|
90
|
+
console.log(`Input pattern: ${input}`);
|
|
91
|
+
const files = await fsAsync.readdir(dir);
|
|
92
|
+
let found = false;
|
|
93
|
+
if (input.startsWith("exact:")) {
|
|
94
|
+
const target = input.replace("exact:", "");
|
|
95
|
+
found = files.includes(target);
|
|
96
|
+
}
|
|
97
|
+
else if (input.startsWith("contains:")) {
|
|
98
|
+
const target = input.replace("contains:", "");
|
|
99
|
+
found = files.some((f) => f.includes(target));
|
|
100
|
+
}
|
|
101
|
+
else if (input.startsWith("format:")) {
|
|
102
|
+
const extension = input.replace("format:", "");
|
|
103
|
+
found = files.some((f) => f.endsWith(`.${extension}`));
|
|
104
|
+
}
|
|
105
|
+
else if (testForRegex(input)) {
|
|
106
|
+
let raw = input.replace("regex:", "").trim(); // e.g. "/file/i" or "file.*::i"
|
|
107
|
+
let pattern = raw;
|
|
108
|
+
let flags = "";
|
|
109
|
+
// Normalize delimiters: convert backslash delimiters to forward slash delimiters
|
|
110
|
+
// This preserves the regex pattern while standardizing the delimiter format
|
|
111
|
+
if (raw.startsWith("\\") && raw.lastIndexOf("\\") > 0) {
|
|
112
|
+
// Convert \pattern\flags to /pattern/flags format
|
|
113
|
+
const lastBackslash = raw.lastIndexOf("\\");
|
|
114
|
+
const patternPart = raw.substring(1, lastBackslash);
|
|
115
|
+
const flagsPart = raw.substring(lastBackslash + 1);
|
|
116
|
+
raw = `/${patternPart}/${flagsPart}`;
|
|
117
|
+
}
|
|
118
|
+
// Now handle the standardized format
|
|
119
|
+
if (raw.startsWith("/") && raw.lastIndexOf("/") > 0) {
|
|
120
|
+
// Standard regex format: /pattern/flags
|
|
121
|
+
const lastSlash = raw.lastIndexOf("/");
|
|
122
|
+
flags = raw.substring(lastSlash + 1);
|
|
123
|
+
pattern = raw.substring(1, lastSlash);
|
|
124
|
+
}
|
|
125
|
+
else if (raw.includes("::")) {
|
|
126
|
+
// Alternative format: pattern::flags
|
|
127
|
+
[pattern, flags] = raw.split("::");
|
|
128
|
+
}
|
|
129
|
+
console.log(`Regex pattern: ${pattern}, flags: ${flags}`);
|
|
130
|
+
try {
|
|
131
|
+
const regex = new RegExp(pattern, flags);
|
|
132
|
+
found = files.some((f) => {
|
|
133
|
+
const matched = regex.test(f);
|
|
134
|
+
return matched;
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
catch (regexError) {
|
|
138
|
+
throw new Error(`Invalid regex pattern: ${pattern}`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
// Fallback to exact path check
|
|
143
|
+
found = await checkFileAccess(pathToMatch, fs.constants.F_OK);
|
|
144
|
+
}
|
|
145
|
+
if (!found) {
|
|
146
|
+
console.log(`Available files in '${dir}':`, files);
|
|
147
|
+
if (!isSoft) {
|
|
148
|
+
throw new Error(`No file matched the pattern: ${filePath}`);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
console.warn(`Soft assertion failed for pattern: ${filePath}`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
console.log(`File verification successful for pattern: ${input}`);
|
|
52
156
|
}
|
|
53
157
|
}
|
|
54
158
|
catch (err) {
|
package/lib/file_checker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file_checker.js","sourceRoot":"","sources":["../../src/file_checker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,
|
|
1
|
+
{"version":3,"file":"file_checker.js","sourceRoot":"","sources":["../../src/file_checker.ts"],"names":[],"mappings":"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"}
|