Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/website-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ jobs:
-DSOURCEMETA_CORE_JSONSCHEMA:BOOL=OFF
-DSOURCEMETA_CORE_JSONPOINTER:BOOL=OFF
-DSOURCEMETA_CORE_YAML:BOOL=OFF
-DSOURCEMETA_CORE_URLPATTERN:BOOL=OFF
-DSOURCEMETA_CORE_EXTENSION_ALTERSCHEMA:BOOL=OFF
-DSOURCEMETA_CORE_EXTENSION_EDITORSCHEMA:BOOL=OFF
-DSOURCEMETA_CORE_EXTENSION_SCHEMACONFIG:BOOL=OFF
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/website-deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ jobs:
-DSOURCEMETA_CORE_JSONSCHEMA:BOOL=OFF
-DSOURCEMETA_CORE_JSONPOINTER:BOOL=OFF
-DSOURCEMETA_CORE_YAML:BOOL=OFF
-DSOURCEMETA_CORE_URLPATTERN:BOOL=OFF
-DSOURCEMETA_CORE_EXTENSION_ALTERSCHEMA:BOOL=OFF
-DSOURCEMETA_CORE_EXTENSION_EDITORSCHEMA:BOOL=OFF
-DSOURCEMETA_CORE_EXTENSION_SCHEMACONFIG:BOOL=OFF
Expand Down
9 changes: 9 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ option(SOURCEMETA_CORE_JSONSCHEMA "Build the Sourcemeta Core JSON Schema library
option(SOURCEMETA_CORE_JSONPOINTER "Build the Sourcemeta Core JSON Pointer library" ON)
option(SOURCEMETA_CORE_JSONL "Build the Sourcemeta Core JSONL library" ON)
option(SOURCEMETA_CORE_YAML "Build the Sourcemeta Core YAML library" ON)
option(SOURCEMETA_CORE_URLPATTERN "Build the Sourcemeta Core URL Pattern library" ON)
option(SOURCEMETA_CORE_EXTENSION_ALTERSCHEMA "Build the Sourcemeta Core AlterSchema library" ON)
option(SOURCEMETA_CORE_EXTENSION_EDITORSCHEMA "Build the Sourcemeta Core EditorSchema library" ON)
option(SOURCEMETA_CORE_EXTENSION_SCHEMACONFIG "Build the Sourcemeta Core SchemaConfig library" ON)
Expand Down Expand Up @@ -121,6 +122,10 @@ if(SOURCEMETA_CORE_YAML)
add_subdirectory(src/core/yaml)
endif()

if(SOURCEMETA_CORE_URLPATTERN)
add_subdirectory(src/core/urlpattern)
endif()

if(SOURCEMETA_CORE_EXTENSION_ALTERSCHEMA)
add_subdirectory(src/extension/alterschema)
endif()
Expand Down Expand Up @@ -232,6 +237,10 @@ if(SOURCEMETA_CORE_TESTS)
add_subdirectory(test/yaml)
endif()

if(SOURCEMETA_CORE_URLPATTERN)
add_subdirectory(test/urlpattern)
endif()

if(SOURCEMETA_CORE_EXTENSION_ALTERSCHEMA)
add_subdirectory(test/alterschema)
endif()
Expand Down
1 change: 1 addition & 0 deletions DEPENDENCIES
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,4 @@ yaml https://github.com/yaml/libyaml 0.2.5
pcre2 https://github.com/PCRE2Project/pcre2 pcre2-10.47
googletest https://github.com/google/googletest a7f443b80b105f940225332ed3c31f2790092f47
googlebenchmark https://github.com/google/benchmark 378fe693a1ef51500db21b11ff05a8018c5f0e55
wpt https://github.com/web-platform-tests/wpt 71154f49e6cdda82c43e11bb74cfe3ad7b3f9368
6 changes: 6 additions & 0 deletions config.cmake.in
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ if(NOT SOURCEMETA_CORE_COMPONENTS)
list(APPEND SOURCEMETA_CORE_COMPONENTS jsonpointer)
list(APPEND SOURCEMETA_CORE_COMPONENTS jsonschema)
list(APPEND SOURCEMETA_CORE_COMPONENTS yaml)
list(APPEND SOURCEMETA_CORE_COMPONENTS urlpattern)
list(APPEND SOURCEMETA_CORE_COMPONENTS alterschema)
list(APPEND SOURCEMETA_CORE_COMPONENTS editorschema)
list(APPEND SOURCEMETA_CORE_COMPONENTS schemaconfig)
Expand Down Expand Up @@ -87,6 +88,11 @@ foreach(component ${SOURCEMETA_CORE_COMPONENTS})
find_dependency(yaml CONFIG)
include("${CMAKE_CURRENT_LIST_DIR}/sourcemeta_core_io.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/sourcemeta_core_yaml.cmake")
elseif(component STREQUAL "urlpattern")
include("${CMAKE_CURRENT_LIST_DIR}/sourcemeta_core_json.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/sourcemeta_core_regex.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/sourcemeta_core_punycode.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/sourcemeta_core_urlpattern.cmake")
elseif(component STREQUAL "alterschema")
include("${CMAKE_CURRENT_LIST_DIR}/sourcemeta_core_uri.cmake")
find_dependency(mpdecimal CONFIG)
Expand Down
44 changes: 44 additions & 0 deletions patches/wpt/0001-Remove-invalid-surrogate-pairs-tests.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
From ec3c41d5eb68cf24e86ef67b1067fc43df859ab0 Mon Sep 17 00:00:00 2001
From: Juan Cruz Viotti <jv@jviotti.com>
Date: Fri, 28 Nov 2025 15:42:16 -0400
Subject: [PATCH] Remove invalid surrogate pairs tests

Signed-off-by: Juan Cruz Viotti <jv@jviotti.com>
---
urlpattern/resources/urlpatterntestdata.json | 20 --------------------
1 file changed, 20 deletions(-)

diff --git a/urlpattern/resources/urlpatterntestdata.json b/urlpattern/resources/urlpatterntestdata.json
index 4b1b9ee5f6..ae10c412ad 100644
--- a/urlpattern/resources/urlpatterntestdata.json
+++ b/urlpattern/resources/urlpatterntestdata.json
@@ -1136,26 +1136,6 @@
"pathname": { "input": "/", "groups": {}}
}
},
- {
- "pattern": ["http://\uD83D \uDEB2"],
- "expected_obj": "error"
- },
- {
- "pattern": [{"hostname":"\uD83D \uDEB2"}],
- "expected_obj": "error"
- },
- {
- "pattern": [{"pathname":"\uD83D \uDEB2"}],
- "inputs": [],
- "expected_obj": {
- "pathname": "%EF%BF%BD%20%EF%BF%BD"
- },
- "expected_match": null
- },
- {
- "pattern": [{"pathname":":\uD83D \uDEB2"}],
- "expected_obj": "error"
- },
{
"pattern": [{"pathname":":a\uDB40\uDD00b"}],
"inputs": [],
--
2.52.0

17 changes: 17 additions & 0 deletions src/core/urlpattern/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
sourcemeta_library(NAMESPACE sourcemeta PROJECT core NAME urlpattern
PRIVATE_HEADERS error.h part.h component.h
SOURCES urlpattern.cc urlpattern_part.cc urlpattern_component.cc)

if(SOURCEMETA_CORE_INSTALL)
sourcemeta_library_install(NAMESPACE sourcemeta PROJECT core NAME urlpattern)
endif()

target_link_libraries(sourcemeta_core_urlpattern PUBLIC
sourcemeta::core::json)
target_link_libraries(sourcemeta_core_urlpattern PUBLIC
sourcemeta::core::regex)
target_link_libraries(sourcemeta_core_urlpattern PRIVATE
sourcemeta::core::punycode)

# TODO: Find a way to get rid of this?
target_link_libraries(sourcemeta_core_urlpattern PRIVATE PCRE2::pcre2)
86 changes: 86 additions & 0 deletions src/core/urlpattern/include/sourcemeta/core/urlpattern.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
#ifndef SOURCEMETA_CORE_URLPATTERN_H_
#define SOURCEMETA_CORE_URLPATTERN_H_

#ifndef SOURCEMETA_CORE_URLPATTERN_EXPORT
#include <sourcemeta/core/urlpattern_export.h>
#endif

// NOLINTBEGIN(misc-include-cleaner)
#include <sourcemeta/core/urlpattern_component.h>
#include <sourcemeta/core/urlpattern_error.h>
#include <sourcemeta/core/urlpattern_part.h>
// NOLINTEND(misc-include-cleaner)

#include <sourcemeta/core/json.h>

#include <compare> // std::strong_ordering
#include <optional> // std::optional
#include <string> // std::string
#include <string_view> // std::string_view

/// @defgroup urlpattern URL Pattern
/// @brief A WHATWG URL Pattern implementation.
///
/// This functionality is included as follows:
///
/// ```cpp
/// #include <sourcemeta/core/urlpattern.h>
/// ```

namespace sourcemeta::core {

/// @ingroup urlpattern
struct URLPatternResult {
std::optional<URLPatternComponentResult> protocol;
std::optional<URLPatternComponentResult> username;
std::optional<URLPatternComponentResult> password;
std::optional<URLPatternComponentResult> hostname;
std::optional<URLPatternComponentResult> port;
std::optional<URLPatternComponentResult> pathname;
std::optional<URLPatternComponentResult> search;
std::optional<URLPatternComponentResult> hash;
};

/// @ingroup urlpattern
struct SOURCEMETA_CORE_URLPATTERN_EXPORT URLPatternInput {
std::string protocol;
std::string username;
std::string password;
std::string hostname;
std::string port;
std::string pathname;
std::string search;
std::string hash;

[[nodiscard]] static auto parse(const JSON &input)
-> std::optional<URLPatternInput>;
[[nodiscard]] static auto parse(const std::string_view input)
-> std::optional<URLPatternInput>;
};

/// @ingroup urlpattern
/// See https://urlpattern.spec.whatwg.org/#url-pattern-struct
struct SOURCEMETA_CORE_URLPATTERN_EXPORT URLPattern {
URLPatternProtocol protocol;
URLPatternUsername username;
URLPatternPassword password;
URLPatternHostname hostname;
URLPatternPort port;
URLPatternPathname pathname;
URLPatternSearch search;
URLPatternHash hash;

auto operator==(const URLPattern &other) const -> bool = default;
auto operator<=>(const URLPattern &other) const -> std::strong_ordering;

[[nodiscard]] static auto parse(const std::string_view input) -> URLPattern;
[[nodiscard]] static auto parse(const JSON &input)
-> std::optional<URLPattern>;

[[nodiscard]] auto match(const URLPatternInput &input) const
-> URLPatternResult;
};

} // namespace sourcemeta::core

#endif
Loading
Loading