@protontech/autofill 0.0.22991789

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 (118) hide show
  1. package/README.md +1 -0
  2. package/cli.d.ts +2 -0
  3. package/cli.js +128 -0
  4. package/constants/heuristics.d.ts +15 -0
  5. package/constants/heuristics.js +21 -0
  6. package/constants/selectors.d.ts +18 -0
  7. package/constants/selectors.js +52 -0
  8. package/debug.d.ts +1 -0
  9. package/debug.js +17 -0
  10. package/dictionary/generate.d.ts +1 -0
  11. package/dictionary/generate.js +42 -0
  12. package/dictionary/generated/dictionary.d.ts +51 -0
  13. package/dictionary/generated/dictionary.js +51 -0
  14. package/dictionary/source/dictionary.d.ts +11 -0
  15. package/dictionary/source/dictionary.js +375 -0
  16. package/dictionary/source/patterns.d.ts +3 -0
  17. package/dictionary/source/patterns.js +3 -0
  18. package/features/abstract.field.d.ts +123 -0
  19. package/features/abstract.field.js +63 -0
  20. package/features/abstract.form.d.ts +98 -0
  21. package/features/abstract.form.js +281 -0
  22. package/features/field.email.d.ts +18 -0
  23. package/features/field.email.js +43 -0
  24. package/features/field.otp.d.ts +36 -0
  25. package/features/field.otp.js +116 -0
  26. package/features/field.password.d.ts +35 -0
  27. package/features/field.password.js +104 -0
  28. package/features/field.username-hidden.d.ts +15 -0
  29. package/features/field.username-hidden.js +40 -0
  30. package/features/field.username.d.ts +16 -0
  31. package/features/field.username.js +41 -0
  32. package/features/form.combined.d.ts +1 -0
  33. package/features/form.combined.js +6 -0
  34. package/index.d.ts +14 -0
  35. package/index.js +15 -0
  36. package/package.json +29 -0
  37. package/rulesets.d.ts +2 -0
  38. package/rulesets.js +10 -0
  39. package/trainees/field.email.d.ts +2 -0
  40. package/trainees/field.email.js +16 -0
  41. package/trainees/field.identity.d.ts +2 -0
  42. package/trainees/field.identity.js +9 -0
  43. package/trainees/field.otp.d.ts +2 -0
  44. package/trainees/field.otp.js +16 -0
  45. package/trainees/field.password.current.d.ts +2 -0
  46. package/trainees/field.password.current.js +16 -0
  47. package/trainees/field.password.new.d.ts +2 -0
  48. package/trainees/field.password.new.js +16 -0
  49. package/trainees/field.username-hidden.d.ts +2 -0
  50. package/trainees/field.username-hidden.js +22 -0
  51. package/trainees/field.username.d.ts +2 -0
  52. package/trainees/field.username.js +16 -0
  53. package/trainees/form.login.d.ts +2 -0
  54. package/trainees/form.login.js +16 -0
  55. package/trainees/form.noop.d.ts +1 -0
  56. package/trainees/form.noop.js +7 -0
  57. package/trainees/form.password-change.d.ts +2 -0
  58. package/trainees/form.password-change.js +16 -0
  59. package/trainees/form.recovery.d.ts +2 -0
  60. package/trainees/form.recovery.js +16 -0
  61. package/trainees/form.register.d.ts +2 -0
  62. package/trainees/form.register.js +16 -0
  63. package/trainees/index.d.ts +9 -0
  64. package/trainees/index.js +72 -0
  65. package/trainees/results/result.email.d.ts +2 -0
  66. package/trainees/results/result.email.js +17 -0
  67. package/trainees/results/result.login.d.ts +2 -0
  68. package/trainees/results/result.login.js +110 -0
  69. package/trainees/results/result.new-password.d.ts +2 -0
  70. package/trainees/results/result.new-password.js +36 -0
  71. package/trainees/results/result.otp.d.ts +2 -0
  72. package/trainees/results/result.otp.js +43 -0
  73. package/trainees/results/result.password-change.d.ts +2 -0
  74. package/trainees/results/result.password-change.js +110 -0
  75. package/trainees/results/result.password.d.ts +2 -0
  76. package/trainees/results/result.password.js +36 -0
  77. package/trainees/results/result.recovery.d.ts +2 -0
  78. package/trainees/results/result.recovery.js +110 -0
  79. package/trainees/results/result.register.d.ts +2 -0
  80. package/trainees/results/result.register.js +110 -0
  81. package/trainees/results/result.username-hidden.d.ts +2 -0
  82. package/trainees/results/result.username-hidden.js +15 -0
  83. package/trainees/results/result.username.d.ts +2 -0
  84. package/trainees/results/result.username.js +16 -0
  85. package/types/index.d.ts +38 -0
  86. package/types/index.js +20 -0
  87. package/utils/attributes.d.ts +9 -0
  88. package/utils/attributes.js +13 -0
  89. package/utils/clustering.d.ts +1 -0
  90. package/utils/clustering.js +81 -0
  91. package/utils/combinators.d.ts +6 -0
  92. package/utils/combinators.js +4 -0
  93. package/utils/dom.d.ts +25 -0
  94. package/utils/dom.js +104 -0
  95. package/utils/exclusion.d.ts +3 -0
  96. package/utils/exclusion.js +59 -0
  97. package/utils/extract.d.ts +13 -0
  98. package/utils/extract.js +59 -0
  99. package/utils/fathom.d.ts +38 -0
  100. package/utils/fathom.js +68 -0
  101. package/utils/field.d.ts +14 -0
  102. package/utils/field.js +50 -0
  103. package/utils/flags.d.ts +25 -0
  104. package/utils/flags.js +60 -0
  105. package/utils/form.d.ts +7 -0
  106. package/utils/form.js +25 -0
  107. package/utils/identity.d.ts +24 -0
  108. package/utils/identity.js +63 -0
  109. package/utils/memoize.d.ts +5 -0
  110. package/utils/memoize.js +12 -0
  111. package/utils/prepass.d.ts +2 -0
  112. package/utils/prepass.js +31 -0
  113. package/utils/re.d.ts +58 -0
  114. package/utils/re.js +64 -0
  115. package/utils/text.d.ts +3 -0
  116. package/utils/text.js +8 -0
  117. package/utils/visible.d.ts +13 -0
  118. package/utils/visible.js +143 -0
@@ -0,0 +1,375 @@
1
+ const dictionary = {
2
+ LOGIN: {
3
+ i18n: {
4
+ en: ["login", "signin", "signon", "authenticate", "connect", "new session"],
5
+ fr: ["connexion", "se connecter", "s'identifier", "authentifier", "entrer", "nouvelle session"],
6
+ es: ["introduce", "introducir", "entrar", "iniciar sesión", "acceder", "nueva sesión"],
7
+ de: ["anmelden", "anmeldung", "anmeldedaten"],
8
+ pt: ["iniciar sessão", "conectar", "entrar", "nova sessão"],
9
+ cz: ["přihlásit"],
10
+ it: ['accedi']
11
+ },
12
+ },
13
+ REGISTER: {
14
+ i18n: {
15
+ en: ["register", "sign up", "create account", "join", "new account", "get started"],
16
+ fr: ["inscrire", "créer un compte", "rejoindre", "commencer", "nouveau compte", "s'inscrire"],
17
+ es: ["registrarse", "crear cuenta", "unirse", "empezar", "nueva cuenta"],
18
+ de: ["registrieren", "neues konto", "konto erstellen"],
19
+ pt: ["registrar", "criar conta", "juntar", "começar", "nova conta"],
20
+ it: ['crea account', 'creare account', 'registrati']
21
+ },
22
+ },
23
+ RECOVERY: {
24
+ i18n: {
25
+ en: ["help", "recover", "restore", "reset", "trouble", "problem"],
26
+ fr: ["aide", "récupérer", "restaurer", "réinitialiser"],
27
+ es: ["ayuda", "recuperar", "restaurar", "restablecer"],
28
+ de: ["hilfe", "wiederherstellen", "zurücksetzen"],
29
+ pt: ["ajuda", "recuperar", "restaurar", "redefinir"],
30
+ },
31
+ },
32
+ MULTI_STEP: {
33
+ i18n: {
34
+ en: ["step", "stage", "progress"],
35
+ fr: ["étape", "progression"],
36
+ es: ["paso", "etapa", "progreso"],
37
+ de: ["schritt", "phase", "fortschritt"],
38
+ pt: ["progresso"],
39
+ },
40
+ },
41
+ TROUBLE: {
42
+ i18n: {
43
+ en: ["forgot", "problem", "issue", "trouble", "need help"],
44
+ fr: ["oublié", "incident", "difficulté"],
45
+ es: ["olvidado", "incidencia", "ayuda"],
46
+ de: ["vergessen", "schwierigkeit", "hilfe"],
47
+ pt: ["esquecido", "questão"],
48
+ },
49
+ },
50
+ PASSWORD: {
51
+ i18n: {
52
+ en: ["password", "secret", "passphrase", "pass code", "key", "secret code"],
53
+ fr: ["mot de passe", "clé secrète", "phrase secrète", "code secret"],
54
+ es: ["contraseña", "clave secreta"],
55
+ de: ["passwort", "geheimnis", "zugangscode"],
56
+ pt: ["senha", "chave secreta", "de segurança"],
57
+ cz: ["heslo"],
58
+ },
59
+ attr: {
60
+ values: ["pwd", "pw", "mdp", "pass", "fmt"],
61
+ },
62
+ },
63
+ PASSWORD_OUTLIER: {
64
+ i18n: {
65
+ en: ["national id", "social security", "userid"],
66
+ },
67
+ },
68
+ USERNAME: {
69
+ i18n: {
70
+ en: ["username", "identifier", "identity", "screenname", "handle", "nickname"],
71
+ fr: ["pseudo", "utilisateur", "identifiant"],
72
+ es: ["usuario", "identificador", "usuari"],
73
+ de: ["nutzername", "anmelde", "benutzer"],
74
+ },
75
+ attr: {
76
+ values: ["appleid", "identifyemail", "acct", "userid", "accountid", "loginid", "loginname", "customerid"],
77
+ },
78
+ },
79
+ USERNAME_OUTLIER: {
80
+ i18n: {
81
+ en: ["first name", "last name", "middle name", "company name", "title"],
82
+ fr: ["prénom", "nom de famille", "titre"],
83
+ es: ["nombre", "apellido"],
84
+ de: ["vorname", "nachname"],
85
+ pt: ["primeiro nome", "sobrenome"],
86
+ },
87
+ },
88
+ EMAIL: {
89
+ i18n: {
90
+ en: ["email"],
91
+ fr: ["courriel"],
92
+ es: ["correo"],
93
+ pt: ["correio"],
94
+ },
95
+ attr: {
96
+ values: ["usermail"],
97
+ },
98
+ },
99
+ TEL: {
100
+ i18n: {
101
+ en: ["telephone", "phonenumber", "mobile", "cellnumber", "cellphone"],
102
+ fr: ["numero de tel"],
103
+ es: ["movil", "teléfono"],
104
+ de: ["telefon", "mobil"],
105
+ pt: ["celular", "telefone"],
106
+ },
107
+ },
108
+ CAPTCHA: {
109
+ i18n: {},
110
+ attr: {
111
+ values: ["captcha", "recaptcha", "hcaptcha", "solve-media", "funcaptcha", "keycaptcha"],
112
+ },
113
+ },
114
+ SUBMIT_ACTION: {
115
+ i18n: {
116
+ en: ["submit", "go"],
117
+ fr: ["valider"],
118
+ es: ["enviar"],
119
+ de: ["senden"],
120
+ pt: ["enviar"],
121
+ },
122
+ },
123
+ CREATE_ACTION: {
124
+ i18n: {
125
+ en: ["new", "set", "create"],
126
+ fr: ["nouveau", "créer"],
127
+ es: ["nuevo", "crear"],
128
+ de: ["neu", "erstellen"],
129
+ pt: ["novo", "criar"],
130
+ it: ['creare']
131
+ },
132
+ attr: {
133
+ endsWith: ["1", "fst"],
134
+ },
135
+ },
136
+ RESET_ACTION: {
137
+ i18n: {
138
+ en: ["change", "update", "reset"],
139
+ fr: ["mettre à jour", "réinitialiser"],
140
+ es: ["cambiar", "actualizar", "restablecer"],
141
+ de: ["ändern", "aktualisieren", "zurücksetzen"],
142
+ pt: ["alterar", "atualizar", "redefinir"],
143
+ },
144
+ },
145
+ CONFIRM_ACTION: {
146
+ i18n: {
147
+ en: ["confirm", "repeat", "verify", "retype", "again"],
148
+ fr: ["répéter", "vérifier", "saisir à nouveau"],
149
+ es: ["repetir", "verificar", "volver a escribir"],
150
+ de: ["bestätigen", "wiederholen", "verifizieren", "erneut eingeben"],
151
+ pt: ["digitar novamente"],
152
+ },
153
+ attr: {
154
+ endsWith: ["2", "bis", "snd"],
155
+ },
156
+ },
157
+ STEP_ACTION: {
158
+ i18n: {
159
+ en: ["continue", "next", "proceed", "accept", "back", "finish", "complete", "get started"],
160
+ fr: ["suivant", "prochain", "précédent", "terminer"],
161
+ es: ["continuar", "siguiente", "anterior", "finalizar"],
162
+ de: ["weiter", "fortfahren", "abschließen", "zurück", "fertigstellen"],
163
+ pt: ["proximo", "terminar", "completar"],
164
+ },
165
+ },
166
+ REMEMBER_ACTION: {
167
+ i18n: {
168
+ en: ["keep", "remember", "stay"],
169
+ fr: ["rester", "se souvenir de"],
170
+ es: ["mantener", "recordarme"],
171
+ de: ["angemeldet bleiben", "mich erinnern"],
172
+ pt: ["manter me", "lembrar de mim"],
173
+ },
174
+ },
175
+ SEARCH_ACTION: {
176
+ i18n: {
177
+ en: ["search", "query"],
178
+ fr: ["recherche"],
179
+ es: ["buscar"],
180
+ de: ["suche"],
181
+ pt: [],
182
+ },
183
+ },
184
+ CURRENT_VALUE: {
185
+ i18n: {
186
+ en: ["previous", "current", "old", "existing", "last", "before"],
187
+ fr: ["précédent", "actuel", "ancien", "existant", "dernier"],
188
+ es: ["anterior", "actual", "viejo", "existente", "último"],
189
+ de: ["vorherige", "aktuelle", "alte", "bestehende", "letzte"],
190
+ pt: ["anterior", "atual", "antigo", "existente", "último"],
191
+ },
192
+ attr: {
193
+ values: ["curr", "prev"],
194
+ },
195
+ },
196
+ HIDDEN: {
197
+ i18n: {},
198
+ attr: {
199
+ values: ["offscreen", "move-offscreen", "sr-only", "display-none", "screen-reader-only", "a11y-hide"],
200
+ exact: ["hidden", "is-hidden"],
201
+ },
202
+ },
203
+ OAUTH: {
204
+ i18n: {},
205
+ attr: {
206
+ values: ["apple", "facebook", "google", "twitch"],
207
+ },
208
+ },
209
+ TOS: {
210
+ i18n: {
211
+ en: ["terms of", "guideline", "consent", "acknowledge", "understand", "agree", "privacy", "policy"],
212
+ fr: ["conditions", "consentement", "accord", "confidentialité"],
213
+ es: ["términos", "condiciones", "consentimiento", "acuerdo", "privacidad"],
214
+ de: ["nutzungsbedingungen", "einwilligung", "zustimmung", "datenschutzrichtlinie"],
215
+ pt: ["termos de uso", "consentimento", "acordo", "política de privacidade"],
216
+ },
217
+ },
218
+ MFA_ACTION: {
219
+ i18n: {
220
+ en: ["Enter code", "verify", "enter auth code", "confirm"],
221
+ fr: [],
222
+ es: [],
223
+ de: [],
224
+ pt: [],
225
+ },
226
+ },
227
+ MFA: {
228
+ i18n: {
229
+ en: [
230
+ "2FA",
231
+ "2step",
232
+ "multi factor",
233
+ "two factor",
234
+ "two step",
235
+ "auth code",
236
+ "authenticator",
237
+ "authentication app",
238
+ "authentication code",
239
+ "security code",
240
+ "verification",
241
+ "generator app",
242
+ ],
243
+ fr: ["2 étapes", "multi-facteur", "double facteur", "double étape", "authentificateur"],
244
+ es: ["2 pasos", "doble paso", "doble factor", "verificacion", "generadora"],
245
+ de: ["2-Schritte", "Multi-Faktor", "Zwei-Faktor", "Zwei-Schritte", "Authentifikator", "Authentifizierungs"],
246
+ pt: ["2 etapas", "autenticador", "dois passos", "dois fatores", "multifator", "verificação", "autenticador"],
247
+ },
248
+ attr: {
249
+ values: ["twofactor", "twostep", "challenge", "two-factor", "loginCode", "2fa", "twofa", "tfacode", "phone_verification", "approvals_code"],
250
+ exact: ["tfa", "mfa"],
251
+ },
252
+ },
253
+ OTP: {
254
+ i18n: {},
255
+ attr: {
256
+ values: ["onetime", "1time", "totp", "otp", "totpPin", "otc"],
257
+ },
258
+ },
259
+ OTP_OUTLIER: {
260
+ i18n: {
261
+ en: ["resend", "new code", "send"],
262
+ fr: ["nouveau code", "envoyer"],
263
+ es: ["reenviar", "nuevo código", "enviar"],
264
+ de: ["neu senden", "neuer Code", "senden"],
265
+ pt: ["reenviar", "novo código", "enviar"],
266
+ },
267
+ attr: {
268
+ values: ["sms", "email", "phone-pin", "tel-pin", "email-pin", "phone_verification_pin"],
269
+ },
270
+ },
271
+ NEWSLETTER: {
272
+ i18n: {
273
+ en: ["newsletter", "mailing", "bulletin"],
274
+ es: ["boletin"],
275
+ },
276
+ attr: {
277
+ values: ["newsletter", "mailing-list", "email-form", "subscription"],
278
+ },
279
+ },
280
+ IDENTITY_FULLNAME: {
281
+ i18n: {},
282
+ attr: {
283
+ values: ["full-name", "your-name", "address-name", "address-contact", "contact-person"],
284
+ exact: ["name"],
285
+ },
286
+ },
287
+ IDENTITY_FIRSTNAME: {
288
+ i18n: {},
289
+ attr: { values: ["first-name", "given-name", "first-n"], exact: ["f-name"] },
290
+ },
291
+ IDENTITY_MIDDLENAME: {
292
+ i18n: {},
293
+ attr: { values: ["middle-name", "additional-name", "middle-n"], exact: ["m-name"] },
294
+ },
295
+ IDENTITY_LASTNAME: {
296
+ i18n: {},
297
+ attr: { values: ["last-name", "surname", "family-name", "family-n", "last-n"], exact: ["l-name", "s-name"] },
298
+ },
299
+ IDENTITY_TELEPHONE: {
300
+ i18n: {},
301
+ attr: {
302
+ values: ["phone", "mobile", "telephone", "tel-local", "tel-national", "national-number", "contact-number"],
303
+ exact: ["tel"],
304
+ },
305
+ },
306
+ IDENTITY_TELEPHONE_PREFIX: {
307
+ i18n: {},
308
+ attr: { values: ["prefix", "code", "country"] },
309
+ },
310
+ IDENTITY_ADDRESS: {
311
+ i18n: {},
312
+ attr: {
313
+ values: [
314
+ "address-line-one",
315
+ "address-line1",
316
+ "address-lines",
317
+ "address1",
318
+ "bill-addr",
319
+ "billing-addr",
320
+ "mailing-addr",
321
+ "preferred-address",
322
+ "street-address",
323
+ ],
324
+ exact: ["address", "addr", "street", "line1", "mail-addr"],
325
+ },
326
+ },
327
+ IDENTITY_ADDRESS_LINES: {
328
+ i18n: {},
329
+ attr: {
330
+ endsWith: ["line2", "line-two", "line3", "line-three"],
331
+ },
332
+ },
333
+ IDENTITY_STATE: {
334
+ i18n: {},
335
+ attr: {
336
+ values: ["address-level-1", "address-state", "address-province", "state-province"],
337
+ exact: ["state", "province", "region", "county"],
338
+ },
339
+ },
340
+ IDENTITY_CITY: {
341
+ i18n: {},
342
+ attr: {
343
+ values: ["address-level-2", "address-city", "address-town", "personal-city"],
344
+ exact: ["city", "town", "locality"],
345
+ },
346
+ },
347
+ IDENTITY_ZIPCODE: {
348
+ i18n: {},
349
+ attr: {
350
+ values: ["zip-code", "postal-code", "post-code", "address-zip", "address-postal", "address-postal-code", "address-zip-code"],
351
+ exact: ["zip"],
352
+ },
353
+ },
354
+ IDENTITY_ORGANIZATION: {
355
+ i18n: {},
356
+ attr: {
357
+ values: ["company-name", "organization", "organization-name"],
358
+ exact: ["organization"],
359
+ },
360
+ },
361
+ IDENTITY_COUNTRY: {
362
+ i18n: {},
363
+ attr: {
364
+ values: ["country-name", "address-country", "address-country-name"],
365
+ exact: ["country"],
366
+ },
367
+ },
368
+ IDENTITY_COUNTRY_CODE: {
369
+ i18n: {},
370
+ attr: {
371
+ values: ["country-code"],
372
+ },
373
+ },
374
+ };
375
+ export default dictionary;
@@ -0,0 +1,3 @@
1
+ export declare const EMAIL_VALUE_RE: RegExp;
2
+ export declare const TEL_VALUE_RE: RegExp;
3
+ export declare const USERNAME_VALUE_RE: RegExp;
@@ -0,0 +1,3 @@
1
+ export const EMAIL_VALUE_RE = /^[\w\-\.]+@([\w-]+\.)+[\w-]{2,5}$/;
2
+ export const TEL_VALUE_RE = /^[\d()+-]{6,25}$/;
3
+ export const USERNAME_VALUE_RE = /^[\w\-\.]{7,30}$/;
@@ -0,0 +1,123 @@
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>;
@@ -0,0 +1,63 @@
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;
@@ -0,0 +1,98 @@
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)[];