@email-utils/validator-syntax 0.0.1-9 → 1.0.0-rc.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixtures.mjs","names":[],"sources":["../src/fixtures/types.ts","../src/fixtures/isemail.ts","../src/fixtures/legacy.ts","../src/fixtures/rfc3696.ts","../src/fixtures/wikipedia.ts","../src/fixtures/index.ts"],"sourcesContent":["// The shape of a fixture. Each one carries its expected result under every\n// preset, so one table drives the tests, the benches, dependents'\n// consistency tests, and the docs' support matrix.\nimport type { ReasonCode } from '../result';\n\nexport type Preset = 'practical' | 'rfc5321' | 'rfc5322' | 'html5';\n\nexport const presets: readonly Preset[] = [\n 'practical',\n 'rfc5321',\n 'rfc5322',\n 'html5',\n];\n\n/** The `syntax.*` codes from the reason-code catalogue (meta docs/api/reason-codes.md). */\nexport type SyntaxReasonCode = ReasonCode;\n\nexport type Expected =\n { ok: true } | { ok: false; reason: SyntaxReasonCode; index?: number };\n\n/**\n * The address features the support matrix has a row for. A fixture is tagged\n * with one only when it's a well-formed example of that feature, so counting\n * which presets accept the tagged fixtures gives the matrix.\n */\nexport type SyntaxFeature =\n | 'dot-atom'\n | 'atext-specials'\n | 'route-chars'\n | 'misplaced-dots'\n | 'long-local'\n | 'quoted-local'\n | 'quoted-pair'\n | 'obs-local'\n | 'comments'\n | 'fws'\n | 'obs-control'\n | 'ipv4-literal'\n | 'ipv6-literal'\n | 'general-literal'\n | 'dotless-domain'\n | 'unknown-tld';\n\n/** The support matrix's rows, in order, with each feature's label. */\nexport const syntaxFeatures: readonly {\n feature: SyntaxFeature;\n label: string;\n}[] = [\n { feature: 'dot-atom', label: 'Letters, digits, and single dots' },\n {\n feature: 'atext-specials',\n label: 'Printable specials like `+`, `/`, `=`, and `_`',\n },\n { feature: 'route-chars', label: 'Route characters (`%`, `!`)' },\n {\n feature: 'misplaced-dots',\n label: 'Leading, trailing, or consecutive dots',\n },\n { feature: 'long-local', label: 'Local part over 64 characters' },\n { feature: 'quoted-local', label: 'Quoted local part' },\n { feature: 'quoted-pair', label: 'Backslash escapes in a quoted string' },\n {\n feature: 'obs-local',\n label: 'Dot-separated atoms and quoted strings mixed',\n },\n { feature: 'comments', label: 'Comments' },\n { feature: 'fws', label: 'Whitespace and line folding between tokens' },\n { feature: 'obs-control', label: 'Control characters (obsolete syntax)' },\n { feature: 'ipv4-literal', label: 'IPv4 address literal' },\n { feature: 'ipv6-literal', label: 'IPv6 address literal' },\n { feature: 'general-literal', label: 'Other domain literals' },\n { feature: 'dotless-domain', label: 'Domain with no dot' },\n { feature: 'unknown-tld', label: 'TLD outside the IANA set' },\n];\n\nexport interface SyntaxFixture {\n address: string;\n description: string;\n /** The result with each preset's default options. */\n expected: Record<Preset, Expected>;\n /** The support-matrix row this fixture is a well-formed example of. */\n feature?: SyntaxFeature;\n}\n\nexport interface LegacyFixture extends SyntaxFixture {\n /** What 0.0.1's `validate()` returned with its default config. */\n legacy: boolean;\n /**\n * Why v1's default preset (`practical`) disagrees with `legacy`: the 0.0.1\n * bug it was, or the v1 rule that changed. Required exactly when they\n * disagree.\n */\n flipped?: string;\n}\n\nexport interface IsemailFixture extends SyntaxFixture {\n /** The test's `id` in isemail's tests.xml. */\n isemail: number;\n}\n\nexport const valid: Expected = { ok: true };\n\nexport function fail(reason: SyntaxReasonCode, index?: number): Expected {\n return index === undefined\n ? { ok: false, reason }\n : { ok: false, reason, index };\n}\n\n/** The same result under every preset. */\nexport function everywhere(expected: Expected): Record<Preset, Expected> {\n return {\n practical: expected,\n rfc5321: expected,\n rfc5322: expected,\n html5: expected,\n };\n}\n\n/** Valid under both RFC presets; `practical` and `html5` both give `rejected`. */\nexport function rfcOnly(rejected: Expected): Record<Preset, Expected> {\n return {\n practical: rejected,\n rfc5321: valid,\n rfc5322: valid,\n html5: rejected,\n };\n}\n\n/** Fails the same way under every preset but rfc5322, which gives `rfc5322`. */\nexport function allBut5322(\n others: Expected,\n rfc5322: Expected,\n): Record<Preset, Expected> {\n return { ...everywhere(others), rfc5322 };\n}\n\n/** Valid only under `rfc5322`; every other preset gives `rejected`. */\nexport function rfc5322Only(rejected: Expected): Record<Preset, Expected> {\n return { ...everywhere(rejected), rfc5322: valid };\n}\n","// Dominic Sayers' is_email test set, version 3.05, from\n// https://github.com/dominicsayers/isemail/blob/e731ebbe49c7c666b4479894ea330acf06cf8b77/test/tests.xml\n// with each test's expected result under v1's presets. `isemail` is the\n// test's id there. Tests 103 and 122 repeat the addresses of 50 and 7, so\n// they're left out. Control characters, which tests.xml writes as the\n// U+2400 control pictures, are the real characters here.\n//\n// Copyright (c) 2016, Dominic Sayers. All rights reserved.\n// Used under the BSD 3-Clause License; the full notice is in\n// THIRD_PARTY_NOTICES.md.\nimport {\n type Expected,\n type IsemailFixture,\n type Preset,\n allBut5322,\n everywhere,\n fail,\n rfc5322Only,\n rfcOnly,\n valid,\n} from './types';\n\n/** A domain literal that only rfc5322's dtext accepts. */\nconst rfc5322Literal: Record<Preset, Expected> = {\n practical: fail('syntax.domain.invalid_char', 5),\n rfc5321: fail('syntax.domain.literal_invalid', 5),\n rfc5322: valid,\n html5: fail('syntax.domain.invalid_char', 5),\n};\n\n/** Quote-unaware presets fail at the opening quote; the RFC presets give `rfc`. */\nfunction quotedLocal(rfc: Expected): Record<Preset, Expected> {\n return {\n practical: fail('syntax.local.invalid_char', 0),\n rfc5321: rfc,\n rfc5322: rfc,\n html5: fail('syntax.local.invalid_char', 0),\n };\n}\n\nconst longLabel =\n 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl';\n\nexport const isemailFixtures: readonly IsemailFixture[] = [\n // The @ separator and the plain parts.\n {\n isemail: 1,\n address: '',\n description: 'Empty string',\n expected: everywhere(fail('syntax.address.empty')),\n },\n {\n isemail: 2,\n address: 'test',\n description: 'No @',\n expected: everywhere(fail('syntax.address.no_at')),\n },\n {\n isemail: 3,\n address: '@',\n description: 'Only an @',\n expected: everywhere(fail('syntax.local.empty')),\n },\n {\n isemail: 4,\n address: 'test@',\n description: 'Nothing after the @',\n expected: everywhere(fail('syntax.domain.empty')),\n },\n {\n isemail: 5,\n address: 'test@io',\n description: 'Domain with no dot, a real TLD',\n feature: 'dotless-domain',\n expected: { ...everywhere(fail('syntax.domain.no_dot')), html5: valid },\n },\n {\n isemail: 6,\n address: '@io',\n description: 'Nothing before the @, dotless domain',\n expected: everywhere(fail('syntax.local.empty')),\n },\n {\n isemail: 7,\n address: '@iana.org',\n description: 'Nothing before the @',\n expected: everywhere(fail('syntax.local.empty')),\n },\n {\n isemail: 8,\n address: 'test@iana.org',\n description: 'Simple address',\n feature: 'dot-atom',\n expected: everywhere(valid),\n },\n {\n isemail: 9,\n address: 'test@nominet.org.uk',\n description: 'Three-label domain',\n feature: 'dot-atom',\n expected: everywhere(valid),\n },\n {\n isemail: 10,\n address: 'test@about.museum',\n description: 'Six-letter TLD',\n feature: 'dot-atom',\n expected: everywhere(valid),\n },\n {\n isemail: 11,\n address: 'a@iana.org',\n description: 'Single-letter local part',\n feature: 'dot-atom',\n expected: everywhere(valid),\n },\n {\n isemail: 12,\n address: 'test@e.com',\n description: 'Single-letter domain label',\n feature: 'dot-atom',\n expected: everywhere(valid),\n },\n {\n isemail: 13,\n address: 'test@iana.a',\n description: 'Single-letter TLD',\n feature: 'unknown-tld',\n expected: { ...everywhere(valid), practical: fail('syntax.tld.unknown') },\n },\n {\n isemail: 14,\n address: 'test.test@iana.org',\n description: 'Dot in the local part',\n feature: 'dot-atom',\n expected: everywhere(valid),\n },\n\n // Dots.\n {\n isemail: 15,\n address: '.test@iana.org',\n description: 'Local part starting with a dot',\n feature: 'misplaced-dots',\n expected: {\n ...everywhere(fail('syntax.local.invalid_char', 0)),\n html5: valid,\n },\n },\n {\n isemail: 16,\n address: 'test.@iana.org',\n description: 'Local part ending with a dot',\n feature: 'misplaced-dots',\n expected: {\n ...everywhere(fail('syntax.local.invalid_char', 4)),\n html5: valid,\n },\n },\n {\n isemail: 17,\n address: 'test..iana.org',\n description: 'No @, consecutive dots',\n expected: everywhere(fail('syntax.address.no_at')),\n },\n {\n isemail: 18,\n address: 'test_exa-mple.com',\n description: 'No @, underscore and hyphen',\n expected: everywhere(fail('syntax.address.no_at')),\n },\n\n // Local-part characters.\n {\n isemail: 19,\n address: '!#$%&`*+/=?^`{|}~@iana.org',\n description: 'Local part of printable specials only',\n feature: 'route-chars',\n expected: {\n ...everywhere(valid),\n practical: fail('syntax.local.invalid_char', 0),\n },\n },\n {\n isemail: 20,\n address: 'test\\\\@test@iana.org',\n description: 'Backslash-escaped @ outside a quoted string',\n expected: everywhere(fail('syntax.local.invalid_char', 4)),\n },\n {\n isemail: 21,\n address: '123@iana.org',\n description: 'All-digit local part',\n feature: 'dot-atom',\n expected: everywhere(valid),\n },\n {\n isemail: 22,\n address: 'test@123.com',\n description: 'All-digit domain label',\n feature: 'dot-atom',\n expected: everywhere(valid),\n },\n {\n isemail: 23,\n address: 'test@iana.123',\n description: 'All-digit TLD',\n feature: 'unknown-tld',\n expected: { ...everywhere(valid), practical: fail('syntax.tld.unknown') },\n },\n {\n // RFC 5321's grammar reads a dotted quad outside brackets as a domain;\n // only a literal in brackets is an IP address.\n isemail: 24,\n address: 'test@255.255.255.255',\n description: 'Dotted quad without brackets',\n feature: 'unknown-tld',\n expected: { ...everywhere(valid), practical: fail('syntax.tld.unknown') },\n },\n\n // Lengths.\n {\n isemail: 25,\n address:\n 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm@iana.org',\n description: 'Local part of exactly 64 characters',\n feature: 'dot-atom',\n expected: everywhere(valid),\n },\n {\n isemail: 26,\n address:\n 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklmn@iana.org',\n description: 'Local part of 65 characters',\n feature: 'long-local',\n expected: {\n practical: fail('syntax.local.too_long'),\n rfc5321: fail('syntax.local.too_long'),\n rfc5322: valid,\n html5: valid,\n },\n },\n {\n isemail: 27,\n address: `test@${longLabel}.com`,\n description: 'Domain label of exactly 63 characters',\n feature: 'dot-atom',\n expected: everywhere(valid),\n },\n {\n isemail: 28,\n address: `test@${longLabel}m.com`,\n description: 'Domain label of 64 characters',\n expected: everywhere(fail('syntax.domain.label_invalid', 5)),\n },\n\n // Domain labels.\n {\n isemail: 29,\n address: 'test@mason-dixon.com',\n description: 'Hyphen inside a domain label',\n feature: 'dot-atom',\n expected: everywhere(valid),\n },\n {\n isemail: 30,\n address: 'test@-iana.org',\n description: 'Domain label starting with a hyphen',\n expected: everywhere(fail('syntax.domain.label_invalid', 5)),\n },\n {\n isemail: 31,\n address: 'test@iana-.com',\n description: 'Domain label ending with a hyphen',\n expected: everywhere(fail('syntax.domain.label_invalid', 9)),\n },\n {\n isemail: 32,\n address: 'test@c--n.com',\n description: 'Consecutive hyphens inside a domain label',\n feature: 'dot-atom',\n expected: everywhere(valid),\n },\n {\n isemail: 33,\n address: 'test@iana.co-uk',\n description: 'Hyphenated TLD',\n feature: 'unknown-tld',\n expected: { ...everywhere(valid), practical: fail('syntax.tld.unknown') },\n },\n {\n isemail: 34,\n address: 'test@.iana.org',\n description: 'Domain starting with a dot',\n expected: everywhere(fail('syntax.domain.label_invalid', 5)),\n },\n {\n isemail: 35,\n address: 'test@iana.org.',\n description: 'Domain ending with a dot',\n expected: everywhere(fail('syntax.domain.label_invalid', 13)),\n },\n {\n isemail: 36,\n address: 'test@iana..com',\n description: 'Consecutive dots in the domain',\n expected: everywhere(fail('syntax.domain.label_invalid', 10)),\n },\n {\n isemail: 37,\n address:\n 'a@a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v',\n description: '126 single-letter domain labels',\n expected: { ...everywhere(valid), practical: fail('syntax.tld.unknown') },\n },\n {\n isemail: 38,\n address: `abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm@${longLabel}.${longLabel}.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghi`,\n description: 'Address of exactly 254 characters',\n expected: { ...everywhere(valid), practical: fail('syntax.tld.unknown') },\n },\n {\n isemail: 39,\n address: `abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm@${longLabel}.${longLabel}.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghij`,\n description: 'Address of 255 characters',\n expected: everywhere(fail('syntax.address.too_long')),\n },\n {\n // html5 has only the address cap, so it reports that instead.\n isemail: 40,\n address: `a@${longLabel}.${longLabel}.${longLabel}.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg.hij`,\n description: 'Domain of 255 characters',\n expected: {\n ...everywhere(fail('syntax.domain.too_long')),\n html5: fail('syntax.address.too_long'),\n },\n },\n {\n isemail: 41,\n address: `a@${longLabel}.${longLabel}.${longLabel}.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg.hijk`,\n description: 'Domain of 256 characters',\n expected: {\n ...everywhere(fail('syntax.domain.too_long')),\n html5: fail('syntax.address.too_long'),\n },\n },\n\n // Quoted local parts. A quote opens a quoted string only at the start of\n // a word; anywhere else it's an invalid character.\n {\n isemail: 42,\n address: '\"test\"@iana.org',\n description: 'Quoted local part',\n feature: 'quoted-local',\n expected: rfcOnly(fail('syntax.local.invalid_char', 0)),\n },\n {\n isemail: 43,\n address: '\"\"@iana.org',\n description: 'Empty quoted local part',\n feature: 'quoted-local',\n expected: rfcOnly(fail('syntax.local.invalid_char', 0)),\n },\n {\n isemail: 44,\n address: '\"\"\"@iana.org',\n description: 'Stray quote after an empty quoted string',\n expected: quotedLocal(fail('syntax.local.invalid_char', 2)),\n },\n {\n isemail: 45,\n address: '\"\\\\a\"@iana.org',\n description: 'Escaped letter in a quoted string',\n feature: 'quoted-pair',\n expected: rfcOnly(fail('syntax.local.invalid_char', 0)),\n },\n {\n isemail: 46,\n address: '\"\\\\\"\"@iana.org',\n description: 'Escaped quote in a quoted string',\n feature: 'quoted-pair',\n expected: rfcOnly(fail('syntax.local.invalid_char', 0)),\n },\n {\n // The escaped closing quote leaves the string open to the end.\n isemail: 47,\n address: '\"\\\\\"@iana.org',\n description: 'Quoted string whose closing quote is escaped',\n expected: quotedLocal(fail('syntax.address.no_at')),\n },\n {\n isemail: 48,\n address: '\"\\\\\\\\\"@iana.org',\n description: 'Escaped backslash in a quoted string',\n feature: 'quoted-pair',\n expected: rfcOnly(fail('syntax.local.invalid_char', 0)),\n },\n {\n isemail: 49,\n address: 'test\"@iana.org',\n description: 'Stray quote at the end of an atom',\n expected: everywhere(fail('syntax.local.invalid_char', 4)),\n },\n {\n isemail: 50,\n address: '\"test@iana.org',\n description: 'Unterminated quoted string',\n expected: quotedLocal(fail('syntax.address.no_at')),\n },\n {\n isemail: 51,\n address: '\"test\"test@iana.org',\n description: 'Atom straight after a quoted string',\n expected: quotedLocal(fail('syntax.local.invalid_char', 6)),\n },\n {\n isemail: 52,\n address: 'test\"text\"@iana.org',\n description: 'Quoted string straight after an atom',\n expected: everywhere(fail('syntax.local.invalid_char', 4)),\n },\n {\n isemail: 53,\n address: '\"test\"\"test\"@iana.org',\n description: 'Two quoted strings with no dot between',\n expected: quotedLocal(fail('syntax.local.invalid_char', 6)),\n },\n {\n isemail: 54,\n address: '\"test\".\"test\"@iana.org',\n description: 'Dot-separated quoted strings',\n feature: 'obs-local',\n expected: {\n ...quotedLocal(valid),\n rfc5321: fail('syntax.local.invalid_char', 6),\n },\n },\n {\n isemail: 55,\n address: '\"test\\\\ test\"@iana.org',\n description: 'Escaped space in a quoted string',\n feature: 'quoted-pair',\n expected: rfcOnly(fail('syntax.local.invalid_char', 0)),\n },\n {\n isemail: 56,\n address: '\"test\".test@iana.org',\n description: 'Quoted string then a dot-separated atom',\n feature: 'obs-local',\n expected: {\n ...quotedLocal(valid),\n rfc5321: fail('syntax.local.invalid_char', 6),\n },\n },\n {\n // NUL isn't even obs-qtext.\n isemail: 57,\n address: '\"test\\u0000\"@iana.org',\n description: 'NUL in a quoted string',\n expected: quotedLocal(fail('syntax.local.invalid_char', 5)),\n },\n {\n // obs-qp allows an escaped NUL; RFC 5321's quoted-pair doesn't.\n isemail: 58,\n address: '\"test\\\\\\u0000\"@iana.org',\n description: 'Escaped NUL in a quoted string',\n feature: 'obs-control',\n expected: {\n ...quotedLocal(valid),\n rfc5321: fail('syntax.local.invalid_char', 6),\n },\n },\n {\n isemail: 59,\n address:\n '\"abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz abcdefghj\"@iana.org',\n description: 'Quoted local part of 65 characters',\n expected: {\n ...quotedLocal(valid),\n rfc5321: fail('syntax.local.too_long'),\n },\n },\n {\n isemail: 60,\n address:\n '\"abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz abcdefg\\\\h\"@iana.org',\n description: 'Quoted local part of 65 characters with an escape',\n expected: {\n ...quotedLocal(valid),\n rfc5321: fail('syntax.local.too_long'),\n },\n },\n\n // Domain literals. rfc5321 takes IPv4 and IPv6 address literals, IPv6\n // being the only registered tag; rfc5322 takes any dtext.\n {\n isemail: 61,\n address: 'test@[255.255.255.255]',\n description: 'IPv4 address literal',\n feature: 'ipv4-literal',\n expected: rfcOnly(fail('syntax.domain.invalid_char', 5)),\n },\n {\n isemail: 62,\n address: 'test@a[255.255.255.255]',\n description: 'Domain literal after a label',\n expected: everywhere(fail('syntax.domain.invalid_char', 6)),\n },\n {\n isemail: 63,\n address: 'test@[255.255.255]',\n description: 'IPv4 literal with three octets',\n feature: 'general-literal',\n expected: rfc5322Literal,\n },\n {\n isemail: 64,\n address: 'test@[255.255.255.255.255]',\n description: 'IPv4 literal with five octets',\n feature: 'general-literal',\n expected: rfc5322Literal,\n },\n {\n isemail: 65,\n address: 'test@[255.255.255.256]',\n description: 'IPv4 literal with an octet over 255',\n feature: 'general-literal',\n expected: rfc5322Literal,\n },\n {\n isemail: 66,\n address: 'test@[1111:2222:3333:4444:5555:6666:7777:8888]',\n description: 'IPv6 literal without the IPv6 tag',\n feature: 'general-literal',\n expected: rfc5322Literal,\n },\n {\n isemail: 67,\n address: 'test@[IPv6:1111:2222:3333:4444:5555:6666:7777]',\n description: 'IPv6 literal with seven groups',\n feature: 'general-literal',\n expected: rfc5322Literal,\n },\n {\n isemail: 68,\n address: 'test@[IPv6:1111:2222:3333:4444:5555:6666:7777:8888]',\n description: 'IPv6 literal with eight groups',\n feature: 'ipv6-literal',\n expected: rfcOnly(fail('syntax.domain.invalid_char', 5)),\n },\n {\n isemail: 69,\n address: 'test@[IPv6:1111:2222:3333:4444:5555:6666:7777:8888:9999]',\n description: 'IPv6 literal with nine groups',\n feature: 'general-literal',\n expected: rfc5322Literal,\n },\n {\n isemail: 70,\n address: 'test@[IPv6:1111:2222:3333:4444:5555:6666:7777:888G]',\n description: 'IPv6 literal with a non-hex digit',\n feature: 'general-literal',\n expected: rfc5322Literal,\n },\n {\n // RFC 5321 allows no more than six groups besides the `::`.\n isemail: 71,\n address: 'test@[IPv6:1111:2222:3333:4444:5555:6666::8888]',\n description: 'IPv6 literal with :: standing for one group',\n feature: 'general-literal',\n expected: rfc5322Literal,\n },\n {\n isemail: 72,\n address: 'test@[IPv6:1111:2222:3333:4444:5555::8888]',\n description: 'Compressed IPv6 literal',\n feature: 'ipv6-literal',\n expected: rfcOnly(fail('syntax.domain.invalid_char', 5)),\n },\n {\n isemail: 73,\n address: 'test@[IPv6:1111:2222:3333:4444:5555:6666::7777:8888]',\n description: 'Compressed IPv6 literal with eight groups',\n feature: 'general-literal',\n expected: rfc5322Literal,\n },\n {\n isemail: 74,\n address: 'test@[IPv6::3333:4444:5555:6666:7777:8888]',\n description: 'IPv6 literal starting with a single colon',\n feature: 'general-literal',\n expected: rfc5322Literal,\n },\n {\n isemail: 75,\n address: 'test@[IPv6:::3333:4444:5555:6666:7777:8888]',\n description: 'IPv6 literal starting with ::',\n feature: 'ipv6-literal',\n expected: rfcOnly(fail('syntax.domain.invalid_char', 5)),\n },\n {\n isemail: 76,\n address: 'test@[IPv6:1111::4444:5555::8888]',\n description: 'IPv6 literal with two ::',\n feature: 'general-literal',\n expected: rfc5322Literal,\n },\n {\n isemail: 77,\n address: 'test@[IPv6:::]',\n description: 'IPv6 unspecified address literal',\n feature: 'ipv6-literal',\n expected: rfcOnly(fail('syntax.domain.invalid_char', 5)),\n },\n {\n isemail: 78,\n address: 'test@[IPv6:1111:2222:3333:4444:5555:255.255.255.255]',\n description: 'IPv4-in-IPv6 literal with five groups',\n feature: 'general-literal',\n expected: rfc5322Literal,\n },\n {\n isemail: 79,\n address: 'test@[IPv6:1111:2222:3333:4444:5555:6666:255.255.255.255]',\n description: 'IPv4-in-IPv6 literal with six groups',\n feature: 'ipv6-literal',\n expected: rfcOnly(fail('syntax.domain.invalid_char', 5)),\n },\n {\n isemail: 80,\n address: 'test@[IPv6:1111:2222:3333:4444:5555:6666:7777:255.255.255.255]',\n description: 'IPv4-in-IPv6 literal with seven groups',\n feature: 'general-literal',\n expected: rfc5322Literal,\n },\n {\n isemail: 81,\n address: 'test@[IPv6:1111:2222:3333:4444::255.255.255.255]',\n description: 'Compressed IPv4-in-IPv6 literal',\n feature: 'ipv6-literal',\n expected: rfcOnly(fail('syntax.domain.invalid_char', 5)),\n },\n {\n isemail: 82,\n address: 'test@[IPv6:1111:2222:3333:4444:5555:6666::255.255.255.255]',\n description: 'Compressed IPv4-in-IPv6 literal with six groups',\n feature: 'general-literal',\n expected: rfc5322Literal,\n },\n {\n isemail: 83,\n address: 'test@[IPv6:1111:2222:3333:4444:::255.255.255.255]',\n description: 'IPv4-in-IPv6 literal with :::',\n feature: 'general-literal',\n expected: rfc5322Literal,\n },\n {\n isemail: 84,\n address: 'test@[IPv6::255.255.255.255]',\n description: 'IPv4-in-IPv6 literal starting with a single colon',\n feature: 'general-literal',\n expected: rfc5322Literal,\n },\n\n // Whitespace and comments. rfc5322 allows them around every word and\n // label (obs-local-part and obs-domain included); the other presets have\n // no CFWS.\n {\n isemail: 85,\n address: ' test @iana.org',\n description: 'Spaces around the local part',\n feature: 'fws',\n expected: allBut5322(fail('syntax.local.unquoted_space', 0), valid),\n },\n {\n isemail: 86,\n address: 'test@ iana .com',\n description: 'Spaces around a domain label',\n feature: 'fws',\n expected: allBut5322(fail('syntax.domain.invalid_char', 5), valid),\n },\n {\n isemail: 87,\n address: 'test . test@iana.org',\n description: 'Spaces around a dot in the local part',\n feature: 'fws',\n expected: allBut5322(fail('syntax.local.unquoted_space', 4), valid),\n },\n {\n isemail: 88,\n address: '\\r\\n test@iana.org',\n description: 'Folded whitespace before the local part',\n feature: 'fws',\n expected: allBut5322(fail('syntax.local.invalid_char', 0), valid),\n },\n {\n isemail: 89,\n address: '\\r\\n \\r\\n test@iana.org',\n description: 'Whitespace folded twice before the local part',\n feature: 'fws',\n expected: allBut5322(fail('syntax.local.invalid_char', 0), valid),\n },\n {\n isemail: 90,\n address: '(comment)test@iana.org',\n description: 'Comment before the local part',\n feature: 'comments',\n expected: rfc5322Only(fail('syntax.comment.not_allowed', 0)),\n },\n {\n // The unclosed outer comment runs to the end, so no @ is outside it.\n isemail: 91,\n address: '((comment)test@iana.org',\n description: 'Unterminated comment around a nested one',\n expected: allBut5322(\n fail('syntax.comment.not_allowed', 0),\n fail('syntax.address.no_at'),\n ),\n },\n {\n isemail: 92,\n address: '(comment(comment))test@iana.org',\n description: 'Nested comment',\n feature: 'comments',\n expected: rfc5322Only(fail('syntax.comment.not_allowed', 0)),\n },\n {\n isemail: 93,\n address: 'test@(comment)iana.org',\n description: 'Comment before the domain',\n feature: 'comments',\n expected: rfc5322Only(fail('syntax.comment.not_allowed', 5)),\n },\n {\n isemail: 94,\n address: 'test(comment)test@iana.org',\n description: 'Comment between two atoms with no dot',\n expected: allBut5322(\n fail('syntax.comment.not_allowed', 4),\n fail('syntax.local.invalid_char', 13),\n ),\n },\n {\n isemail: 95,\n address: 'test@(comment)[255.255.255.255]',\n description: 'Comment before a domain literal',\n feature: 'comments',\n expected: rfc5322Only(fail('syntax.comment.not_allowed', 5)),\n },\n {\n isemail: 96,\n address:\n '(comment)abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm@iana.org',\n description: 'Comment before a 64-character local part',\n feature: 'comments',\n expected: rfc5322Only(fail('syntax.comment.not_allowed', 0)),\n },\n {\n isemail: 97,\n address: `test@(comment)${longLabel}.com`,\n description: 'Comment before a 63-character domain label',\n feature: 'comments',\n expected: rfc5322Only(fail('syntax.comment.not_allowed', 5)),\n },\n {\n // 263 characters, but the length caps don't count comments, so it's\n // 254 to rfc5322.\n isemail: 98,\n address:\n '(comment)test@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghik.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghik.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijk.abcdefghijklmnopqrstuvwxyzabcdefghijk.abcdefghijklmnopqrstu',\n description: 'Comment before a 254-character address',\n feature: 'comments',\n expected: rfc5322Only(fail('syntax.comment.not_allowed', 0)),\n },\n {\n isemail: 99,\n address: 'test@iana.org\\n',\n description: 'Trailing line feed',\n expected: everywhere(fail('syntax.domain.invalid_char', 13)),\n },\n\n // Punycode.\n {\n isemail: 100,\n address: 'test@xn--hxajbheg2az3al.xn--jxalpdlp',\n description: 'Punycode domain with a retired test TLD',\n feature: 'unknown-tld',\n expected: { ...everywhere(valid), practical: fail('syntax.tld.unknown') },\n },\n {\n isemail: 101,\n address: 'xn--test@iana.org',\n description: 'Punycode prefix in the local part',\n feature: 'dot-atom',\n expected: everywhere(valid),\n },\n {\n isemail: 102,\n address: 'test@iana.org-',\n description: 'TLD ending with a hyphen',\n expected: everywhere(fail('syntax.domain.label_invalid', 13)),\n },\n\n // Unterminated constructs. One that swallows the @ leaves none outside it.\n {\n isemail: 104,\n address: '(test@iana.org',\n description: 'Unterminated comment before the @',\n expected: allBut5322(\n fail('syntax.comment.not_allowed', 0),\n fail('syntax.address.no_at'),\n ),\n },\n {\n isemail: 105,\n address: 'test@(iana.org',\n description: 'Unterminated comment in the domain',\n expected: allBut5322(\n fail('syntax.comment.not_allowed', 5),\n fail('syntax.comment.unterminated', 5),\n ),\n },\n {\n isemail: 106,\n address: 'test@[1.2.3.4',\n description: 'Unterminated domain literal',\n expected: {\n practical: fail('syntax.domain.invalid_char', 5),\n rfc5321: fail('syntax.domain.literal_invalid', 5),\n rfc5322: fail('syntax.domain.literal_invalid', 5),\n html5: fail('syntax.domain.invalid_char', 5),\n },\n },\n {\n isemail: 107,\n address: '\"test\\\\\"@iana.org',\n description: 'Quoted string whose closing quote is escaped',\n expected: quotedLocal(fail('syntax.address.no_at')),\n },\n {\n isemail: 108,\n address: '(comment\\\\)test@iana.org',\n description: 'Comment whose closing parenthesis is escaped',\n expected: allBut5322(\n fail('syntax.comment.not_allowed', 0),\n fail('syntax.address.no_at'),\n ),\n },\n {\n isemail: 109,\n address: 'test@iana.org(comment\\\\)',\n description: 'Trailing comment whose closing parenthesis is escaped',\n expected: allBut5322(\n fail('syntax.comment.not_allowed', 13),\n fail('syntax.comment.unterminated', 13),\n ),\n },\n {\n isemail: 110,\n address: 'test@iana.org(comment\\\\',\n description: 'Trailing comment ending in a backslash',\n expected: allBut5322(\n fail('syntax.comment.not_allowed', 13),\n fail('syntax.comment.unterminated', 13),\n ),\n },\n\n // General domain literals.\n {\n isemail: 112,\n address: 'test@[RFC-5322-domain-literal]',\n description: \"Domain literal that isn't an address\",\n feature: 'general-literal',\n expected: rfc5322Literal,\n },\n {\n isemail: 113,\n address: 'test@[RFC-5322]-domain-literal]',\n description: 'Text after a domain literal',\n expected: {\n ...rfc5322Literal,\n rfc5322: fail('syntax.domain.invalid_char', 15),\n },\n },\n {\n isemail: 114,\n address: 'test@[RFC-5322-[domain-literal]',\n description: 'Unescaped [ inside a domain literal',\n expected: {\n ...rfc5322Literal,\n rfc5322: fail('syntax.domain.literal_invalid', 5),\n },\n },\n {\n isemail: 115,\n address: 'test@[RFC-5322-\\\\\\u0007-domain-literal]',\n description: 'Escaped BEL in a domain literal',\n feature: 'obs-control',\n expected: rfc5322Literal,\n },\n {\n isemail: 116,\n address: 'test@[RFC-5322-\\\\\\t-domain-literal]',\n description: 'Escaped tab in a domain literal',\n feature: 'general-literal',\n expected: rfc5322Literal,\n },\n {\n isemail: 117,\n address: 'test@[RFC-5322-\\\\]-domain-literal]',\n description: 'Escaped ] in a domain literal',\n feature: 'general-literal',\n expected: rfc5322Literal,\n },\n {\n isemail: 118,\n address: 'test@[RFC-5322-domain-literal\\\\]',\n description: 'Domain literal whose closing bracket is escaped',\n expected: {\n ...rfc5322Literal,\n rfc5322: fail('syntax.domain.literal_invalid', 5),\n },\n },\n {\n isemail: 119,\n address: 'test@[RFC-5322-domain-literal\\\\',\n description: 'Domain literal ending in a backslash',\n expected: {\n ...rfc5322Literal,\n rfc5322: fail('syntax.domain.literal_invalid', 5),\n },\n },\n {\n isemail: 120,\n address: 'test@[RFC 5322 domain literal]',\n description: 'Spaces in a domain literal',\n feature: 'general-literal',\n expected: rfc5322Literal,\n },\n {\n isemail: 121,\n address: 'test@[RFC-5322-domain-literal] (comment)',\n description: 'Comment after a domain literal',\n expected: rfc5322Literal,\n },\n {\n isemail: 123,\n address: 'test@.org',\n description: 'Domain starting with a dot before the TLD',\n expected: everywhere(fail('syntax.domain.label_invalid', 5)),\n },\n\n // Control characters. rfc5322's obsolete syntax allows most of them in\n // quoted strings, comments, and escapes; CR and LF only as folding.\n {\n isemail: 124,\n address: '\"\\u007f\"@iana.org',\n description: 'DEL in a quoted string',\n feature: 'obs-control',\n expected: {\n ...quotedLocal(valid),\n rfc5321: fail('syntax.local.invalid_char', 1),\n },\n },\n {\n isemail: 125,\n address: '\"\\\\\\u007f\"@iana.org',\n description: 'Escaped DEL in a quoted string',\n feature: 'obs-control',\n expected: {\n ...quotedLocal(valid),\n rfc5321: fail('syntax.local.invalid_char', 2),\n },\n },\n {\n isemail: 126,\n address: '(\\u007f)test@iana.org',\n description: 'DEL in a comment',\n feature: 'obs-control',\n expected: rfc5322Only(fail('syntax.comment.not_allowed', 0)),\n },\n {\n isemail: 127,\n address: 'test@iana.org\\r',\n description: 'Trailing CR',\n expected: everywhere(fail('syntax.domain.invalid_char', 13)),\n },\n {\n isemail: 128,\n address: '\\rtest@iana.org',\n description: 'Leading CR',\n expected: everywhere(fail('syntax.local.invalid_char', 0)),\n },\n {\n isemail: 129,\n address: '\"\\rtest\"@iana.org',\n description: 'CR in a quoted string',\n expected: quotedLocal(fail('syntax.local.invalid_char', 1)),\n },\n {\n isemail: 130,\n address: '(\\r)test@iana.org',\n description: 'CR in a comment',\n expected: allBut5322(\n fail('syntax.comment.not_allowed', 0),\n fail('syntax.local.invalid_char', 1),\n ),\n },\n {\n isemail: 131,\n address: 'test@iana.org(\\r)',\n description: 'CR in a trailing comment',\n expected: allBut5322(\n fail('syntax.comment.not_allowed', 13),\n fail('syntax.domain.invalid_char', 14),\n ),\n },\n {\n isemail: 132,\n address: '\\ntest@iana.org',\n description: 'Leading LF',\n expected: everywhere(fail('syntax.local.invalid_char', 0)),\n },\n {\n isemail: 133,\n address: '\"\\n\"@iana.org',\n description: 'LF in a quoted string',\n expected: quotedLocal(fail('syntax.local.invalid_char', 1)),\n },\n {\n isemail: 134,\n address: '\"\\\\\\n\"@iana.org',\n description: 'Escaped LF in a quoted string',\n feature: 'obs-control',\n expected: {\n ...quotedLocal(valid),\n rfc5321: fail('syntax.local.invalid_char', 2),\n },\n },\n {\n isemail: 135,\n address: '(\\n)test@iana.org',\n description: 'LF in a comment',\n expected: allBut5322(\n fail('syntax.comment.not_allowed', 0),\n fail('syntax.local.invalid_char', 1),\n ),\n },\n {\n isemail: 136,\n address: '\\u0007@iana.org',\n description: 'BEL as the local part',\n expected: everywhere(fail('syntax.local.invalid_char', 0)),\n },\n {\n isemail: 137,\n address: 'test@\\u0007.org',\n description: 'BEL as a domain label',\n expected: everywhere(fail('syntax.domain.invalid_char', 5)),\n },\n {\n isemail: 138,\n address: '\"\\u0007\"@iana.org',\n description: 'BEL in a quoted string',\n feature: 'obs-control',\n expected: {\n ...quotedLocal(valid),\n rfc5321: fail('syntax.local.invalid_char', 1),\n },\n },\n {\n isemail: 139,\n address: '\"\\\\\\u0007\"@iana.org',\n description: 'Escaped BEL in a quoted string',\n feature: 'obs-control',\n expected: {\n ...quotedLocal(valid),\n rfc5321: fail('syntax.local.invalid_char', 2),\n },\n },\n {\n isemail: 140,\n address: '(\\u0007)test@iana.org',\n description: 'BEL in a comment',\n feature: 'obs-control',\n expected: rfc5322Only(fail('syntax.comment.not_allowed', 0)),\n },\n\n // Folding. A CRLF must be followed by a space or tab; `index` points at\n // the CR of the first one that isn't.\n {\n isemail: 141,\n address: '\\r\\ntest@iana.org',\n description: 'Leading CRLF with no whitespace after it',\n expected: everywhere(fail('syntax.local.invalid_char', 0)),\n },\n {\n isemail: 142,\n address: '\\r\\n \\r\\ntest@iana.org',\n description: 'Folded whitespace ending in a CRLF',\n expected: allBut5322(\n fail('syntax.local.invalid_char', 0),\n fail('syntax.local.invalid_char', 3),\n ),\n },\n {\n isemail: 143,\n address: ' \\r\\ntest@iana.org',\n description: 'Space then a CRLF with no whitespace after it',\n expected: allBut5322(\n fail('syntax.local.unquoted_space', 0),\n fail('syntax.local.invalid_char', 1),\n ),\n },\n {\n isemail: 144,\n address: ' \\r\\n test@iana.org',\n description:\n 'Folded whitespace before the local part, starting with a space',\n feature: 'fws',\n expected: allBut5322(fail('syntax.local.unquoted_space', 0), valid),\n },\n {\n isemail: 145,\n address: ' \\r\\n \\r\\ntest@iana.org',\n description: 'Folded whitespace ending in a CRLF, starting with a space',\n expected: allBut5322(\n fail('syntax.local.unquoted_space', 0),\n fail('syntax.local.invalid_char', 4),\n ),\n },\n {\n isemail: 146,\n address: ' \\r\\n\\r\\ntest@iana.org',\n description: 'Two CRLFs in a row',\n expected: allBut5322(\n fail('syntax.local.unquoted_space', 0),\n fail('syntax.local.invalid_char', 1),\n ),\n },\n {\n isemail: 147,\n address: ' \\r\\n\\r\\n test@iana.org',\n description: 'Two CRLFs in a row, then a space',\n expected: allBut5322(\n fail('syntax.local.unquoted_space', 0),\n fail('syntax.local.invalid_char', 1),\n ),\n },\n {\n isemail: 148,\n address: 'test@iana.org\\r\\n ',\n description: 'Folded whitespace after the domain',\n feature: 'fws',\n expected: allBut5322(fail('syntax.domain.invalid_char', 13), valid),\n },\n {\n isemail: 149,\n address: 'test@iana.org\\r\\n \\r\\n ',\n description: 'Whitespace folded twice after the domain',\n feature: 'fws',\n expected: allBut5322(fail('syntax.domain.invalid_char', 13), valid),\n },\n {\n isemail: 150,\n address: 'test@iana.org\\r\\n',\n description: 'Trailing CRLF',\n expected: everywhere(fail('syntax.domain.invalid_char', 13)),\n },\n {\n isemail: 151,\n address: 'test@iana.org\\r\\n \\r\\n',\n description: 'Folded whitespace after the domain, ending in a CRLF',\n expected: allBut5322(\n fail('syntax.domain.invalid_char', 13),\n fail('syntax.domain.invalid_char', 16),\n ),\n },\n {\n isemail: 152,\n address: 'test@iana.org \\r\\n',\n description: 'Trailing space then a CRLF',\n expected: allBut5322(\n fail('syntax.domain.invalid_char', 13),\n fail('syntax.domain.invalid_char', 14),\n ),\n },\n {\n isemail: 153,\n address: 'test@iana.org \\r\\n ',\n description: 'Folded whitespace after the domain, starting with a space',\n feature: 'fws',\n expected: allBut5322(fail('syntax.domain.invalid_char', 13), valid),\n },\n {\n isemail: 154,\n address: 'test@iana.org \\r\\n \\r\\n',\n description:\n 'Folded whitespace after the domain, starting with a space and ending in a CRLF',\n expected: allBut5322(\n fail('syntax.domain.invalid_char', 13),\n fail('syntax.domain.invalid_char', 17),\n ),\n },\n {\n isemail: 155,\n address: 'test@iana.org \\r\\n\\r\\n',\n description: 'Trailing space then two CRLFs',\n expected: allBut5322(\n fail('syntax.domain.invalid_char', 13),\n fail('syntax.domain.invalid_char', 14),\n ),\n },\n {\n isemail: 156,\n address: 'test@iana.org \\r\\n\\r\\n ',\n description: 'Trailing space then two CRLFs and a space',\n expected: allBut5322(\n fail('syntax.domain.invalid_char', 13),\n fail('syntax.domain.invalid_char', 14),\n ),\n },\n {\n isemail: 157,\n address: ' test@iana.org',\n description: 'Leading space',\n feature: 'fws',\n expected: allBut5322(fail('syntax.local.unquoted_space', 0), valid),\n },\n {\n isemail: 158,\n address: 'test@iana.org ',\n description: 'Trailing space',\n feature: 'fws',\n expected: allBut5322(fail('syntax.domain.invalid_char', 13), valid),\n },\n\n // Odds and ends.\n {\n isemail: 159,\n address: 'test@[IPv6:1::2:]',\n description: 'IPv6 literal ending with a single colon',\n feature: 'general-literal',\n expected: rfc5322Literal,\n },\n {\n isemail: 160,\n address: '\"test\\\\©\"@iana.org',\n description: 'Escaped non-ASCII character in a quoted string',\n expected: quotedLocal(fail('syntax.local.invalid_char', 6)),\n },\n {\n // `/` is atext, and RFC 5322's domain is a dot-atom.\n isemail: 161,\n address: 'test@iana/icann.org',\n description: 'Slash in the domain',\n expected: allBut5322(fail('syntax.domain.invalid_char', 9), valid),\n },\n {\n isemail: 165,\n address: 'test.(comment)test@iana.org',\n description: 'Comment after a dot in the local part',\n feature: 'comments',\n expected: rfc5322Only(fail('syntax.comment.not_allowed', 5)),\n },\n {\n isemail: 166,\n address: 'test@org',\n description: 'TLD alone as the domain',\n feature: 'dotless-domain',\n expected: { ...everywhere(fail('syntax.domain.no_dot')), html5: valid },\n },\n {\n isemail: 167,\n address: 'test@test.com',\n description: 'Common test domain',\n feature: 'dot-atom',\n expected: everywhere(valid),\n },\n {\n isemail: 168,\n address: 'test@nic.no',\n description: 'Country-code TLD',\n feature: 'dot-atom',\n expected: everywhere(valid),\n },\n];\n","// Every address the 0.0.1 mocha suite tested, once each, with its expected\n// result under v1's presets. The old suite ran most addresses under several\n// configs of the 0.0.1 option tree; v1 replaces that tree with presets, so\n// each address appears here once, tagged per preset. `legacy` is what 0.0.1\n// returned with its default config, and `flipped` explains every case where\n// the default preset now disagrees.\n//\n// The preset rules behind the expectations are in ./index.ts.\nimport {\n type LegacyFixture,\n allBut5322,\n everywhere,\n fail,\n valid,\n} from './types';\n\nconst quotedLocalRejected =\n 'practical rejects quoted local parts, which are legal but never seen on real mailboxes';\n\nconst routeRejected =\n 'practical rejects `%` and `!`, the source-route and bang-path characters, which are legal but never seen on real mailboxes';\n\n/** The 0.0.1 suite reran these cases uppercased, under `local.alphaLower: false`. */\nfunction withUppercase(fixture: LegacyFixture): LegacyFixture[] {\n return [\n fixture,\n {\n ...fixture,\n address: fixture.address.toUpperCase(),\n description: `${fixture.description}, uppercased`,\n },\n ];\n}\n\nexport const legacyFixtures: readonly LegacyFixture[] = [\n // Plain dot-atom addresses.\n ...withUppercase({\n address: 'simple@example.com',\n description: 'Simple address',\n feature: 'dot-atom',\n expected: everywhere(valid),\n legacy: true,\n }),\n ...withUppercase({\n address: 'x@example.com',\n description: 'Single-letter local part',\n feature: 'dot-atom',\n expected: everywhere(valid),\n legacy: true,\n }),\n ...withUppercase({\n address: 'admin@test.co',\n description: 'Two-letter TLD',\n feature: 'dot-atom',\n expected: everywhere(valid),\n legacy: true,\n }),\n ...withUppercase({\n address: 'test@gmail.com',\n description: 'Gmail address',\n feature: 'dot-atom',\n expected: everywhere(valid),\n legacy: true,\n }),\n ...withUppercase({\n address: 'tesT@example.com',\n description: 'Uppercase letter in the local part',\n feature: 'dot-atom',\n expected: everywhere(valid),\n legacy: true,\n }),\n ...withUppercase({\n address: 'test1@example.com',\n description: 'Digit in the local part',\n feature: 'dot-atom',\n expected: everywhere(valid),\n legacy: true,\n }),\n {\n address: 'simple1@example.com',\n description: 'Digit at the end of the local part',\n feature: 'dot-atom',\n expected: everywhere(valid),\n legacy: true,\n },\n ...withUppercase({\n address: 'very.common@example.com',\n description: 'Dot in the local part',\n feature: 'dot-atom',\n expected: everywhere(valid),\n legacy: true,\n }),\n {\n address: 'disposable.style.email.with+symbol@example.com',\n description: 'Dots and a plus sign in the local part',\n feature: 'atext-specials',\n expected: everywhere(valid),\n legacy: true,\n },\n {\n address: 'other.email-with-hyphen@example.com',\n description: 'Dots and hyphens in the local part',\n feature: 'atext-specials',\n expected: everywhere(valid),\n legacy: true,\n },\n {\n address: 'user.name+tag+sorting@example.com',\n description: 'Dot and plus-sign tags in the local part',\n feature: 'atext-specials',\n expected: everywhere(valid),\n legacy: true,\n },\n\n // Printable specials in the local part.\n ...withUppercase({\n address: 'disposablestyleemailwith+symbol@example.com',\n description: 'Plus sign in the local part',\n feature: 'atext-specials',\n expected: everywhere(valid),\n legacy: true,\n }),\n ...withUppercase({\n address: 'username+tag+sorting@example.com',\n description: 'Plus-sign tags in the local part',\n feature: 'atext-specials',\n expected: everywhere(valid),\n legacy: true,\n }),\n ...withUppercase({\n address: 'test/test@test.com',\n description: 'Slash in the local part',\n feature: 'atext-specials',\n expected: everywhere(valid),\n legacy: true,\n }),\n\n // Routes: legal atext, but never seen on real mailboxes.\n ...withUppercase({\n address: 'mailhost.com!username@example.org',\n description: 'Bang path in the local part, dotted relay host',\n feature: 'route-chars',\n expected: {\n ...everywhere(valid),\n practical: fail('syntax.local.invalid_char', 12),\n },\n legacy: true,\n flipped: routeRejected,\n }),\n {\n // Not a flip: 0.0.1 rejected it too, but for its dotless relay host;\n // practical rejects the `!` itself, like the dotted case above.\n address: 'mailhost!username@example.org',\n description: 'Bang path in the local part, dotless relay host',\n feature: 'route-chars',\n expected: {\n ...everywhere(valid),\n practical: fail('syntax.local.invalid_char', 8),\n },\n legacy: false,\n },\n ...withUppercase({\n address: 'user%example.com@example.org',\n description: 'Percent route in the local part, dotted relay host',\n feature: 'route-chars',\n expected: {\n ...everywhere(valid),\n practical: fail('syntax.local.invalid_char', 4),\n },\n legacy: true,\n flipped: routeRejected,\n }),\n {\n // Not a flip: 0.0.1 rejected it too, but for its dotless relay host;\n // practical rejects the `%` itself, like the dotted case above.\n address: 'user%example@example.org',\n description: 'Percent route in the local part, dotless relay host',\n feature: 'route-chars',\n expected: {\n ...everywhere(valid),\n practical: fail('syntax.local.invalid_char', 4),\n },\n legacy: false,\n },\n\n // Hyphens.\n ...withUppercase({\n address: 'fully-qualified-domain@example.com',\n description: 'Hyphens in the local part',\n feature: 'atext-specials',\n expected: everywhere(valid),\n legacy: true,\n }),\n ...withUppercase({\n address: 'otheremail-with-hyphen@example.com',\n description: 'Hyphens in the local part',\n feature: 'atext-specials',\n expected: everywhere(valid),\n legacy: true,\n }),\n ...withUppercase({\n address: 'user-@example.org',\n description: 'Local part ending in a hyphen',\n feature: 'atext-specials',\n expected: everywhere(valid),\n legacy: true,\n }),\n ...withUppercase({\n address: 'exampleindeed@strange-example.com',\n description: 'Hyphenated domain',\n feature: 'dot-atom',\n expected: everywhere(valid),\n legacy: true,\n }),\n ...withUppercase({\n address: 'example-indeed@strange-example.com',\n description: 'Hyphens in the local part and the domain',\n feature: 'atext-specials',\n expected: everywhere(valid),\n legacy: true,\n }),\n\n // Quoted local parts.\n ...withUppercase({\n address: '\" \"@example.org',\n description: 'Quoted space as the whole local part',\n feature: 'quoted-local',\n expected: {\n practical: fail('syntax.local.invalid_char', 0),\n rfc5321: valid,\n rfc5322: valid,\n html5: fail('syntax.local.invalid_char', 0),\n },\n legacy: true,\n flipped: quotedLocalRejected,\n }),\n ...withUppercase({\n address: '\"john..doe\"@example.com',\n description: 'Consecutive dots inside a quoted local part',\n feature: 'quoted-local',\n expected: {\n practical: fail('syntax.local.invalid_char', 0),\n rfc5321: valid,\n rfc5322: valid,\n html5: fail('syntax.local.invalid_char', 0),\n },\n legacy: true,\n flipped: quotedLocalRejected,\n }),\n ...withUppercase({\n address: '\"justactually\"@example.com',\n description: 'Quoted local part',\n feature: 'quoted-local',\n expected: {\n practical: fail('syntax.local.invalid_char', 0),\n rfc5321: valid,\n rfc5322: valid,\n html5: fail('syntax.local.invalid_char', 0),\n },\n legacy: true,\n flipped: quotedLocalRejected,\n }),\n ...withUppercase({\n address: 'just.\"actually\".right@example.com',\n description: 'Quoted string between dot-separated atoms',\n feature: 'obs-local',\n expected: {\n // RFC 5321 allows a Dot-string or a Quoted-string, never both.\n practical: fail('syntax.local.invalid_char', 5),\n rfc5321: fail('syntax.local.invalid_char', 5),\n rfc5322: valid,\n html5: fail('syntax.local.invalid_char', 5),\n },\n legacy: true,\n flipped: quotedLocalRejected,\n }),\n {\n address: 'just.\"not\".right@example.com',\n description: 'Quoted string between dot-separated atoms',\n feature: 'obs-local',\n expected: {\n practical: fail('syntax.local.invalid_char', 5),\n rfc5321: fail('syntax.local.invalid_char', 5),\n rfc5322: valid,\n html5: fail('syntax.local.invalid_char', 5),\n },\n legacy: true,\n flipped: quotedLocalRejected,\n },\n {\n // The Wikipedia example with its escapes lost in the 0.0.1 suite, so it\n // isn't the valid address it was meant to be. The original is in\n // wikipedia.ts.\n address:\n '\"very.(),:;<>[]\".VERY.\"very@\\\\ \"very\".unusual\"@strange.example.com',\n description: 'Quoted strings with specials, missing their escapes',\n expected: {\n practical: fail('syntax.local.invalid_char', 0),\n rfc5321: fail('syntax.local.invalid_char', 16),\n rfc5322: fail('syntax.local.invalid_char', 31),\n html5: fail('syntax.local.invalid_char', 0),\n },\n legacy: false,\n },\n\n // Malformed quoting.\n ...withUppercase({\n address: 'just\"not\"right@example.com',\n description: 'Quotes inside an atom',\n expected: everywhere(fail('syntax.local.invalid_char', 4)),\n legacy: false,\n }),\n ...withUppercase({\n address: 'just.\"not\"right@example.com',\n description: 'Quoted string with no dot after it',\n expected: {\n practical: fail('syntax.local.invalid_char', 5),\n rfc5321: fail('syntax.local.invalid_char', 5),\n rfc5322: fail('syntax.local.invalid_char', 10),\n html5: fail('syntax.local.invalid_char', 5),\n },\n legacy: false,\n }),\n ...withUppercase({\n address: 'just.\"not.\"right@example.com',\n description: 'Quoted string ending in a dot, with no dot after it',\n expected: {\n practical: fail('syntax.local.invalid_char', 5),\n rfc5321: fail('syntax.local.invalid_char', 5),\n rfc5322: fail('syntax.local.invalid_char', 11),\n html5: fail('syntax.local.invalid_char', 5),\n },\n legacy: false,\n }),\n ...withUppercase({\n address: '\"john..doe@example.com',\n description: 'Unterminated quote',\n expected: {\n // The quote runs to the end, so no `@` is outside it.\n practical: fail('syntax.local.invalid_char', 0),\n rfc5321: fail('syntax.address.no_at'),\n rfc5322: fail('syntax.address.no_at'),\n html5: fail('syntax.local.invalid_char', 0),\n },\n legacy: false,\n }),\n ...withUppercase({\n address: '\"john\"..doe@example.com',\n description: 'Consecutive dots after a quoted string',\n expected: {\n practical: fail('syntax.local.invalid_char', 0),\n rfc5321: fail('syntax.local.invalid_char', 6),\n rfc5322: fail('syntax.local.consecutive_dots', 7),\n html5: fail('syntax.local.invalid_char', 0),\n },\n legacy: false,\n }),\n ...withUppercase({\n address: 'a\"b(c)d,e:f;g<h>i[j\\\\k]l@example.com',\n description: 'Unquoted specials',\n expected: everywhere(fail('syntax.local.invalid_char', 1)),\n legacy: false,\n }),\n\n // Spaces.\n ...withUppercase({\n address: 'james richards@google.com',\n description: 'Unquoted space',\n expected: everywhere(fail('syntax.local.unquoted_space', 5)),\n legacy: false,\n }),\n ...withUppercase({\n address: 'james\" richards@google.com',\n description: 'Space after a stray quote',\n expected: everywhere(fail('syntax.local.invalid_char', 5)),\n legacy: false,\n }),\n ...withUppercase({\n address: 'this is\"notallowed@example.com',\n description: 'Unquoted space and a stray quote',\n expected: everywhere(fail('syntax.local.unquoted_space', 4)),\n legacy: false,\n }),\n ...withUppercase({\n address: 'this still\"not\\\\allowed@example.com',\n description: 'Unquoted space, a stray quote, and a backslash',\n expected: everywhere(fail('syntax.local.unquoted_space', 4)),\n legacy: false,\n }),\n\n // Dots.\n ...withUppercase({\n address: 'john..doe@example.com',\n description: 'Consecutive dots in the local part',\n feature: 'misplaced-dots',\n expected: {\n practical: fail('syntax.local.consecutive_dots', 5),\n rfc5321: fail('syntax.local.consecutive_dots', 5),\n rfc5322: fail('syntax.local.consecutive_dots', 5),\n html5: valid,\n },\n legacy: false,\n }),\n ...withUppercase({\n address: 'john.doe@example..com',\n description: 'Consecutive dots in the domain',\n expected: everywhere(fail('syntax.domain.label_invalid', 17)),\n legacy: false,\n }),\n\n // The @ separator.\n ...withUppercase({\n address: 'Abc.example.com',\n description: 'No @',\n expected: everywhere(fail('syntax.address.no_at')),\n legacy: false,\n }),\n {\n address: 'Abc+example.com',\n description: 'No @',\n expected: everywhere(fail('syntax.address.no_at')),\n legacy: false,\n },\n ...withUppercase({\n address: '@Abc.example.com',\n description: 'Nothing before the @',\n expected: everywhere(fail('syntax.local.empty')),\n legacy: false,\n }),\n ...withUppercase({\n address: 'A@b@c@example.com',\n description: 'More than one @',\n expected: everywhere(fail('syntax.local.invalid_char', 1)),\n legacy: false,\n }),\n\n // Characters outside the allowed sets.\n ...withUppercase({\n address: 'QA☕CHOCOLATE☕@test.com',\n description: 'Non-ASCII characters in the local part',\n expected: everywhere(fail('syntax.local.invalid_char', 2)),\n legacy: false,\n }),\n ...withUppercase({\n address: 'i_like_underscore@but_its_not_allowed_in_this_part.example.com',\n description: 'Underscores in the domain',\n // `_` is atext, and RFC 5322's domain is a dot-atom.\n expected: allBut5322(fail('syntax.domain.invalid_char', 21), valid),\n legacy: false,\n }),\n ...withUppercase({\n address: 'james@cb$.com',\n description: 'Dollar sign in the domain',\n // `$` is atext, and RFC 5322's domain is a dot-atom.\n expected: allBut5322(fail('syntax.domain.invalid_char', 8), valid),\n legacy: false,\n }),\n\n // Lengths.\n ...withUppercase({\n address:\n '1234567890123456789012345678901234567890123456789012345678901234+x@example.com',\n description: 'Local part over 64 characters',\n feature: 'long-local',\n expected: {\n practical: fail('syntax.local.too_long'),\n rfc5321: fail('syntax.local.too_long'),\n rfc5322: valid,\n html5: valid,\n },\n legacy: false,\n }),\n {\n address:\n 'uayuYfBgRktoqVPCAJLhkcyVHFsZygReesttpNWTTiETtbQFfDUMZjyCdeaEhcotf+x@example.com',\n description: 'Local part over 64 characters, letters only',\n feature: 'long-local',\n expected: {\n practical: fail('syntax.local.too_long'),\n rfc5321: fail('syntax.local.too_long'),\n rfc5322: valid,\n html5: valid,\n },\n legacy: false,\n },\n\n // Domain shape.\n ...withUppercase({\n address: 'james@google',\n description: 'Domain with no dot',\n feature: 'dotless-domain',\n expected: {\n practical: fail('syntax.domain.no_dot'),\n rfc5321: fail('syntax.domain.no_dot'),\n rfc5322: fail('syntax.domain.no_dot'),\n html5: valid,\n },\n legacy: false,\n }),\n {\n address: 'admin@mailserver1',\n description: 'Domain with no dot, ending in a digit',\n feature: 'dotless-domain',\n expected: {\n practical: fail('syntax.domain.no_dot'),\n rfc5321: fail('syntax.domain.no_dot'),\n rfc5322: fail('syntax.domain.no_dot'),\n html5: valid,\n },\n legacy: false,\n },\n {\n address: 'james@g.com',\n description: 'Single-character domain label',\n feature: 'dot-atom',\n expected: everywhere(valid),\n legacy: false,\n flipped:\n '0.0.1 required two characters before the last dot (`charsBeforeDot`), rejecting real single-letter domains (validator-syntax#12)',\n },\n {\n address: 'james@google.c',\n description: 'Single-character TLD',\n feature: 'unknown-tld',\n expected: {\n practical: fail('syntax.tld.unknown'),\n rfc5321: valid,\n rfc5322: valid,\n html5: valid,\n },\n legacy: false,\n },\n {\n address: 'test@example.thisisnotavalidtld',\n description: 'TLD outside the IANA set',\n feature: 'unknown-tld',\n expected: {\n practical: fail('syntax.tld.unknown'),\n rfc5321: valid,\n rfc5322: valid,\n html5: valid,\n },\n legacy: false,\n },\n];\n","// The examples from RFC 3696 section 3, and the corrected forms from its\n// verified erratum 246: https://www.rfc-editor.org/errata/eid246\n// The erratum points out that backslash escapes are only valid inside a\n// quoted string, so the section's first three examples are invalid as\n// printed.\nimport { type SyntaxFixture, everywhere, fail, rfcOnly, valid } from './types';\n\nexport const rfc3696Fixtures: readonly SyntaxFixture[] = [\n // Printed as valid; invalid per erratum 246.\n {\n address: 'Abc\\\\@def@example.com',\n description: 'Backslash-escaped @ outside a quoted string',\n expected: everywhere(fail('syntax.local.invalid_char', 3)),\n },\n {\n address: 'Fred\\\\ Bloggs@example.com',\n description: 'Backslash-escaped space outside a quoted string',\n expected: everywhere(fail('syntax.local.invalid_char', 4)),\n },\n {\n address: 'Joe.\\\\\\\\Blow@example.com',\n description: 'Backslash-escaped backslash outside a quoted string',\n expected: everywhere(fail('syntax.local.invalid_char', 4)),\n },\n\n // Erratum 246's corrections.\n {\n address: '\"Abc\\\\@def\"@example.com',\n description: 'Escaped @ in a quoted string',\n feature: 'quoted-pair',\n expected: rfcOnly(fail('syntax.local.invalid_char', 0)),\n },\n {\n address: '\"Fred\\\\ Bloggs\"@example.com',\n description: 'Escaped space in a quoted string',\n feature: 'quoted-pair',\n expected: rfcOnly(fail('syntax.local.invalid_char', 0)),\n },\n {\n address: '\"Joe.\\\\\\\\Blow\"@example.com',\n description: 'Escaped backslash in a quoted string',\n feature: 'quoted-pair',\n expected: rfcOnly(fail('syntax.local.invalid_char', 0)),\n },\n\n // The quoted forms.\n {\n address: '\"Abc@def\"@example.com',\n description: 'Quoted @',\n feature: 'quoted-local',\n expected: rfcOnly(fail('syntax.local.invalid_char', 0)),\n },\n {\n address: '\"Fred Bloggs\"@example.com',\n description: 'Quoted space',\n feature: 'quoted-local',\n expected: rfcOnly(fail('syntax.local.invalid_char', 0)),\n },\n\n // Unquoted specials.\n {\n address: 'user+mailbox@example.com',\n description: 'Plus sign',\n feature: 'atext-specials',\n expected: everywhere(valid),\n },\n {\n address: 'customer/department=shipping@example.com',\n description: 'Slash and equals sign',\n feature: 'atext-specials',\n expected: everywhere(valid),\n },\n {\n address: '$A12345@example.com',\n description: 'Dollar sign first',\n feature: 'atext-specials',\n expected: everywhere(valid),\n },\n {\n address: '!def!xyz%abc@example.com',\n description: 'Bang path and percent route',\n feature: 'route-chars',\n expected: {\n ...everywhere(valid),\n practical: fail('syntax.local.invalid_char', 0),\n },\n },\n {\n address: '_somename@example.com',\n description: 'Underscore first',\n feature: 'atext-specials',\n expected: everywhere(valid),\n },\n];\n","// The examples from Wikipedia's \"Email address\" article, revision\n// 1374714890 (2026-09-13):\n// https://en.wikipedia.org/w/index.php?title=Email_address&oldid=1374714890#Examples\n// Those already in legacy.ts, word for word, are left out.\nimport {\n type SyntaxFixture,\n allBut5322,\n everywhere,\n fail,\n rfcOnly,\n valid,\n} from './types';\n\nexport const wikipediaFixtures: readonly SyntaxFixture[] = [\n // Listed as valid.\n {\n address: 'FirstName.LastName@EasierReading.org',\n description: 'Mixed case',\n feature: 'dot-atom',\n expected: everywhere(valid),\n },\n {\n address: 'long.email-address-with-hyphens@and.subdomains.example.com',\n description: 'Hyphens in the local part, subdomains',\n feature: 'atext-specials',\n expected: everywhere(valid),\n },\n {\n address: 'name/surname@example.com',\n description: 'Slash in the local part',\n feature: 'atext-specials',\n expected: everywhere(valid),\n },\n {\n address: 'admin@example',\n description: 'Domain with no dot',\n feature: 'dotless-domain',\n expected: { ...everywhere(fail('syntax.domain.no_dot')), html5: valid },\n },\n {\n address: 'example@s.example',\n description: 'Reserved TLD',\n feature: 'unknown-tld',\n expected: { ...everywhere(valid), practical: fail('syntax.tld.unknown') },\n },\n {\n address: '\"jane..doe\"@example.org',\n description: 'Consecutive dots inside a quoted local part',\n feature: 'quoted-local',\n expected: rfcOnly(fail('syntax.local.invalid_char', 0)),\n },\n {\n address:\n '\"very.(),:;<>[]\\\\\".VERY.\\\\\"very@\\\\\\\\ \\\\\"very\\\\\".unusual\"@strange.example.com',\n description: 'Quoted string with specials, an @, and escapes',\n feature: 'quoted-pair',\n expected: rfcOnly(fail('syntax.local.invalid_char', 0)),\n },\n {\n address: 'postmaster@[123.123.123.123]',\n description: 'IPv4 address literal',\n feature: 'ipv4-literal',\n expected: rfcOnly(fail('syntax.domain.invalid_char', 11)),\n },\n {\n address: 'postmaster@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370:7334]',\n description: 'IPv6 address literal',\n feature: 'ipv6-literal',\n expected: rfcOnly(fail('syntax.domain.invalid_char', 11)),\n },\n {\n address: '_test@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370:7334]',\n description: 'Underscore first, IPv6 address literal',\n feature: 'ipv6-literal',\n expected: rfcOnly(fail('syntax.domain.invalid_char', 6)),\n },\n\n // Listed as valid with SMTPUTF8, which no preset accepts without\n // allowUnicode.\n {\n address: 'I❤️CHOCOLATE@example.com',\n description: 'Emoji in the local part',\n expected: everywhere(fail('syntax.local.invalid_char', 1)),\n },\n\n // Listed as invalid.\n {\n address: 'abc.example.com',\n description: 'No @',\n expected: everywhere(fail('syntax.address.no_at')),\n },\n {\n address: 'a@b@c@example.com',\n description: 'More than one @',\n expected: everywhere(fail('syntax.local.invalid_char', 1)),\n },\n {\n address: 'this is\"not\\\\allowed@example.com',\n description: 'Unquoted space, quote, and backslash',\n expected: everywhere(fail('syntax.local.unquoted_space', 4)),\n },\n {\n address: 'this\\\\ still\\\\\"not\\\\\\\\allowed@example.com',\n description: 'Backslash escapes outside a quoted string',\n expected: everywhere(fail('syntax.local.invalid_char', 4)),\n },\n {\n address: 'i.like.underscores@but_they_are_not_allowed_in_this_part',\n description: 'Underscores in a dotless domain',\n // `_` is atext under rfc5322, which still requires a dot.\n expected: allBut5322(\n fail('syntax.domain.invalid_char', 22),\n fail('syntax.domain.no_dot'),\n ),\n },\n];\n","/**\n * The syntax corpus, published as `@email-utils/validator-syntax/fixtures`\n * so dependents can check they split and judge addresses exactly as\n * `parseAddress` does, and so the docs can build the support matrix.\n *\n * @remarks\n * Every fixture's `expected` is the result under each preset's default\n * options. The rules behind them:\n *\n * - `practical`: a dot-atom local part (letters, digits, and\n * ``#$&'*+/=?^_`{|}~-`` with single inner dots), so no quoted strings, no\n * `%` or `!` routes, and no comments or whitespace; hostname labels with at\n * least one dot, and no domain literals; the TLD in the IANA set.\n * - `rfc5321`: an RFC 5321 Dot-string or Quoted-string local part, never\n * both mixed, capped at 64 characters; hostname labels with at least one\n * dot, or an IPv4 or `IPv6:` address literal (IPv6 is the only registered\n * tag, and no more than six groups may sit beside a `::`); no comments or\n * whitespace.\n * - `rfc5322`: RFC 5322's addr-spec with its obsolete syntax: dot-separated\n * atoms and quoted strings mixed, comments and folding whitespace around\n * every word and label, control characters in quoted strings, comments,\n * and escapes, and any dtext in a domain literal. Domain labels are\n * atext, since RFC 5322's domain is a dot-atom, with the hostname rules\n * for hyphens and length on top. A CRLF must be followed by a space or\n * tab. No 64-character local cap, but a dotted domain is still required.\n * - `html5`: exactly the WHATWG `input[type=email]` regex.\n *\n * Every preset caps a domain label at 63 characters and the address at 254;\n * all but `html5` cap the domain at 253. Comments and folding whitespace\n * don't count toward the caps.\n *\n * The address splits on the last `@` outside a quoted string, comment, or\n * domain literal (validator-syntax#9). A quote opens a quoted string only at\n * the start of a word; anywhere else it's an invalid character. A quoted\n * string, comment, or literal left open runs to the end, taking any `@`\n * with it.\n *\n * The first failure wins, checked in this order: empty input; the split;\n * the local part, left to right, then its length; the domain, left to right,\n * then its length; the address length; a dotless domain; the TLD. Where a\n * failure has a position, `index` points at the first offending character\n * in the whole address: the `(` of a disallowed or unterminated comment,\n * the `[` of a bad domain literal, the start of an overlong label, and the\n * CR of a CRLF that isn't followed by whitespace.\n *\n * @packageDocumentation\n */\nimport { createSyntaxValidator } from '../index';\nimport type { SyntaxOptions } from '../options';\nimport type { ReasonCode } from '../result';\nimport { isemailFixtures } from './isemail';\nimport { legacyFixtures } from './legacy';\nimport { rfc3696Fixtures } from './rfc3696';\nimport {\n type Preset,\n type SyntaxFeature,\n type SyntaxFixture,\n presets,\n syntaxFeatures,\n} from './types';\nimport { wikipediaFixtures } from './wikipedia';\n\nexport type {\n Expected,\n IsemailFixture,\n LegacyFixture,\n Preset,\n SyntaxFeature,\n SyntaxFixture,\n SyntaxReasonCode,\n} from './types';\nexport {\n isemailFixtures,\n legacyFixtures,\n presets,\n rfc3696Fixtures,\n syntaxFeatures,\n wikipediaFixtures,\n};\n\n/** Every fixture from every source, each address once. */\nexport const syntaxFixtures: readonly SyntaxFixture[] = [\n ...legacyFixtures,\n ...isemailFixtures,\n ...wikipediaFixtures,\n ...rfc3696Fixtures,\n];\n\nexport type Support = 'yes' | 'partial' | 'no';\n\nexport interface SupportRow {\n feature: SyntaxFeature;\n label: string;\n /** Whether the preset accepts all, some, or none of the feature's fixtures. */\n support: Record<Preset, Support>;\n /** The feature's fixtures, for examples. */\n fixtures: readonly SyntaxFixture[];\n}\n\n/** The docs' support matrix: one row per feature, one column per preset. */\nexport function supportMatrix(): SupportRow[] {\n return syntaxFeatures.map(({ feature, label }) => {\n const fixtures = syntaxFixtures.filter(\n (fixture) => fixture.feature === feature,\n );\n const supportIn = (preset: Preset): Support => {\n const accepted = fixtures.filter(\n (fixture) => fixture.expected[preset].ok,\n ).length;\n if (accepted === fixtures.length) {\n return 'yes';\n }\n return accepted === 0 ? 'no' : 'partial';\n };\n const support = {\n practical: supportIn('practical'),\n rfc5321: supportIn('rfc5321'),\n rfc5322: supportIn('rfc5322'),\n html5: supportIn('html5'),\n };\n return { feature, label, support, fixtures };\n });\n}\n\n/** An address the configuration accepts. */\nexport interface ValidPreviewEntry {\n address: string;\n /** The fixture's description; absent for addresses you pass in. */\n description?: string;\n /** Whether the preset alone, without the overrides, would reject it. */\n changed: boolean;\n}\n\n/** An address the configuration rejects, and the first check it fails. */\nexport interface InvalidPreviewEntry {\n address: string;\n /** The fixture's description; absent for addresses you pass in. */\n description?: string;\n reason: ReasonCode;\n message?: string;\n index?: number;\n /** Whether the preset alone, without the overrides, would accept it. */\n changed: boolean;\n}\n\n/** The addresses split by whether the configuration accepts them. */\nexport interface SyntaxPreview {\n valid: ValidPreviewEntry[];\n invalid: InvalidPreviewEntry[];\n}\n\n/**\n * Runs `addresses` through `createSyntaxValidator(options)` and splits them\n * into the ones it accepts and the ones it rejects, each list in input\n * order.\n *\n * @remarks\n * `changed` marks the addresses the overrides move: those the preset alone\n * would judge the other way. With no overrides, nothing is changed.\n *\n * @example\n * ```ts\n * const { valid, invalid } = previewSyntaxOptions({ checkTld: false });\n * valid.filter((entry) => entry.changed); // now accepted, e.g. example@s.example\n * previewSyntaxOptions({ preset: 'html5' }, ['ada@localhost']).valid; // [{ address: 'ada@localhost', changed: false }]\n * ```\n *\n * @param addresses - The addresses to judge; `syntaxFixtures` by default.\n * @throws TypeError when `options` are malformed, or `addresses` isn't an\n * array of strings.\n */\nexport function previewSyntaxOptions(\n options?: SyntaxOptions,\n addresses?: readonly string[],\n): SyntaxPreview {\n const validator = createSyntaxValidator(options);\n const preset = createSyntaxValidator({ preset: options?.preset });\n const entries = addresses === undefined ? syntaxFixtures : own(addresses);\n const valid: ValidPreviewEntry[] = [];\n const invalid: InvalidPreviewEntry[] = [];\n for (const { address, description } of entries) {\n const result = validator.parse(address);\n const described = description === undefined ? {} : { description };\n if (result.ok) {\n const changed = !preset.isValid(address);\n valid.push({ address, ...described, changed });\n } else {\n const { ok: _, ...failure } = result;\n invalid.push({\n address,\n ...described,\n ...failure,\n changed: preset.isValid(address),\n });\n }\n }\n return { valid, invalid };\n}\n\n/** Checks the caller's addresses, before any of them is parsed. */\nfunction own(\n addresses: readonly string[],\n): { address: string; description?: undefined }[] {\n if (!Array.isArray(addresses)) {\n throw new TypeError('Expected the addresses to be an array');\n }\n return addresses.map((address: unknown, i) => {\n if (typeof address !== 'string') {\n throw new TypeError(`Expected addresses[${i}] to be a string`);\n }\n return { address };\n });\n}\n"],"mappings":"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"}