@protontech/autofill 0.0.22991789 → 0.0.33835493

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.
Files changed (176) hide show
  1. package/constants/features.d.ts +1 -0
  2. package/constants/features.js +1 -0
  3. package/constants/heuristics.d.ts +5 -4
  4. package/constants/heuristics.js +5 -10
  5. package/constants/selectors.d.ts +13 -7
  6. package/constants/selectors.js +29 -17
  7. package/debug.d.ts +24 -1
  8. package/debug.js +15 -13
  9. package/dictionary/generate.js +30 -21
  10. package/dictionary/generated/dictionary.d.ts +18 -4
  11. package/dictionary/generated/dictionary.js +31 -17
  12. package/dictionary/source/dictionary.d.ts +4 -3
  13. package/dictionary/source/dictionary.js +155 -89
  14. package/dictionary/source/patterns.js +2 -2
  15. package/features/feature.d.ts +18 -0
  16. package/features/feature.js +79 -0
  17. package/features/feature.spec.d.ts +1 -0
  18. package/features/feature.spec.js +55 -0
  19. package/features/v1/abstract.field.d.ts +20401 -0
  20. package/features/v1/abstract.field.js +95 -0
  21. package/features/v1/abstract.form.d.ts +1226 -0
  22. package/features/v1/abstract.form.js +336 -0
  23. package/features/v1/field.email.d.ts +62 -0
  24. package/features/v1/field.email.js +27 -0
  25. package/features/v1/field.otp.d.ts +142 -0
  26. package/features/v1/field.otp.js +105 -0
  27. package/features/v1/field.password.d.ts +162 -0
  28. package/features/v1/field.password.js +81 -0
  29. package/features/v1/field.username-hidden.d.ts +62 -0
  30. package/features/v1/field.username-hidden.js +25 -0
  31. package/features/v1/field.username.d.ts +72 -0
  32. package/features/v1/field.username.js +31 -0
  33. package/features/v1/index.d.ts +4428 -0
  34. package/features/v1/index.js +22 -0
  35. package/features/v1/index.spec.d.ts +1 -0
  36. package/features/v1/index.spec.js +30 -0
  37. package/index.d.ts +7 -2
  38. package/index.js +11 -3
  39. package/models/perceptron/index.d.ts +2 -0
  40. package/models/perceptron/index.js +42 -0
  41. package/models/perceptron/params/email-model.json +53 -0
  42. package/models/perceptron/params/login-model.json +465 -0
  43. package/models/perceptron/params/new-password-model.json +133 -0
  44. package/models/perceptron/params/otp-model.json +117 -0
  45. package/models/perceptron/params/password-change-model.json +465 -0
  46. package/models/perceptron/params/password-model.json +133 -0
  47. package/models/perceptron/params/recovery-model.json +465 -0
  48. package/models/perceptron/params/register-model.json +465 -0
  49. package/models/perceptron/params/username-hidden-model.json +53 -0
  50. package/models/perceptron/params/username-model.json +61 -0
  51. package/models/random_forest/index.d.ts +2 -0
  52. package/models/random_forest/index.js +42 -0
  53. package/models/random_forest/params/email-model.json +1456 -0
  54. package/models/random_forest/params/login-model.json +4194 -0
  55. package/models/random_forest/params/new-password-model.json +1448 -0
  56. package/models/random_forest/params/otp-model.json +2004 -0
  57. package/models/random_forest/params/password-change-model.json +1422 -0
  58. package/models/random_forest/params/password-model.json +1292 -0
  59. package/models/random_forest/params/recovery-model.json +2754 -0
  60. package/models/random_forest/params/register-model.json +3678 -0
  61. package/models/random_forest/params/username-hidden-model.json +1108 -0
  62. package/models/random_forest/params/username-model.json +1052 -0
  63. package/package.json +17 -15
  64. package/rules/v1/index.d.ts +4 -0
  65. package/rules/v1/index.js +66 -0
  66. package/rulesets.d.ts +9 -2
  67. package/rulesets.js +14 -9
  68. package/types/index.d.ts +70 -17
  69. package/types/index.js +34 -1
  70. package/utils/attributes.js +1 -1
  71. package/utils/clustering.js +18 -5
  72. package/utils/credit-card.d.ts +32 -0
  73. package/utils/credit-card.js +259 -0
  74. package/utils/credit-card.samples.spec.d.ts +1 -0
  75. package/utils/credit-card.samples.spec.js +452 -0
  76. package/utils/credit-card.spec.d.ts +1 -0
  77. package/utils/credit-card.spec.js +296 -0
  78. package/utils/dom.d.ts +3 -2
  79. package/utils/dom.js +12 -7
  80. package/utils/exclusion.d.ts +1 -0
  81. package/utils/exclusion.js +22 -10
  82. package/utils/extract.d.ts +1 -0
  83. package/utils/extract.js +26 -7
  84. package/utils/fathom.d.ts +10 -23
  85. package/utils/fathom.js +7 -12
  86. package/utils/field.d.ts +12 -4
  87. package/utils/field.js +25 -14
  88. package/utils/flags.d.ts +9 -3
  89. package/utils/flags.js +27 -9
  90. package/utils/form.d.ts +16 -5
  91. package/utils/form.js +35 -14
  92. package/utils/identity.d.ts +12 -21
  93. package/utils/identity.js +66 -41
  94. package/utils/identity.samples.spec.d.ts +1 -0
  95. package/utils/identity.samples.spec.js +28 -0
  96. package/utils/iframe.d.ts +2 -0
  97. package/utils/iframe.js +22 -0
  98. package/utils/overrides.d.ts +19 -0
  99. package/utils/overrides.js +40 -0
  100. package/utils/prepass.js +6 -4
  101. package/utils/re.d.ts +19 -4
  102. package/utils/re.js +22 -7
  103. package/utils/re.spec.d.ts +1 -0
  104. package/utils/re.spec.js +62 -0
  105. package/utils/shadow-dom.d.ts +8 -0
  106. package/utils/shadow-dom.js +53 -0
  107. package/utils/shadow-dom.spec.d.ts +1 -0
  108. package/utils/shadow-dom.spec.js +215 -0
  109. package/utils/visible.d.ts +3 -2
  110. package/utils/visible.js +42 -22
  111. package/cli.d.ts +0 -2
  112. package/cli.js +0 -128
  113. package/features/abstract.field.d.ts +0 -123
  114. package/features/abstract.field.js +0 -63
  115. package/features/abstract.form.d.ts +0 -98
  116. package/features/abstract.form.js +0 -281
  117. package/features/field.email.d.ts +0 -18
  118. package/features/field.email.js +0 -43
  119. package/features/field.otp.d.ts +0 -36
  120. package/features/field.otp.js +0 -116
  121. package/features/field.password.d.ts +0 -35
  122. package/features/field.password.js +0 -104
  123. package/features/field.username-hidden.d.ts +0 -15
  124. package/features/field.username-hidden.js +0 -40
  125. package/features/field.username.d.ts +0 -16
  126. package/features/field.username.js +0 -41
  127. package/features/form.combined.d.ts +0 -1
  128. package/features/form.combined.js +0 -6
  129. package/trainees/field.email.d.ts +0 -2
  130. package/trainees/field.email.js +0 -16
  131. package/trainees/field.identity.d.ts +0 -2
  132. package/trainees/field.identity.js +0 -9
  133. package/trainees/field.otp.d.ts +0 -2
  134. package/trainees/field.otp.js +0 -16
  135. package/trainees/field.password.current.d.ts +0 -2
  136. package/trainees/field.password.current.js +0 -16
  137. package/trainees/field.password.new.d.ts +0 -2
  138. package/trainees/field.password.new.js +0 -16
  139. package/trainees/field.username-hidden.d.ts +0 -2
  140. package/trainees/field.username-hidden.js +0 -22
  141. package/trainees/field.username.d.ts +0 -2
  142. package/trainees/field.username.js +0 -16
  143. package/trainees/form.login.d.ts +0 -2
  144. package/trainees/form.login.js +0 -16
  145. package/trainees/form.noop.d.ts +0 -1
  146. package/trainees/form.noop.js +0 -7
  147. package/trainees/form.password-change.d.ts +0 -2
  148. package/trainees/form.password-change.js +0 -16
  149. package/trainees/form.recovery.d.ts +0 -2
  150. package/trainees/form.recovery.js +0 -16
  151. package/trainees/form.register.d.ts +0 -2
  152. package/trainees/form.register.js +0 -16
  153. package/trainees/index.d.ts +0 -9
  154. package/trainees/index.js +0 -72
  155. package/trainees/results/result.email.d.ts +0 -2
  156. package/trainees/results/result.email.js +0 -17
  157. package/trainees/results/result.login.d.ts +0 -2
  158. package/trainees/results/result.login.js +0 -110
  159. package/trainees/results/result.new-password.d.ts +0 -2
  160. package/trainees/results/result.new-password.js +0 -36
  161. package/trainees/results/result.otp.d.ts +0 -2
  162. package/trainees/results/result.otp.js +0 -43
  163. package/trainees/results/result.password-change.d.ts +0 -2
  164. package/trainees/results/result.password-change.js +0 -110
  165. package/trainees/results/result.password.d.ts +0 -2
  166. package/trainees/results/result.password.js +0 -36
  167. package/trainees/results/result.recovery.d.ts +0 -2
  168. package/trainees/results/result.recovery.js +0 -110
  169. package/trainees/results/result.register.d.ts +0 -2
  170. package/trainees/results/result.register.js +0 -110
  171. package/trainees/results/result.username-hidden.d.ts +0 -2
  172. package/trainees/results/result.username-hidden.js +0 -15
  173. package/trainees/results/result.username.d.ts +0 -2
  174. package/trainees/results/result.username.js +0 -16
  175. package/utils/memoize.d.ts +0 -5
  176. 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
+ });