typedef (USVString or URLPatternInit) URLPatternInput;

// https://urlpattern.spec.whatwg.org/#urlpattern
[Exposed=(Window,Worker)]
interface URLPattern {
    constructor(URLPatternInput input, USVString baseURL, optional URLPatternOptions options = {});
    constructor(optional URLPatternInput input = {}, optional URLPatternOptions options = {});

    [FIXME] boolean test(optional URLPatternInput input = {}, optional USVString baseURL);

    [FIXME] URLPatternResult? exec(optional URLPatternInput input = {}, optional USVString baseURL);

    [FIXME] readonly attribute USVString protocol;
    [FIXME] readonly attribute USVString username;
    [FIXME] readonly attribute USVString password;
    [FIXME] readonly attribute USVString hostname;
    [FIXME] readonly attribute USVString port;
    [FIXME] readonly attribute USVString pathname;
    [FIXME] readonly attribute USVString search;
    [FIXME] readonly attribute USVString hash;

    [FIXME] readonly attribute boolean hasRegExpGroups;
};

// https://urlpattern.spec.whatwg.org/#dictdef-urlpatterninit
dictionary URLPatternInit {
    USVString protocol;
    USVString username;
    USVString password;
    USVString hostname;
    USVString port;
    USVString pathname;
    USVString search;
    USVString hash;
    USVString baseURL;
};

// https://urlpattern.spec.whatwg.org/#dictdef-urlpatternoptions
dictionary URLPatternOptions {
    boolean ignoreCase = false;
};

// https://urlpattern.spec.whatwg.org/#dictdef-urlpatternresult
dictionary URLPatternResult {
    sequence<URLPatternInput> inputs;

    URLPatternComponentResult protocol;
    URLPatternComponentResult username;
    URLPatternComponentResult password;
    URLPatternComponentResult hostname;
    URLPatternComponentResult port;
    URLPatternComponentResult pathname;
    URLPatternComponentResult search;
    URLPatternComponentResult hash;
};

// https://urlpattern.spec.whatwg.org/#dictdef-urlpatterncomponentresult
dictionary URLPatternComponentResult {
    USVString input;
    record<USVString, (USVString or undefined)> groups;
};
