@protontech/autofill 0.0.22991789 → 0.0.33690782
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/constants/features.d.ts +1 -0
- package/constants/features.js +1 -0
- package/constants/heuristics.d.ts +5 -4
- package/constants/heuristics.js +5 -10
- package/constants/selectors.d.ts +13 -7
- package/constants/selectors.js +29 -17
- package/debug.d.ts +24 -1
- package/debug.js +15 -13
- package/dictionary/generate.js +30 -21
- package/dictionary/generated/dictionary.d.ts +18 -4
- package/dictionary/generated/dictionary.js +31 -17
- package/dictionary/source/dictionary.d.ts +4 -3
- package/dictionary/source/dictionary.js +155 -89
- package/dictionary/source/patterns.js +2 -2
- package/features/feature.d.ts +17 -0
- package/features/feature.js +72 -0
- package/features/feature.spec.d.ts +1 -0
- package/features/feature.spec.js +55 -0
- package/features/v1/abstract.field.d.ts +20401 -0
- package/features/v1/abstract.field.js +95 -0
- package/features/v1/abstract.form.d.ts +1226 -0
- package/features/v1/abstract.form.js +336 -0
- package/features/v1/field.email.d.ts +62 -0
- package/features/v1/field.email.js +27 -0
- package/features/v1/field.otp.d.ts +142 -0
- package/features/v1/field.otp.js +105 -0
- package/features/v1/field.password.d.ts +162 -0
- package/features/v1/field.password.js +81 -0
- package/features/v1/field.username-hidden.d.ts +62 -0
- package/features/v1/field.username-hidden.js +25 -0
- package/features/v1/field.username.d.ts +72 -0
- package/features/v1/field.username.js +31 -0
- package/features/v1/index.d.ts +4427 -0
- package/features/v1/index.js +22 -0
- package/features/v1/index.spec.d.ts +1 -0
- package/features/v1/index.spec.js +30 -0
- package/index.d.ts +5 -2
- package/index.js +10 -3
- package/models/perceptron/index.d.ts +2 -0
- package/models/perceptron/index.js +27 -0
- package/models/perceptron/params/email-model.json +53 -0
- package/models/perceptron/params/login-model.json +465 -0
- package/models/perceptron/params/new-password-model.json +133 -0
- package/models/perceptron/params/otp-model.json +117 -0
- package/models/perceptron/params/password-change-model.json +465 -0
- package/models/perceptron/params/password-model.json +133 -0
- package/models/perceptron/params/recovery-model.json +465 -0
- package/models/perceptron/params/register-model.json +465 -0
- package/models/perceptron/params/username-hidden-model.json +53 -0
- package/models/perceptron/params/username-model.json +61 -0
- package/models/prod_20240829/index.d.ts +2 -0
- package/models/prod_20240829/index.js +27 -0
- package/models/prod_20240829/params/email-model.json +45 -0
- package/models/prod_20240829/params/login-model.json +421 -0
- package/models/prod_20240829/params/new-password-model.json +125 -0
- package/models/prod_20240829/params/otp-model.json +153 -0
- package/models/prod_20240829/params/password-change-model.json +421 -0
- package/models/prod_20240829/params/password-model.json +125 -0
- package/models/prod_20240829/params/recovery-model.json +421 -0
- package/models/prod_20240829/params/register-model.json +421 -0
- package/models/prod_20240829/params/username-hidden-model.json +41 -0
- package/models/prod_20240829/params/username-model.json +45 -0
- package/models/random_forest/index.d.ts +2 -0
- package/models/random_forest/index.js +27 -0
- package/models/random_forest/params/email-model.json +1456 -0
- package/models/random_forest/params/login-model.json +4194 -0
- package/models/random_forest/params/new-password-model.json +1448 -0
- package/models/random_forest/params/otp-model.json +2004 -0
- package/models/random_forest/params/password-change-model.json +1422 -0
- package/models/random_forest/params/password-model.json +1292 -0
- package/models/random_forest/params/recovery-model.json +2754 -0
- package/models/random_forest/params/register-model.json +3678 -0
- package/models/random_forest/params/username-hidden-model.json +1108 -0
- package/models/random_forest/params/username-model.json +1052 -0
- package/models/v1/index.d.ts +2 -0
- package/models/v1/index.js +35 -0
- package/package.json +14 -15
- package/rules/v1/index.d.ts +3 -0
- package/rules/v1/index.js +69 -0
- package/rulesets.d.ts +2 -2
- package/rulesets.js +11 -10
- package/types/index.d.ts +72 -17
- package/types/index.js +35 -2
- package/utils/attributes.js +1 -1
- package/utils/clustering.js +18 -5
- package/utils/credit-card.d.ts +32 -0
- package/utils/credit-card.js +259 -0
- package/utils/credit-card.samples.spec.d.ts +1 -0
- package/utils/credit-card.samples.spec.js +452 -0
- package/utils/credit-card.spec.d.ts +1 -0
- package/utils/credit-card.spec.js +296 -0
- package/utils/dom.d.ts +3 -2
- package/utils/dom.js +12 -7
- package/utils/exclusion.d.ts +1 -0
- package/utils/exclusion.js +22 -10
- package/utils/extract.d.ts +1 -0
- package/utils/extract.js +26 -7
- package/utils/fathom.d.ts +10 -23
- package/utils/fathom.js +7 -12
- package/utils/field.d.ts +12 -4
- package/utils/field.js +25 -14
- package/utils/flags.d.ts +9 -3
- package/utils/flags.js +27 -9
- package/utils/form.d.ts +16 -5
- package/utils/form.js +35 -14
- package/utils/identity.d.ts +12 -21
- package/utils/identity.js +66 -41
- package/utils/identity.samples.spec.d.ts +1 -0
- package/utils/identity.samples.spec.js +28 -0
- package/utils/iframe.d.ts +2 -0
- package/utils/iframe.js +22 -0
- package/utils/overrides.d.ts +19 -0
- package/utils/overrides.js +40 -0
- package/utils/prepass.js +6 -4
- package/utils/re.d.ts +19 -4
- package/utils/re.js +22 -7
- package/utils/re.spec.d.ts +1 -0
- package/utils/re.spec.js +62 -0
- package/utils/shadow-dom.d.ts +8 -0
- package/utils/shadow-dom.js +53 -0
- package/utils/shadow-dom.spec.d.ts +1 -0
- package/utils/shadow-dom.spec.js +215 -0
- package/utils/visible.d.ts +3 -2
- package/utils/visible.js +42 -22
- package/cli.d.ts +0 -2
- package/cli.js +0 -128
- package/features/abstract.field.d.ts +0 -123
- package/features/abstract.field.js +0 -63
- package/features/abstract.form.d.ts +0 -98
- package/features/abstract.form.js +0 -281
- package/features/field.email.d.ts +0 -18
- package/features/field.email.js +0 -43
- package/features/field.otp.d.ts +0 -36
- package/features/field.otp.js +0 -116
- package/features/field.password.d.ts +0 -35
- package/features/field.password.js +0 -104
- package/features/field.username-hidden.d.ts +0 -15
- package/features/field.username-hidden.js +0 -40
- package/features/field.username.d.ts +0 -16
- package/features/field.username.js +0 -41
- package/features/form.combined.d.ts +0 -1
- package/features/form.combined.js +0 -6
- package/trainees/field.email.d.ts +0 -2
- package/trainees/field.email.js +0 -16
- package/trainees/field.identity.d.ts +0 -2
- package/trainees/field.identity.js +0 -9
- package/trainees/field.otp.d.ts +0 -2
- package/trainees/field.otp.js +0 -16
- package/trainees/field.password.current.d.ts +0 -2
- package/trainees/field.password.current.js +0 -16
- package/trainees/field.password.new.d.ts +0 -2
- package/trainees/field.password.new.js +0 -16
- package/trainees/field.username-hidden.d.ts +0 -2
- package/trainees/field.username-hidden.js +0 -22
- package/trainees/field.username.d.ts +0 -2
- package/trainees/field.username.js +0 -16
- package/trainees/form.login.d.ts +0 -2
- package/trainees/form.login.js +0 -16
- package/trainees/form.noop.d.ts +0 -1
- package/trainees/form.noop.js +0 -7
- package/trainees/form.password-change.d.ts +0 -2
- package/trainees/form.password-change.js +0 -16
- package/trainees/form.recovery.d.ts +0 -2
- package/trainees/form.recovery.js +0 -16
- package/trainees/form.register.d.ts +0 -2
- package/trainees/form.register.js +0 -16
- package/trainees/index.d.ts +0 -9
- package/trainees/index.js +0 -72
- package/trainees/results/result.email.d.ts +0 -2
- package/trainees/results/result.email.js +0 -17
- package/trainees/results/result.login.d.ts +0 -2
- package/trainees/results/result.login.js +0 -110
- package/trainees/results/result.new-password.d.ts +0 -2
- package/trainees/results/result.new-password.js +0 -36
- package/trainees/results/result.otp.d.ts +0 -2
- package/trainees/results/result.otp.js +0 -43
- package/trainees/results/result.password-change.d.ts +0 -2
- package/trainees/results/result.password-change.js +0 -110
- package/trainees/results/result.password.d.ts +0 -2
- package/trainees/results/result.password.js +0 -36
- package/trainees/results/result.recovery.d.ts +0 -2
- package/trainees/results/result.recovery.js +0 -110
- package/trainees/results/result.register.d.ts +0 -2
- package/trainees/results/result.register.js +0 -110
- package/trainees/results/result.username-hidden.d.ts +0 -2
- package/trainees/results/result.username-hidden.js +0 -15
- package/trainees/results/result.username.d.ts +0 -2
- package/trainees/results/result.username.js +0 -16
- package/utils/memoize.d.ts +0 -5
- package/utils/memoize.js +0 -12
package/cli.js
DELETED
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env ts-node-script
|
|
2
|
-
import { exec } from "child_process";
|
|
3
|
-
import { Command } from "commander";
|
|
4
|
-
import fs from "fs/promises";
|
|
5
|
-
import path from "path";
|
|
6
|
-
import prettier from "prettier";
|
|
7
|
-
import { FORM_FEATURES } from "./features/abstract.form";
|
|
8
|
-
import { EMAIL_FIELD_FEATURES } from "./features/field.email";
|
|
9
|
-
import { OTP_FIELD_FEATURES } from "./features/field.otp";
|
|
10
|
-
import { PW_FIELD_FEATURES } from "./features/field.password";
|
|
11
|
-
import { USERNAME_FIELD_FEATURES } from "./features/field.username";
|
|
12
|
-
import { HIDDEN_USER_FIELD_FEATURES } from "./features/field.username-hidden";
|
|
13
|
-
const program = new Command();
|
|
14
|
-
const FEATURE_MAP = {
|
|
15
|
-
login: FORM_FEATURES,
|
|
16
|
-
register: FORM_FEATURES,
|
|
17
|
-
"password-change": FORM_FEATURES,
|
|
18
|
-
recovery: FORM_FEATURES,
|
|
19
|
-
username: USERNAME_FIELD_FEATURES,
|
|
20
|
-
"username-hidden": HIDDEN_USER_FIELD_FEATURES,
|
|
21
|
-
email: EMAIL_FIELD_FEATURES,
|
|
22
|
-
password: PW_FIELD_FEATURES,
|
|
23
|
-
"new-password": PW_FIELD_FEATURES,
|
|
24
|
-
otp: OTP_FIELD_FEATURES,
|
|
25
|
-
};
|
|
26
|
-
program.version("0.0.1").description("CLI utilities for ProtonPass fathom");
|
|
27
|
-
program
|
|
28
|
-
.command("get-vector [id]")
|
|
29
|
-
.description("Gets a human readable vector for a specific dataset entry")
|
|
30
|
-
.requiredOption("--trainee <trainee>")
|
|
31
|
-
.action(async (id, options) => {
|
|
32
|
-
try {
|
|
33
|
-
const file = await fs.readFile(`./dist/vectors/training_${options.trainee}.json`, "utf8");
|
|
34
|
-
const training = JSON.parse(file).pages;
|
|
35
|
-
const entry = training.find(({ filename }) => filename.startsWith(id));
|
|
36
|
-
if (entry === undefined) {
|
|
37
|
-
console.log("No entry found");
|
|
38
|
-
}
|
|
39
|
-
const featureSet = FEATURE_MAP[options.trainee];
|
|
40
|
-
if (featureSet === undefined)
|
|
41
|
-
throw new Error(`unknown feature set for trainee ${options.trainee}`);
|
|
42
|
-
entry === null || entry === void 0 ? void 0 : entry.nodes.forEach(({ features, markup, isTarget }) => {
|
|
43
|
-
console.log(`${markup} ${isTarget ? "✅" : "❌"}`);
|
|
44
|
-
features.forEach((value, i) => {
|
|
45
|
-
var _a;
|
|
46
|
-
console.log(`↳ ${(_a = featureSet === null || featureSet === void 0 ? void 0 : featureSet[i]) !== null && _a !== void 0 ? _a : "unknown"} = ${value}`);
|
|
47
|
-
});
|
|
48
|
-
console.log("\n");
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
catch (e) {
|
|
52
|
-
console.warn("Could not read file - try training your trainee first", e);
|
|
53
|
-
}
|
|
54
|
-
});
|
|
55
|
-
const buildCommand = (trainee) => `yarn train -- ${trainee} --delay 12 --iterations 5000 --learning-rate 0.5 --tabs 20`;
|
|
56
|
-
const extractResults = (stdout) => {
|
|
57
|
-
const jsonRegex = /{[\s\S]+}/;
|
|
58
|
-
const jsonMatch = stdout.match(jsonRegex);
|
|
59
|
-
if (!(jsonMatch === null || jsonMatch === void 0 ? void 0 : jsonMatch[0]))
|
|
60
|
-
throw new Error("Could not parse weights");
|
|
61
|
-
return JSON.parse(jsonMatch[0]);
|
|
62
|
-
};
|
|
63
|
-
const extractCutoff = (stdout) => {
|
|
64
|
-
const cutoffRegex = /Optimal cutoff: (\d+(\.\d+)?)/;
|
|
65
|
-
const cutoffMatch = stdout.match(cutoffRegex);
|
|
66
|
-
if (!cutoffMatch)
|
|
67
|
-
throw new Error("Could not parse cutoff");
|
|
68
|
-
return parseFloat(cutoffMatch[1]);
|
|
69
|
-
};
|
|
70
|
-
const extractSummary = (stdout) => {
|
|
71
|
-
const dataRegex = /Training precision:(?:.|\n)+?(?=Training per-tag results)/s;
|
|
72
|
-
const ansiColorRegex = /\x1b\[[0-9;]*m/g;
|
|
73
|
-
const dataMatch = stdout.match(dataRegex);
|
|
74
|
-
if (!(dataMatch === null || dataMatch === void 0 ? void 0 : dataMatch[0]))
|
|
75
|
-
throw new Error("Could not parse results");
|
|
76
|
-
return dataMatch[0].replace(ansiColorRegex, "");
|
|
77
|
-
};
|
|
78
|
-
const train = async (trainee) => {
|
|
79
|
-
const basePath = path.resolve(__dirname, "trainees/results");
|
|
80
|
-
const id = trainee.toUpperCase();
|
|
81
|
-
console.info(`\n[${id}]: Start training`);
|
|
82
|
-
console.time(`[${id}]`);
|
|
83
|
-
return new Promise((resolve) => {
|
|
84
|
-
exec(buildCommand(trainee), async (error, stdout) => {
|
|
85
|
-
console.timeEnd(`[${id}]`);
|
|
86
|
-
if (error) {
|
|
87
|
-
console.error(`[${id}]: Error during training: ${error.message}`);
|
|
88
|
-
resolve();
|
|
89
|
-
}
|
|
90
|
-
const results = extractResults(stdout);
|
|
91
|
-
results.cutoff = extractCutoff(stdout);
|
|
92
|
-
const summary = extractSummary(stdout);
|
|
93
|
-
console.log(summary);
|
|
94
|
-
let output = `// ${trainee.toUpperCase()} (trained on ${new Date().toDateString()})\n`;
|
|
95
|
-
output += summary
|
|
96
|
-
.split("\n")
|
|
97
|
-
.filter(Boolean)
|
|
98
|
-
.map((line) => `// ${line}`)
|
|
99
|
-
.join("\n");
|
|
100
|
-
output += `\n\nimport { TrainingResults } from "src/types";\n\n`;
|
|
101
|
-
output += `export const results: TrainingResults = ${JSON.stringify(results)};`;
|
|
102
|
-
await fs.writeFile(path.resolve(basePath, `result.${trainee}.ts`), await prettier.format(output, {
|
|
103
|
-
tabWidth: 2,
|
|
104
|
-
useTabs: false,
|
|
105
|
-
printWidth: 160,
|
|
106
|
-
parser: "babel-ts",
|
|
107
|
-
}));
|
|
108
|
-
resolve();
|
|
109
|
-
});
|
|
110
|
-
});
|
|
111
|
-
};
|
|
112
|
-
program.command("train [trainee]").description("trains a specific trainee").action(train);
|
|
113
|
-
program
|
|
114
|
-
.command("train-all")
|
|
115
|
-
.description("Sequentially trains all models and updates scores between each run")
|
|
116
|
-
.option("--type <type>")
|
|
117
|
-
.action(async (options) => {
|
|
118
|
-
const type = options === null || options === void 0 ? void 0 : options.type;
|
|
119
|
-
const formTrainees = !type || type === "form" ? ["login", "register", "password-change", "recovery"] : [];
|
|
120
|
-
const fieldTrainees = !type || type === "field" ? ["username", "username-hidden", "email", "password", "new-password", "otp"] : [];
|
|
121
|
-
for (const form of formTrainees) {
|
|
122
|
-
await train(form);
|
|
123
|
-
}
|
|
124
|
-
for (const field of fieldTrainees) {
|
|
125
|
-
await train(field);
|
|
126
|
-
}
|
|
127
|
-
});
|
|
128
|
-
program.parse(process.argv);
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
import { Fnode } from "@protontech/fathom";
|
|
2
|
-
declare const getFieldFeature: (fnode: Fnode) => {
|
|
3
|
-
fieldAttrs: string[];
|
|
4
|
-
fieldText: string;
|
|
5
|
-
labelText: string;
|
|
6
|
-
formFnode: any;
|
|
7
|
-
formFeatures: {
|
|
8
|
-
fieldsCount: any;
|
|
9
|
-
inputCount: any;
|
|
10
|
-
fieldsetCount: any;
|
|
11
|
-
textCount: any;
|
|
12
|
-
textareaCount: any;
|
|
13
|
-
selectCount: any;
|
|
14
|
-
optionsCount: any;
|
|
15
|
-
checkboxCount: any;
|
|
16
|
-
radioCount: any;
|
|
17
|
-
identifierCount: any;
|
|
18
|
-
hiddenIdentifierCount: any;
|
|
19
|
-
hiddenCount: any;
|
|
20
|
-
passwordCount: any;
|
|
21
|
-
hiddenPasswordCount: any;
|
|
22
|
-
usernameCount: any;
|
|
23
|
-
emailCount: any;
|
|
24
|
-
submitCount: any;
|
|
25
|
-
hasTels: number;
|
|
26
|
-
hasOAuth: number;
|
|
27
|
-
hasCaptchas: number;
|
|
28
|
-
hasFiles: number;
|
|
29
|
-
hasDate: number;
|
|
30
|
-
hasNumber: number;
|
|
31
|
-
oneVisibleField: number;
|
|
32
|
-
twoVisibleFields: number;
|
|
33
|
-
threeOrMoreVisibleFields: number;
|
|
34
|
-
noPasswords: number;
|
|
35
|
-
onePassword: number;
|
|
36
|
-
twoPasswords: number;
|
|
37
|
-
threeOrMorePasswords: number;
|
|
38
|
-
noIdentifiers: number;
|
|
39
|
-
oneIdentifier: number;
|
|
40
|
-
twoIdentifiers: number;
|
|
41
|
-
threeOrMoreIdentifiers: number;
|
|
42
|
-
autofocusedIsIdentifier: number;
|
|
43
|
-
autofocusedIsPassword: number;
|
|
44
|
-
visibleInputsCount: number;
|
|
45
|
-
inputRatio: number;
|
|
46
|
-
hiddenRatio: number;
|
|
47
|
-
visibleRatio: number;
|
|
48
|
-
identifierRatio: number;
|
|
49
|
-
emailRatio: number;
|
|
50
|
-
usernameRatio: number;
|
|
51
|
-
passwordRatio: number;
|
|
52
|
-
checkboxRatio: number;
|
|
53
|
-
requiredRatio: number;
|
|
54
|
-
patternRatio: number;
|
|
55
|
-
minMaxLengthRatio: number;
|
|
56
|
-
pageLogin: number;
|
|
57
|
-
formTextLogin: number;
|
|
58
|
-
formAttrsLogin: number;
|
|
59
|
-
headingsLogin: number;
|
|
60
|
-
layoutLogin: number;
|
|
61
|
-
rememberMeCheckbox: number;
|
|
62
|
-
troubleLink: number;
|
|
63
|
-
submitLogin: number;
|
|
64
|
-
pageRegister: number;
|
|
65
|
-
formTextRegister: number;
|
|
66
|
-
formAttrsRegister: number;
|
|
67
|
-
headingsRegister: number;
|
|
68
|
-
layoutRegister: number;
|
|
69
|
-
pwNewRegister: number;
|
|
70
|
-
pwConfirmRegister: number;
|
|
71
|
-
submitRegister: number;
|
|
72
|
-
TOSRef: number;
|
|
73
|
-
pagePwReset: number;
|
|
74
|
-
formTextPwReset: number;
|
|
75
|
-
formAttrsPwReset: number;
|
|
76
|
-
headingsPwReset: number;
|
|
77
|
-
layoutPwReset: number;
|
|
78
|
-
pageRecovery: number;
|
|
79
|
-
formTextRecovery: number;
|
|
80
|
-
formAttrsRecovery: number;
|
|
81
|
-
headingsRecovery: number;
|
|
82
|
-
layoutRecovery: number;
|
|
83
|
-
identifierRecovery: number;
|
|
84
|
-
submitRecovery: number;
|
|
85
|
-
formMFA: number;
|
|
86
|
-
formTextMFA: number;
|
|
87
|
-
formAttrsMFA: number;
|
|
88
|
-
formOTPOutlier: number;
|
|
89
|
-
linkOTPOutlier: number;
|
|
90
|
-
inputsMFA: number;
|
|
91
|
-
inputsOTP: number;
|
|
92
|
-
newsletterForm: number;
|
|
93
|
-
searchForm: number;
|
|
94
|
-
multiStepForm: number;
|
|
95
|
-
multiAuthForm: number;
|
|
96
|
-
formInputIterator: {
|
|
97
|
-
prev(input: HTMLElement): HTMLElement | null;
|
|
98
|
-
next(input: HTMLElement): HTMLElement | null;
|
|
99
|
-
};
|
|
100
|
-
} | undefined;
|
|
101
|
-
isFormLogin: boolean;
|
|
102
|
-
isFormRegister: boolean;
|
|
103
|
-
isFormPWChange: boolean;
|
|
104
|
-
isFormRecovery: boolean;
|
|
105
|
-
isFormNoop: boolean;
|
|
106
|
-
value: string;
|
|
107
|
-
visible: boolean;
|
|
108
|
-
type: string | null;
|
|
109
|
-
readonly: boolean;
|
|
110
|
-
required: boolean;
|
|
111
|
-
disabled: boolean;
|
|
112
|
-
pattern: string;
|
|
113
|
-
autocomplete: string | null;
|
|
114
|
-
minLength: number;
|
|
115
|
-
maxLength: number;
|
|
116
|
-
tabIndex: number;
|
|
117
|
-
prevField: HTMLElement | null;
|
|
118
|
-
nextField: HTMLElement | null;
|
|
119
|
-
searchField: boolean;
|
|
120
|
-
identityField: boolean;
|
|
121
|
-
};
|
|
122
|
-
export default getFieldFeature;
|
|
123
|
-
export type FieldFeatures = ReturnType<typeof getFieldFeature>;
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import { getFieldHaystacks } from "../utils/extract";
|
|
2
|
-
import { getParentFormFnode, safeInt } from "../utils/fathom";
|
|
3
|
-
import getFormFeatures from "./abstract.form";
|
|
4
|
-
import { any } from "../utils/combinators";
|
|
5
|
-
import { getFormClassification } from "../utils/fathom";
|
|
6
|
-
import { flagAsHidden, removeHiddenFlag } from "../utils/flags";
|
|
7
|
-
import { matchesIdentityField } from "../utils/identity";
|
|
8
|
-
import { matchSearchAction } from "../utils/re";
|
|
9
|
-
import { isVisible, isVisibleField } from "../utils/visible";
|
|
10
|
-
const getFieldFeature = (fnode) => {
|
|
11
|
-
var _a, _b;
|
|
12
|
-
const field = fnode.element;
|
|
13
|
-
const fieldHaystacks = getFieldHaystacks(field);
|
|
14
|
-
const formFnode = getParentFormFnode(fnode);
|
|
15
|
-
if (formFnode !== null && !formFnode.hasNoteFor("form"))
|
|
16
|
-
formFnode.setNoteFor("form", getFormFeatures(formFnode));
|
|
17
|
-
const formFeatures = formFnode === null || formFnode === void 0 ? void 0 : formFnode.noteFor("form");
|
|
18
|
-
const formClassification = getFormClassification(formFnode);
|
|
19
|
-
const value = field.value;
|
|
20
|
-
const type = field.getAttribute("type");
|
|
21
|
-
const readonly = field.readOnly;
|
|
22
|
-
const required = field.required;
|
|
23
|
-
const minLength = safeInt(field.minLength, 0);
|
|
24
|
-
const maxLength = safeInt(field.maxLength, 250);
|
|
25
|
-
const pattern = field.pattern;
|
|
26
|
-
const autocomplete = field.getAttribute("autocomplete");
|
|
27
|
-
const disabled = field.disabled;
|
|
28
|
-
const typeValid = type !== "hidden";
|
|
29
|
-
const tabIndex = field.tabIndex;
|
|
30
|
-
const visible = typeValid ? isVisibleField(field) && isVisible(field, { opacity: false }) : false;
|
|
31
|
-
if (typeValid)
|
|
32
|
-
(visible ? removeHiddenFlag : flagAsHidden)(field);
|
|
33
|
-
const searchField = visible && any(matchSearchAction)(fieldHaystacks.fieldAttrs.concat(fieldHaystacks.fieldText));
|
|
34
|
-
const identityField = matchesIdentityField(fnode.element, { searchField, visible, isFormLogin: formClassification.login, type });
|
|
35
|
-
const prevField = typeValid ? (_a = formFeatures === null || formFeatures === void 0 ? void 0 : formFeatures.formInputIterator.prev(field)) !== null && _a !== void 0 ? _a : null : null;
|
|
36
|
-
const nextField = typeValid ? (_b = formFeatures === null || formFeatures === void 0 ? void 0 : formFeatures.formInputIterator.next(field)) !== null && _b !== void 0 ? _b : null : null;
|
|
37
|
-
return {
|
|
38
|
-
formFnode,
|
|
39
|
-
formFeatures,
|
|
40
|
-
isFormLogin: formClassification.login,
|
|
41
|
-
isFormRegister: formClassification.register,
|
|
42
|
-
isFormPWChange: formClassification.pwChange,
|
|
43
|
-
isFormRecovery: formClassification.recovery,
|
|
44
|
-
isFormNoop: formClassification.noop,
|
|
45
|
-
value,
|
|
46
|
-
visible,
|
|
47
|
-
type,
|
|
48
|
-
readonly,
|
|
49
|
-
required,
|
|
50
|
-
disabled,
|
|
51
|
-
pattern,
|
|
52
|
-
autocomplete,
|
|
53
|
-
minLength,
|
|
54
|
-
maxLength,
|
|
55
|
-
tabIndex,
|
|
56
|
-
prevField,
|
|
57
|
-
nextField,
|
|
58
|
-
searchField,
|
|
59
|
-
identityField,
|
|
60
|
-
...fieldHaystacks,
|
|
61
|
-
};
|
|
62
|
-
};
|
|
63
|
-
export default getFieldFeature;
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
import { Fnode } from "@protontech/fathom";
|
|
2
|
-
declare const getFormFeatures: (fnode: Fnode) => {
|
|
3
|
-
fieldsCount: any;
|
|
4
|
-
inputCount: any;
|
|
5
|
-
fieldsetCount: any;
|
|
6
|
-
textCount: any;
|
|
7
|
-
textareaCount: any;
|
|
8
|
-
selectCount: any;
|
|
9
|
-
optionsCount: any;
|
|
10
|
-
checkboxCount: any;
|
|
11
|
-
radioCount: any;
|
|
12
|
-
identifierCount: any;
|
|
13
|
-
hiddenIdentifierCount: any;
|
|
14
|
-
hiddenCount: any;
|
|
15
|
-
passwordCount: any;
|
|
16
|
-
hiddenPasswordCount: any;
|
|
17
|
-
usernameCount: any;
|
|
18
|
-
emailCount: any;
|
|
19
|
-
submitCount: any;
|
|
20
|
-
hasTels: number;
|
|
21
|
-
hasOAuth: number;
|
|
22
|
-
hasCaptchas: number;
|
|
23
|
-
hasFiles: number;
|
|
24
|
-
hasDate: number;
|
|
25
|
-
hasNumber: number;
|
|
26
|
-
oneVisibleField: number;
|
|
27
|
-
twoVisibleFields: number;
|
|
28
|
-
threeOrMoreVisibleFields: number;
|
|
29
|
-
noPasswords: number;
|
|
30
|
-
onePassword: number;
|
|
31
|
-
twoPasswords: number;
|
|
32
|
-
threeOrMorePasswords: number;
|
|
33
|
-
noIdentifiers: number;
|
|
34
|
-
oneIdentifier: number;
|
|
35
|
-
twoIdentifiers: number;
|
|
36
|
-
threeOrMoreIdentifiers: number;
|
|
37
|
-
autofocusedIsIdentifier: number;
|
|
38
|
-
autofocusedIsPassword: number;
|
|
39
|
-
visibleInputsCount: number;
|
|
40
|
-
inputRatio: number;
|
|
41
|
-
hiddenRatio: number;
|
|
42
|
-
visibleRatio: number;
|
|
43
|
-
identifierRatio: number;
|
|
44
|
-
emailRatio: number;
|
|
45
|
-
usernameRatio: number;
|
|
46
|
-
passwordRatio: number;
|
|
47
|
-
checkboxRatio: number;
|
|
48
|
-
requiredRatio: number;
|
|
49
|
-
patternRatio: number;
|
|
50
|
-
minMaxLengthRatio: number;
|
|
51
|
-
pageLogin: number;
|
|
52
|
-
formTextLogin: number;
|
|
53
|
-
formAttrsLogin: number;
|
|
54
|
-
headingsLogin: number;
|
|
55
|
-
layoutLogin: number;
|
|
56
|
-
rememberMeCheckbox: number;
|
|
57
|
-
troubleLink: number;
|
|
58
|
-
submitLogin: number;
|
|
59
|
-
pageRegister: number;
|
|
60
|
-
formTextRegister: number;
|
|
61
|
-
formAttrsRegister: number;
|
|
62
|
-
headingsRegister: number;
|
|
63
|
-
layoutRegister: number;
|
|
64
|
-
pwNewRegister: number;
|
|
65
|
-
pwConfirmRegister: number;
|
|
66
|
-
submitRegister: number;
|
|
67
|
-
TOSRef: number;
|
|
68
|
-
pagePwReset: number;
|
|
69
|
-
formTextPwReset: number;
|
|
70
|
-
formAttrsPwReset: number;
|
|
71
|
-
headingsPwReset: number;
|
|
72
|
-
layoutPwReset: number;
|
|
73
|
-
pageRecovery: number;
|
|
74
|
-
formTextRecovery: number;
|
|
75
|
-
formAttrsRecovery: number;
|
|
76
|
-
headingsRecovery: number;
|
|
77
|
-
layoutRecovery: number;
|
|
78
|
-
identifierRecovery: number;
|
|
79
|
-
submitRecovery: number;
|
|
80
|
-
formMFA: number;
|
|
81
|
-
formTextMFA: number;
|
|
82
|
-
formAttrsMFA: number;
|
|
83
|
-
formOTPOutlier: number;
|
|
84
|
-
linkOTPOutlier: number;
|
|
85
|
-
inputsMFA: number;
|
|
86
|
-
inputsOTP: number;
|
|
87
|
-
newsletterForm: number;
|
|
88
|
-
searchForm: number;
|
|
89
|
-
multiStepForm: number;
|
|
90
|
-
multiAuthForm: number;
|
|
91
|
-
formInputIterator: {
|
|
92
|
-
prev(input: HTMLElement): HTMLElement | null;
|
|
93
|
-
next(input: HTMLElement): HTMLElement | null;
|
|
94
|
-
};
|
|
95
|
-
};
|
|
96
|
-
export default getFormFeatures;
|
|
97
|
-
export type FormFeatures = ReturnType<typeof getFormFeatures>;
|
|
98
|
-
export declare const FORM_FEATURES: (keyof FormFeatures)[];
|