idnumbers
    Preparing search index...

    Function createCompositeValidator

    • Combine several ID formats a country accepts into one CountryValidator.

      • validate(id) is true when any member validates it.
      • parse(id) returns the first non-null result among members that can parse, in member order (a.parse(id) ?? b.parse(id)); it is omitted when no member can parse.
      • The composite's own checksum() method is omitted: members use different check-digit algorithms.
      • METADATA starts from the first member's METADATA, then spans every member: minLength/maxLength are the smallest/largest member bounds and regexp matches any member's shape; masks lists every member's masks, in member order (#129). parsable is true when the composite has parse, and checksum only when every member's format carries a checksum. overrides are applied last (e.g. a country-level countryName/idType, or a hand-written regexp); an override set to undefined is ignored.

      The registry METADATA must describe every shape validate() accepts (#117): getCountryIdFormat() and the failure-reason derivation both read it.

      The composite's parse result type is the union of its members' (#123).

      Type Parameters

      Parameters

      Returns CountryValidator<ParseResultOf<M[number]>>

      Error if member regexps use different flags or a backreference and no regexp override is given.

      import { createCompositeValidator } from 'idnumbers/core';
      import type { IdMetadata } from 'idnumbers/core';

      const metadata = (regexp: RegExp, length: number): IdMetadata => ({
      iso3166Alpha2: 'XX',
      minLength: length,
      maxLength: length,
      parsable: false,
      checksum: false,
      regexp,
      aliasOf: null,
      names: [],
      links: [],
      deprecated: false,
      });

      const digits = {
      METADATA: metadata(/^\d{6}$/, 6),
      validate: (id: string) => /^\d{6}$/.test(id),
      };
      const prefixed = {
      METADATA: metadata(/^XX\d{4}$/, 6),
      validate: (id: string) => /^XX\d{4}$/.test(id),
      };

      const either = createCompositeValidator([digits, prefixed]);
      either.validate('123456'); // true
      either.validate('XX1234'); // true
      either.validate('YY1234'); // false