@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
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { OTP_PATTERNS } from "@protontech/autofill/constants/heuristics";
|
|
2
|
+
import { feature, featureScaled, flattenFeatures } from "@protontech/autofill/features/feature";
|
|
3
|
+
import { field, fieldAttrs, fieldAutocomplete, fieldCC, fieldForm, fieldFormFeats, fieldIdentity, fieldLabel, fieldNext, fieldPrev, fieldSearch, fieldText, maxLength, pattern, placeholder, type, } from "@protontech/autofill/features/v1/abstract.field";
|
|
4
|
+
import { any } from "@protontech/autofill/utils/combinators";
|
|
5
|
+
import { getNodeRect } from "@protontech/autofill/utils/dom";
|
|
6
|
+
import { matchAuthenticator, matchOtpAttr, matchOtpFieldOutlier, matchTwoFa } from "@protontech/autofill/utils/re";
|
|
7
|
+
const matchSibling = (sibling, match) => {
|
|
8
|
+
if (!sibling)
|
|
9
|
+
return false;
|
|
10
|
+
if ((sibling === null || sibling === void 0 ? void 0 : sibling.getAttribute("type")) !== match.type)
|
|
11
|
+
return false;
|
|
12
|
+
const maxLen = sibling.getAttribute("maxlength");
|
|
13
|
+
if (maxLen && parseInt(maxLen, 10) > 1)
|
|
14
|
+
return false;
|
|
15
|
+
const minLen = sibling.getAttribute("minlength");
|
|
16
|
+
if (minLen && parseInt(minLen) > 1)
|
|
17
|
+
return false;
|
|
18
|
+
const { top, bottom, width, area } = getNodeRect(sibling);
|
|
19
|
+
if (width >= 100)
|
|
20
|
+
return false;
|
|
21
|
+
const topMatch = Math.abs(match.rect.top - top) <= 2;
|
|
22
|
+
const bottomMatch = Math.abs(match.rect.bottom - bottom) <= 2;
|
|
23
|
+
const aligned = topMatch && bottomMatch;
|
|
24
|
+
if (!aligned)
|
|
25
|
+
return false;
|
|
26
|
+
const areaMatch = Math.abs(match.rect.area - area) < 16;
|
|
27
|
+
if (!areaMatch)
|
|
28
|
+
return false;
|
|
29
|
+
return true;
|
|
30
|
+
};
|
|
31
|
+
const searchForm = feature("searchForm", { fieldFormFeats }, (p) => { var _a; return Boolean((_a = p.fieldFormFeats) === null || _a === void 0 ? void 0 : _a.searchForm); });
|
|
32
|
+
const formComplexity = feature("formComplexity", { fieldFormFeats }, (p) => { var _a, _b; return (_b = (_a = p.fieldFormFeats) === null || _a === void 0 ? void 0 : _a.formComplexityScaled) !== null && _b !== void 0 ? _b : 0; });
|
|
33
|
+
const formMFA = feature("formMFA", { fieldFormFeats }, (p) => { var _a; return Boolean((_a = p.fieldFormFeats) === null || _a === void 0 ? void 0 : _a.__formMFA); });
|
|
34
|
+
const formAuthenticator = feature("formAuthenticator", { fieldFormFeats }, (p) => { var _a; return Boolean((_a = p.fieldFormFeats) === null || _a === void 0 ? void 0 : _a.__formTextAuthenticator); });
|
|
35
|
+
const mfaCandidates = feature("mfaCandidates", { fieldFormFeats }, (p) => { var _a, _b; return (_b = (_a = p.fieldFormFeats) === null || _a === void 0 ? void 0 : _a.__formInputMFACandidates) !== null && _b !== void 0 ? _b : 0; });
|
|
36
|
+
const outlierForm = feature("outlierForm", { fieldFormFeats }, (p) => { var _a; return Boolean((_a = p.fieldFormFeats) === null || _a === void 0 ? void 0 : _a.__formOTPOutlier); });
|
|
37
|
+
const outlierLink = feature("outlierLink", { fieldFormFeats }, (p) => { var _a; return Boolean((_a = p.fieldFormFeats) === null || _a === void 0 ? void 0 : _a.__linkOTPOutlier); });
|
|
38
|
+
const outlierHeadings = feature("outlierHeadings", { fieldFormFeats }, (p) => { var _a; return Boolean((_a = p.fieldFormFeats) === null || _a === void 0 ? void 0 : _a.__headingsOTPOutlier); });
|
|
39
|
+
const numericMode = feature("numericMode", { field }, (p) => p.field.inputMode === "numeric");
|
|
40
|
+
const patternOTP = feature("patternOTP", { fieldPattern: pattern, numericMode }, (p) => !numericMode && OTP_PATTERNS.some((pattern) => { var _a; return ((_a = p.pattern) === null || _a === void 0 ? void 0 : _a.trim()) === pattern; }));
|
|
41
|
+
const nameMatch = feature("nameMatch", { field }, (p) => ["code", "token", "otp", "otc", "totp"].some((match) => p.field.name === match));
|
|
42
|
+
const idMatch = feature("idMatch", { field }, (p) => ["code", "token", "otp", "otc", "totp"].some((match) => p.field.id === match));
|
|
43
|
+
const autocompleteOff = feature("autocompleteOff", { fieldAutocomplete }, (p) => p.fieldAutocomplete !== undefined && (p.fieldAutocomplete === "off" || p.fieldAutocomplete === "false"));
|
|
44
|
+
const autocompleteOTC = feature("autocompleteOTC", { fieldAutocomplete }, (p) => { var _a, _b; return (_b = (_a = p.fieldAutocomplete) === null || _a === void 0 ? void 0 : _a.includes("one-time-code")) !== null && _b !== void 0 ? _b : false; });
|
|
45
|
+
const maxLen = feature("maxLen", { fieldMaxLength: maxLength }, (p) => (p.maxLength ? parseInt(p.maxLength, 10) : null));
|
|
46
|
+
const singleInput = feature("singleInput", { mfaCandidates }, (p) => p.mfaCandidates === 1);
|
|
47
|
+
const rect = feature("rect", { field }, (p) => getNodeRect(p.field));
|
|
48
|
+
const similarBefore = feature("similarBefore", { type, fieldPrev, rect }, (p) => matchSibling(p.fieldPrev, p));
|
|
49
|
+
const similarAfter = feature("similarAfter", { type, fieldNext, rect }, (p) => matchSibling(p.fieldNext, p));
|
|
50
|
+
const siblingOfInterest = feature("siblingOfInterest", { similarBefore, similarAfter }, (p) => p.similarBefore || p.similarAfter);
|
|
51
|
+
const attrOTP = feature("attrOTP", { fieldAttrs }, (p) => any(matchOtpAttr)(p.fieldAttrs));
|
|
52
|
+
const attrMFA = feature("attrMFA", { fieldAttrs }, (p) => any(matchTwoFa)(p.fieldAttrs));
|
|
53
|
+
const attrOutlier = feature("attrOutlier", { fieldAttrs }, (p) => any(matchOtpFieldOutlier)(p.fieldAttrs));
|
|
54
|
+
const textOTP = feature("textOTP", { fieldText }, (p) => matchOtpAttr(p.fieldText));
|
|
55
|
+
const textMFA = feature("textMFA", { fieldText }, (p) => matchTwoFa(p.fieldText));
|
|
56
|
+
const textAuthenticator = feature("textAuthenticator", { fieldText }, (p) => matchAuthenticator(p.fieldText));
|
|
57
|
+
const labelOTP = feature("labelOTP", { fieldLabel }, (p) => matchOtpAttr(p.fieldLabel));
|
|
58
|
+
const labelMFA = feature("labelMFA", { fieldLabel }, (p) => matchTwoFa(p.fieldLabel));
|
|
59
|
+
const labelAuthenticator = feature("labelAuthenticator", { fieldLabel }, (p) => matchAuthenticator(p.fieldLabel));
|
|
60
|
+
const labelOutlier = feature("labelOutlier", { fieldLabel }, (p) => matchOtpFieldOutlier(p.fieldLabel));
|
|
61
|
+
const mfa = feature("mfa", { formMFA, labelMFA, textMFA, attrMFA }, (p) => p.formMFA || p.labelMFA || p.textMFA || p.attrMFA);
|
|
62
|
+
const otp = feature("otp", { attrOTP, textOTP, labelOTP }, (p) => p.attrOTP || p.textOTP || p.labelOTP);
|
|
63
|
+
const outlierCandidate = feature("outlierCandidate", { mfa, otp }, (p) => p.mfa || p.otp);
|
|
64
|
+
const outlierMaxLength = feature("outlierMaxLength", { maxLen }, (p) => Boolean(p.maxLen && (p.maxLen > 20 || (p.maxLen > 1 && p.maxLen < 5))));
|
|
65
|
+
const outlierInputCount = feature("outlierInputCount", { mfaCandidates }, (p) => !(p.mfaCandidates === 1 || p.mfaCandidates === 6 || p.mfaCandidates === 5));
|
|
66
|
+
const outlierEmailMatchRaw = feature("outlierEmailMatch", { outlierCandidate, fieldForm }, (p) => {
|
|
67
|
+
var _a, _b, _c, _d;
|
|
68
|
+
if (!outlierCandidate)
|
|
69
|
+
return 0;
|
|
70
|
+
return (_d = (_c = ((_b = (_a = p.fieldForm) === null || _a === void 0 ? void 0 : _a.element.innerText) !== null && _b !== void 0 ? _b : "").match(/[a-z0-9*._-]@/gi)) === null || _c === void 0 ? void 0 : _c.length) !== null && _d !== void 0 ? _d : 0;
|
|
71
|
+
});
|
|
72
|
+
const outlierEmailMatchScaled = featureScaled(outlierEmailMatchRaw, 0, 2);
|
|
73
|
+
const outlierField = feature("outlierField", { attrOutlier, labelOutlier, fieldPlaceholder: placeholder }, (p) => p.attrOutlier || p.labelOutlier || p.placeholder.includes("://"));
|
|
74
|
+
const outlierSearch = feature("outlierSearch", { isSearchField: fieldSearch, searchForm }, (p) => p.isSearchField || p.searchForm);
|
|
75
|
+
const outlierAutocomplete = feature("outlierAutocomplete", { outlierCandidate, autocompleteOff, autocompleteOTC, fieldAutocomplete }, (p) => p.outlierCandidate && p.fieldAutocomplete !== undefined && !p.autocompleteOff && !p.autocompleteOTC);
|
|
76
|
+
export const otpFeatures = flattenFeatures({
|
|
77
|
+
attrMFA,
|
|
78
|
+
attrOTP,
|
|
79
|
+
autocompleteOTC,
|
|
80
|
+
fieldCC,
|
|
81
|
+
fieldIdentity,
|
|
82
|
+
formAuthenticator,
|
|
83
|
+
formComplexity,
|
|
84
|
+
formMFA,
|
|
85
|
+
idMatch,
|
|
86
|
+
labelAuthenticator,
|
|
87
|
+
labelMFA,
|
|
88
|
+
labelOTP,
|
|
89
|
+
nameMatch,
|
|
90
|
+
numericMode,
|
|
91
|
+
outlierAutocomplete,
|
|
92
|
+
outlierEmailMatchScaled,
|
|
93
|
+
outlierField,
|
|
94
|
+
outlierForm,
|
|
95
|
+
outlierHeadings,
|
|
96
|
+
outlierInputCount,
|
|
97
|
+
outlierLink,
|
|
98
|
+
outlierMaxLength,
|
|
99
|
+
outlierSearch,
|
|
100
|
+
patternOTP,
|
|
101
|
+
siblingOfInterest,
|
|
102
|
+
singleInput,
|
|
103
|
+
textAuthenticator,
|
|
104
|
+
textMFA,
|
|
105
|
+
});
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
export declare const passwordFeatures: {
|
|
2
|
+
attrConfirm: {
|
|
3
|
+
name: "attrConfirm";
|
|
4
|
+
parents: import("../..").AbstractFeatures;
|
|
5
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
6
|
+
};
|
|
7
|
+
attrCreate: {
|
|
8
|
+
name: "attrCreate";
|
|
9
|
+
parents: import("../..").AbstractFeatures;
|
|
10
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
11
|
+
};
|
|
12
|
+
attrCurrent: {
|
|
13
|
+
name: "attrCurrent";
|
|
14
|
+
parents: import("../..").AbstractFeatures;
|
|
15
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
16
|
+
};
|
|
17
|
+
attrReset: {
|
|
18
|
+
name: "attrReset";
|
|
19
|
+
parents: import("../..").AbstractFeatures;
|
|
20
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
21
|
+
};
|
|
22
|
+
autocompleteCurrent: {
|
|
23
|
+
name: "autocompleteCurrent";
|
|
24
|
+
parents: import("../..").AbstractFeatures;
|
|
25
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
26
|
+
};
|
|
27
|
+
autocompleteNew: {
|
|
28
|
+
name: "autocompleteNew";
|
|
29
|
+
parents: import("../..").AbstractFeatures;
|
|
30
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
31
|
+
};
|
|
32
|
+
autocompleteOTP: {
|
|
33
|
+
name: "autocompleteOTP";
|
|
34
|
+
parents: import("../..").AbstractFeatures;
|
|
35
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
36
|
+
};
|
|
37
|
+
fieldAutocompleteOff: {
|
|
38
|
+
name: "autocompleteOff";
|
|
39
|
+
parents: import("../..").AbstractFeatures;
|
|
40
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
41
|
+
};
|
|
42
|
+
fieldCC: {
|
|
43
|
+
name: "fieldCC";
|
|
44
|
+
parents: import("../..").AbstractFeatures;
|
|
45
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
46
|
+
};
|
|
47
|
+
fieldExotic: {
|
|
48
|
+
name: "fieldExotic";
|
|
49
|
+
parents: import("../..").AbstractFeatures;
|
|
50
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
51
|
+
};
|
|
52
|
+
fieldIdentity: {
|
|
53
|
+
name: "fieldIdentity";
|
|
54
|
+
parents: import("../..").AbstractFeatures;
|
|
55
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
56
|
+
};
|
|
57
|
+
fieldLogin: {
|
|
58
|
+
name: "fieldLogin";
|
|
59
|
+
parents: import("../..").AbstractFeatures;
|
|
60
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
61
|
+
};
|
|
62
|
+
fieldRegister: {
|
|
63
|
+
name: "fieldRegister";
|
|
64
|
+
parents: import("../..").AbstractFeatures;
|
|
65
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
66
|
+
};
|
|
67
|
+
labelConfirm: {
|
|
68
|
+
name: "labelConfirm";
|
|
69
|
+
parents: import("../..").AbstractFeatures;
|
|
70
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
71
|
+
};
|
|
72
|
+
labelCreate: {
|
|
73
|
+
name: "labelCreate";
|
|
74
|
+
parents: import("../..").AbstractFeatures;
|
|
75
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
76
|
+
};
|
|
77
|
+
labelCurrent: {
|
|
78
|
+
name: "labelCurrent";
|
|
79
|
+
parents: import("../..").AbstractFeatures;
|
|
80
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
81
|
+
};
|
|
82
|
+
nextPwConfirm: {
|
|
83
|
+
name: "nextPwConfirm";
|
|
84
|
+
parents: import("../..").AbstractFeatures;
|
|
85
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
86
|
+
};
|
|
87
|
+
nextPwCurrent: {
|
|
88
|
+
name: "nextPwCurrent";
|
|
89
|
+
parents: import("../..").AbstractFeatures;
|
|
90
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
91
|
+
};
|
|
92
|
+
nextPwField: {
|
|
93
|
+
name: "nextPwField";
|
|
94
|
+
parents: import("../..").AbstractFeatures;
|
|
95
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
96
|
+
};
|
|
97
|
+
nextPwNew: {
|
|
98
|
+
name: "nextPwNew";
|
|
99
|
+
parents: import("../..").AbstractFeatures;
|
|
100
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
101
|
+
};
|
|
102
|
+
passwordOutlier: {
|
|
103
|
+
name: "passwordOutlier";
|
|
104
|
+
parents: import("../..").AbstractFeatures;
|
|
105
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
106
|
+
};
|
|
107
|
+
prevPwCurrent: {
|
|
108
|
+
name: "prevPwCurrent";
|
|
109
|
+
parents: import("../..").AbstractFeatures;
|
|
110
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
111
|
+
};
|
|
112
|
+
prevPwField: {
|
|
113
|
+
name: "prevPwField";
|
|
114
|
+
parents: import("../..").AbstractFeatures;
|
|
115
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
116
|
+
};
|
|
117
|
+
prevPwNew: {
|
|
118
|
+
name: "prevPwNew";
|
|
119
|
+
parents: import("../..").AbstractFeatures;
|
|
120
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
121
|
+
};
|
|
122
|
+
textConfirm: {
|
|
123
|
+
name: "textConfirm";
|
|
124
|
+
parents: import("../..").AbstractFeatures;
|
|
125
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
126
|
+
};
|
|
127
|
+
textCreate: {
|
|
128
|
+
name: "textCreate";
|
|
129
|
+
parents: import("../..").AbstractFeatures;
|
|
130
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
131
|
+
};
|
|
132
|
+
textCurrent: {
|
|
133
|
+
name: "textCurrent";
|
|
134
|
+
parents: import("../..").AbstractFeatures;
|
|
135
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
136
|
+
};
|
|
137
|
+
fieldLogin_autocompleteNew: {
|
|
138
|
+
name: "fieldLogin,autocompleteNew";
|
|
139
|
+
parents: import("../..").AbstractFeatures;
|
|
140
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): number;
|
|
141
|
+
};
|
|
142
|
+
fieldLogin_maybeNew: {
|
|
143
|
+
name: "fieldLogin,maybeNew";
|
|
144
|
+
parents: import("../..").AbstractFeatures;
|
|
145
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): number;
|
|
146
|
+
};
|
|
147
|
+
fieldRegister_autocompleteCurrent: {
|
|
148
|
+
name: "fieldRegister,autocompleteCurrent";
|
|
149
|
+
parents: import("../..").AbstractFeatures;
|
|
150
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): number;
|
|
151
|
+
};
|
|
152
|
+
fieldRegister_maybeCurrent: {
|
|
153
|
+
name: "fieldRegister,maybeCurrent";
|
|
154
|
+
parents: import("../..").AbstractFeatures;
|
|
155
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): number;
|
|
156
|
+
};
|
|
157
|
+
prevPwCurrent_nextPwNew: {
|
|
158
|
+
name: "prevPwCurrent,nextPwNew";
|
|
159
|
+
parents: import("../..").AbstractFeatures;
|
|
160
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): number;
|
|
161
|
+
};
|
|
162
|
+
};
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { feature, featuresProduct, flattenFeatures } from "@protontech/autofill/features/feature";
|
|
2
|
+
import { fieldAttrs, fieldAutocomplete, fieldAutocompleteOff, fieldCC, fieldExotic, fieldIdentity, fieldLabel, fieldLogin, fieldNext, fieldPrev, fieldRegister, fieldText } from "@protontech/autofill/features/v1/abstract.field";
|
|
3
|
+
import { any } from "@protontech/autofill/utils/combinators";
|
|
4
|
+
import { getAllFieldHaystacks } from "@protontech/autofill/utils/extract";
|
|
5
|
+
import { matchPasswordConfirm, matchPasswordConfirmAttr, matchPasswordCreate, matchPasswordCreateAttr, matchPasswordCurrent, matchPasswordCurrentAttr, matchPasswordOutlier, matchPasswordReset, matchPasswordResetAttr, } from "@protontech/autofill/utils/re";
|
|
6
|
+
const passwordOutlier = feature("passwordOutlier", { fieldAttrs, fieldText, fieldLabel }, (p) => any(matchPasswordOutlier)(p.fieldAttrs.concat(p.fieldLabel, p.fieldText)));
|
|
7
|
+
const outlier = feature("outlier", { fieldCC, fieldIdentity, passwordOutlier }, (p) => p.fieldCC || p.fieldIdentity || p.passwordOutlier);
|
|
8
|
+
const autocompleteGated = feature("autocompleteGated", { fieldAutocomplete, outlier }, (p) => { var _a; return (p.outlier ? "" : ((_a = p.fieldAutocomplete) !== null && _a !== void 0 ? _a : "")); });
|
|
9
|
+
const autocompleteNew = feature("autocompleteNew", { autocompleteGated }, (p) => p.autocompleteGated === "new-password");
|
|
10
|
+
const autocompleteCurrent = feature("autocompleteCurrent", { autocompleteGated }, (p) => p.autocompleteGated === "current-password");
|
|
11
|
+
const autocompleteOTP = feature("autocompleteOTP", { autocompleteGated }, (p) => p.autocompleteGated.includes("one-time-code"));
|
|
12
|
+
const attrCurrent = feature("attrCurrent", { fieldAttrs }, (p) => any(matchPasswordCurrentAttr)(p.fieldAttrs));
|
|
13
|
+
const textCurrent = feature("textCurrent", { fieldText }, (p) => matchPasswordCurrent(p.fieldText));
|
|
14
|
+
const labelCurrent = feature("labelCurrent", { fieldLabel }, (p) => matchPasswordCurrent(p.fieldLabel));
|
|
15
|
+
const current = feature("current", { attrCurrent, textCurrent, labelCurrent }, (p) => p.attrCurrent || p.textCurrent || p.labelCurrent);
|
|
16
|
+
const attrCreate = feature("attrCreate", { fieldAttrs }, (p) => any(matchPasswordCreateAttr)(p.fieldAttrs));
|
|
17
|
+
const textCreate = feature("textCreate", { fieldText }, (p) => matchPasswordCreate(p.fieldText));
|
|
18
|
+
const labelCreate = feature("labelCreate", { fieldLabel }, (p) => matchPasswordCreate(p.fieldLabel));
|
|
19
|
+
const create = feature("create", { attrCreate, textCreate, labelCreate }, (p) => p.attrCreate || p.textCreate || p.labelCreate);
|
|
20
|
+
const attrConfirm = feature("attrConfirm", { fieldAttrs }, (p) => any(matchPasswordConfirmAttr)(p.fieldAttrs));
|
|
21
|
+
const textConfirm = feature("textConfirm", { fieldText }, (p) => matchPasswordConfirm(p.fieldText));
|
|
22
|
+
const labelConfirm = feature("labelConfirm", { fieldLabel }, (p) => matchPasswordConfirm(p.fieldLabel));
|
|
23
|
+
const confirm = feature("confirm", { attrConfirm, textConfirm, labelConfirm }, (p) => p.attrConfirm || p.textConfirm || p.labelConfirm);
|
|
24
|
+
const attrReset = feature("attrReset", { fieldAttrs }, (p) => any(matchPasswordResetAttr)(p.fieldAttrs));
|
|
25
|
+
const textReset = feature("textReset", { fieldText }, (p) => matchPasswordReset(p.fieldText));
|
|
26
|
+
const labelReset = feature("labelReset", { fieldLabel }, (p) => matchPasswordReset(p.fieldLabel));
|
|
27
|
+
const reset = feature("reset", { attrReset, textReset, labelReset }, (p) => p.attrReset || p.textReset || p.labelReset);
|
|
28
|
+
const maybeCurrent = feature("maybeCurrent", { current }, (p) => p.current);
|
|
29
|
+
const maybeNew = feature("maybeNew", { create, confirm, reset }, (p) => p.create || p.confirm || p.reset);
|
|
30
|
+
const prevPwFieldEl = feature("prevPwFieldEl", { fieldPrev }, (p) => { var _a; return (((_a = p.fieldPrev) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "password" ? p.fieldPrev : null); });
|
|
31
|
+
const prevPwField = feature("prevPwField", { prevPwFieldEl }, (p) => p.prevPwFieldEl !== null);
|
|
32
|
+
const prevPwHaystack = feature("prevPwHaystack", { prevPwFieldEl }, (p) => (p.prevPwFieldEl ? getAllFieldHaystacks(p.prevPwFieldEl) : []));
|
|
33
|
+
const prevPwAutocomplete = feature("prevPwAutocomplete", { prevPwFieldEl }, (p) => { var _a, _b; return (_b = (_a = p.prevPwFieldEl) === null || _a === void 0 ? void 0 : _a.getAttribute("autocomplete")) !== null && _b !== void 0 ? _b : null; });
|
|
34
|
+
const prevPwNew = feature("prevPwNew", { prevPwAutocomplete, prevPwHaystack }, (p) => p.prevPwAutocomplete === "new-password" || any(matchPasswordCreate)(p.prevPwHaystack));
|
|
35
|
+
const prevPwCurrent = feature("prevPwCurrent", { prevPwAutocomplete, prevPwHaystack }, (p) => p.prevPwAutocomplete === "current-password" || any(matchPasswordCurrent)(p.prevPwHaystack));
|
|
36
|
+
const nextPwFieldEl = feature("nextPwFieldEl", { fieldNext }, (p) => { var _a; return (((_a = p.fieldNext) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "password" ? p.fieldNext : null); });
|
|
37
|
+
const nextPwField = feature("nextPwField", { nextPwFieldEl }, (p) => p.nextPwFieldEl !== null);
|
|
38
|
+
const nextPwHaystack = feature("nextPwHaystack", { nextPwFieldEl }, (p) => (p.nextPwFieldEl ? getAllFieldHaystacks(p.nextPwFieldEl) : []));
|
|
39
|
+
const nextPwAutocomplete = feature("nextPwAutocomplete", { nextPwFieldEl }, (p) => { var _a, _b; return (_b = (_a = p.nextPwFieldEl) === null || _a === void 0 ? void 0 : _a.getAttribute("autocomplete")) !== null && _b !== void 0 ? _b : null; });
|
|
40
|
+
const nextPwNew = feature("nextPwNew", { nextPwAutocomplete, nextPwHaystack }, (p) => p.nextPwAutocomplete === "new-password" || any(matchPasswordCreate)(p.nextPwHaystack));
|
|
41
|
+
const nextPwConfirm = feature("nextPwConfirm", { nextPwHaystack }, (p) => any(matchPasswordConfirm)(p.nextPwHaystack));
|
|
42
|
+
const nextPwCurrent = feature("nextPwCurrent", { nextPwAutocomplete, nextPwHaystack }, (p) => p.nextPwAutocomplete === "current-password" || any(matchPasswordCurrent)(p.nextPwHaystack));
|
|
43
|
+
const fieldLogin_autocompleteNew = featuresProduct(fieldLogin, autocompleteNew);
|
|
44
|
+
const fieldLogin_maybeNew = featuresProduct(fieldLogin, maybeNew);
|
|
45
|
+
const fieldRegister_autocompleteCurrent = featuresProduct(fieldRegister, autocompleteCurrent);
|
|
46
|
+
const fieldRegister_maybeCurrent = featuresProduct(fieldRegister, maybeCurrent);
|
|
47
|
+
const prevPwCurrent_nextPwNew = featuresProduct(prevPwCurrent, nextPwNew);
|
|
48
|
+
export const passwordFeatures = flattenFeatures({
|
|
49
|
+
attrConfirm,
|
|
50
|
+
attrCreate,
|
|
51
|
+
attrCurrent,
|
|
52
|
+
attrReset,
|
|
53
|
+
autocompleteCurrent,
|
|
54
|
+
autocompleteNew,
|
|
55
|
+
autocompleteOTP,
|
|
56
|
+
fieldAutocompleteOff,
|
|
57
|
+
fieldCC,
|
|
58
|
+
fieldExotic,
|
|
59
|
+
fieldIdentity,
|
|
60
|
+
fieldLogin,
|
|
61
|
+
fieldRegister,
|
|
62
|
+
labelConfirm,
|
|
63
|
+
labelCreate,
|
|
64
|
+
labelCurrent,
|
|
65
|
+
nextPwConfirm,
|
|
66
|
+
nextPwCurrent,
|
|
67
|
+
nextPwField,
|
|
68
|
+
nextPwNew,
|
|
69
|
+
passwordOutlier,
|
|
70
|
+
prevPwCurrent,
|
|
71
|
+
prevPwField,
|
|
72
|
+
prevPwNew,
|
|
73
|
+
textConfirm,
|
|
74
|
+
textCreate,
|
|
75
|
+
textCurrent,
|
|
76
|
+
fieldLogin_autocompleteNew,
|
|
77
|
+
fieldLogin_maybeNew,
|
|
78
|
+
fieldRegister_autocompleteCurrent,
|
|
79
|
+
fieldRegister_maybeCurrent,
|
|
80
|
+
prevPwCurrent_nextPwNew,
|
|
81
|
+
});
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
export declare const usernameHiddenFeatures: {
|
|
2
|
+
attrMatch: {
|
|
3
|
+
name: "attrMatch";
|
|
4
|
+
parents: import("../..").AbstractFeatures;
|
|
5
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
6
|
+
};
|
|
7
|
+
autocompleteUsername: {
|
|
8
|
+
name: "autocompleteUsername";
|
|
9
|
+
parents: import("../..").AbstractFeatures;
|
|
10
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
11
|
+
};
|
|
12
|
+
fieldAttrEmail: {
|
|
13
|
+
name: "attrEmail";
|
|
14
|
+
parents: import("../..").AbstractFeatures;
|
|
15
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
16
|
+
};
|
|
17
|
+
fieldAttrUsername: {
|
|
18
|
+
name: "attrUsername";
|
|
19
|
+
parents: import("../..").AbstractFeatures;
|
|
20
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
21
|
+
};
|
|
22
|
+
fieldAutocompleteEmail: {
|
|
23
|
+
name: "autocompleteEmail";
|
|
24
|
+
parents: import("../..").AbstractFeatures;
|
|
25
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
26
|
+
};
|
|
27
|
+
fieldCC: {
|
|
28
|
+
name: "fieldCC";
|
|
29
|
+
parents: import("../..").AbstractFeatures;
|
|
30
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
31
|
+
};
|
|
32
|
+
fieldExotic: {
|
|
33
|
+
name: "fieldExotic";
|
|
34
|
+
parents: import("../..").AbstractFeatures;
|
|
35
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
36
|
+
};
|
|
37
|
+
fieldIdentity: {
|
|
38
|
+
name: "fieldIdentity";
|
|
39
|
+
parents: import("../..").AbstractFeatures;
|
|
40
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
41
|
+
};
|
|
42
|
+
valueEmail: {
|
|
43
|
+
name: "valueEmail";
|
|
44
|
+
parents: import("../..").AbstractFeatures;
|
|
45
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
46
|
+
};
|
|
47
|
+
valueTel: {
|
|
48
|
+
name: "valueTel";
|
|
49
|
+
parents: import("../..").AbstractFeatures;
|
|
50
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
51
|
+
};
|
|
52
|
+
valueUsername: {
|
|
53
|
+
name: "valueUsername";
|
|
54
|
+
parents: import("../..").AbstractFeatures;
|
|
55
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
56
|
+
};
|
|
57
|
+
visibleReadonly: {
|
|
58
|
+
name: "visibleReadonly";
|
|
59
|
+
parents: import("../..").AbstractFeatures;
|
|
60
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
61
|
+
};
|
|
62
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { feature, flattenFeatures } from "@protontech/autofill/features/feature";
|
|
2
|
+
import { field, fieldAttrEmail, fieldAttrUsername, fieldAutocomplete, fieldAutocompleteEmail, fieldCC, fieldExotic, fieldIdentity, readonly, typeValid, value } from "@protontech/autofill/features/v1/abstract.field";
|
|
3
|
+
import { matchEmailValue, matchTelValue, matchUsernameValue } from "@protontech/autofill/utils/re";
|
|
4
|
+
import { isVisible } from "@protontech/autofill/utils/visible";
|
|
5
|
+
const visibleReadonly = feature("visibleReadonly", { field, typeValid, readonly }, (p) => p.readonly && p.typeValid && isVisible(p.field, { opacity: true }));
|
|
6
|
+
const attrMatch = feature("attrMatch", { field }, (p) => p.field.matches('[name="username"],[id="username"],[name="account"]'));
|
|
7
|
+
const autocompleteUsername = feature("autocompleteUsername", { fieldAutocomplete }, (p) => { var _a; return Boolean((_a = p.fieldAutocomplete) === null || _a === void 0 ? void 0 : _a.includes("username")); });
|
|
8
|
+
const valueCandidate = feature("valueCandidate", { fieldValue: value }, (p) => p.value.length < 100);
|
|
9
|
+
const valueEmail = feature("valueEmail", { valueCandidate, fieldValue: value }, (p) => p.valueCandidate && matchEmailValue(p.value));
|
|
10
|
+
const valueTel = feature("valueTel", { valueCandidate, fieldValue: value }, (p) => p.valueCandidate && matchTelValue(p.value));
|
|
11
|
+
const valueUsername = feature("valueUsername", { valueCandidate, fieldValue: value }, (p) => p.valueCandidate && matchUsernameValue(p.value));
|
|
12
|
+
export const usernameHiddenFeatures = flattenFeatures({
|
|
13
|
+
attrMatch,
|
|
14
|
+
autocompleteUsername,
|
|
15
|
+
fieldAttrEmail,
|
|
16
|
+
fieldAttrUsername,
|
|
17
|
+
fieldAutocompleteEmail,
|
|
18
|
+
fieldCC,
|
|
19
|
+
fieldExotic,
|
|
20
|
+
fieldIdentity,
|
|
21
|
+
valueEmail,
|
|
22
|
+
valueTel,
|
|
23
|
+
valueUsername,
|
|
24
|
+
visibleReadonly,
|
|
25
|
+
});
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
export declare const usernameFeatures: {
|
|
2
|
+
fieldAttrUsername: {
|
|
3
|
+
name: "attrUsername";
|
|
4
|
+
parents: import("../..").AbstractFeatures;
|
|
5
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
6
|
+
};
|
|
7
|
+
fieldAutocompleteEmail: {
|
|
8
|
+
name: "autocompleteEmail";
|
|
9
|
+
parents: import("../..").AbstractFeatures;
|
|
10
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
11
|
+
};
|
|
12
|
+
fieldAutocompleteOff: {
|
|
13
|
+
name: "autocompleteOff";
|
|
14
|
+
parents: import("../..").AbstractFeatures;
|
|
15
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
16
|
+
};
|
|
17
|
+
fieldAutocompleteUsername: {
|
|
18
|
+
name: "autocompleteUsername";
|
|
19
|
+
parents: import("../..").AbstractFeatures;
|
|
20
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
21
|
+
};
|
|
22
|
+
fieldCC: {
|
|
23
|
+
name: "fieldCC";
|
|
24
|
+
parents: import("../..").AbstractFeatures;
|
|
25
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
26
|
+
};
|
|
27
|
+
fieldIdentity: {
|
|
28
|
+
name: "fieldIdentity";
|
|
29
|
+
parents: import("../..").AbstractFeatures;
|
|
30
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
31
|
+
};
|
|
32
|
+
fieldSearch: {
|
|
33
|
+
name: "isSearchField";
|
|
34
|
+
parents: import("../..").AbstractFeatures;
|
|
35
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
36
|
+
};
|
|
37
|
+
firstLoginFormField: {
|
|
38
|
+
name: "firstLoginFormField";
|
|
39
|
+
parents: import("../..").AbstractFeatures;
|
|
40
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
41
|
+
};
|
|
42
|
+
labelUsername: {
|
|
43
|
+
name: "labelUsername";
|
|
44
|
+
parents: import("../..").AbstractFeatures;
|
|
45
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
46
|
+
};
|
|
47
|
+
outlierAttrs: {
|
|
48
|
+
name: "outlierAttrs";
|
|
49
|
+
parents: import("../..").AbstractFeatures;
|
|
50
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
51
|
+
};
|
|
52
|
+
outlierEmail: {
|
|
53
|
+
name: "outlierEmail";
|
|
54
|
+
parents: import("../..").AbstractFeatures;
|
|
55
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
56
|
+
};
|
|
57
|
+
outlierLabel: {
|
|
58
|
+
name: "outlierLabel";
|
|
59
|
+
parents: import("../..").AbstractFeatures;
|
|
60
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
61
|
+
};
|
|
62
|
+
outlierText: {
|
|
63
|
+
name: "outlierText";
|
|
64
|
+
parents: import("../..").AbstractFeatures;
|
|
65
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
66
|
+
};
|
|
67
|
+
textUsername: {
|
|
68
|
+
name: "textUsername";
|
|
69
|
+
parents: import("../..").AbstractFeatures;
|
|
70
|
+
compute(parents: import("../..").InferParentComputeType<import("../..").AbstractFeatures>, fnode: import("@protontech/fathom").Fnode): boolean;
|
|
71
|
+
};
|
|
72
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { feature, flattenFeatures } from "@protontech/autofill/features/feature";
|
|
2
|
+
import { fieldAttrs, fieldAttrUsername, fieldAutocompleteEmail, fieldAutocompleteOff, fieldAutocompleteUsername, fieldCC, fieldEmailMatch, fieldFeats, fieldIdentity, fieldLabel, fieldPrevInput, fieldSearch, fieldText, } from "@protontech/autofill/features/v1/abstract.field";
|
|
3
|
+
import { any } from "@protontech/autofill/utils/combinators";
|
|
4
|
+
import { matchUsername, matchUsernameOutlier } from "@protontech/autofill/utils/re";
|
|
5
|
+
const textUsername = feature("textUsername", { fieldText }, (p) => matchUsername(p.fieldText));
|
|
6
|
+
const labelUsername = feature("labelUsername", { fieldLabel }, (p) => matchUsername(p.fieldLabel));
|
|
7
|
+
const username = feature("username", { fieldAttrUsername, textUsername, labelUsername }, (p) => p.attrUsername || p.textUsername || p.labelUsername);
|
|
8
|
+
const outlierAttrs = feature("outlierAttrs", { fieldAttrs }, (p) => any(matchUsernameOutlier)(p.fieldAttrs));
|
|
9
|
+
const outlierText = feature("outlierText", { fieldText }, (p) => matchUsernameOutlier(p.fieldText));
|
|
10
|
+
const outlierLabel = feature("outlierLabel", { fieldLabel }, (p) => matchUsernameOutlier(p.fieldLabel));
|
|
11
|
+
const outlierEmail = feature("outlierEmail", { username, emailMatch: fieldEmailMatch }, (p) => !p.username && p.emailMatch);
|
|
12
|
+
const outlier = feature("outlier", { outlierAttrs, outlierText, outlierLabel, outlierEmail }, (p) => p.outlierAttrs || p.outlierText || p.outlierLabel || p.outlierEmail);
|
|
13
|
+
const maybeCandidate = feature("maybeCandidate", { outlier, username }, (p) => !(p.outlier || p.username));
|
|
14
|
+
const firstFormField = feature("firstFormField", { fieldPrevInput }, (p) => p.fieldPrevInput === null);
|
|
15
|
+
const firstLoginFormField = feature("firstLoginFormField", { fieldFeats, firstFormField, maybeCandidate }, (p) => p.fieldFeats.isFormLogin && p.firstFormField && p.maybeCandidate);
|
|
16
|
+
export const usernameFeatures = flattenFeatures({
|
|
17
|
+
fieldAttrUsername,
|
|
18
|
+
fieldAutocompleteEmail,
|
|
19
|
+
fieldAutocompleteOff,
|
|
20
|
+
fieldAutocompleteUsername,
|
|
21
|
+
fieldCC,
|
|
22
|
+
fieldIdentity,
|
|
23
|
+
fieldSearch,
|
|
24
|
+
firstLoginFormField,
|
|
25
|
+
labelUsername,
|
|
26
|
+
outlierAttrs,
|
|
27
|
+
outlierEmail,
|
|
28
|
+
outlierLabel,
|
|
29
|
+
outlierText,
|
|
30
|
+
textUsername,
|
|
31
|
+
});
|