Compare commits
7 commits
e01cd343bc
...
89d0c80736
| Author | SHA1 | Date | |
|---|---|---|---|
| 89d0c80736 | |||
| 2013b4e1cc | |||
| cf761709dd | |||
| 2bc7af69fe | |||
| 20935b7b50 | |||
| 0e6be36e85 | |||
| 5e97b6dcbc |
39 changed files with 2528 additions and 1670 deletions
|
|
@ -7,257 +7,253 @@ use PhpCsFixer\Finder;
|
||||||
use PhpCsFixer\Runner;
|
use PhpCsFixer\Runner;
|
||||||
|
|
||||||
$finder = new Finder()->in(__DIR__)->exclude([
|
$finder = new Finder()->in(__DIR__)->exclude([
|
||||||
'vendor',
|
'vendor',
|
||||||
'web/vendor',
|
'web/vendor',
|
||||||
'web/wp',
|
'web/wp',
|
||||||
'web/app/languages',
|
'web/app/languages',
|
||||||
'web/app/plugins',
|
'web/app/plugins',
|
||||||
'web/app/mu-plugins',
|
'web/app/mu-plugins',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return new Config()
|
return new Config()
|
||||||
->setRiskyAllowed(true)
|
->setRiskyAllowed(true)
|
||||||
->setRules([
|
->setRules([
|
||||||
'array_syntax' => ['syntax' => 'short'],
|
'array_syntax' => ['syntax' => 'short'],
|
||||||
'assign_null_coalescing_to_coalesce_equal' => true,
|
'assign_null_coalescing_to_coalesce_equal' => true,
|
||||||
'attribute_empty_parentheses' => ['use_parentheses' => true],
|
'attribute_empty_parentheses' => ['use_parentheses' => true],
|
||||||
'blank_line_after_namespace' => true,
|
'blank_line_after_namespace' => true,
|
||||||
'blank_lines_before_namespace' => ['min_line_breaks' => 1, 'max_line_breaks' => 2],
|
'blank_lines_before_namespace' => ['min_line_breaks' => 1, 'max_line_breaks' => 2],
|
||||||
'cast_spaces' => true,
|
'cast_spaces' => true,
|
||||||
'class_attributes_separation' => ['elements' => [
|
'class_attributes_separation' => ['elements' => [
|
||||||
'case' => 'none',
|
'case' => 'none',
|
||||||
'const' => 'none',
|
'const' => 'none',
|
||||||
'method' => 'one',
|
'method' => 'one',
|
||||||
'property' => 'one',
|
'property' => 'one',
|
||||||
'trait_import' => 'none',
|
'trait_import' => 'none',
|
||||||
]],
|
]],
|
||||||
'class_reference_name_casing' => true,
|
'class_reference_name_casing' => true,
|
||||||
'clean_namespace' => true,
|
'clean_namespace' => true,
|
||||||
'combine_consecutive_issets' => true,
|
'combine_consecutive_issets' => true,
|
||||||
'combine_consecutive_unsets' => true,
|
'combine_consecutive_unsets' => true,
|
||||||
'combine_nested_dirname' => true,
|
'combine_nested_dirname' => true,
|
||||||
'comment_to_phpdoc' => true,
|
'comment_to_phpdoc' => true,
|
||||||
'constant_case' => true,
|
'constant_case' => true,
|
||||||
'date_time_immutable' => true,
|
'date_time_immutable' => true,
|
||||||
'declare_equal_normalize' => true,
|
'declare_equal_normalize' => true,
|
||||||
'declare_parentheses' => true,
|
'declare_parentheses' => true,
|
||||||
'declare_strict_types' => true,
|
'declare_strict_types' => true,
|
||||||
'dir_constant' => true,
|
'dir_constant' => true,
|
||||||
'echo_tag_syntax' => true,
|
'echo_tag_syntax' => true,
|
||||||
'encoding' => true,
|
'encoding' => true,
|
||||||
'ereg_to_preg' => true,
|
'ereg_to_preg' => true,
|
||||||
'error_suppression' => true,
|
'error_suppression' => true,
|
||||||
'explicit_indirect_variable' => true,
|
'explicit_indirect_variable' => true,
|
||||||
'explicit_string_variable' => true,
|
'explicit_string_variable' => true,
|
||||||
'final_class' => true,
|
'final_class' => true,
|
||||||
'final_internal_class' => true,
|
'final_internal_class' => true,
|
||||||
'full_opening_tag' => true,
|
'full_opening_tag' => true,
|
||||||
'fully_qualified_strict_types' => ['import_symbols' => true],
|
'fully_qualified_strict_types' => ['import_symbols' => true],
|
||||||
'function_to_constant' => true,
|
'function_to_constant' => true,
|
||||||
'global_namespace_import' => ['import_classes' => true, 'import_constants' => true, 'import_functions' => true],
|
'global_namespace_import' => ['import_classes' => true, 'import_constants' => true, 'import_functions' => true],
|
||||||
'heredoc_to_nowdoc' => true,
|
'heredoc_to_nowdoc' => true,
|
||||||
'integer_literal_case' => true,
|
'integer_literal_case' => true,
|
||||||
'lambda_not_used_import' => true,
|
'lambda_not_used_import' => true,
|
||||||
'list_syntax' => true,
|
'list_syntax' => true,
|
||||||
'logical_operators' => true,
|
'logical_operators' => true,
|
||||||
'long_to_shorthand_operator' => true,
|
'long_to_shorthand_operator' => true,
|
||||||
'lowercase_cast' => true,
|
'lowercase_cast' => true,
|
||||||
'lowercase_keywords' => true,
|
'lowercase_keywords' => true,
|
||||||
'lowercase_static_reference' => true,
|
'lowercase_static_reference' => true,
|
||||||
'magic_constant_casing' => true,
|
'magic_constant_casing' => true,
|
||||||
'magic_method_casing' => true,
|
'magic_method_casing' => true,
|
||||||
'mb_str_functions' => true,
|
'mb_str_functions' => true,
|
||||||
'modernize_strpos' => ['modernize_stripos' => true],
|
'modernize_strpos' => ['modernize_stripos' => true],
|
||||||
'modernize_types_casting' => true,
|
'modernize_types_casting' => true,
|
||||||
'modifier_keywords' => true,
|
'modifier_keywords' => true,
|
||||||
'multiline_comment_opening_closing' => true,
|
'multiline_comment_opening_closing' => true,
|
||||||
'native_constant_invocation' => true,
|
'native_constant_invocation' => true,
|
||||||
'native_function_casing' => true,
|
'native_function_casing' => true,
|
||||||
'native_function_invocation' => [
|
'native_function_invocation' => ['include' => ['@compiler_optimized'], 'scope' => 'namespaced', 'strict' => true],
|
||||||
'include' => ['@compiler_optimized'],
|
'native_type_declaration_casing' => true,
|
||||||
'scope' => 'namespaced',
|
'new_expression_parentheses' => true,
|
||||||
'strict' => true,
|
'no_alias_functions' => ['sets' => ['@all']],
|
||||||
],
|
'no_alias_language_construct_call' => true,
|
||||||
'native_type_declaration_casing' => true,
|
'no_alternative_syntax' => true,
|
||||||
'new_expression_parentheses' => true,
|
'no_binary_string' => true,
|
||||||
'no_alias_functions' => ['sets' => ['@all']],
|
'no_closing_tag' => true,
|
||||||
'no_alias_language_construct_call' => true,
|
'no_empty_comment' => true,
|
||||||
'no_alternative_syntax' => true,
|
'no_homoglyph_names' => true,
|
||||||
'no_binary_string' => true,
|
'no_leading_import_slash' => true,
|
||||||
'no_closing_tag' => true,
|
'no_mixed_echo_print' => ['use' => 'echo'],
|
||||||
'no_empty_comment' => true,
|
'no_multiline_whitespace_around_double_arrow' => true,
|
||||||
'no_homoglyph_names' => true,
|
'no_multiple_statements_per_line' => true,
|
||||||
'no_leading_import_slash' => true,
|
'no_null_property_initialization' => true,
|
||||||
'no_mixed_echo_print' => ['use' => 'echo'],
|
'no_php4_constructor' => true,
|
||||||
'no_multiline_whitespace_around_double_arrow' => true,
|
'no_short_bool_cast' => true,
|
||||||
'no_multiple_statements_per_line' => true,
|
'no_trailing_comma_in_singleline' => true,
|
||||||
'no_null_property_initialization' => true,
|
'no_trailing_whitespace_in_comment' => true,
|
||||||
'no_php4_constructor' => true,
|
'no_unneeded_braces' => ['namespaces' => true],
|
||||||
'no_short_bool_cast' => true,
|
'no_unneeded_control_parentheses' => ['statements' => [
|
||||||
'no_trailing_comma_in_singleline' => true,
|
'break',
|
||||||
'no_trailing_whitespace_in_comment' => true,
|
'clone',
|
||||||
'no_unneeded_braces' => ['namespaces' => true],
|
'continue',
|
||||||
'no_unneeded_control_parentheses' => ['statements' => [
|
'echo_print',
|
||||||
'break',
|
'negative_instanceof',
|
||||||
'clone',
|
'others',
|
||||||
'continue',
|
'return',
|
||||||
'echo_print',
|
'switch_case',
|
||||||
'negative_instanceof',
|
'yield',
|
||||||
'others',
|
'yield_from',
|
||||||
'return',
|
]],
|
||||||
'switch_case',
|
'no_unneeded_final_method' => true,
|
||||||
'yield',
|
'no_unneeded_import_alias' => true,
|
||||||
'yield_from',
|
'no_unreachable_default_argument_value' => true,
|
||||||
]],
|
'no_unset_cast' => true,
|
||||||
'no_unneeded_final_method' => true,
|
'no_unset_on_property' => true,
|
||||||
'no_unneeded_import_alias' => true,
|
'no_unused_imports' => true,
|
||||||
'no_unreachable_default_argument_value' => true,
|
'no_useless_concat_operator' => true,
|
||||||
'no_unset_cast' => true,
|
'no_useless_nullsafe_operator' => true,
|
||||||
'no_unset_on_property' => true,
|
'no_useless_printf' => true,
|
||||||
'no_unused_imports' => true,
|
'no_useless_return' => true,
|
||||||
'no_useless_concat_operator' => true,
|
'no_useless_sprintf' => true,
|
||||||
'no_useless_nullsafe_operator' => true,
|
'no_whitespace_before_comma_in_array' => ['after_heredoc' => true],
|
||||||
'no_useless_printf' => true,
|
'non_printable_character' => true,
|
||||||
'no_useless_return' => true,
|
'normalize_index_brace' => true,
|
||||||
'no_useless_sprintf' => true,
|
'nullable_type_declaration' => ['syntax' => 'union'],
|
||||||
'no_whitespace_before_comma_in_array' => ['after_heredoc' => true],
|
'nullable_type_declaration_for_default_null_value' => true,
|
||||||
'non_printable_character' => true,
|
'numeric_literal_separator' => ['override_existing' => true, 'strategy' => 'use_separator'],
|
||||||
'normalize_index_brace' => true,
|
'ordered_attributes' => true,
|
||||||
'nullable_type_declaration' => ['syntax' => 'union'],
|
'ordered_class_elements' => ['case_sensitive' => false, 'sort_algorithm' => 'alpha'],
|
||||||
'nullable_type_declaration_for_default_null_value' => true,
|
'ordered_imports' => ['case_sensitive' => true],
|
||||||
'numeric_literal_separator' => ['override_existing' => true, 'strategy' => 'use_separator'],
|
'ordered_interfaces' => true,
|
||||||
'ordered_attributes' => true,
|
'ordered_traits' => true,
|
||||||
'ordered_class_elements' => ['case_sensitive' => false, 'sort_algorithm' => 'alpha'],
|
'ordered_types' => ['null_adjustment' => 'always_last'],
|
||||||
'ordered_imports' => ['case_sensitive' => true],
|
'phpdoc_readonly_class_comment_to_keyword' => true,
|
||||||
'ordered_interfaces' => true,
|
'phpdoc_to_param_type' => true,
|
||||||
'ordered_traits' => true,
|
'phpdoc_to_property_type' => true,
|
||||||
'ordered_types' => ['null_adjustment' => 'always_last'],
|
'phpdoc_to_return_type' => true,
|
||||||
'phpdoc_readonly_class_comment_to_keyword' => true,
|
'pow_to_exponentiation' => true,
|
||||||
'phpdoc_to_param_type' => true,
|
'protected_to_private' => true,
|
||||||
'phpdoc_to_property_type' => true,
|
'psr_autoloading' => true,
|
||||||
'phpdoc_to_return_type' => true,
|
'random_api_migration' => ['replacements' => [
|
||||||
'pow_to_exponentiation' => true,
|
'getrandmax' => 'mt_getrandmax',
|
||||||
'protected_to_private' => true,
|
'rand' => 'mt_rand',
|
||||||
'psr_autoloading' => true,
|
'srand' => 'mt_srand',
|
||||||
'random_api_migration' => ['replacements' => [
|
]],
|
||||||
'getrandmax' => 'mt_getrandmax',
|
'return_assignment' => true,
|
||||||
'rand' => 'mt_rand',
|
'self_accessor' => true,
|
||||||
'srand' => 'mt_srand',
|
'self_static_accessor' => true,
|
||||||
]],
|
'set_type_to_cast' => true,
|
||||||
'return_assignment' => true,
|
'short_scalar_cast' => true,
|
||||||
'self_accessor' => true,
|
'simple_to_complex_string_variable' => true,
|
||||||
'self_static_accessor' => true,
|
'simplified_null_return' => true,
|
||||||
'set_type_to_cast' => true,
|
'single_class_element_per_statement' => true,
|
||||||
'short_scalar_cast' => true,
|
'single_import_per_statement' => true,
|
||||||
'simple_to_complex_string_variable' => true,
|
'single_line_after_imports' => true,
|
||||||
'simplified_null_return' => true,
|
'single_line_comment_spacing' => true,
|
||||||
'single_class_element_per_statement' => true,
|
'single_line_comment_style' => true,
|
||||||
'single_import_per_statement' => true,
|
'single_line_empty_body' => true,
|
||||||
'single_line_after_imports' => true,
|
'single_trait_insert_per_statement' => true,
|
||||||
'single_line_comment_spacing' => true,
|
'standardize_not_equals' => true,
|
||||||
'single_line_comment_style' => true,
|
'static_lambda' => true,
|
||||||
'single_line_empty_body' => true,
|
'strict_comparison' => true,
|
||||||
'single_trait_insert_per_statement' => true,
|
'strict_param' => true,
|
||||||
'standardize_not_equals' => true,
|
'string_implicit_backslashes' => true,
|
||||||
'static_lambda' => true,
|
'string_length_to_empty' => true,
|
||||||
'strict_comparison' => true,
|
'switch_continue_to_break' => true,
|
||||||
'strict_param' => true,
|
'ternary_to_null_coalescing' => true,
|
||||||
'string_implicit_backslashes' => true,
|
'trim_array_spaces' => true,
|
||||||
'string_length_to_empty' => true,
|
'use_arrow_functions' => true,
|
||||||
'switch_continue_to_break' => true,
|
'void_return' => true,
|
||||||
'ternary_to_null_coalescing' => true,
|
'whitespace_after_comma_in_array' => ['ensure_single_space' => true],
|
||||||
'trim_array_spaces' => true,
|
// ---
|
||||||
'use_arrow_functions' => true,
|
// Each line of multi-line DocComments must have an asterisk [PSR-5] and must be aligned with the first one.
|
||||||
'void_return' => true,
|
'align_multiline_comment' => ['comment_type' => 'all_multiline'],
|
||||||
'whitespace_after_comma_in_array' => ['ensure_single_space' => true],
|
// There should not be blank lines between docblock and the documented element.
|
||||||
// ---
|
'no_blank_lines_after_phpdoc' => true,
|
||||||
// Each line of multi-line DocComments must have an asterisk [PSR-5] and must be aligned with the first one.
|
// There should not be empty PHPDoc blocks.
|
||||||
'align_multiline_comment' => ['comment_type' => 'all_multiline'],
|
'no_empty_phpdoc' => true,
|
||||||
// There should not be blank lines between docblock and the documented element.
|
// Removes @param, @return and @var tags that don't provide any useful information.
|
||||||
'no_blank_lines_after_phpdoc' => true,
|
'no_superfluous_phpdoc_tags' => [
|
||||||
// There should not be empty PHPDoc blocks.
|
'allow_hidden_params' => false,
|
||||||
'no_empty_phpdoc' => true,
|
'allow_mixed' => false,
|
||||||
// Removes @param, @return and @var tags that don't provide any useful information.
|
'allow_unused_params' => false,
|
||||||
'no_superfluous_phpdoc_tags' => [
|
],
|
||||||
'allow_hidden_params' => false,
|
// PHPDoc should contain @param for all params.
|
||||||
'allow_mixed' => false,
|
'phpdoc_add_missing_param_annotation' => ['only_untyped' => false],
|
||||||
'allow_unused_params' => false,
|
// All items of the given PHPDoc tags must be either left-aligned or (by default) aligned vertically.
|
||||||
],
|
'phpdoc_align' => true,
|
||||||
// PHPDoc should contain @param for all params.
|
// PHPDoc annotation descriptions should not be a sentence.
|
||||||
'phpdoc_add_missing_param_annotation' => ['only_untyped' => false],
|
'phpdoc_annotation_without_dot' => true,
|
||||||
// All items of the given PHPDoc tags must be either left-aligned or (by default) aligned vertically.
|
// PHPDoc array<T> type must be used instead of T[].
|
||||||
'phpdoc_align' => true,
|
'phpdoc_array_type' => true,
|
||||||
// PHPDoc annotation descriptions should not be a sentence.
|
// Docblocks should have the same indentation as the documented subject.
|
||||||
'phpdoc_annotation_without_dot' => true,
|
'phpdoc_indent' => true,
|
||||||
// PHPDoc array<T> type must be used instead of T[].
|
// Fixes PHPDoc inline tags.
|
||||||
'phpdoc_array_type' => true,
|
'phpdoc_inline_tag_normalizer' => true,
|
||||||
// Docblocks should have the same indentation as the documented subject.
|
// Changes doc blocks from single to multi line, or reversed. Works for class constants, properties and methods only.
|
||||||
'phpdoc_indent' => true,
|
'phpdoc_line_span' => ['const' => 'single', 'method' => 'multi', 'property' => 'single'],
|
||||||
// Fixes PHPDoc inline tags.
|
// PHPDoc list type must be used instead of array without a key.
|
||||||
'phpdoc_inline_tag_normalizer' => true,
|
'phpdoc_list_type' => false,
|
||||||
// Changes doc blocks from single to multi line, or reversed. Works for class constants, properties and methods only.
|
// @access annotations must be removed from PHPDoc.
|
||||||
'phpdoc_line_span' => ['const' => 'single', 'method' => 'multi', 'property' => 'single'],
|
'phpdoc_no_access' => true,
|
||||||
// PHPDoc list type must be used instead of array without a key.
|
// No alias PHPDoc tags should be used.
|
||||||
'phpdoc_list_type' => false,
|
'phpdoc_no_alias_tag' => true,
|
||||||
// @access annotations must be removed from PHPDoc.
|
// @return void and @return null annotations must be removed from PHPDoc.
|
||||||
'phpdoc_no_access' => true,
|
'phpdoc_no_empty_return' => false,
|
||||||
// No alias PHPDoc tags should be used.
|
// @package and @subpackage annotations must be removed from PHPDoc.
|
||||||
'phpdoc_no_alias_tag' => true,
|
'phpdoc_no_package' => true,
|
||||||
// @return void and @return null annotations must be removed from PHPDoc.
|
// Classy that does not inherit must not have @inheritdoc tags.
|
||||||
'phpdoc_no_empty_return' => false,
|
'phpdoc_no_useless_inheritdoc' => true,
|
||||||
// @package and @subpackage annotations must be removed from PHPDoc.
|
// Annotations in PHPDoc should be ordered in defined sequence.
|
||||||
'phpdoc_no_package' => true,
|
'phpdoc_order' => true,
|
||||||
// Classy that does not inherit must not have @inheritdoc tags.
|
// Order PHPDoc tags by value.
|
||||||
'phpdoc_no_useless_inheritdoc' => true,
|
'phpdoc_order_by_value' => true,
|
||||||
// Annotations in PHPDoc should be ordered in defined sequence.
|
// Orders all @param annotations in DocBlocks according to method signature.
|
||||||
'phpdoc_order' => true,
|
'phpdoc_param_order' => true,
|
||||||
// Order PHPDoc tags by value.
|
// The type of @return annotations of methods returning a reference to itself must the configured one.
|
||||||
'phpdoc_order_by_value' => true,
|
'phpdoc_return_self_reference' => true,
|
||||||
// Orders all @param annotations in DocBlocks according to method signature.
|
// Scalar types should always be written in the same form. int not integer, bool not boolean, float not real or double.
|
||||||
'phpdoc_param_order' => true,
|
'phpdoc_scalar' => ['types' => [
|
||||||
// The type of @return annotations of methods returning a reference to itself must the configured one.
|
'boolean',
|
||||||
'phpdoc_return_self_reference' => true,
|
'callback',
|
||||||
// Scalar types should always be written in the same form. int not integer, bool not boolean, float not real or double.
|
'double',
|
||||||
'phpdoc_scalar' => ['types' => [
|
'integer',
|
||||||
'boolean',
|
'never-return',
|
||||||
'callback',
|
'never-returns',
|
||||||
'double',
|
'no-return',
|
||||||
'integer',
|
'real',
|
||||||
'never-return',
|
'str',
|
||||||
'never-returns',
|
]],
|
||||||
'no-return',
|
// Annotations in PHPDoc should be grouped together so that annotations of the same type immediately follow each other. Annotations of a different type are separated by a single blank line.
|
||||||
'real',
|
'phpdoc_separation' => [
|
||||||
'str',
|
'groups' => [
|
||||||
]],
|
['Annotation', 'NamedArgumentConstructor', 'Target'],
|
||||||
// Annotations in PHPDoc should be grouped together so that annotations of the same type immediately follow each other. Annotations of a different type are separated by a single blank line.
|
['author', 'copyright', 'license'],
|
||||||
'phpdoc_separation' => [
|
['category', 'package', 'subpackage'],
|
||||||
'groups' => [
|
['property', 'property-read', 'property-write'],
|
||||||
['Annotation', 'NamedArgumentConstructor', 'Target'],
|
['deprecated', 'link', 'see', 'since'],
|
||||||
['author', 'copyright', 'license'],
|
],
|
||||||
['category', 'package', 'subpackage'],
|
'skip_unlisted_annotations' => false,
|
||||||
['property', 'property-read', 'property-write'],
|
],
|
||||||
['deprecated', 'link', 'see', 'since'],
|
// Single line @var PHPDoc should have proper spacing.
|
||||||
],
|
'phpdoc_single_line_var_spacing' => true,
|
||||||
'skip_unlisted_annotations' => false,
|
// PHPDoc summary should end in either a full stop, exclamation mark, or question mark.
|
||||||
],
|
'phpdoc_summary' => true,
|
||||||
// Single line @var PHPDoc should have proper spacing.
|
// Docblocks should only be used on structural elements.
|
||||||
'phpdoc_single_line_var_spacing' => true,
|
'phpdoc_to_comment' => false,
|
||||||
// PHPDoc summary should end in either a full stop, exclamation mark, or question mark.
|
// PHPDoc should start and end with content, excluding the very first and last line of the docblocks.
|
||||||
'phpdoc_summary' => true,
|
'phpdoc_trim' => true,
|
||||||
// Docblocks should only be used on structural elements.
|
// Removes extra blank lines after summary and after description in PHPDoc.
|
||||||
'phpdoc_to_comment' => false,
|
'phpdoc_trim_consecutive_blank_line_separation' => true,
|
||||||
// PHPDoc should start and end with content, excluding the very first and last line of the docblocks.
|
// The correct case must be used for standard PHP types in PHPDoc.
|
||||||
'phpdoc_trim' => true,
|
'phpdoc_types' => true,
|
||||||
// Removes extra blank lines after summary and after description in PHPDoc.
|
// Sorts PHPDoc types.
|
||||||
'phpdoc_trim_consecutive_blank_line_separation' => true,
|
'phpdoc_types_order' => ['null_adjustment' => 'always_last'],
|
||||||
// The correct case must be used for standard PHP types in PHPDoc.
|
// @var and @type annotations must have type and name in the correct order.
|
||||||
'phpdoc_types' => true,
|
'phpdoc_var_annotation_correct_order' => true,
|
||||||
// Sorts PHPDoc types.
|
// @var and @type annotations of classy properties should not contain the name.
|
||||||
'phpdoc_types_order' => ['null_adjustment' => 'always_last'],
|
'phpdoc_var_without_name' => true,
|
||||||
// @var and @type annotations must have type and name in the correct order.
|
])
|
||||||
'phpdoc_var_annotation_correct_order' => true,
|
->setFinder($finder)
|
||||||
// @var and @type annotations of classy properties should not contain the name.
|
->setParallelConfig(Runner\Parallel\ParallelConfigFactory::detect());
|
||||||
'phpdoc_var_without_name' => true,
|
|
||||||
])
|
|
||||||
->setFinder($finder)
|
|
||||||
->setParallelConfig(Runner\Parallel\ParallelConfigFactory::detect());
|
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@
|
||||||
"configPath": "cfg/oxlint.config.ts",
|
"configPath": "cfg/oxlint.config.ts",
|
||||||
"disableNestedConfig": false,
|
"disableNestedConfig": false,
|
||||||
"fixKind": "safe_fix",
|
"fixKind": "safe_fix",
|
||||||
"run": "onType",
|
"run": "onSave",
|
||||||
"unusedDisableDirectives": "deny"
|
"unusedDisableDirectives": "deny"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
236
bun.lock
236
bun.lock
|
|
@ -8,7 +8,7 @@
|
||||||
"@mobily/ts-belt": "v4.0.0-rc.5",
|
"@mobily/ts-belt": "v4.0.0-rc.5",
|
||||||
"@sentry/browser": "^10.47.0",
|
"@sentry/browser": "^10.47.0",
|
||||||
"a11y-dialog": "^8.1.5",
|
"a11y-dialog": "^8.1.5",
|
||||||
"effect": "^4.0.0-beta.46",
|
"effect": "^4.0.0-beta.49",
|
||||||
"lit-html": "^3.3.2",
|
"lit-html": "^3.3.2",
|
||||||
"purify-ts": "2.1.2",
|
"purify-ts": "2.1.2",
|
||||||
"ts-pattern": "^5.9.0",
|
"ts-pattern": "^5.9.0",
|
||||||
|
|
@ -26,34 +26,34 @@
|
||||||
"@vitejs/plugin-legacy": "^8.0.1",
|
"@vitejs/plugin-legacy": "^8.0.1",
|
||||||
"better-typescript-lib": "^2.12.0",
|
"better-typescript-lib": "^2.12.0",
|
||||||
"browserslist": "^4.28.2",
|
"browserslist": "^4.28.2",
|
||||||
"caniuse-lite": "^1.0.30001787",
|
"caniuse-lite": "^1.0.30001788",
|
||||||
"eslint": "^10.2.0",
|
"eslint": "^10.2.0",
|
||||||
"eslint-plugin-functional": "^9.0.4",
|
"eslint-plugin-functional": "^9.0.4",
|
||||||
"eslint-plugin-jsx-a11y": "^6.10.2",
|
"eslint-plugin-jsx-a11y": "^6.10.2",
|
||||||
"eslint-plugin-oxlint": "^1.59.0",
|
"eslint-plugin-oxlint": "^1.60.0",
|
||||||
"eslint-plugin-perfectionist": "^5.8.0",
|
"eslint-plugin-perfectionist": "^5.8.0",
|
||||||
"eslint-plugin-sonarjs": "^4.0.2",
|
"eslint-plugin-sonarjs": "^4.0.2",
|
||||||
"fdir": "^6.5.0",
|
"fdir": "^6.5.0",
|
||||||
"globals": "^17.4.0",
|
"globals": "^17.5.0",
|
||||||
"jiti": "^2.6.1",
|
"jiti": "^2.6.1",
|
||||||
"knip": "^6.3.1",
|
"knip": "^6.4.1",
|
||||||
"lightningcss": "^1.32.0",
|
"lightningcss": "^1.32.0",
|
||||||
"lightningcss-cli": "^1.32.0",
|
"lightningcss-cli": "^1.32.0",
|
||||||
"oxlint": "^1.59.0",
|
"oxlint": "^1.60.0",
|
||||||
"oxlint-tsgolint": "^0.20.0",
|
"oxlint-tsgolint": "^0.21.0",
|
||||||
"playwright": "^1.59.1",
|
"playwright": "^1.59.1",
|
||||||
"prettier": "^3.8.1",
|
"prettier": "^3.8.3",
|
||||||
"prettier-plugin-pkg": "^0.22.1",
|
"prettier-plugin-pkg": "^0.22.1",
|
||||||
"prettier-plugin-sh": "^0.18.1",
|
"prettier-plugin-sh": "^0.18.1",
|
||||||
"sass-embedded": "^1.99.0",
|
"sass-embedded": "^1.99.0",
|
||||||
"stylelint": "^17.6.0",
|
"stylelint": "^17.7.0",
|
||||||
"stylelint-config-clean-order": "^8.0.1",
|
"stylelint-config-clean-order": "^8.0.1",
|
||||||
"stylelint-config-sass-guidelines": "^13.0.0",
|
"stylelint-config-sass-guidelines": "^13.0.0",
|
||||||
"stylelint-config-standard-scss": "^17.0.0",
|
"stylelint-config-standard-scss": "^17.0.0",
|
||||||
"stylelint-declaration-block-no-ignored-properties": "^3.0.0",
|
"stylelint-declaration-block-no-ignored-properties": "^3.0.0",
|
||||||
"stylelint-plugin-logical-css": "^2.1.0",
|
"stylelint-plugin-logical-css": "^2.1.0",
|
||||||
"typescript": "6.0.2",
|
"typescript": "6.0.2",
|
||||||
"typescript-eslint": "^8.58.1",
|
"typescript-eslint": "^8.58.2",
|
||||||
"vite": "^8.0.8",
|
"vite": "^8.0.8",
|
||||||
"vite-tsconfig-paths": "^6.1.1",
|
"vite-tsconfig-paths": "^6.1.1",
|
||||||
},
|
},
|
||||||
|
|
@ -428,55 +428,55 @@
|
||||||
|
|
||||||
"@oxc-resolver/binding-win32-x64-msvc": ["@oxc-resolver/binding-win32-x64-msvc@11.19.1", "", { "os": "win32", "cpu": "x64" }, "sha512-6hIU3RQu45B+VNTY4Ru8ppFwjVS/S5qwYyGhBotmjxfEKk41I2DlGtRfGJndZ5+6lneE2pwloqunlOyZuX/XAw=="],
|
"@oxc-resolver/binding-win32-x64-msvc": ["@oxc-resolver/binding-win32-x64-msvc@11.19.1", "", { "os": "win32", "cpu": "x64" }, "sha512-6hIU3RQu45B+VNTY4Ru8ppFwjVS/S5qwYyGhBotmjxfEKk41I2DlGtRfGJndZ5+6lneE2pwloqunlOyZuX/XAw=="],
|
||||||
|
|
||||||
"@oxlint-tsgolint/darwin-arm64": ["@oxlint-tsgolint/darwin-arm64@0.20.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-KKQcIHZHMxqpHUA1VXIbOG6chNCFkUWbQy6M+AFVtPKkA/3xAeJkJ3njoV66bfzwPHRcWQO+kcj5XqtbkjakoA=="],
|
"@oxlint-tsgolint/darwin-arm64": ["@oxlint-tsgolint/darwin-arm64@0.21.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-P20j3MLqfwIT+94qGU3htC7dWp4pXGZW1p1p7FRUzu1aopq7c9nPCgf0W/WjktqQ57+iuTq9mbSlwWinl6+H1A=="],
|
||||||
|
|
||||||
"@oxlint-tsgolint/darwin-x64": ["@oxlint-tsgolint/darwin-x64@0.20.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-7HeVMuclGfG+NLZi2ybY0T4fMI7/XxO/208rJk+zEIloKkVnlh11Wd241JMGwgNFXn+MLJbOqOfojDb2Dt4L1g=="],
|
"@oxlint-tsgolint/darwin-x64": ["@oxlint-tsgolint/darwin-x64@0.21.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-81TmmuBcPedEA0MwRmObuQuXnCprS1UiHQWGe7pseqNAJzUWXeAPrayqKTACX92VpruJI+yvY0XJrFp11PpcTA=="],
|
||||||
|
|
||||||
"@oxlint-tsgolint/linux-arm64": ["@oxlint-tsgolint/linux-arm64@0.20.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-zxhUwz+WSxE6oWlZLK2z2ps9yC6ebmgoYmjAl0Oa48+GqkZ56NVgo+wb8DURNv6xrggzHStQxqQxe3mK51HZag=="],
|
"@oxlint-tsgolint/linux-arm64": ["@oxlint-tsgolint/linux-arm64@0.21.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-sbjBr6zDduX8rNO0PTjhf7VYLCPWqdijWiMPp8e10qu6Tam1GdaVLaLlX8QrNupTgglO1GvqqgY/jcacWL8a6g=="],
|
||||||
|
|
||||||
"@oxlint-tsgolint/linux-x64": ["@oxlint-tsgolint/linux-x64@0.20.0", "", { "os": "linux", "cpu": "x64" }, "sha512-/1l6FnahC9im8PK+Ekkx/V3yetO/PzZnJegE2FXcv/iXEhbeVxP/ouiTYcUQu9shT1FWJCSNti1VJHH+21Y1dg=="],
|
"@oxlint-tsgolint/linux-x64": ["@oxlint-tsgolint/linux-x64@0.21.0", "", { "os": "linux", "cpu": "x64" }, "sha512-jNrOcy53R5TJQfrK444Cm60bW9437xDoxPbm3AdvFSo/fhdFMllawc7uZC2Wzr+EAjTkW13K8R4QHzsUdBG9fQ=="],
|
||||||
|
|
||||||
"@oxlint-tsgolint/win32-arm64": ["@oxlint-tsgolint/win32-arm64@0.20.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-oPZ5Yz8sVdo7P/5q+i3IKeix31eFZ55JAPa1+RGPoe9PoaYVsdMvR6Jvib6YtrqoJnFPlg3fjEjlEPL8VBKYJA=="],
|
"@oxlint-tsgolint/win32-arm64": ["@oxlint-tsgolint/win32-arm64@0.21.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-xWeRxJJILDE4b9UqHEWGBxcBc1TUS6zWHhxcyxTZMwf4q3wdKeu0OHYAcwLGJzoSjEIf6FTjyfPiRNil2oqsdg=="],
|
||||||
|
|
||||||
"@oxlint-tsgolint/win32-x64": ["@oxlint-tsgolint/win32-x64@0.20.0", "", { "os": "win32", "cpu": "x64" }, "sha512-4stx8RHj3SP9vQyRF/yZbz5igtPvYMEUR8CUoha4BVNZihi39DpCR8qkU7lpjB5Ga1DRMo2pHaA4bdTOMaY4mw=="],
|
"@oxlint-tsgolint/win32-x64": ["@oxlint-tsgolint/win32-x64@0.21.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Ob9AA9teI8ckPo1whV1smLr5NrqwgBv/8boDbK0YZG+fKgNGRwr1hBj1ORgFWOQaUBv+5njp5A0RAfJJjQ95QQ=="],
|
||||||
|
|
||||||
"@oxlint/binding-android-arm-eabi": ["@oxlint/binding-android-arm-eabi@1.59.0", "", { "os": "android", "cpu": "arm" }, "sha512-etYDw/UaEv936AQUd/CRMBVd+e+XuuU6wC+VzOv1STvsTyZenLChepLWqLtnyTTp4YMlM22ypzogDDwqYxv5cg=="],
|
"@oxlint/binding-android-arm-eabi": ["@oxlint/binding-android-arm-eabi@1.60.0", "", { "os": "android", "cpu": "arm" }, "sha512-YdeJKaZckDQL1qa62a1aKq/goyq48aX3yOxaaWqWb4sau4Ee4IiLbamftNLU3zbePky6QsDj6thnSSzHRBjDfA=="],
|
||||||
|
|
||||||
"@oxlint/binding-android-arm64": ["@oxlint/binding-android-arm64@1.59.0", "", { "os": "android", "cpu": "arm64" }, "sha512-TgLc7XVLKH2a4h8j3vn1MDjfK33i9MY60f/bKhRGWyVzbk5LCZ4X01VZG7iHrMmi5vYbAp8//Ponigx03CLsdw=="],
|
"@oxlint/binding-android-arm64": ["@oxlint/binding-android-arm64@1.60.0", "", { "os": "android", "cpu": "arm64" }, "sha512-7ANS7PpXCfq84xZQ8E5WPs14gwcuPcl+/8TFNXfpSu0CQBXz3cUo2fDpHT8v8HJN+Ut02eacvMAzTnc9s6X4tw=="],
|
||||||
|
|
||||||
"@oxlint/binding-darwin-arm64": ["@oxlint/binding-darwin-arm64@1.59.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-DXyFPf5ZKldMLloRHx/B9fsxsiTQomaw7cmEW3YIJko2HgCh+GUhp9gGYwHrqlLJPsEe3dYj9JebjX92D3j3AA=="],
|
"@oxlint/binding-darwin-arm64": ["@oxlint/binding-darwin-arm64@1.60.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-pJsgd9AfplLGBm1fIr25V6V14vMrayhx4uIQvlfH7jWs2SZwSrvi3TfgfJySB8T+hvyEH8K2zXljQiUnkgUnfQ=="],
|
||||||
|
|
||||||
"@oxlint/binding-darwin-x64": ["@oxlint/binding-darwin-x64@1.59.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-LgvrsdgVLX1qWqIEmNsSmMXJhpAWdtUQ0M+oR0CySwi+9IHWyOGuIL8w8+u/kbZNMyZr4WUyYB5i0+D+AKgkLg=="],
|
"@oxlint/binding-darwin-x64": ["@oxlint/binding-darwin-x64@1.60.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-Ue1aXHX49ivwflKqGJc7zcd/LeLgbhaTcDCQStgx5x06AXgjEAZmvrlMuIkWd4AL4FHQe6QJ9f33z04Cg448VQ=="],
|
||||||
|
|
||||||
"@oxlint/binding-freebsd-x64": ["@oxlint/binding-freebsd-x64@1.59.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-bOJhqX/ny4hrFuTPlyk8foSRx/vLRpxJh0jOOKN2NWW6FScXHPAA5rQbrwdQPcgGB5V8Ua51RS03fke8ssBcug=="],
|
"@oxlint/binding-freebsd-x64": ["@oxlint/binding-freebsd-x64@1.60.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-YCyQzsQtusQw+gNRW9rRTifSO+Dt/+dtCl2NHoDMZqJlRTEZ/Oht9YnuporI9yiTx7+cB+eqzX3MtHHVHGIWhg=="],
|
||||||
|
|
||||||
"@oxlint/binding-linux-arm-gnueabihf": ["@oxlint/binding-linux-arm-gnueabihf@1.59.0", "", { "os": "linux", "cpu": "arm" }, "sha512-vVUXxYMF9trXCsz4m9H6U0IjehosVHxBzVgJUxly1uz4W1PdDyicaBnpC0KRXsHYretLVe+uS9pJy8iM57Kujw=="],
|
"@oxlint/binding-linux-arm-gnueabihf": ["@oxlint/binding-linux-arm-gnueabihf@1.60.0", "", { "os": "linux", "cpu": "arm" }, "sha512-c7dxM2Zksa45Qw16i2iGY3Fti2NirJ38FrsBsKw+qcJ0OtqTsBgKJLF0xV+yLG56UH01Z8WRPgsw31e0MoRoGQ=="],
|
||||||
|
|
||||||
"@oxlint/binding-linux-arm-musleabihf": ["@oxlint/binding-linux-arm-musleabihf@1.59.0", "", { "os": "linux", "cpu": "arm" }, "sha512-TULQW8YBPGRWg5yZpFPL54HLOnJ3/HiX6VenDPi6YfxB/jlItwSMFh3/hCeSNbh+DAMaE1Py0j5MOaivHkI/9Q=="],
|
"@oxlint/binding-linux-arm-musleabihf": ["@oxlint/binding-linux-arm-musleabihf@1.60.0", "", { "os": "linux", "cpu": "arm" }, "sha512-ZWALoA42UYqBEP1Tbw9OWURgFGS1nWj2AAvLdY6ZcGx/Gj93qVCBKjcvwXMupZibYwFbi9s/rzqkZseb/6gVtQ=="],
|
||||||
|
|
||||||
"@oxlint/binding-linux-arm64-gnu": ["@oxlint/binding-linux-arm64-gnu@1.59.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-Gt54Y4eqSgYJ90xipm24xeyaPV854706o/kiT8oZvUt3VDY7qqxdqyGqchMaujd87ib+/MXvnl9WkK8Cc1BExg=="],
|
"@oxlint/binding-linux-arm64-gnu": ["@oxlint/binding-linux-arm64-gnu@1.60.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-tpy+1w4p9hN5CicMCxqNy6ymfRtV5ayE573vFNjp1k1TN/qhLFgflveZoE/0++RlkHikBz2vY545NWm/hp7big=="],
|
||||||
|
|
||||||
"@oxlint/binding-linux-arm64-musl": ["@oxlint/binding-linux-arm64-musl@1.59.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-3CtsKp7NFB3OfqQzbuAecrY7GIZeiv7AD+xutU4tefVQzlfmTI7/ygWLrvkzsDEjTlMq41rYHxgsn6Yh8tybmA=="],
|
"@oxlint/binding-linux-arm64-musl": ["@oxlint/binding-linux-arm64-musl@1.60.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-eDYDXZGhQAXyn6GwtwiX/qcLS0HlOLPJ/+iiIY8RYr+3P8oKBmgKxADLlniL6FtWfE7pPk7IGN9/xvDEvDvFeg=="],
|
||||||
|
|
||||||
"@oxlint/binding-linux-ppc64-gnu": ["@oxlint/binding-linux-ppc64-gnu@1.59.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-K0diOpT3ncDmOfl9I1HuvpEsAuTxkts0VYwIv/w6Xiy9CdwyPBVX88Ga9l8VlGgMrwBMnSY4xIvVlVY/fkQk7Q=="],
|
"@oxlint/binding-linux-ppc64-gnu": ["@oxlint/binding-linux-ppc64-gnu@1.60.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-nxehly5XYBHUWI9VJX1bqCf9j/B43DaK/aS/T1fcxCpX3PA4Rm9BB54nPD1CKayT8xg6REN1ao+01hSRNgy8OA=="],
|
||||||
|
|
||||||
"@oxlint/binding-linux-riscv64-gnu": ["@oxlint/binding-linux-riscv64-gnu@1.59.0", "", { "os": "linux", "cpu": "none" }, "sha512-xAU7+QDU6kTJJ7mJLOGgo7oOjtAtkKyFZ0Yjdb5cEo3DiCCPFLvyr08rWiQh6evZ7RiUTf+o65NY/bqttzJiQQ=="],
|
"@oxlint/binding-linux-riscv64-gnu": ["@oxlint/binding-linux-riscv64-gnu@1.60.0", "", { "os": "linux", "cpu": "none" }, "sha512-j1qf/NaUfOWQutjeoooNG1Q0zsK0XGmSu1uDLq3cctquRF3j7t9Hxqf/76ehCc5GEUAanth2W4Fa+XT1RFg/nw=="],
|
||||||
|
|
||||||
"@oxlint/binding-linux-riscv64-musl": ["@oxlint/binding-linux-riscv64-musl@1.59.0", "", { "os": "linux", "cpu": "none" }, "sha512-KUmZmKlTTyauOnvUNVxK7G40sSSx0+w5l1UhaGsC6KPpOYHenx2oqJTnabmpLJicok7IC+3Y6fXAUOMyexaeJQ=="],
|
"@oxlint/binding-linux-riscv64-musl": ["@oxlint/binding-linux-riscv64-musl@1.60.0", "", { "os": "linux", "cpu": "none" }, "sha512-YELKPRefQ/q/h3RUmeRfPCUhh2wBvgV1RyZ/F9M9u8cDyXsQW2ojv1DeWQTt466yczDITjZnIOg/s05pk7Ve2A=="],
|
||||||
|
|
||||||
"@oxlint/binding-linux-s390x-gnu": ["@oxlint/binding-linux-s390x-gnu@1.59.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-4usRxC8gS0PGdkHnRmwJt/4zrQNZyk6vL0trCxwZSsAKM+OxhB8nKiR+mhjdBbl8lbMh2gc3bZpNN/ik8c4c2A=="],
|
"@oxlint/binding-linux-s390x-gnu": ["@oxlint/binding-linux-s390x-gnu@1.60.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-JkO3C6Gki7Y6h/MiIkFKvHFOz98/YWvQ4WYbK9DLXACMP2rjULzkeGyAzorJE5S1dzLQGFgeqvN779kSFwoV1g=="],
|
||||||
|
|
||||||
"@oxlint/binding-linux-x64-gnu": ["@oxlint/binding-linux-x64-gnu@1.59.0", "", { "os": "linux", "cpu": "x64" }, "sha512-s/rNE2gDmbwAOOP493xk2X7M8LZfI1LJFSSW1+yanz3vuQCFPiHkx4GY+O1HuLUDtkzGlhtMrIcxxzyYLv308w=="],
|
"@oxlint/binding-linux-x64-gnu": ["@oxlint/binding-linux-x64-gnu@1.60.0", "", { "os": "linux", "cpu": "x64" }, "sha512-XjKHdFVCpZZZSWBCKyyqCq65s2AKXykMXkjLoKYODrD+f5toLhlwsMESscu8FbgnJQ4Y/dpR/zdazsahmgBJIA=="],
|
||||||
|
|
||||||
"@oxlint/binding-linux-x64-musl": ["@oxlint/binding-linux-x64-musl@1.59.0", "", { "os": "linux", "cpu": "x64" }, "sha512-+yYj1udJa2UvvIUmEm0IcKgc0UlPMgz0nsSTvkPL2y6n0uU5LgIHSwVu4AHhrve6j9BpVSoRksnz8c9QcvITJA=="],
|
"@oxlint/binding-linux-x64-musl": ["@oxlint/binding-linux-x64-musl@1.60.0", "", { "os": "linux", "cpu": "x64" }, "sha512-js29ZWIuPhNWzY8NC7KoffEMEeWG105vbmm+8EOJsC+T/jHBiKIJEUF78+F/IrgEWMMP9N0kRND4Pp75+xAhKg=="],
|
||||||
|
|
||||||
"@oxlint/binding-openharmony-arm64": ["@oxlint/binding-openharmony-arm64@1.59.0", "", { "os": "none", "cpu": "arm64" }, "sha512-bUplUb48LYsB3hHlQXP2ZMOenpieWoOyppLAnnAhuPag3MGPnt+7caxE3w/Vl9wpQsTA3gzLntQi9rxWrs7Xqg=="],
|
"@oxlint/binding-openharmony-arm64": ["@oxlint/binding-openharmony-arm64@1.60.0", "", { "os": "none", "cpu": "arm64" }, "sha512-H+PUITKHk04stFpWj3x3Kg08Afp/bcXSBi0EhasR5a0Vw7StXHTzdl655PUI0fB4qdh2Wsu6Dsi+3ACxPoyQnA=="],
|
||||||
|
|
||||||
"@oxlint/binding-win32-arm64-msvc": ["@oxlint/binding-win32-arm64-msvc@1.59.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-/HLsLuz42rWl7h7ePdmMTpHm2HIDmPtcEMYgm5BBEHiEiuNOrzMaUpd2z7UnNni5LGN9obJy2YoAYBLXQwazrA=="],
|
"@oxlint/binding-win32-arm64-msvc": ["@oxlint/binding-win32-arm64-msvc@1.60.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-WA/yc7f7ZfCefBXVzNHn1Ztulb1EFwNBb4jMZ6pjML0zz6pHujlF3Q3jySluz3XHl/GNeMTntG1seUBWVMlMag=="],
|
||||||
|
|
||||||
"@oxlint/binding-win32-ia32-msvc": ["@oxlint/binding-win32-ia32-msvc@1.59.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-rUPy+JnanpPwV/aJCPnxAD1fW50+XPI0VkWr7f0vEbqcdsS8NpB24Rw6RsS7SdpFv8Dw+8ugCwao5nCFbqOUSg=="],
|
"@oxlint/binding-win32-ia32-msvc": ["@oxlint/binding-win32-ia32-msvc@1.60.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-33YxL1sqwYNZXtn3MD/4dno6s0xeedXOJlT1WohkVD565WvohClZUr7vwKdAk954n4xiEWJkewiCr+zLeq7AeA=="],
|
||||||
|
|
||||||
"@oxlint/binding-win32-x64-msvc": ["@oxlint/binding-win32-x64-msvc@1.59.0", "", { "os": "win32", "cpu": "x64" }, "sha512-xkE7puteDS/vUyRngLXW0t8WgdWoS/tfxXjhP/P7SMqPDx+hs44SpssO3h3qmTqECYEuXBUPzcAw5257Ka+ofA=="],
|
"@oxlint/binding-win32-x64-msvc": ["@oxlint/binding-win32-x64-msvc@1.60.0", "", { "os": "win32", "cpu": "x64" }, "sha512-JOro4ZcfBLamJCyfURQmOQByoorgOdx3ZjAkSqnb/CyG/i+lN3KoV5LAgk5ZAW6DPq7/Cx7n23f8DuTWXTWgyQ=="],
|
||||||
|
|
||||||
"@parcel/watcher": ["@parcel/watcher@2.5.6", "", { "dependencies": { "detect-libc": "^2.0.3", "is-glob": "^4.0.3", "node-addon-api": "^7.0.0", "picomatch": "^4.0.3" }, "optionalDependencies": { "@parcel/watcher-android-arm64": "2.5.6", "@parcel/watcher-darwin-arm64": "2.5.6", "@parcel/watcher-darwin-x64": "2.5.6", "@parcel/watcher-freebsd-x64": "2.5.6", "@parcel/watcher-linux-arm-glibc": "2.5.6", "@parcel/watcher-linux-arm-musl": "2.5.6", "@parcel/watcher-linux-arm64-glibc": "2.5.6", "@parcel/watcher-linux-arm64-musl": "2.5.6", "@parcel/watcher-linux-x64-glibc": "2.5.6", "@parcel/watcher-linux-x64-musl": "2.5.6", "@parcel/watcher-win32-arm64": "2.5.6", "@parcel/watcher-win32-ia32": "2.5.6", "@parcel/watcher-win32-x64": "2.5.6" } }, "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ=="],
|
"@parcel/watcher": ["@parcel/watcher@2.5.6", "", { "dependencies": { "detect-libc": "^2.0.3", "is-glob": "^4.0.3", "node-addon-api": "^7.0.0", "picomatch": "^4.0.3" }, "optionalDependencies": { "@parcel/watcher-android-arm64": "2.5.6", "@parcel/watcher-darwin-arm64": "2.5.6", "@parcel/watcher-darwin-x64": "2.5.6", "@parcel/watcher-freebsd-x64": "2.5.6", "@parcel/watcher-linux-arm-glibc": "2.5.6", "@parcel/watcher-linux-arm-musl": "2.5.6", "@parcel/watcher-linux-arm64-glibc": "2.5.6", "@parcel/watcher-linux-arm64-musl": "2.5.6", "@parcel/watcher-linux-x64-glibc": "2.5.6", "@parcel/watcher-linux-x64-musl": "2.5.6", "@parcel/watcher-win32-arm64": "2.5.6", "@parcel/watcher-win32-ia32": "2.5.6", "@parcel/watcher-win32-x64": "2.5.6" } }, "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ=="],
|
||||||
|
|
||||||
|
|
@ -586,25 +586,25 @@
|
||||||
|
|
||||||
"@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="],
|
"@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="],
|
||||||
|
|
||||||
"@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.58.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.58.1", "@typescript-eslint/type-utils": "8.58.1", "@typescript-eslint/utils": "8.58.1", "@typescript-eslint/visitor-keys": "8.58.1", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.58.1", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-eSkwoemjo76bdXl2MYqtxg51HNwUSkWfODUOQ3PaTLZGh9uIWWFZIjyjaJnex7wXDu+TRx+ATsnSxdN9YWfRTQ=="],
|
"@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.58.2", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.58.2", "@typescript-eslint/type-utils": "8.58.2", "@typescript-eslint/utils": "8.58.2", "@typescript-eslint/visitor-keys": "8.58.2", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.58.2", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-aC2qc5thQahutKjP+cl8cgN9DWe3ZUqVko30CMSZHnFEHyhOYoZSzkGtAI2mcwZ38xeImDucI4dnqsHiOYuuCw=="],
|
||||||
|
|
||||||
"@typescript-eslint/parser": ["@typescript-eslint/parser@8.58.1", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.58.1", "@typescript-eslint/types": "8.58.1", "@typescript-eslint/typescript-estree": "8.58.1", "@typescript-eslint/visitor-keys": "8.58.1", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-gGkiNMPqerb2cJSVcruigx9eHBlLG14fSdPdqMoOcBfh+vvn4iCq2C8MzUB89PrxOXk0y3GZ1yIWb9aOzL93bw=="],
|
"@typescript-eslint/parser": ["@typescript-eslint/parser@8.58.2", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.58.2", "@typescript-eslint/types": "8.58.2", "@typescript-eslint/typescript-estree": "8.58.2", "@typescript-eslint/visitor-keys": "8.58.2", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-/Zb/xaIDfxeJnvishjGdcR4jmr7S+bda8PKNhRGdljDM+elXhlvN0FyPSsMnLmJUrVG9aPO6dof80wjMawsASg=="],
|
||||||
|
|
||||||
"@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.58.1", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.58.1", "@typescript-eslint/types": "^8.58.1", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-gfQ8fk6cxhtptek+/8ZIqw8YrRW5048Gug8Ts5IYcMLCw18iUgrZAEY/D7s4hkI0FxEfGakKuPK/XUMPzPxi5g=="],
|
"@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.58.2", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.58.2", "@typescript-eslint/types": "^8.58.2", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-Cq6UfpZZk15+r87BkIh5rDpi38W4b+Sjnb8wQCPPDDweS/LRCFjCyViEbzHk5Ck3f2QDfgmlxqSa7S7clDtlfg=="],
|
||||||
|
|
||||||
"@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.58.1", "", { "dependencies": { "@typescript-eslint/types": "8.58.1", "@typescript-eslint/visitor-keys": "8.58.1" } }, "sha512-TPYUEqJK6avLcEjumWsIuTpuYODTTDAtoMdt8ZZa93uWMTX13Nb8L5leSje1NluammvU+oI3QRr5lLXPgihX3w=="],
|
"@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.58.1", "", { "dependencies": { "@typescript-eslint/types": "8.58.1", "@typescript-eslint/visitor-keys": "8.58.1" } }, "sha512-TPYUEqJK6avLcEjumWsIuTpuYODTTDAtoMdt8ZZa93uWMTX13Nb8L5leSje1NluammvU+oI3QRr5lLXPgihX3w=="],
|
||||||
|
|
||||||
"@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.58.1", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-JAr2hOIct2Q+qk3G+8YFfqkqi7sC86uNryT+2i5HzMa2MPjw4qNFvtjnw1IiA1rP7QhNKVe21mSSLaSjwA1Olw=="],
|
"@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.58.2", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-3SR+RukipDvkkKp/d0jP0dyzuls3DbGmwDpVEc5wqk5f38KFThakqAAO0XMirWAE+kT00oTauTbzMFGPoAzB0A=="],
|
||||||
|
|
||||||
"@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.58.1", "", { "dependencies": { "@typescript-eslint/types": "8.58.1", "@typescript-eslint/typescript-estree": "8.58.1", "@typescript-eslint/utils": "8.58.1", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-HUFxvTJVroT+0rXVJC7eD5zol6ID+Sn5npVPWoFuHGg9Ncq5Q4EYstqR+UOqaNRFXi5TYkpXXkLhoCHe3G0+7w=="],
|
"@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.58.1", "", { "dependencies": { "@typescript-eslint/types": "8.58.1", "@typescript-eslint/typescript-estree": "8.58.1", "@typescript-eslint/utils": "8.58.1", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-HUFxvTJVroT+0rXVJC7eD5zol6ID+Sn5npVPWoFuHGg9Ncq5Q4EYstqR+UOqaNRFXi5TYkpXXkLhoCHe3G0+7w=="],
|
||||||
|
|
||||||
"@typescript-eslint/types": ["@typescript-eslint/types@8.58.1", "", {}, "sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw=="],
|
"@typescript-eslint/types": ["@typescript-eslint/types@8.58.1", "", {}, "sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw=="],
|
||||||
|
|
||||||
"@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.58.1", "", { "dependencies": { "@typescript-eslint/project-service": "8.58.1", "@typescript-eslint/tsconfig-utils": "8.58.1", "@typescript-eslint/types": "8.58.1", "@typescript-eslint/visitor-keys": "8.58.1", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-w4w7WR7GHOjqqPnvAYbazq+Y5oS68b9CzasGtnd6jIeOIeKUzYzupGTB2T4LTPSv4d+WPeccbxuneTFHYgAAWg=="],
|
"@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.58.2", "", { "dependencies": { "@typescript-eslint/project-service": "8.58.2", "@typescript-eslint/tsconfig-utils": "8.58.2", "@typescript-eslint/types": "8.58.2", "@typescript-eslint/visitor-keys": "8.58.2", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-ELGuoofuhhoCvNbQjFFiobFcGgcDCEm0ThWdmO4Z0UzLqPXS3KFvnEZ+SHewwOYHjM09tkzOWXNTv9u6Gqtyuw=="],
|
||||||
|
|
||||||
"@typescript-eslint/utils": ["@typescript-eslint/utils@8.58.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.58.1", "@typescript-eslint/types": "8.58.1", "@typescript-eslint/typescript-estree": "8.58.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-Ln8R0tmWC7pTtLOzgJzYTXSCjJ9rDNHAqTaVONF4FEi2qwce8mD9iSOxOpLFFvWp/wBFlew0mjM1L1ihYWfBdQ=="],
|
"@typescript-eslint/utils": ["@typescript-eslint/utils@8.58.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.58.1", "@typescript-eslint/types": "8.58.1", "@typescript-eslint/typescript-estree": "8.58.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-Ln8R0tmWC7pTtLOzgJzYTXSCjJ9rDNHAqTaVONF4FEi2qwce8mD9iSOxOpLFFvWp/wBFlew0mjM1L1ihYWfBdQ=="],
|
||||||
|
|
||||||
"@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.58.1", "", { "dependencies": { "@typescript-eslint/types": "8.58.1", "eslint-visitor-keys": "^5.0.0" } }, "sha512-y+vH7QE8ycjoa0bWciFg7OpFcipUuem1ujhrdLtq1gByKwfbC7bPeKsiny9e0urg93DqwGcHey+bGRKCnF1nZQ=="],
|
"@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.58.2", "", { "dependencies": { "@typescript-eslint/types": "8.58.2", "eslint-visitor-keys": "^5.0.0" } }, "sha512-f1WO2Lx8a9t8DARmcWAUPJbu0G20bJlj8L4z72K00TMeJAoyLr/tHhI/pzYBLrR4dXWkcxO1cWYZEOX8DKHTqA=="],
|
||||||
|
|
||||||
"@typescript/lib-decorators": ["@better-typescript-lib/decorators@2.12.0", "", { "peerDependencies": { "typescript": ">=4.5.2" } }, "sha512-/m9Q5Xk66ThUJidTsxmXJH0+49iCLl5PFmue0HkNSGrcPU96oaoKNY5sH1AslwA/OWVvBg3hE58ZwSGm6TQFuQ=="],
|
"@typescript/lib-decorators": ["@better-typescript-lib/decorators@2.12.0", "", { "peerDependencies": { "typescript": ">=4.5.2" } }, "sha512-/m9Q5Xk66ThUJidTsxmXJH0+49iCLl5PFmue0HkNSGrcPU96oaoKNY5sH1AslwA/OWVvBg3hE58ZwSGm6TQFuQ=="],
|
||||||
|
|
||||||
|
|
@ -726,7 +726,7 @@
|
||||||
|
|
||||||
"callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="],
|
"callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="],
|
||||||
|
|
||||||
"caniuse-lite": ["caniuse-lite@1.0.30001787", "", {}, "sha512-mNcrMN9KeI68u7muanUpEejSLghOKlVhRqS/Za2IeyGllJ9I9otGpR9g3nsw7n4W378TE/LyIteA0+/FOZm4Kg=="],
|
"caniuse-lite": ["caniuse-lite@1.0.30001788", "", {}, "sha512-6q8HFp+lOQtcf7wBK+uEenxymVWkGKkjFpCvw5W25cmMwEDU45p1xQFBQv8JDlMMry7eNxyBaR+qxgmTUZkIRQ=="],
|
||||||
|
|
||||||
"change-case": ["change-case@5.4.4", "", {}, "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w=="],
|
"change-case": ["change-case@5.4.4", "", {}, "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w=="],
|
||||||
|
|
||||||
|
|
@ -796,7 +796,7 @@
|
||||||
|
|
||||||
"dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="],
|
"dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="],
|
||||||
|
|
||||||
"effect": ["effect@4.0.0-beta.46", "", { "dependencies": { "@standard-schema/spec": "^1.1.0", "fast-check": "^4.5.3", "find-my-way-ts": "^0.1.6", "ini": "^6.0.0", "kubernetes-types": "^1.30.0", "msgpackr": "^1.11.8", "multipasta": "^0.2.7", "toml": "^3.0.0", "uuid": "^13.0.0", "yaml": "^2.8.2" } }, "sha512-3f6gXvvUMtEueCRY0tU76Vq2Pej1SAwwE+s0Owd5nD53yS5n4RZhUA1rlCGFuSbQFA225pGy8vO72+lpvu7u5A=="],
|
"effect": ["effect@4.0.0-beta.49", "", { "dependencies": { "@standard-schema/spec": "^1.1.0", "fast-check": "^4.6.0", "find-my-way-ts": "^0.1.6", "ini": "^6.0.0", "kubernetes-types": "^1.30.0", "msgpackr": "^1.11.9", "multipasta": "^0.2.7", "toml": "^4.1.1", "uuid": "^13.0.0", "yaml": "^2.8.3" } }, "sha512-4+mx856l4zxJJ+ybVNamqjAAinYsTNDVGZ5H3kstqKhDxCBW7sK/mZTtHuI7azt5AXEKX2ZXsi3EPAQVnkZk0w=="],
|
||||||
|
|
||||||
"electron-to-chromium": ["electron-to-chromium@1.5.334", "", {}, "sha512-mgjZAz7Jyx1SRCwEpy9wefDS7GvNPazLthHg8eQMJ76wBdGQQDW33TCrUTvQ4wzpmOrv2zrFoD3oNufMdyMpog=="],
|
"electron-to-chromium": ["electron-to-chromium@1.5.334", "", {}, "sha512-mgjZAz7Jyx1SRCwEpy9wefDS7GvNPazLthHg8eQMJ76wBdGQQDW33TCrUTvQ4wzpmOrv2zrFoD3oNufMdyMpog=="],
|
||||||
|
|
||||||
|
|
@ -838,7 +838,7 @@
|
||||||
|
|
||||||
"eslint-plugin-jsx-a11y": ["eslint-plugin-jsx-a11y@6.10.2", "", { "dependencies": { "aria-query": "^5.3.2", "array-includes": "^3.1.8", "array.prototype.flatmap": "^1.3.2", "ast-types-flow": "^0.0.8", "axe-core": "^4.10.0", "axobject-query": "^4.1.0", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", "hasown": "^2.0.2", "jsx-ast-utils": "^3.3.5", "language-tags": "^1.0.9", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "safe-regex-test": "^1.0.3", "string.prototype.includes": "^2.0.1" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" } }, "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q=="],
|
"eslint-plugin-jsx-a11y": ["eslint-plugin-jsx-a11y@6.10.2", "", { "dependencies": { "aria-query": "^5.3.2", "array-includes": "^3.1.8", "array.prototype.flatmap": "^1.3.2", "ast-types-flow": "^0.0.8", "axe-core": "^4.10.0", "axobject-query": "^4.1.0", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", "hasown": "^2.0.2", "jsx-ast-utils": "^3.3.5", "language-tags": "^1.0.9", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "safe-regex-test": "^1.0.3", "string.prototype.includes": "^2.0.1" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" } }, "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q=="],
|
||||||
|
|
||||||
"eslint-plugin-oxlint": ["eslint-plugin-oxlint@1.59.0", "", { "dependencies": { "jsonc-parser": "^3.3.1" }, "peerDependencies": { "oxlint": "~1.59.0" } }, "sha512-g0DR+xSsnUdyaMc2KAXvBVGWz5V4GwlAE1PM+ocKxl2Eg7YgOjkRLLbxgJ3bhYOhRLhD8F0X4DjJu2FSDvrvAg=="],
|
"eslint-plugin-oxlint": ["eslint-plugin-oxlint@1.60.0", "", { "dependencies": { "jsonc-parser": "^3.3.1" }, "peerDependencies": { "oxlint": "~1.60.0" } }, "sha512-9RUD23k7ablez1qg7JWnyPYPOlbucDDqaDr+qNUi0TbIQCPqIPCLzfllgqKF9lOxlg+l17H8hISErmarvm2J1w=="],
|
||||||
|
|
||||||
"eslint-plugin-perfectionist": ["eslint-plugin-perfectionist@5.8.0", "", { "dependencies": { "@typescript-eslint/utils": "^8.58.0", "natural-orderby": "^5.0.0" }, "peerDependencies": { "eslint": "^8.45.0 || ^9.0.0 || ^10.0.0" } }, "sha512-k8uIptWIxkUclonCFGyDzgYs9NI+Qh0a7cUXS3L7IYZDEsjXuimFBVbxXPQQngWqMiaxJRwbtYB4smMGMqF+cw=="],
|
"eslint-plugin-perfectionist": ["eslint-plugin-perfectionist@5.8.0", "", { "dependencies": { "@typescript-eslint/utils": "^8.58.0", "natural-orderby": "^5.0.0" }, "peerDependencies": { "eslint": "^8.45.0 || ^9.0.0 || ^10.0.0" } }, "sha512-k8uIptWIxkUclonCFGyDzgYs9NI+Qh0a7cUXS3L7IYZDEsjXuimFBVbxXPQQngWqMiaxJRwbtYB4smMGMqF+cw=="],
|
||||||
|
|
||||||
|
|
@ -930,7 +930,7 @@
|
||||||
|
|
||||||
"global-prefix": ["global-prefix@3.0.0", "", { "dependencies": { "ini": "^1.3.5", "kind-of": "^6.0.2", "which": "^1.3.1" } }, "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg=="],
|
"global-prefix": ["global-prefix@3.0.0", "", { "dependencies": { "ini": "^1.3.5", "kind-of": "^6.0.2", "which": "^1.3.1" } }, "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg=="],
|
||||||
|
|
||||||
"globals": ["globals@17.4.0", "", {}, "sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw=="],
|
"globals": ["globals@17.5.0", "", {}, "sha512-qoV+HK2yFl/366t2/Cb3+xxPUo5BuMynomoDmiaZBIdbs+0pYbjfZU+twLhGKp4uCZ/+NbtpVepH5bGCxRyy2g=="],
|
||||||
|
|
||||||
"globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="],
|
"globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="],
|
||||||
|
|
||||||
|
|
@ -1076,7 +1076,7 @@
|
||||||
|
|
||||||
"kind-of": ["kind-of@6.0.3", "", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="],
|
"kind-of": ["kind-of@6.0.3", "", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="],
|
||||||
|
|
||||||
"knip": ["knip@6.3.1", "", { "dependencies": { "@nodelib/fs.walk": "^1.2.3", "fast-glob": "^3.3.3", "formatly": "^0.3.0", "get-tsconfig": "4.13.7", "jiti": "^2.6.0", "minimist": "^1.2.8", "oxc-parser": "^0.121.0", "oxc-resolver": "^11.19.1", "picocolors": "^1.1.1", "picomatch": "^4.0.1", "smol-toml": "^1.6.1", "strip-json-comments": "5.0.3", "unbash": "^2.2.0", "yaml": "^2.8.2", "zod": "^4.1.11" }, "bin": { "knip": "bin/knip.js", "knip-bun": "bin/knip-bun.js" } }, "sha512-22kLJloVcOVOAudCxlFOC0ICAMme7dKsS7pVTEnrmyKGpswb8ieznvAiSKUeFVDJhb01ect6dkDc1Ha1g1sPpg=="],
|
"knip": ["knip@6.4.1", "", { "dependencies": { "@nodelib/fs.walk": "^1.2.3", "fast-glob": "^3.3.3", "formatly": "^0.3.0", "get-tsconfig": "4.13.7", "jiti": "^2.6.0", "minimist": "^1.2.8", "oxc-parser": "^0.121.0", "oxc-resolver": "^11.19.1", "picocolors": "^1.1.1", "picomatch": "^4.0.1", "smol-toml": "^1.6.1", "strip-json-comments": "5.0.3", "unbash": "^2.2.0", "yaml": "^2.8.2", "zod": "^4.1.11" }, "bin": { "knip": "bin/knip.js", "knip-bun": "bin/knip-bun.js" } }, "sha512-Ry+ywmDFSZvKp/jx7LxMgsZWRTs931alV84e60lh0Stf6kSRYqSIUTkviyyDFRcSO3yY1Kpbi83OirN+4lA2Xw=="],
|
||||||
|
|
||||||
"known-css-properties": ["known-css-properties@0.37.0", "", {}, "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ=="],
|
"known-css-properties": ["known-css-properties@0.37.0", "", {}, "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ=="],
|
||||||
|
|
||||||
|
|
@ -1256,9 +1256,9 @@
|
||||||
|
|
||||||
"oxc-resolver": ["oxc-resolver@11.19.1", "", { "optionalDependencies": { "@oxc-resolver/binding-android-arm-eabi": "11.19.1", "@oxc-resolver/binding-android-arm64": "11.19.1", "@oxc-resolver/binding-darwin-arm64": "11.19.1", "@oxc-resolver/binding-darwin-x64": "11.19.1", "@oxc-resolver/binding-freebsd-x64": "11.19.1", "@oxc-resolver/binding-linux-arm-gnueabihf": "11.19.1", "@oxc-resolver/binding-linux-arm-musleabihf": "11.19.1", "@oxc-resolver/binding-linux-arm64-gnu": "11.19.1", "@oxc-resolver/binding-linux-arm64-musl": "11.19.1", "@oxc-resolver/binding-linux-ppc64-gnu": "11.19.1", "@oxc-resolver/binding-linux-riscv64-gnu": "11.19.1", "@oxc-resolver/binding-linux-riscv64-musl": "11.19.1", "@oxc-resolver/binding-linux-s390x-gnu": "11.19.1", "@oxc-resolver/binding-linux-x64-gnu": "11.19.1", "@oxc-resolver/binding-linux-x64-musl": "11.19.1", "@oxc-resolver/binding-openharmony-arm64": "11.19.1", "@oxc-resolver/binding-wasm32-wasi": "11.19.1", "@oxc-resolver/binding-win32-arm64-msvc": "11.19.1", "@oxc-resolver/binding-win32-ia32-msvc": "11.19.1", "@oxc-resolver/binding-win32-x64-msvc": "11.19.1" } }, "sha512-qE/CIg/spwrTBFt5aKmwe3ifeDdLfA2NESN30E42X/lII5ClF8V7Wt6WIJhcGZjp0/Q+nQ+9vgxGk//xZNX2hg=="],
|
"oxc-resolver": ["oxc-resolver@11.19.1", "", { "optionalDependencies": { "@oxc-resolver/binding-android-arm-eabi": "11.19.1", "@oxc-resolver/binding-android-arm64": "11.19.1", "@oxc-resolver/binding-darwin-arm64": "11.19.1", "@oxc-resolver/binding-darwin-x64": "11.19.1", "@oxc-resolver/binding-freebsd-x64": "11.19.1", "@oxc-resolver/binding-linux-arm-gnueabihf": "11.19.1", "@oxc-resolver/binding-linux-arm-musleabihf": "11.19.1", "@oxc-resolver/binding-linux-arm64-gnu": "11.19.1", "@oxc-resolver/binding-linux-arm64-musl": "11.19.1", "@oxc-resolver/binding-linux-ppc64-gnu": "11.19.1", "@oxc-resolver/binding-linux-riscv64-gnu": "11.19.1", "@oxc-resolver/binding-linux-riscv64-musl": "11.19.1", "@oxc-resolver/binding-linux-s390x-gnu": "11.19.1", "@oxc-resolver/binding-linux-x64-gnu": "11.19.1", "@oxc-resolver/binding-linux-x64-musl": "11.19.1", "@oxc-resolver/binding-openharmony-arm64": "11.19.1", "@oxc-resolver/binding-wasm32-wasi": "11.19.1", "@oxc-resolver/binding-win32-arm64-msvc": "11.19.1", "@oxc-resolver/binding-win32-ia32-msvc": "11.19.1", "@oxc-resolver/binding-win32-x64-msvc": "11.19.1" } }, "sha512-qE/CIg/spwrTBFt5aKmwe3ifeDdLfA2NESN30E42X/lII5ClF8V7Wt6WIJhcGZjp0/Q+nQ+9vgxGk//xZNX2hg=="],
|
||||||
|
|
||||||
"oxlint": ["oxlint@1.59.0", "", { "optionalDependencies": { "@oxlint/binding-android-arm-eabi": "1.59.0", "@oxlint/binding-android-arm64": "1.59.0", "@oxlint/binding-darwin-arm64": "1.59.0", "@oxlint/binding-darwin-x64": "1.59.0", "@oxlint/binding-freebsd-x64": "1.59.0", "@oxlint/binding-linux-arm-gnueabihf": "1.59.0", "@oxlint/binding-linux-arm-musleabihf": "1.59.0", "@oxlint/binding-linux-arm64-gnu": "1.59.0", "@oxlint/binding-linux-arm64-musl": "1.59.0", "@oxlint/binding-linux-ppc64-gnu": "1.59.0", "@oxlint/binding-linux-riscv64-gnu": "1.59.0", "@oxlint/binding-linux-riscv64-musl": "1.59.0", "@oxlint/binding-linux-s390x-gnu": "1.59.0", "@oxlint/binding-linux-x64-gnu": "1.59.0", "@oxlint/binding-linux-x64-musl": "1.59.0", "@oxlint/binding-openharmony-arm64": "1.59.0", "@oxlint/binding-win32-arm64-msvc": "1.59.0", "@oxlint/binding-win32-ia32-msvc": "1.59.0", "@oxlint/binding-win32-x64-msvc": "1.59.0" }, "peerDependencies": { "oxlint-tsgolint": ">=0.18.0" }, "optionalPeers": ["oxlint-tsgolint"], "bin": { "oxlint": "bin/oxlint" } }, "sha512-0xBLeGGjP4vD9pygRo8iuOkOzEU1MqOnfiOl7KYezL/QvWL8NUg6n03zXc7ZVqltiOpUxBk2zgHI3PnRIEdAvw=="],
|
"oxlint": ["oxlint@1.60.0", "", { "optionalDependencies": { "@oxlint/binding-android-arm-eabi": "1.60.0", "@oxlint/binding-android-arm64": "1.60.0", "@oxlint/binding-darwin-arm64": "1.60.0", "@oxlint/binding-darwin-x64": "1.60.0", "@oxlint/binding-freebsd-x64": "1.60.0", "@oxlint/binding-linux-arm-gnueabihf": "1.60.0", "@oxlint/binding-linux-arm-musleabihf": "1.60.0", "@oxlint/binding-linux-arm64-gnu": "1.60.0", "@oxlint/binding-linux-arm64-musl": "1.60.0", "@oxlint/binding-linux-ppc64-gnu": "1.60.0", "@oxlint/binding-linux-riscv64-gnu": "1.60.0", "@oxlint/binding-linux-riscv64-musl": "1.60.0", "@oxlint/binding-linux-s390x-gnu": "1.60.0", "@oxlint/binding-linux-x64-gnu": "1.60.0", "@oxlint/binding-linux-x64-musl": "1.60.0", "@oxlint/binding-openharmony-arm64": "1.60.0", "@oxlint/binding-win32-arm64-msvc": "1.60.0", "@oxlint/binding-win32-ia32-msvc": "1.60.0", "@oxlint/binding-win32-x64-msvc": "1.60.0" }, "peerDependencies": { "oxlint-tsgolint": ">=0.18.0" }, "optionalPeers": ["oxlint-tsgolint"], "bin": { "oxlint": "bin/oxlint" } }, "sha512-tnRzTWiWJ9pg3ftRWnD0+Oqh78L6ZSwcEudvCZaER0PIqiAnNyXj5N1dPwjmNpDalkKS9m/WMLN1CTPUBPmsgw=="],
|
||||||
|
|
||||||
"oxlint-tsgolint": ["oxlint-tsgolint@0.20.0", "", { "optionalDependencies": { "@oxlint-tsgolint/darwin-arm64": "0.20.0", "@oxlint-tsgolint/darwin-x64": "0.20.0", "@oxlint-tsgolint/linux-arm64": "0.20.0", "@oxlint-tsgolint/linux-x64": "0.20.0", "@oxlint-tsgolint/win32-arm64": "0.20.0", "@oxlint-tsgolint/win32-x64": "0.20.0" }, "bin": { "tsgolint": "bin/tsgolint.js" } }, "sha512-/Uc9TQyN1l8w9QNvXtVHYtz+SzDJHKpb5X0UnHodl0BVzijUPk0LPlDOHAvogd1UI+iy9ZSF6gQxEqfzUxCULQ=="],
|
"oxlint-tsgolint": ["oxlint-tsgolint@0.21.0", "", { "optionalDependencies": { "@oxlint-tsgolint/darwin-arm64": "0.21.0", "@oxlint-tsgolint/darwin-x64": "0.21.0", "@oxlint-tsgolint/linux-arm64": "0.21.0", "@oxlint-tsgolint/linux-x64": "0.21.0", "@oxlint-tsgolint/win32-arm64": "0.21.0", "@oxlint-tsgolint/win32-x64": "0.21.0" }, "bin": { "tsgolint": "bin/tsgolint.js" } }, "sha512-HiWPhANwRnN1pZJQ2SgNB3WRR+1etLJHmRzQ/MJhyINsEIaOUCjxhlXJKbEaVUwdnyXwRWqo/P9Fx21lz0/mSg=="],
|
||||||
|
|
||||||
"p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="],
|
"p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="],
|
||||||
|
|
||||||
|
|
@ -1308,7 +1308,7 @@
|
||||||
|
|
||||||
"prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="],
|
"prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="],
|
||||||
|
|
||||||
"prettier": ["prettier@3.8.2", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-8c3mgTe0ASwWAJK+78dpviD+A8EqhndQPUBpNUIPt6+xWlIigCwfN01lWr9MAede4uqXGTEKeQWTvzb3vjia0Q=="],
|
"prettier": ["prettier@3.8.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw=="],
|
||||||
|
|
||||||
"prettier-plugin-curly": ["prettier-plugin-curly@0.4.1", "", { "peerDependencies": { "prettier": "^3" } }, "sha512-Xc7zatoD0/08zYFv+hwnlqT5ekM81DCbBr73CWAsr1Fmx7qLQT/M0wfPx6w/+zfnmXH009xYvjzLUPcwzq7Fbw=="],
|
"prettier-plugin-curly": ["prettier-plugin-curly@0.4.1", "", { "peerDependencies": { "prettier": "^3" } }, "sha512-Xc7zatoD0/08zYFv+hwnlqT5ekM81DCbBr73CWAsr1Fmx7qLQT/M0wfPx6w/+zfnmXH009xYvjzLUPcwzq7Fbw=="],
|
||||||
|
|
||||||
|
|
@ -1484,7 +1484,7 @@
|
||||||
|
|
||||||
"style-search": ["style-search@0.1.0", "", {}, "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg=="],
|
"style-search": ["style-search@0.1.0", "", {}, "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg=="],
|
||||||
|
|
||||||
"stylelint": ["stylelint@17.6.0", "", { "dependencies": { "@csstools/css-calc": "^3.1.1", "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-syntax-patches-for-csstree": "^1.1.1", "@csstools/css-tokenizer": "^4.0.0", "@csstools/media-query-list-parser": "^5.0.0", "@csstools/selector-resolve-nested": "^4.0.0", "@csstools/selector-specificity": "^6.0.0", "colord": "^2.9.3", "cosmiconfig": "^9.0.1", "css-functions-list": "^3.3.3", "css-tree": "^3.2.1", "debug": "^4.4.3", "fast-glob": "^3.3.3", "fastest-levenshtein": "^1.0.16", "file-entry-cache": "^11.1.2", "global-modules": "^2.0.0", "globby": "^16.1.1", "globjoin": "^0.1.4", "html-tags": "^5.1.0", "ignore": "^7.0.5", "import-meta-resolve": "^4.2.0", "is-plain-object": "^5.0.0", "mathml-tag-names": "^4.0.0", "meow": "^14.1.0", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "picocolors": "^1.1.1", "postcss": "^8.5.8", "postcss-safe-parser": "^7.0.1", "postcss-selector-parser": "^7.1.1", "postcss-value-parser": "^4.2.0", "string-width": "^8.2.0", "supports-hyperlinks": "^4.4.0", "svg-tags": "^1.0.0", "table": "^6.9.0", "write-file-atomic": "^7.0.1" }, "bin": { "stylelint": "bin/stylelint.mjs" } }, "sha512-tokrsMIVAR9vAQ/q3UVEr7S0dGXCi7zkCezPRnS2kqPUulvUh5Vgfwngrk4EoAoW7wnrThqTdnTFN5Ra7CaxIg=="],
|
"stylelint": ["stylelint@17.7.0", "", { "dependencies": { "@csstools/css-calc": "^3.1.1", "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-syntax-patches-for-csstree": "^1.1.2", "@csstools/css-tokenizer": "^4.0.0", "@csstools/media-query-list-parser": "^5.0.0", "@csstools/selector-resolve-nested": "^4.0.0", "@csstools/selector-specificity": "^6.0.0", "colord": "^2.9.3", "cosmiconfig": "^9.0.1", "css-functions-list": "^3.3.3", "css-tree": "^3.2.1", "debug": "^4.4.3", "fast-glob": "^3.3.3", "fastest-levenshtein": "^1.0.16", "file-entry-cache": "^11.1.2", "global-modules": "^2.0.0", "globby": "^16.2.0", "globjoin": "^0.1.4", "html-tags": "^5.1.0", "ignore": "^7.0.5", "import-meta-resolve": "^4.2.0", "is-plain-object": "^5.0.0", "mathml-tag-names": "^4.0.0", "meow": "^14.1.0", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "picocolors": "^1.1.1", "postcss": "^8.5.8", "postcss-safe-parser": "^7.0.1", "postcss-selector-parser": "^7.1.1", "postcss-value-parser": "^4.2.0", "string-width": "^8.2.0", "supports-hyperlinks": "^4.4.0", "svg-tags": "^1.0.0", "table": "^6.9.0", "write-file-atomic": "^7.0.1" }, "bin": { "stylelint": "bin/stylelint.mjs" } }, "sha512-n/+4RheCRl+cecGnF+S/Adz59iCRaK9BVznJYB+a7GOksfwNzjiOPnYv17pTO0HgRse9IiqbMtekGNhOb2tVYQ=="],
|
||||||
|
|
||||||
"stylelint-config-clean-order": ["stylelint-config-clean-order@8.0.1", "", { "peerDependencies": { "stylelint": ">=16", "stylelint-order": ">=6" } }, "sha512-zKjp7BiINXRZOG9m0fE/6UKoM6clPekL+LoAiHMCiQU2hgirKL5G0mKc5Z0ygIhQXfb1+DTRDM0mu6Ecdv4q8g=="],
|
"stylelint-config-clean-order": ["stylelint-config-clean-order@8.0.1", "", { "peerDependencies": { "stylelint": ">=16", "stylelint-order": ">=6" } }, "sha512-zKjp7BiINXRZOG9m0fE/6UKoM6clPekL+LoAiHMCiQU2hgirKL5G0mKc5Z0ygIhQXfb1+DTRDM0mu6Ecdv4q8g=="],
|
||||||
|
|
||||||
|
|
@ -1532,7 +1532,7 @@
|
||||||
|
|
||||||
"to-valid-identifier": ["to-valid-identifier@1.0.0", "", { "dependencies": { "@sindresorhus/base62": "^1.0.0", "reserved-identifiers": "^1.0.0" } }, "sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw=="],
|
"to-valid-identifier": ["to-valid-identifier@1.0.0", "", { "dependencies": { "@sindresorhus/base62": "^1.0.0", "reserved-identifiers": "^1.0.0" } }, "sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw=="],
|
||||||
|
|
||||||
"toml": ["toml@3.0.0", "", {}, "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w=="],
|
"toml": ["toml@4.1.1", "", {}, "sha512-EBJnVBr3dTXdA89WVFoAIPUqkBjxPMwRqsfuo1r240tKFHXv3zgca4+NJib/h6TyvGF7vOawz0jGuryJCdNHrw=="],
|
||||||
|
|
||||||
"ts-api-utils": ["ts-api-utils@2.5.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA=="],
|
"ts-api-utils": ["ts-api-utils@2.5.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA=="],
|
||||||
|
|
||||||
|
|
@ -1556,7 +1556,7 @@
|
||||||
|
|
||||||
"typescript": ["typescript@6.0.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ=="],
|
"typescript": ["typescript@6.0.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ=="],
|
||||||
|
|
||||||
"typescript-eslint": ["typescript-eslint@8.58.1", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.58.1", "@typescript-eslint/parser": "8.58.1", "@typescript-eslint/typescript-estree": "8.58.1", "@typescript-eslint/utils": "8.58.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-gf6/oHChByg9HJvhMO1iBexJh12AqqTfnuxscMDOVqfJW3htsdRJI/GfPpHTTcyeB8cSTUY2JcZmVgoyPqcrDg=="],
|
"typescript-eslint": ["typescript-eslint@8.58.2", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.58.2", "@typescript-eslint/parser": "8.58.2", "@typescript-eslint/typescript-estree": "8.58.2", "@typescript-eslint/utils": "8.58.2" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-V8iSng9mRbdZjl54VJ9NKr6ZB+dW0J3TzRXRGcSbLIej9jV86ZRtlYeTKDR/QLxXykocJ5icNzbsl2+5TzIvcQ=="],
|
||||||
|
|
||||||
"unbash": ["unbash@2.2.0", "", {}, "sha512-X2wH19RAPZE3+ldGicOkoj/SIA83OIxcJ6Cuaw23hf8Xc6fQpvZXY0SftE2JgS0QhYLUG4uwodSI3R53keyh7w=="],
|
"unbash": ["unbash@2.2.0", "", {}, "sha512-X2wH19RAPZE3+ldGicOkoj/SIA83OIxcJ6Cuaw23hf8Xc6fQpvZXY0SftE2JgS0QhYLUG4uwodSI3R53keyh7w=="],
|
||||||
|
|
||||||
|
|
@ -1632,10 +1632,44 @@
|
||||||
|
|
||||||
"@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
|
"@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
|
||||||
|
|
||||||
|
"@gcch/configuration-eslint/globals": ["globals@17.4.0", "", {}, "sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw=="],
|
||||||
|
|
||||||
|
"@gcch/configuration-eslint/typescript-eslint": ["typescript-eslint@8.58.1", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.58.1", "@typescript-eslint/parser": "8.58.1", "@typescript-eslint/typescript-estree": "8.58.1", "@typescript-eslint/utils": "8.58.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-gf6/oHChByg9HJvhMO1iBexJh12AqqTfnuxscMDOVqfJW3htsdRJI/GfPpHTTcyeB8cSTUY2JcZmVgoyPqcrDg=="],
|
||||||
|
|
||||||
|
"@gcch/configuration-oxlint/globals": ["globals@17.4.0", "", {}, "sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw=="],
|
||||||
|
|
||||||
|
"@gcch/configuration-oxlint/oxlint": ["oxlint@1.59.0", "", { "optionalDependencies": { "@oxlint/binding-android-arm-eabi": "1.59.0", "@oxlint/binding-android-arm64": "1.59.0", "@oxlint/binding-darwin-arm64": "1.59.0", "@oxlint/binding-darwin-x64": "1.59.0", "@oxlint/binding-freebsd-x64": "1.59.0", "@oxlint/binding-linux-arm-gnueabihf": "1.59.0", "@oxlint/binding-linux-arm-musleabihf": "1.59.0", "@oxlint/binding-linux-arm64-gnu": "1.59.0", "@oxlint/binding-linux-arm64-musl": "1.59.0", "@oxlint/binding-linux-ppc64-gnu": "1.59.0", "@oxlint/binding-linux-riscv64-gnu": "1.59.0", "@oxlint/binding-linux-riscv64-musl": "1.59.0", "@oxlint/binding-linux-s390x-gnu": "1.59.0", "@oxlint/binding-linux-x64-gnu": "1.59.0", "@oxlint/binding-linux-x64-musl": "1.59.0", "@oxlint/binding-openharmony-arm64": "1.59.0", "@oxlint/binding-win32-arm64-msvc": "1.59.0", "@oxlint/binding-win32-ia32-msvc": "1.59.0", "@oxlint/binding-win32-x64-msvc": "1.59.0" }, "peerDependencies": { "oxlint-tsgolint": ">=0.18.0" }, "optionalPeers": ["oxlint-tsgolint"], "bin": { "oxlint": "bin/oxlint" } }, "sha512-0xBLeGGjP4vD9pygRo8iuOkOzEU1MqOnfiOl7KYezL/QvWL8NUg6n03zXc7ZVqltiOpUxBk2zgHI3PnRIEdAvw=="],
|
||||||
|
|
||||||
|
"@gcch/configuration-oxlint/oxlint-tsgolint": ["oxlint-tsgolint@0.20.0", "", { "optionalDependencies": { "@oxlint-tsgolint/darwin-arm64": "0.20.0", "@oxlint-tsgolint/darwin-x64": "0.20.0", "@oxlint-tsgolint/linux-arm64": "0.20.0", "@oxlint-tsgolint/linux-x64": "0.20.0", "@oxlint-tsgolint/win32-arm64": "0.20.0", "@oxlint-tsgolint/win32-x64": "0.20.0" }, "bin": { "tsgolint": "bin/tsgolint.js" } }, "sha512-/Uc9TQyN1l8w9QNvXtVHYtz+SzDJHKpb5X0UnHodl0BVzijUPk0LPlDOHAvogd1UI+iy9ZSF6gQxEqfzUxCULQ=="],
|
||||||
|
|
||||||
|
"@gcch/configuration-prettier/prettier": ["prettier@3.8.2", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-8c3mgTe0ASwWAJK+78dpviD+A8EqhndQPUBpNUIPt6+xWlIigCwfN01lWr9MAede4uqXGTEKeQWTvzb3vjia0Q=="],
|
||||||
|
|
||||||
"@keyv/bigmap/keyv": ["keyv@5.6.0", "", { "dependencies": { "@keyv/serialize": "^1.1.1" } }, "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw=="],
|
"@keyv/bigmap/keyv": ["keyv@5.6.0", "", { "dependencies": { "@keyv/serialize": "^1.1.1" } }, "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw=="],
|
||||||
|
|
||||||
|
"@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.58.2", "", { "dependencies": { "@typescript-eslint/types": "8.58.2", "@typescript-eslint/visitor-keys": "8.58.2" } }, "sha512-SgmyvDPexWETQek+qzZnrG6844IaO02UVyOLhI4wpo82dpZJY9+6YZCKAMFzXb7qhx37mFK1QcPQ18tud+vo6Q=="],
|
||||||
|
|
||||||
|
"@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.58.2", "", { "dependencies": { "@typescript-eslint/types": "8.58.2", "@typescript-eslint/typescript-estree": "8.58.2", "@typescript-eslint/utils": "8.58.2", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-Z7EloNR/B389FvabdGeTo2XMs4W9TjtPiO9DAsmT0yom0bwlPyRjkJ1uCdW1DvrrrYP50AJZ9Xc3sByZA9+dcg=="],
|
||||||
|
|
||||||
|
"@typescript-eslint/eslint-plugin/@typescript-eslint/utils": ["@typescript-eslint/utils@8.58.2", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.58.2", "@typescript-eslint/types": "8.58.2", "@typescript-eslint/typescript-estree": "8.58.2" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-QZfjHNEzPY8+l0+fIXMvuQ2sJlplB4zgDZvA+NmvZsZv3EQwOcc1DuIU1VJUTWZ/RKouBMhDyNaBMx4sWvrzRA=="],
|
||||||
|
|
||||||
"@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="],
|
"@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="],
|
||||||
|
|
||||||
|
"@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.58.2", "", { "dependencies": { "@typescript-eslint/types": "8.58.2", "@typescript-eslint/visitor-keys": "8.58.2" } }, "sha512-SgmyvDPexWETQek+qzZnrG6844IaO02UVyOLhI4wpo82dpZJY9+6YZCKAMFzXb7qhx37mFK1QcPQ18tud+vo6Q=="],
|
||||||
|
|
||||||
|
"@typescript-eslint/parser/@typescript-eslint/types": ["@typescript-eslint/types@8.58.2", "", {}, "sha512-9TukXyATBQf/Jq9AMQXfvurk+G5R2MwfqQGDR2GzGz28HvY/lXNKGhkY+6IOubwcquikWk5cjlgPvD2uAA7htQ=="],
|
||||||
|
|
||||||
|
"@typescript-eslint/project-service/@typescript-eslint/types": ["@typescript-eslint/types@8.58.2", "", {}, "sha512-9TukXyATBQf/Jq9AMQXfvurk+G5R2MwfqQGDR2GzGz28HvY/lXNKGhkY+6IOubwcquikWk5cjlgPvD2uAA7htQ=="],
|
||||||
|
|
||||||
|
"@typescript-eslint/scope-manager/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.58.1", "", { "dependencies": { "@typescript-eslint/types": "8.58.1", "eslint-visitor-keys": "^5.0.0" } }, "sha512-y+vH7QE8ycjoa0bWciFg7OpFcipUuem1ujhrdLtq1gByKwfbC7bPeKsiny9e0urg93DqwGcHey+bGRKCnF1nZQ=="],
|
||||||
|
|
||||||
|
"@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.58.1", "", { "dependencies": { "@typescript-eslint/project-service": "8.58.1", "@typescript-eslint/tsconfig-utils": "8.58.1", "@typescript-eslint/types": "8.58.1", "@typescript-eslint/visitor-keys": "8.58.1", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-w4w7WR7GHOjqqPnvAYbazq+Y5oS68b9CzasGtnd6jIeOIeKUzYzupGTB2T4LTPSv4d+WPeccbxuneTFHYgAAWg=="],
|
||||||
|
|
||||||
|
"@typescript-eslint/typescript-estree/@typescript-eslint/types": ["@typescript-eslint/types@8.58.2", "", {}, "sha512-9TukXyATBQf/Jq9AMQXfvurk+G5R2MwfqQGDR2GzGz28HvY/lXNKGhkY+6IOubwcquikWk5cjlgPvD2uAA7htQ=="],
|
||||||
|
|
||||||
|
"@typescript-eslint/utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.58.1", "", { "dependencies": { "@typescript-eslint/project-service": "8.58.1", "@typescript-eslint/tsconfig-utils": "8.58.1", "@typescript-eslint/types": "8.58.1", "@typescript-eslint/visitor-keys": "8.58.1", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-w4w7WR7GHOjqqPnvAYbazq+Y5oS68b9CzasGtnd6jIeOIeKUzYzupGTB2T4LTPSv4d+WPeccbxuneTFHYgAAWg=="],
|
||||||
|
|
||||||
|
"@typescript-eslint/visitor-keys/@typescript-eslint/types": ["@typescript-eslint/types@8.58.2", "", {}, "sha512-9TukXyATBQf/Jq9AMQXfvurk+G5R2MwfqQGDR2GzGz28HvY/lXNKGhkY+6IOubwcquikWk5cjlgPvD2uAA7htQ=="],
|
||||||
|
|
||||||
"astro-eslint-parser/eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="],
|
"astro-eslint-parser/eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="],
|
||||||
|
|
||||||
"astro-eslint-parser/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="],
|
"astro-eslint-parser/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="],
|
||||||
|
|
@ -1644,6 +1678,8 @@
|
||||||
|
|
||||||
"babel-plugin-polyfill-corejs2/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
|
"babel-plugin-polyfill-corejs2/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
|
||||||
|
|
||||||
|
"browserslist/caniuse-lite": ["caniuse-lite@1.0.30001787", "", {}, "sha512-mNcrMN9KeI68u7muanUpEejSLghOKlVhRqS/Za2IeyGllJ9I9otGpR9g3nsw7n4W378TE/LyIteA0+/FOZm4Kg=="],
|
||||||
|
|
||||||
"browserslist-to-esbuild/meow": ["meow@13.2.0", "", {}, "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA=="],
|
"browserslist-to-esbuild/meow": ["meow@13.2.0", "", {}, "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA=="],
|
||||||
|
|
||||||
"cacheable/keyv": ["keyv@5.6.0", "", { "dependencies": { "@keyv/serialize": "^1.1.1" } }, "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw=="],
|
"cacheable/keyv": ["keyv@5.6.0", "", { "dependencies": { "@keyv/serialize": "^1.1.1" } }, "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw=="],
|
||||||
|
|
@ -1656,6 +1692,8 @@
|
||||||
|
|
||||||
"eslint-plugin-jsx-a11y/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="],
|
"eslint-plugin-jsx-a11y/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="],
|
||||||
|
|
||||||
|
"eslint-plugin-sonarjs/globals": ["globals@17.4.0", "", {}, "sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw=="],
|
||||||
|
|
||||||
"eslint-plugin-unicorn/globals": ["globals@16.5.0", "", {}, "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ=="],
|
"eslint-plugin-unicorn/globals": ["globals@16.5.0", "", {}, "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ=="],
|
||||||
|
|
||||||
"fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
|
"fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
|
||||||
|
|
@ -1670,6 +1708,8 @@
|
||||||
|
|
||||||
"micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="],
|
"micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="],
|
||||||
|
|
||||||
|
"prettier-plugin-ini/prettier": ["prettier@3.8.2", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-8c3mgTe0ASwWAJK+78dpviD+A8EqhndQPUBpNUIPt6+xWlIigCwfN01lWr9MAede4uqXGTEKeQWTvzb3vjia0Q=="],
|
||||||
|
|
||||||
"qified/hookified": ["hookified@2.1.1", "", {}, "sha512-AHb76R16GB5EsPBE2J7Ko5kiEyXwviB9P5SMrAKcuAu4vJPZttViAbj9+tZeaQE5zjDme+1vcHP78Yj/WoAveA=="],
|
"qified/hookified": ["hookified@2.1.1", "", {}, "sha512-AHb76R16GB5EsPBE2J7Ko5kiEyXwviB9P5SMrAKcuAu4vJPZttViAbj9+tZeaQE5zjDme+1vcHP78Yj/WoAveA=="],
|
||||||
|
|
||||||
"rolldown/@oxc-project/types": ["@oxc-project/types@0.124.0", "", {}, "sha512-VBFWMTBvHxS11Z5Lvlr3IWgrwhMTXV+Md+EQF0Xf60+wAdsGFTBx7X7K/hP4pi8N7dcm1RvcHwDxZ16Qx8keUg=="],
|
"rolldown/@oxc-project/types": ["@oxc-project/types@0.124.0", "", {}, "sha512-VBFWMTBvHxS11Z5Lvlr3IWgrwhMTXV+Md+EQF0Xf60+wAdsGFTBx7X7K/hP4pi8N7dcm1RvcHwDxZ16Qx8keUg=="],
|
||||||
|
|
@ -1688,8 +1728,84 @@
|
||||||
|
|
||||||
"table/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
|
"table/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
|
||||||
|
|
||||||
|
"typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@8.58.2", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.58.2", "@typescript-eslint/types": "8.58.2", "@typescript-eslint/typescript-estree": "8.58.2" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-QZfjHNEzPY8+l0+fIXMvuQ2sJlplB4zgDZvA+NmvZsZv3EQwOcc1DuIU1VJUTWZ/RKouBMhDyNaBMx4sWvrzRA=="],
|
||||||
|
|
||||||
"vite/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
|
"vite/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
|
||||||
|
|
||||||
|
"@gcch/configuration-eslint/typescript-eslint/@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.58.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.58.1", "@typescript-eslint/type-utils": "8.58.1", "@typescript-eslint/utils": "8.58.1", "@typescript-eslint/visitor-keys": "8.58.1", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.58.1", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-eSkwoemjo76bdXl2MYqtxg51HNwUSkWfODUOQ3PaTLZGh9uIWWFZIjyjaJnex7wXDu+TRx+ATsnSxdN9YWfRTQ=="],
|
||||||
|
|
||||||
|
"@gcch/configuration-eslint/typescript-eslint/@typescript-eslint/parser": ["@typescript-eslint/parser@8.58.1", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.58.1", "@typescript-eslint/types": "8.58.1", "@typescript-eslint/typescript-estree": "8.58.1", "@typescript-eslint/visitor-keys": "8.58.1", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-gGkiNMPqerb2cJSVcruigx9eHBlLG14fSdPdqMoOcBfh+vvn4iCq2C8MzUB89PrxOXk0y3GZ1yIWb9aOzL93bw=="],
|
||||||
|
|
||||||
|
"@gcch/configuration-eslint/typescript-eslint/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.58.1", "", { "dependencies": { "@typescript-eslint/project-service": "8.58.1", "@typescript-eslint/tsconfig-utils": "8.58.1", "@typescript-eslint/types": "8.58.1", "@typescript-eslint/visitor-keys": "8.58.1", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-w4w7WR7GHOjqqPnvAYbazq+Y5oS68b9CzasGtnd6jIeOIeKUzYzupGTB2T4LTPSv4d+WPeccbxuneTFHYgAAWg=="],
|
||||||
|
|
||||||
|
"@gcch/configuration-oxlint/oxlint/@oxlint/binding-android-arm-eabi": ["@oxlint/binding-android-arm-eabi@1.59.0", "", { "os": "android", "cpu": "arm" }, "sha512-etYDw/UaEv936AQUd/CRMBVd+e+XuuU6wC+VzOv1STvsTyZenLChepLWqLtnyTTp4YMlM22ypzogDDwqYxv5cg=="],
|
||||||
|
|
||||||
|
"@gcch/configuration-oxlint/oxlint/@oxlint/binding-android-arm64": ["@oxlint/binding-android-arm64@1.59.0", "", { "os": "android", "cpu": "arm64" }, "sha512-TgLc7XVLKH2a4h8j3vn1MDjfK33i9MY60f/bKhRGWyVzbk5LCZ4X01VZG7iHrMmi5vYbAp8//Ponigx03CLsdw=="],
|
||||||
|
|
||||||
|
"@gcch/configuration-oxlint/oxlint/@oxlint/binding-darwin-arm64": ["@oxlint/binding-darwin-arm64@1.59.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-DXyFPf5ZKldMLloRHx/B9fsxsiTQomaw7cmEW3YIJko2HgCh+GUhp9gGYwHrqlLJPsEe3dYj9JebjX92D3j3AA=="],
|
||||||
|
|
||||||
|
"@gcch/configuration-oxlint/oxlint/@oxlint/binding-darwin-x64": ["@oxlint/binding-darwin-x64@1.59.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-LgvrsdgVLX1qWqIEmNsSmMXJhpAWdtUQ0M+oR0CySwi+9IHWyOGuIL8w8+u/kbZNMyZr4WUyYB5i0+D+AKgkLg=="],
|
||||||
|
|
||||||
|
"@gcch/configuration-oxlint/oxlint/@oxlint/binding-freebsd-x64": ["@oxlint/binding-freebsd-x64@1.59.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-bOJhqX/ny4hrFuTPlyk8foSRx/vLRpxJh0jOOKN2NWW6FScXHPAA5rQbrwdQPcgGB5V8Ua51RS03fke8ssBcug=="],
|
||||||
|
|
||||||
|
"@gcch/configuration-oxlint/oxlint/@oxlint/binding-linux-arm-gnueabihf": ["@oxlint/binding-linux-arm-gnueabihf@1.59.0", "", { "os": "linux", "cpu": "arm" }, "sha512-vVUXxYMF9trXCsz4m9H6U0IjehosVHxBzVgJUxly1uz4W1PdDyicaBnpC0KRXsHYretLVe+uS9pJy8iM57Kujw=="],
|
||||||
|
|
||||||
|
"@gcch/configuration-oxlint/oxlint/@oxlint/binding-linux-arm-musleabihf": ["@oxlint/binding-linux-arm-musleabihf@1.59.0", "", { "os": "linux", "cpu": "arm" }, "sha512-TULQW8YBPGRWg5yZpFPL54HLOnJ3/HiX6VenDPi6YfxB/jlItwSMFh3/hCeSNbh+DAMaE1Py0j5MOaivHkI/9Q=="],
|
||||||
|
|
||||||
|
"@gcch/configuration-oxlint/oxlint/@oxlint/binding-linux-arm64-gnu": ["@oxlint/binding-linux-arm64-gnu@1.59.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-Gt54Y4eqSgYJ90xipm24xeyaPV854706o/kiT8oZvUt3VDY7qqxdqyGqchMaujd87ib+/MXvnl9WkK8Cc1BExg=="],
|
||||||
|
|
||||||
|
"@gcch/configuration-oxlint/oxlint/@oxlint/binding-linux-arm64-musl": ["@oxlint/binding-linux-arm64-musl@1.59.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-3CtsKp7NFB3OfqQzbuAecrY7GIZeiv7AD+xutU4tefVQzlfmTI7/ygWLrvkzsDEjTlMq41rYHxgsn6Yh8tybmA=="],
|
||||||
|
|
||||||
|
"@gcch/configuration-oxlint/oxlint/@oxlint/binding-linux-ppc64-gnu": ["@oxlint/binding-linux-ppc64-gnu@1.59.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-K0diOpT3ncDmOfl9I1HuvpEsAuTxkts0VYwIv/w6Xiy9CdwyPBVX88Ga9l8VlGgMrwBMnSY4xIvVlVY/fkQk7Q=="],
|
||||||
|
|
||||||
|
"@gcch/configuration-oxlint/oxlint/@oxlint/binding-linux-riscv64-gnu": ["@oxlint/binding-linux-riscv64-gnu@1.59.0", "", { "os": "linux", "cpu": "none" }, "sha512-xAU7+QDU6kTJJ7mJLOGgo7oOjtAtkKyFZ0Yjdb5cEo3DiCCPFLvyr08rWiQh6evZ7RiUTf+o65NY/bqttzJiQQ=="],
|
||||||
|
|
||||||
|
"@gcch/configuration-oxlint/oxlint/@oxlint/binding-linux-riscv64-musl": ["@oxlint/binding-linux-riscv64-musl@1.59.0", "", { "os": "linux", "cpu": "none" }, "sha512-KUmZmKlTTyauOnvUNVxK7G40sSSx0+w5l1UhaGsC6KPpOYHenx2oqJTnabmpLJicok7IC+3Y6fXAUOMyexaeJQ=="],
|
||||||
|
|
||||||
|
"@gcch/configuration-oxlint/oxlint/@oxlint/binding-linux-s390x-gnu": ["@oxlint/binding-linux-s390x-gnu@1.59.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-4usRxC8gS0PGdkHnRmwJt/4zrQNZyk6vL0trCxwZSsAKM+OxhB8nKiR+mhjdBbl8lbMh2gc3bZpNN/ik8c4c2A=="],
|
||||||
|
|
||||||
|
"@gcch/configuration-oxlint/oxlint/@oxlint/binding-linux-x64-gnu": ["@oxlint/binding-linux-x64-gnu@1.59.0", "", { "os": "linux", "cpu": "x64" }, "sha512-s/rNE2gDmbwAOOP493xk2X7M8LZfI1LJFSSW1+yanz3vuQCFPiHkx4GY+O1HuLUDtkzGlhtMrIcxxzyYLv308w=="],
|
||||||
|
|
||||||
|
"@gcch/configuration-oxlint/oxlint/@oxlint/binding-linux-x64-musl": ["@oxlint/binding-linux-x64-musl@1.59.0", "", { "os": "linux", "cpu": "x64" }, "sha512-+yYj1udJa2UvvIUmEm0IcKgc0UlPMgz0nsSTvkPL2y6n0uU5LgIHSwVu4AHhrve6j9BpVSoRksnz8c9QcvITJA=="],
|
||||||
|
|
||||||
|
"@gcch/configuration-oxlint/oxlint/@oxlint/binding-openharmony-arm64": ["@oxlint/binding-openharmony-arm64@1.59.0", "", { "os": "none", "cpu": "arm64" }, "sha512-bUplUb48LYsB3hHlQXP2ZMOenpieWoOyppLAnnAhuPag3MGPnt+7caxE3w/Vl9wpQsTA3gzLntQi9rxWrs7Xqg=="],
|
||||||
|
|
||||||
|
"@gcch/configuration-oxlint/oxlint/@oxlint/binding-win32-arm64-msvc": ["@oxlint/binding-win32-arm64-msvc@1.59.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-/HLsLuz42rWl7h7ePdmMTpHm2HIDmPtcEMYgm5BBEHiEiuNOrzMaUpd2z7UnNni5LGN9obJy2YoAYBLXQwazrA=="],
|
||||||
|
|
||||||
|
"@gcch/configuration-oxlint/oxlint/@oxlint/binding-win32-ia32-msvc": ["@oxlint/binding-win32-ia32-msvc@1.59.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-rUPy+JnanpPwV/aJCPnxAD1fW50+XPI0VkWr7f0vEbqcdsS8NpB24Rw6RsS7SdpFv8Dw+8ugCwao5nCFbqOUSg=="],
|
||||||
|
|
||||||
|
"@gcch/configuration-oxlint/oxlint/@oxlint/binding-win32-x64-msvc": ["@oxlint/binding-win32-x64-msvc@1.59.0", "", { "os": "win32", "cpu": "x64" }, "sha512-xkE7puteDS/vUyRngLXW0t8WgdWoS/tfxXjhP/P7SMqPDx+hs44SpssO3h3qmTqECYEuXBUPzcAw5257Ka+ofA=="],
|
||||||
|
|
||||||
|
"@gcch/configuration-oxlint/oxlint-tsgolint/@oxlint-tsgolint/darwin-arm64": ["@oxlint-tsgolint/darwin-arm64@0.20.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-KKQcIHZHMxqpHUA1VXIbOG6chNCFkUWbQy6M+AFVtPKkA/3xAeJkJ3njoV66bfzwPHRcWQO+kcj5XqtbkjakoA=="],
|
||||||
|
|
||||||
|
"@gcch/configuration-oxlint/oxlint-tsgolint/@oxlint-tsgolint/darwin-x64": ["@oxlint-tsgolint/darwin-x64@0.20.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-7HeVMuclGfG+NLZi2ybY0T4fMI7/XxO/208rJk+zEIloKkVnlh11Wd241JMGwgNFXn+MLJbOqOfojDb2Dt4L1g=="],
|
||||||
|
|
||||||
|
"@gcch/configuration-oxlint/oxlint-tsgolint/@oxlint-tsgolint/linux-arm64": ["@oxlint-tsgolint/linux-arm64@0.20.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-zxhUwz+WSxE6oWlZLK2z2ps9yC6ebmgoYmjAl0Oa48+GqkZ56NVgo+wb8DURNv6xrggzHStQxqQxe3mK51HZag=="],
|
||||||
|
|
||||||
|
"@gcch/configuration-oxlint/oxlint-tsgolint/@oxlint-tsgolint/linux-x64": ["@oxlint-tsgolint/linux-x64@0.20.0", "", { "os": "linux", "cpu": "x64" }, "sha512-/1l6FnahC9im8PK+Ekkx/V3yetO/PzZnJegE2FXcv/iXEhbeVxP/ouiTYcUQu9shT1FWJCSNti1VJHH+21Y1dg=="],
|
||||||
|
|
||||||
|
"@gcch/configuration-oxlint/oxlint-tsgolint/@oxlint-tsgolint/win32-arm64": ["@oxlint-tsgolint/win32-arm64@0.20.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-oPZ5Yz8sVdo7P/5q+i3IKeix31eFZ55JAPa1+RGPoe9PoaYVsdMvR6Jvib6YtrqoJnFPlg3fjEjlEPL8VBKYJA=="],
|
||||||
|
|
||||||
|
"@gcch/configuration-oxlint/oxlint-tsgolint/@oxlint-tsgolint/win32-x64": ["@oxlint-tsgolint/win32-x64@0.20.0", "", { "os": "win32", "cpu": "x64" }, "sha512-4stx8RHj3SP9vQyRF/yZbz5igtPvYMEUR8CUoha4BVNZihi39DpCR8qkU7lpjB5Ga1DRMo2pHaA4bdTOMaY4mw=="],
|
||||||
|
|
||||||
|
"@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@8.58.2", "", {}, "sha512-9TukXyATBQf/Jq9AMQXfvurk+G5R2MwfqQGDR2GzGz28HvY/lXNKGhkY+6IOubwcquikWk5cjlgPvD2uAA7htQ=="],
|
||||||
|
|
||||||
|
"@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/types": ["@typescript-eslint/types@8.58.2", "", {}, "sha512-9TukXyATBQf/Jq9AMQXfvurk+G5R2MwfqQGDR2GzGz28HvY/lXNKGhkY+6IOubwcquikWk5cjlgPvD2uAA7htQ=="],
|
||||||
|
|
||||||
|
"@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@8.58.2", "", {}, "sha512-9TukXyATBQf/Jq9AMQXfvurk+G5R2MwfqQGDR2GzGz28HvY/lXNKGhkY+6IOubwcquikWk5cjlgPvD2uAA7htQ=="],
|
||||||
|
|
||||||
|
"@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.58.1", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.58.1", "@typescript-eslint/types": "^8.58.1", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-gfQ8fk6cxhtptek+/8ZIqw8YrRW5048Gug8Ts5IYcMLCw18iUgrZAEY/D7s4hkI0FxEfGakKuPK/XUMPzPxi5g=="],
|
||||||
|
|
||||||
|
"@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.58.1", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-JAr2hOIct2Q+qk3G+8YFfqkqi7sC86uNryT+2i5HzMa2MPjw4qNFvtjnw1IiA1rP7QhNKVe21mSSLaSjwA1Olw=="],
|
||||||
|
|
||||||
|
"@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.58.1", "", { "dependencies": { "@typescript-eslint/types": "8.58.1", "eslint-visitor-keys": "^5.0.0" } }, "sha512-y+vH7QE8ycjoa0bWciFg7OpFcipUuem1ujhrdLtq1gByKwfbC7bPeKsiny9e0urg93DqwGcHey+bGRKCnF1nZQ=="],
|
||||||
|
|
||||||
|
"@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.58.1", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.58.1", "@typescript-eslint/types": "^8.58.1", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-gfQ8fk6cxhtptek+/8ZIqw8YrRW5048Gug8Ts5IYcMLCw18iUgrZAEY/D7s4hkI0FxEfGakKuPK/XUMPzPxi5g=="],
|
||||||
|
|
||||||
|
"@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.58.1", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-JAr2hOIct2Q+qk3G+8YFfqkqi7sC86uNryT+2i5HzMa2MPjw4qNFvtjnw1IiA1rP7QhNKVe21mSSLaSjwA1Olw=="],
|
||||||
|
|
||||||
|
"@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.58.1", "", { "dependencies": { "@typescript-eslint/types": "8.58.1", "eslint-visitor-keys": "^5.0.0" } }, "sha512-y+vH7QE8ycjoa0bWciFg7OpFcipUuem1ujhrdLtq1gByKwfbC7bPeKsiny9e0urg93DqwGcHey+bGRKCnF1nZQ=="],
|
||||||
|
|
||||||
"eslint-plugin-jsx-a11y/minimatch/brace-expansion": ["brace-expansion@1.1.13", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w=="],
|
"eslint-plugin-jsx-a11y/minimatch/brace-expansion": ["brace-expansion@1.1.13", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w=="],
|
||||||
|
|
||||||
"stylelint/file-entry-cache/flat-cache": ["flat-cache@6.1.22", "", { "dependencies": { "cacheable": "^2.3.4", "flatted": "^3.4.2", "hookified": "^1.15.0" } }, "sha512-N2dnzVJIphnNsjHcrxGW7DePckJ6haPrSFqpsBUhHYgwtKGVq4JrBGielEGD2fCVnsGm1zlBVZ8wGhkyuetgug=="],
|
"stylelint/file-entry-cache/flat-cache": ["flat-cache@6.1.22", "", { "dependencies": { "cacheable": "^2.3.4", "flatted": "^3.4.2", "hookified": "^1.15.0" } }, "sha512-N2dnzVJIphnNsjHcrxGW7DePckJ6haPrSFqpsBUhHYgwtKGVq4JrBGielEGD2fCVnsGm1zlBVZ8wGhkyuetgug=="],
|
||||||
|
|
@ -1700,6 +1816,22 @@
|
||||||
|
|
||||||
"table/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
|
"table/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
|
||||||
|
|
||||||
|
"typescript-eslint/@typescript-eslint/utils/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.58.2", "", { "dependencies": { "@typescript-eslint/types": "8.58.2", "@typescript-eslint/visitor-keys": "8.58.2" } }, "sha512-SgmyvDPexWETQek+qzZnrG6844IaO02UVyOLhI4wpo82dpZJY9+6YZCKAMFzXb7qhx37mFK1QcPQ18tud+vo6Q=="],
|
||||||
|
|
||||||
|
"typescript-eslint/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@8.58.2", "", {}, "sha512-9TukXyATBQf/Jq9AMQXfvurk+G5R2MwfqQGDR2GzGz28HvY/lXNKGhkY+6IOubwcquikWk5cjlgPvD2uAA7htQ=="],
|
||||||
|
|
||||||
|
"@gcch/configuration-eslint/typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.58.1", "", { "dependencies": { "@typescript-eslint/types": "8.58.1", "eslint-visitor-keys": "^5.0.0" } }, "sha512-y+vH7QE8ycjoa0bWciFg7OpFcipUuem1ujhrdLtq1gByKwfbC7bPeKsiny9e0urg93DqwGcHey+bGRKCnF1nZQ=="],
|
||||||
|
|
||||||
|
"@gcch/configuration-eslint/typescript-eslint/@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="],
|
||||||
|
|
||||||
|
"@gcch/configuration-eslint/typescript-eslint/@typescript-eslint/parser/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.58.1", "", { "dependencies": { "@typescript-eslint/types": "8.58.1", "eslint-visitor-keys": "^5.0.0" } }, "sha512-y+vH7QE8ycjoa0bWciFg7OpFcipUuem1ujhrdLtq1gByKwfbC7bPeKsiny9e0urg93DqwGcHey+bGRKCnF1nZQ=="],
|
||||||
|
|
||||||
|
"@gcch/configuration-eslint/typescript-eslint/@typescript-eslint/typescript-estree/@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.58.1", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.58.1", "@typescript-eslint/types": "^8.58.1", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-gfQ8fk6cxhtptek+/8ZIqw8YrRW5048Gug8Ts5IYcMLCw18iUgrZAEY/D7s4hkI0FxEfGakKuPK/XUMPzPxi5g=="],
|
||||||
|
|
||||||
|
"@gcch/configuration-eslint/typescript-eslint/@typescript-eslint/typescript-estree/@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.58.1", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-JAr2hOIct2Q+qk3G+8YFfqkqi7sC86uNryT+2i5HzMa2MPjw4qNFvtjnw1IiA1rP7QhNKVe21mSSLaSjwA1Olw=="],
|
||||||
|
|
||||||
|
"@gcch/configuration-eslint/typescript-eslint/@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.58.1", "", { "dependencies": { "@typescript-eslint/types": "8.58.1", "eslint-visitor-keys": "^5.0.0" } }, "sha512-y+vH7QE8ycjoa0bWciFg7OpFcipUuem1ujhrdLtq1gByKwfbC7bPeKsiny9e0urg93DqwGcHey+bGRKCnF1nZQ=="],
|
||||||
|
|
||||||
"eslint-plugin-jsx-a11y/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
|
"eslint-plugin-jsx-a11y/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
220
composer.lock
generated
220
composer.lock
generated
|
|
@ -585,7 +585,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "illuminate/collections",
|
"name": "illuminate/collections",
|
||||||
"version": "v13.4.0",
|
"version": "v13.5.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/illuminate/collections.git",
|
"url": "https://github.com/illuminate/collections.git",
|
||||||
|
|
@ -644,7 +644,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "illuminate/conditionable",
|
"name": "illuminate/conditionable",
|
||||||
"version": "v13.4.0",
|
"version": "v13.5.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/illuminate/conditionable.git",
|
"url": "https://github.com/illuminate/conditionable.git",
|
||||||
|
|
@ -690,16 +690,16 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "illuminate/contracts",
|
"name": "illuminate/contracts",
|
||||||
"version": "v13.4.0",
|
"version": "v13.5.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/illuminate/contracts.git",
|
"url": "https://github.com/illuminate/contracts.git",
|
||||||
"reference": "8796cc5f30124b81210ae2f3b2ae0f69ad4fc7f8"
|
"reference": "022d9816b4ff052a3db5946a86be3cd2e224db0f"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/illuminate/contracts/zipball/8796cc5f30124b81210ae2f3b2ae0f69ad4fc7f8",
|
"url": "https://api.github.com/repos/illuminate/contracts/zipball/022d9816b4ff052a3db5946a86be3cd2e224db0f",
|
||||||
"reference": "8796cc5f30124b81210ae2f3b2ae0f69ad4fc7f8",
|
"reference": "022d9816b4ff052a3db5946a86be3cd2e224db0f",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -734,11 +734,11 @@
|
||||||
"issues": "https://github.com/laravel/framework/issues",
|
"issues": "https://github.com/laravel/framework/issues",
|
||||||
"source": "https://github.com/laravel/framework"
|
"source": "https://github.com/laravel/framework"
|
||||||
},
|
},
|
||||||
"time": "2026-03-26T17:13:01+00:00"
|
"time": "2026-04-12T17:46:48+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "illuminate/macroable",
|
"name": "illuminate/macroable",
|
||||||
"version": "v13.4.0",
|
"version": "v13.5.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/illuminate/macroable.git",
|
"url": "https://github.com/illuminate/macroable.git",
|
||||||
|
|
@ -784,7 +784,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "illuminate/reflection",
|
"name": "illuminate/reflection",
|
||||||
"version": "v13.4.0",
|
"version": "v13.5.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/illuminate/reflection.git",
|
"url": "https://github.com/illuminate/reflection.git",
|
||||||
|
|
@ -835,16 +835,16 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "illuminate/support",
|
"name": "illuminate/support",
|
||||||
"version": "v13.4.0",
|
"version": "v13.5.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/illuminate/support.git",
|
"url": "https://github.com/illuminate/support.git",
|
||||||
"reference": "e7ce0496cae80c3e1aa72e37f09335a6454846dc"
|
"reference": "0e8642a79d385c644a75400cad176b042242c894"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/illuminate/support/zipball/e7ce0496cae80c3e1aa72e37f09335a6454846dc",
|
"url": "https://api.github.com/repos/illuminate/support/zipball/0e8642a79d385c644a75400cad176b042242c894",
|
||||||
"reference": "e7ce0496cae80c3e1aa72e37f09335a6454846dc",
|
"reference": "0e8642a79d385c644a75400cad176b042242c894",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -910,7 +910,7 @@
|
||||||
"issues": "https://github.com/laravel/framework/issues",
|
"issues": "https://github.com/laravel/framework/issues",
|
||||||
"source": "https://github.com/laravel/framework"
|
"source": "https://github.com/laravel/framework"
|
||||||
},
|
},
|
||||||
"time": "2026-04-07T13:34:38+00:00"
|
"time": "2026-04-13T14:52:53+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "laravel/helpers",
|
"name": "laravel/helpers",
|
||||||
|
|
@ -2506,7 +2506,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-ctype",
|
"name": "symfony/polyfill-ctype",
|
||||||
"version": "v1.34.0",
|
"version": "v1.35.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/polyfill-ctype.git",
|
"url": "https://github.com/symfony/polyfill-ctype.git",
|
||||||
|
|
@ -2565,7 +2565,7 @@
|
||||||
"portable"
|
"portable"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.34.0"
|
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.35.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -2589,7 +2589,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-mbstring",
|
"name": "symfony/polyfill-mbstring",
|
||||||
"version": "v1.34.0",
|
"version": "v1.35.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/polyfill-mbstring.git",
|
"url": "https://github.com/symfony/polyfill-mbstring.git",
|
||||||
|
|
@ -2650,7 +2650,7 @@
|
||||||
"shim"
|
"shim"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.34.0"
|
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.35.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -2674,7 +2674,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-php80",
|
"name": "symfony/polyfill-php80",
|
||||||
"version": "v1.34.0",
|
"version": "v1.35.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/polyfill-php80.git",
|
"url": "https://github.com/symfony/polyfill-php80.git",
|
||||||
|
|
@ -2734,7 +2734,7 @@
|
||||||
"shim"
|
"shim"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/polyfill-php80/tree/v1.34.0"
|
"source": "https://github.com/symfony/polyfill-php80/tree/v1.35.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -2758,7 +2758,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-php84",
|
"name": "symfony/polyfill-php84",
|
||||||
"version": "v1.34.0",
|
"version": "v1.35.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/polyfill-php84.git",
|
"url": "https://github.com/symfony/polyfill-php84.git",
|
||||||
|
|
@ -2814,7 +2814,7 @@
|
||||||
"shim"
|
"shim"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/polyfill-php84/tree/v1.34.0"
|
"source": "https://github.com/symfony/polyfill-php84/tree/v1.35.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -2838,7 +2838,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-php85",
|
"name": "symfony/polyfill-php85",
|
||||||
"version": "v1.34.0",
|
"version": "v1.35.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/polyfill-php85.git",
|
"url": "https://github.com/symfony/polyfill-php85.git",
|
||||||
|
|
@ -2894,7 +2894,7 @@
|
||||||
"shim"
|
"shim"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/polyfill-php85/tree/v1.34.0"
|
"source": "https://github.com/symfony/polyfill-php85/tree/v1.35.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -2918,7 +2918,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-uuid",
|
"name": "symfony/polyfill-uuid",
|
||||||
"version": "v1.34.0",
|
"version": "v1.35.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/polyfill-uuid.git",
|
"url": "https://github.com/symfony/polyfill-uuid.git",
|
||||||
|
|
@ -2977,7 +2977,7 @@
|
||||||
"uuid"
|
"uuid"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/polyfill-uuid/tree/v1.34.0"
|
"source": "https://github.com/symfony/polyfill-uuid/tree/v1.35.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -3629,15 +3629,15 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "wpackagist-plugin/query-monitor",
|
"name": "wpackagist-plugin/query-monitor",
|
||||||
"version": "4.0.5",
|
"version": "4.0.6",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "svn",
|
"type": "svn",
|
||||||
"url": "https://plugins.svn.wordpress.org/query-monitor/",
|
"url": "https://plugins.svn.wordpress.org/query-monitor/",
|
||||||
"reference": "tags/4.0.5"
|
"reference": "tags/4.0.6"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://downloads.wordpress.org/plugin/query-monitor.4.0.5.zip"
|
"url": "https://downloads.wordpress.org/plugin/query-monitor.4.0.6.zip"
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"composer/installers": "^1.0 || ^2.0"
|
"composer/installers": "^1.0 || ^2.0"
|
||||||
|
|
@ -3701,15 +3701,15 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "wpackagist-plugin/woocommerce",
|
"name": "wpackagist-plugin/woocommerce",
|
||||||
"version": "10.6.2",
|
"version": "10.7.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "svn",
|
"type": "svn",
|
||||||
"url": "https://plugins.svn.wordpress.org/woocommerce/",
|
"url": "https://plugins.svn.wordpress.org/woocommerce/",
|
||||||
"reference": "tags/10.6.2"
|
"reference": "tags/10.7.0"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://downloads.wordpress.org/plugin/woocommerce.10.6.2.zip"
|
"url": "https://downloads.wordpress.org/plugin/woocommerce.10.7.0.zip"
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"composer/installers": "^1.0 || ^2.0"
|
"composer/installers": "^1.0 || ^2.0"
|
||||||
|
|
@ -4077,6 +4077,75 @@
|
||||||
],
|
],
|
||||||
"time": "2024-05-06T16:37:16+00:00"
|
"time": "2024-05-06T16:37:16+00:00"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "ergebnis/agent-detector",
|
||||||
|
"version": "1.1.1",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/ergebnis/agent-detector.git",
|
||||||
|
"reference": "5b654a9f1ff8a5d2ce6a57568df5ae8801c87f64"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/ergebnis/agent-detector/zipball/5b654a9f1ff8a5d2ce6a57568df5ae8801c87f64",
|
||||||
|
"reference": "5b654a9f1ff8a5d2ce6a57568df5ae8801c87f64",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0 || ~8.6.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"ergebnis/composer-normalize": "^2.50.0",
|
||||||
|
"ergebnis/license": "^2.7.0",
|
||||||
|
"ergebnis/php-cs-fixer-config": "^6.60.2",
|
||||||
|
"ergebnis/phpstan-rules": "^2.13.1",
|
||||||
|
"ergebnis/phpunit-slow-test-detector": "^2.24.0",
|
||||||
|
"ergebnis/rector-rules": "^1.16.0",
|
||||||
|
"fakerphp/faker": "^1.24.1",
|
||||||
|
"infection/infection": "^0.26.6",
|
||||||
|
"phpstan/extension-installer": "^1.4.3",
|
||||||
|
"phpstan/phpstan": "^2.1.46",
|
||||||
|
"phpstan/phpstan-deprecation-rules": "^2.0.4",
|
||||||
|
"phpstan/phpstan-phpunit": "^2.0.16",
|
||||||
|
"phpstan/phpstan-strict-rules": "^2.0.10",
|
||||||
|
"phpunit/phpunit": "^9.6.34",
|
||||||
|
"rector/rector": "^2.4.1"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-main": "1.0-dev"
|
||||||
|
},
|
||||||
|
"composer-normalize": {
|
||||||
|
"indent-size": 2,
|
||||||
|
"indent-style": "space"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Ergebnis\\AgentDetector\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Andreas Möller",
|
||||||
|
"email": "am@localheinz.com",
|
||||||
|
"homepage": "https://localheinz.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Provides a detector for detecting the presence of an agent.",
|
||||||
|
"homepage": "https://github.com/ergebnis/agent-detector",
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/ergebnis/agent-detector/issues",
|
||||||
|
"security": "https://github.com/ergebnis/agent-detector/blob/main/.github/SECURITY.md",
|
||||||
|
"source": "https://github.com/ergebnis/agent-detector"
|
||||||
|
},
|
||||||
|
"time": "2026-04-10T13:45:13+00:00"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "evenement/evenement",
|
"name": "evenement/evenement",
|
||||||
"version": "v3.0.2",
|
"version": "v3.0.2",
|
||||||
|
|
@ -4187,22 +4256,23 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "friendsofphp/php-cs-fixer",
|
"name": "friendsofphp/php-cs-fixer",
|
||||||
"version": "v3.94.2",
|
"version": "v3.95.1",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
|
"url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
|
||||||
"reference": "7787ceff91365ba7d623ec410b8f429cdebb4f63"
|
"reference": "a9727678fbd12997f1d9de8f4a37824ed9df1065"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/7787ceff91365ba7d623ec410b8f429cdebb4f63",
|
"url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/a9727678fbd12997f1d9de8f4a37824ed9df1065",
|
||||||
"reference": "7787ceff91365ba7d623ec410b8f429cdebb4f63",
|
"reference": "a9727678fbd12997f1d9de8f4a37824ed9df1065",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"clue/ndjson-react": "^1.3",
|
"clue/ndjson-react": "^1.3",
|
||||||
"composer/semver": "^3.4",
|
"composer/semver": "^3.4",
|
||||||
"composer/xdebug-handler": "^3.0.5",
|
"composer/xdebug-handler": "^3.0.5",
|
||||||
|
"ergebnis/agent-detector": "^1.1.1",
|
||||||
"ext-filter": "*",
|
"ext-filter": "*",
|
||||||
"ext-hash": "*",
|
"ext-hash": "*",
|
||||||
"ext-json": "*",
|
"ext-json": "*",
|
||||||
|
|
@ -4227,18 +4297,18 @@
|
||||||
"symfony/stopwatch": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0"
|
"symfony/stopwatch": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"facile-it/paraunit": "^1.3.1 || ^2.7.1",
|
"facile-it/paraunit": "^1.3.1 || ^2.8.0",
|
||||||
"infection/infection": "^0.32.3",
|
"infection/infection": "^0.32.6",
|
||||||
"justinrainbow/json-schema": "^6.6.4",
|
"justinrainbow/json-schema": "^6.8.0",
|
||||||
"keradus/cli-executor": "^2.3",
|
"keradus/cli-executor": "^2.3",
|
||||||
"mikey179/vfsstream": "^1.6.12",
|
"mikey179/vfsstream": "^1.6.12",
|
||||||
"php-coveralls/php-coveralls": "^2.9.1",
|
"php-coveralls/php-coveralls": "^2.9.1",
|
||||||
"php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.7",
|
"php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.8",
|
||||||
"php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.7",
|
"php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.8",
|
||||||
"phpunit/phpunit": "^9.6.34 || ^10.5.63 || ^11.5.51",
|
"phpunit/phpunit": "^9.6.34 || ^10.5.63 || ^11.5.55",
|
||||||
"symfony/polyfill-php85": "^1.33",
|
"symfony/polyfill-php85": "^1.33",
|
||||||
"symfony/var-dumper": "^5.4.48 || ^6.4.32 || ^7.4.4 || ^8.0.4",
|
"symfony/var-dumper": "^5.4.48 || ^6.4.32 || ^7.4.4 || ^8.0.8",
|
||||||
"symfony/yaml": "^5.4.45 || ^6.4.30 || ^7.4.1 || ^8.0.1"
|
"symfony/yaml": "^5.4.45 || ^6.4.30 || ^7.4.1 || ^8.0.8"
|
||||||
},
|
},
|
||||||
"suggest": {
|
"suggest": {
|
||||||
"ext-dom": "For handling output formats in XML",
|
"ext-dom": "For handling output formats in XML",
|
||||||
|
|
@ -4279,7 +4349,7 @@
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
|
"issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
|
||||||
"source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.94.2"
|
"source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.95.1"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -4287,7 +4357,7 @@
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-02-20T16:13:53+00:00"
|
"time": "2026-04-12T17:00:09+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "php-standard-library/phpstan-extension",
|
"name": "php-standard-library/phpstan-extension",
|
||||||
|
|
@ -4446,11 +4516,11 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpstan/phpstan",
|
"name": "phpstan/phpstan",
|
||||||
"version": "2.1.46",
|
"version": "2.1.47",
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/a193923fc2d6325ef4e741cf3af8c3e8f54dbf25",
|
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/79015445d8bd79e62b29140f12e5bfced1dcca65",
|
||||||
"reference": "a193923fc2d6325ef4e741cf3af8c3e8f54dbf25",
|
"reference": "79015445d8bd79e62b29140f12e5bfced1dcca65",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -4495,7 +4565,7 @@
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-04-01T09:25:14+00:00"
|
"time": "2026-04-13T15:49:08+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "psr/event-dispatcher",
|
"name": "psr/event-dispatcher",
|
||||||
|
|
@ -5129,12 +5199,12 @@
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/Roave/SecurityAdvisories.git",
|
"url": "https://github.com/Roave/SecurityAdvisories.git",
|
||||||
"reference": "d830a949e5c180e97c2245221daf8b589552cc2c"
|
"reference": "f8c7911d543be053da1601797a9d471110222b08"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/d830a949e5c180e97c2245221daf8b589552cc2c",
|
"url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/f8c7911d543be053da1601797a9d471110222b08",
|
||||||
"reference": "d830a949e5c180e97c2245221daf8b589552cc2c",
|
"reference": "f8c7911d543be053da1601797a9d471110222b08",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"conflict": {
|
"conflict": {
|
||||||
|
|
@ -5264,7 +5334,7 @@
|
||||||
"codingms/modules": "<4.3.11|>=5,<5.7.4|>=6,<6.4.2|>=7,<7.5.5",
|
"codingms/modules": "<4.3.11|>=5,<5.7.4|>=6,<6.4.2|>=7,<7.5.5",
|
||||||
"commerceteam/commerce": ">=0.9.6,<0.9.9",
|
"commerceteam/commerce": ">=0.9.6,<0.9.9",
|
||||||
"components/jquery": ">=1.0.3,<3.5",
|
"components/jquery": ">=1.0.3,<3.5",
|
||||||
"composer/composer": "<1.10.27|>=2,<2.2.26|>=2.3,<2.9.3",
|
"composer/composer": "<1.10.27|>=2,<2.2.27|>=2.3,<2.9.6",
|
||||||
"concrete5/concrete5": "<9.4.8",
|
"concrete5/concrete5": "<9.4.8",
|
||||||
"concrete5/core": "<8.5.8|>=9,<9.1",
|
"concrete5/core": "<8.5.8|>=9,<9.1",
|
||||||
"contao-components/mediaelement": ">=2.14.2,<2.21.1",
|
"contao-components/mediaelement": ">=2.14.2,<2.21.1",
|
||||||
|
|
@ -5281,7 +5351,7 @@
|
||||||
"cpsit/typo3-mailqueue": "<0.4.5|>=0.5,<0.5.2",
|
"cpsit/typo3-mailqueue": "<0.4.5|>=0.5,<0.5.2",
|
||||||
"craftcms/aws-s3": ">=2.0.2,<=2.2.4",
|
"craftcms/aws-s3": ">=2.0.2,<=2.2.4",
|
||||||
"craftcms/azure-blob": ">=2.0.0.0-beta1,<=2.1",
|
"craftcms/azure-blob": ">=2.0.0.0-beta1,<=2.1",
|
||||||
"craftcms/cms": "<=4.17.7|>=5,<=5.9.13",
|
"craftcms/cms": "<=4.17.8|>=5,<5.9.15",
|
||||||
"craftcms/commerce": ">=4,<4.11|>=5,<5.6",
|
"craftcms/commerce": ">=4,<4.11|>=5,<5.6",
|
||||||
"craftcms/composer": ">=4.0.0.0-RC1-dev,<=4.10|>=5.0.0.0-RC1-dev,<=5.5.1",
|
"craftcms/composer": ">=4.0.0.0-RC1-dev,<=4.10|>=5.0.0.0-RC1-dev,<=5.5.1",
|
||||||
"craftcms/craft": ">=3.5,<=4.16.17|>=5.0.0.0-RC1-dev,<=5.8.21",
|
"craftcms/craft": ">=3.5,<=4.16.17|>=5.0.0.0-RC1-dev,<=5.8.21",
|
||||||
|
|
@ -5549,7 +5619,7 @@
|
||||||
"kelvinmo/simplexrd": "<3.1.1",
|
"kelvinmo/simplexrd": "<3.1.1",
|
||||||
"kevinpapst/kimai2": "<1.16.7",
|
"kevinpapst/kimai2": "<1.16.7",
|
||||||
"khodakhah/nodcms": "<=3",
|
"khodakhah/nodcms": "<=3",
|
||||||
"kimai/kimai": "<=2.50",
|
"kimai/kimai": "<=2.52",
|
||||||
"kitodo/presentation": "<3.2.3|>=3.3,<3.3.4",
|
"kitodo/presentation": "<3.2.3|>=3.3,<3.3.4",
|
||||||
"klaviyo/magento2-extension": ">=1,<3",
|
"klaviyo/magento2-extension": ">=1,<3",
|
||||||
"knplabs/knp-snappy": "<=1.4.2",
|
"knplabs/knp-snappy": "<=1.4.2",
|
||||||
|
|
@ -5567,7 +5637,7 @@
|
||||||
"laravel/fortify": "<1.11.1",
|
"laravel/fortify": "<1.11.1",
|
||||||
"laravel/framework": "<10.48.29|>=11,<11.44.1|>=12,<12.1.1",
|
"laravel/framework": "<10.48.29|>=11,<11.44.1|>=12,<12.1.1",
|
||||||
"laravel/laravel": ">=5.4,<5.4.22",
|
"laravel/laravel": ">=5.4,<5.4.22",
|
||||||
"laravel/passport": "<13.7.1",
|
"laravel/passport": ">=13,<13.7.1",
|
||||||
"laravel/pulse": "<1.3.1",
|
"laravel/pulse": "<1.3.1",
|
||||||
"laravel/reverb": "<1.7",
|
"laravel/reverb": "<1.7",
|
||||||
"laravel/socialite": ">=1,<2.0.10",
|
"laravel/socialite": ">=1,<2.0.10",
|
||||||
|
|
@ -5690,8 +5760,8 @@
|
||||||
"october/backend": "<1.1.2",
|
"october/backend": "<1.1.2",
|
||||||
"october/cms": "<1.0.469|==1.0.469|==1.0.471|==1.1.1",
|
"october/cms": "<1.0.469|==1.0.469|==1.0.471|==1.1.1",
|
||||||
"october/october": "<3.7.5",
|
"october/october": "<3.7.5",
|
||||||
"october/rain": "<1.0.472|>=1.1,<1.1.2",
|
"october/rain": "<=3.7.13|>=4,<=4.1.9",
|
||||||
"october/system": "<=3.7.12|>=4,<=4.0.11",
|
"october/system": "<=3.7.13|>=4,<=4.1.9",
|
||||||
"oliverklee/phpunit": "<3.5.15",
|
"oliverklee/phpunit": "<3.5.15",
|
||||||
"omeka/omeka-s": "<4.0.3",
|
"omeka/omeka-s": "<4.0.3",
|
||||||
"onelogin/php-saml": "<2.21.1|>=3,<3.8.1|>=4,<4.3.1",
|
"onelogin/php-saml": "<2.21.1|>=3,<3.8.1|>=4,<4.3.1",
|
||||||
|
|
@ -5824,6 +5894,7 @@
|
||||||
"rudloff/rtmpdump-bin": "<=2.3.1",
|
"rudloff/rtmpdump-bin": "<=2.3.1",
|
||||||
"s-cart/core": "<=9.0.5",
|
"s-cart/core": "<=9.0.5",
|
||||||
"s-cart/s-cart": "<6.9",
|
"s-cart/s-cart": "<6.9",
|
||||||
|
"s9y/serendipity": "<2.6",
|
||||||
"sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1",
|
"sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1",
|
||||||
"sabre/dav": ">=1.6,<1.7.11|>=1.8,<1.8.9",
|
"sabre/dav": ">=1.6,<1.7.11|>=1.8,<1.8.9",
|
||||||
"saloonphp/saloon": "<4",
|
"saloonphp/saloon": "<4",
|
||||||
|
|
@ -6053,6 +6124,7 @@
|
||||||
"webcoast/deferred-image-processing": "<1.0.2",
|
"webcoast/deferred-image-processing": "<1.0.2",
|
||||||
"webklex/laravel-imap": "<5.3",
|
"webklex/laravel-imap": "<5.3",
|
||||||
"webklex/php-imap": "<5.3",
|
"webklex/php-imap": "<5.3",
|
||||||
|
"webonyx/graphql-php": "<=15.31.4",
|
||||||
"webpa/webpa": "<3.1.2",
|
"webpa/webpa": "<3.1.2",
|
||||||
"webreinvent/vaahcms": "<=2.3.1",
|
"webreinvent/vaahcms": "<=2.3.1",
|
||||||
"wikibase/wikibase": "<=1.39.3",
|
"wikibase/wikibase": "<=1.39.3",
|
||||||
|
|
@ -6072,7 +6144,7 @@
|
||||||
"wpcloud/wp-stateless": "<3.2",
|
"wpcloud/wp-stateless": "<3.2",
|
||||||
"wpglobus/wpglobus": "<=1.9.6",
|
"wpglobus/wpglobus": "<=1.9.6",
|
||||||
"wpmetabox/meta-box": "<5.11.2",
|
"wpmetabox/meta-box": "<5.11.2",
|
||||||
"wwbn/avideo": "<=26",
|
"wwbn/avideo": "<=29",
|
||||||
"xataface/xataface": "<3",
|
"xataface/xataface": "<3",
|
||||||
"xpressengine/xpressengine": "<3.0.15",
|
"xpressengine/xpressengine": "<3.0.15",
|
||||||
"yab/quarx": "<2.4.5",
|
"yab/quarx": "<2.4.5",
|
||||||
|
|
@ -6172,7 +6244,7 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-04-10T21:13:58+00:00"
|
"time": "2026-04-15T00:40:17+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "sebastian/diff",
|
"name": "sebastian/diff",
|
||||||
|
|
@ -6715,7 +6787,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-intl-grapheme",
|
"name": "symfony/polyfill-intl-grapheme",
|
||||||
"version": "v1.34.0",
|
"version": "v1.35.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/polyfill-intl-grapheme.git",
|
"url": "https://github.com/symfony/polyfill-intl-grapheme.git",
|
||||||
|
|
@ -6773,7 +6845,7 @@
|
||||||
"shim"
|
"shim"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.34.0"
|
"source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.35.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -6797,7 +6869,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-intl-normalizer",
|
"name": "symfony/polyfill-intl-normalizer",
|
||||||
"version": "v1.34.0",
|
"version": "v1.35.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
|
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
|
||||||
|
|
@ -6858,7 +6930,7 @@
|
||||||
"shim"
|
"shim"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.34.0"
|
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.35.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -6882,7 +6954,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-php81",
|
"name": "symfony/polyfill-php81",
|
||||||
"version": "v1.34.0",
|
"version": "v1.35.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/polyfill-php81.git",
|
"url": "https://github.com/symfony/polyfill-php81.git",
|
||||||
|
|
@ -6938,7 +7010,7 @@
|
||||||
"shim"
|
"shim"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/polyfill-php81/tree/v1.34.0"
|
"source": "https://github.com/symfony/polyfill-php81/tree/v1.35.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -7411,16 +7483,16 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "webmozart/assert",
|
"name": "webmozart/assert",
|
||||||
"version": "2.2.0",
|
"version": "2.3.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/webmozarts/assert.git",
|
"url": "https://github.com/webmozarts/assert.git",
|
||||||
"reference": "1b99650e7ffcad232624a260bc7fbdec2ffc407c"
|
"reference": "eb0d790f735ba6cff25c683a85a1da0eadeff9e4"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/webmozarts/assert/zipball/1b99650e7ffcad232624a260bc7fbdec2ffc407c",
|
"url": "https://api.github.com/repos/webmozarts/assert/zipball/eb0d790f735ba6cff25c683a85a1da0eadeff9e4",
|
||||||
"reference": "1b99650e7ffcad232624a260bc7fbdec2ffc407c",
|
"reference": "eb0d790f735ba6cff25c683a85a1da0eadeff9e4",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -7467,9 +7539,9 @@
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/webmozarts/assert/issues",
|
"issues": "https://github.com/webmozarts/assert/issues",
|
||||||
"source": "https://github.com/webmozarts/assert/tree/2.2.0"
|
"source": "https://github.com/webmozarts/assert/tree/2.3.0"
|
||||||
},
|
},
|
||||||
"time": "2026-04-09T16:54:47+00:00"
|
"time": "2026-04-11T10:33:05+00:00"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
|
|
@ -7484,5 +7556,5 @@
|
||||||
"php": ">=8.5"
|
"php": ">=8.5"
|
||||||
},
|
},
|
||||||
"platform-dev": {},
|
"platform-dev": {},
|
||||||
"plugin-api-version": "2.6.0"
|
"plugin-api-version": "2.9.0"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -37,16 +37,16 @@ $webroot_dir = $root_dir . '/web';
|
||||||
* .env.local will override .env if it exists
|
* .env.local will override .env if it exists
|
||||||
*/
|
*/
|
||||||
if (file_exists($root_dir . '/.env')) {
|
if (file_exists($root_dir . '/.env')) {
|
||||||
$env_files = file_exists($root_dir . '/.env.local') ? ['.env', '.env.local'] : ['.env'];
|
$env_files = file_exists($root_dir . '/.env.local') ? ['.env', '.env.local'] : ['.env'];
|
||||||
|
|
||||||
$dotenv = Dotenv\Dotenv::createImmutable($root_dir, $env_files, false);
|
$dotenv = Dotenv\Dotenv::createImmutable($root_dir, $env_files, false);
|
||||||
|
|
||||||
$dotenv->load();
|
$dotenv->load();
|
||||||
|
|
||||||
$dotenv->required(['WP_HOME', 'WP_SITEURL']);
|
$dotenv->required(['WP_HOME', 'WP_SITEURL']);
|
||||||
if (!env('DATABASE_URL')) {
|
if (!env('DATABASE_URL')) {
|
||||||
$dotenv->required(['DB_NAME', 'DB_USER', 'DB_PASSWORD']);
|
$dotenv->required(['DB_NAME', 'DB_USER', 'DB_PASSWORD']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -57,7 +57,7 @@ define('WP_ENV', env('WP_ENV') ?: 'production');
|
||||||
|
|
||||||
// Infer WP_ENVIRONMENT_TYPE based on WP_ENV
|
// Infer WP_ENVIRONMENT_TYPE based on WP_ENV
|
||||||
if (!env('WP_ENVIRONMENT_TYPE') && in_array(WP_ENV, ['production', 'staging', 'development', 'local'], true)) {
|
if (!env('WP_ENVIRONMENT_TYPE') && in_array(WP_ENV, ['production', 'staging', 'development', 'local'], true)) {
|
||||||
Config::define('WP_ENVIRONMENT_TYPE', WP_ENV);
|
Config::define('WP_ENVIRONMENT_TYPE', WP_ENV);
|
||||||
}
|
}
|
||||||
|
|
||||||
// URLs
|
// URLs
|
||||||
|
|
@ -71,7 +71,7 @@ Config::define('WP_CONTENT_URL', Config::get('WP_HOME') . Config::get('CONTENT_D
|
||||||
|
|
||||||
// DB settings
|
// DB settings
|
||||||
if (env('DB_SSL')) {
|
if (env('DB_SSL')) {
|
||||||
Config::define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);
|
Config::define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);
|
||||||
}
|
}
|
||||||
|
|
||||||
Config::define('DB_NAME', env('DB_NAME'));
|
Config::define('DB_NAME', env('DB_NAME'));
|
||||||
|
|
@ -83,12 +83,12 @@ Config::define('DB_COLLATE', '');
|
||||||
$table_prefix = env('DB_PREFIX') ?: 'wp_';
|
$table_prefix = env('DB_PREFIX') ?: 'wp_';
|
||||||
|
|
||||||
if (env('DATABASE_URL')) {
|
if (env('DATABASE_URL')) {
|
||||||
$dsn = (object) parse_url(env('DATABASE_URL'));
|
$dsn = (object) parse_url(env('DATABASE_URL'));
|
||||||
|
|
||||||
Config::define('DB_NAME', mb_substr($dsn->path, 1));
|
Config::define('DB_NAME', mb_substr($dsn->path, 1));
|
||||||
Config::define('DB_USER', $dsn->user);
|
Config::define('DB_USER', $dsn->user);
|
||||||
Config::define('DB_PASSWORD', $dsn->pass ?? null);
|
Config::define('DB_PASSWORD', $dsn->pass ?? null);
|
||||||
Config::define('DB_HOST', isset($dsn->port) ? "{$dsn->host}:{$dsn->port}" : $dsn->host);
|
Config::define('DB_HOST', isset($dsn->port) ? "{$dsn->host}:{$dsn->port}" : $dsn->host);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Authentication Unique Keys and Salts
|
// Authentication Unique Keys and Salts
|
||||||
|
|
@ -129,18 +129,18 @@ Config::define('WP_PLUGIN_DIR', Config::get('WP_CONTENT_DIR') . '/plugins');
|
||||||
* See https://codex.wordpress.org/Function_Reference/is_ssl#Notes
|
* See https://codex.wordpress.org/Function_Reference/is_ssl#Notes
|
||||||
*/
|
*/
|
||||||
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && 'https' === $_SERVER['HTTP_X_FORWARDED_PROTO']) {
|
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && 'https' === $_SERVER['HTTP_X_FORWARDED_PROTO']) {
|
||||||
$_SERVER['HTTPS'] = 'on';
|
$_SERVER['HTTPS'] = 'on';
|
||||||
}
|
}
|
||||||
|
|
||||||
$env_config = __DIR__ . '/environments/' . WP_ENV . '.php';
|
$env_config = __DIR__ . '/environments/' . WP_ENV . '.php';
|
||||||
|
|
||||||
if (file_exists($env_config)) {
|
if (file_exists($env_config)) {
|
||||||
include_once $env_config;
|
include_once $env_config;
|
||||||
}
|
}
|
||||||
|
|
||||||
Config::apply();
|
Config::apply();
|
||||||
|
|
||||||
// Bootstrap WordPress
|
// Bootstrap WordPress
|
||||||
if (!defined('ABSPATH')) {
|
if (!defined('ABSPATH')) {
|
||||||
define('ABSPATH', $webroot_dir . '/wp/');
|
define('ABSPATH', $webroot_dir . '/wp/');
|
||||||
}
|
}
|
||||||
|
|
|
||||||
1689
mago-schema.json
1689
mago-schema.json
File diff suppressed because it is too large
Load diff
|
|
@ -37,27 +37,29 @@ threads = 0
|
||||||
|
|
||||||
[analyzer]
|
[analyzer]
|
||||||
allow-possibly-undefined-array-keys = false
|
allow-possibly-undefined-array-keys = false
|
||||||
|
allow-side-effects-in-conditions = true
|
||||||
analyze-dead-code = true
|
analyze-dead-code = true
|
||||||
check-arrow-function-missing-type-hints = true
|
check-arrow-function-missing-type-hints = true
|
||||||
check-closure-missing-type-hints = true
|
check-closure-missing-type-hints = true
|
||||||
|
check-experimental = true
|
||||||
check-missing-override = true
|
check-missing-override = true
|
||||||
check-missing-type-hints = true
|
check-missing-type-hints = true
|
||||||
|
check-name-casing = true
|
||||||
check-property-initialization = true
|
check-property-initialization = true
|
||||||
check-throws = true
|
check-throws = true
|
||||||
check-use-statements = true
|
check-use-statements = true
|
||||||
enforce-class-finality = true
|
enforce-class-finality = true
|
||||||
|
find-overly-wide-return-types = true
|
||||||
find-unused-definitions = true
|
find-unused-definitions = true
|
||||||
find-unused-expressions = true
|
find-unused-expressions = true
|
||||||
find-unused-parameters = true
|
find-unused-parameters = true
|
||||||
|
memoize-properties = true
|
||||||
no-boolean-literal-comparison = false
|
no-boolean-literal-comparison = false
|
||||||
perform-heuristic-checks = true
|
perform-heuristic-checks = true
|
||||||
plugins = ["psl"]
|
plugins = ["psl"]
|
||||||
require-api-or-internal = true
|
require-api-or-internal = true
|
||||||
strict-list-index-checks = true
|
strict-list-index-checks = true
|
||||||
trust-existence-checks = false
|
trust-existence-checks = false
|
||||||
check-experimental = true
|
|
||||||
check-name-casing = true
|
|
||||||
memoize-properties = true
|
|
||||||
|
|
||||||
[analyzer.performance]
|
[analyzer.performance]
|
||||||
array-combination-threshold = 256
|
array-combination-threshold = 256
|
||||||
|
|
|
||||||
20
package.json
20
package.json
|
|
@ -14,7 +14,7 @@
|
||||||
"@mobily/ts-belt": "v4.0.0-rc.5",
|
"@mobily/ts-belt": "v4.0.0-rc.5",
|
||||||
"@sentry/browser": "^10.47.0",
|
"@sentry/browser": "^10.47.0",
|
||||||
"a11y-dialog": "^8.1.5",
|
"a11y-dialog": "^8.1.5",
|
||||||
"effect": "^4.0.0-beta.46",
|
"effect": "^4.0.0-beta.49",
|
||||||
"lit-html": "^3.3.2",
|
"lit-html": "^3.3.2",
|
||||||
"purify-ts": "2.1.2",
|
"purify-ts": "2.1.2",
|
||||||
"ts-pattern": "^5.9.0",
|
"ts-pattern": "^5.9.0",
|
||||||
|
|
@ -32,34 +32,34 @@
|
||||||
"@vitejs/plugin-legacy": "^8.0.1",
|
"@vitejs/plugin-legacy": "^8.0.1",
|
||||||
"better-typescript-lib": "^2.12.0",
|
"better-typescript-lib": "^2.12.0",
|
||||||
"browserslist": "^4.28.2",
|
"browserslist": "^4.28.2",
|
||||||
"caniuse-lite": "^1.0.30001787",
|
"caniuse-lite": "^1.0.30001788",
|
||||||
"eslint": "^10.2.0",
|
"eslint": "^10.2.0",
|
||||||
"eslint-plugin-functional": "^9.0.4",
|
"eslint-plugin-functional": "^9.0.4",
|
||||||
"eslint-plugin-jsx-a11y": "^6.10.2",
|
"eslint-plugin-jsx-a11y": "^6.10.2",
|
||||||
"eslint-plugin-oxlint": "^1.59.0",
|
"eslint-plugin-oxlint": "^1.60.0",
|
||||||
"eslint-plugin-perfectionist": "^5.8.0",
|
"eslint-plugin-perfectionist": "^5.8.0",
|
||||||
"eslint-plugin-sonarjs": "^4.0.2",
|
"eslint-plugin-sonarjs": "^4.0.2",
|
||||||
"fdir": "^6.5.0",
|
"fdir": "^6.5.0",
|
||||||
"globals": "^17.4.0",
|
"globals": "^17.5.0",
|
||||||
"jiti": "^2.6.1",
|
"jiti": "^2.6.1",
|
||||||
"knip": "^6.3.1",
|
"knip": "^6.4.1",
|
||||||
"lightningcss": "^1.32.0",
|
"lightningcss": "^1.32.0",
|
||||||
"lightningcss-cli": "^1.32.0",
|
"lightningcss-cli": "^1.32.0",
|
||||||
"oxlint": "^1.59.0",
|
"oxlint": "^1.60.0",
|
||||||
"oxlint-tsgolint": "^0.20.0",
|
"oxlint-tsgolint": "^0.21.0",
|
||||||
"playwright": "^1.59.1",
|
"playwright": "^1.59.1",
|
||||||
"prettier": "^3.8.1",
|
"prettier": "^3.8.3",
|
||||||
"prettier-plugin-pkg": "^0.22.1",
|
"prettier-plugin-pkg": "^0.22.1",
|
||||||
"prettier-plugin-sh": "^0.18.1",
|
"prettier-plugin-sh": "^0.18.1",
|
||||||
"sass-embedded": "^1.99.0",
|
"sass-embedded": "^1.99.0",
|
||||||
"stylelint": "^17.6.0",
|
"stylelint": "^17.7.0",
|
||||||
"stylelint-config-clean-order": "^8.0.1",
|
"stylelint-config-clean-order": "^8.0.1",
|
||||||
"stylelint-config-sass-guidelines": "^13.0.0",
|
"stylelint-config-sass-guidelines": "^13.0.0",
|
||||||
"stylelint-config-standard-scss": "^17.0.0",
|
"stylelint-config-standard-scss": "^17.0.0",
|
||||||
"stylelint-declaration-block-no-ignored-properties": "^3.0.0",
|
"stylelint-declaration-block-no-ignored-properties": "^3.0.0",
|
||||||
"stylelint-plugin-logical-css": "^2.1.0",
|
"stylelint-plugin-logical-css": "^2.1.0",
|
||||||
"typescript": "6.0.2",
|
"typescript": "6.0.2",
|
||||||
"typescript-eslint": "^8.58.1",
|
"typescript-eslint": "^8.58.2",
|
||||||
"vite": "^8.0.8",
|
"vite": "^8.0.8",
|
||||||
"vite-tsconfig-paths": "^6.1.1"
|
"vite-tsconfig-paths": "^6.1.1"
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -14,32 +14,32 @@ global $wpdb;
|
||||||
$wp_postmeta = "{$wpdb->prefix}postmeta";
|
$wp_postmeta = "{$wpdb->prefix}postmeta";
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
||||||
// Error Handling
|
// Error Handling
|
||||||
$sql = "UPDATE {$wp_postmeta} SET meta_value = REPLACE(meta_value,'-scaled.jpg','.jpg') WHERE meta_key='_wp_attached_file' AND meta_value LIKE '%-scaled.jpg%'";
|
$sql = "UPDATE {$wp_postmeta} SET meta_value = REPLACE(meta_value,'-scaled.jpg','.jpg') WHERE meta_key='_wp_attached_file' AND meta_value LIKE '%-scaled.jpg%'";
|
||||||
$result = $pdo->exec($sql);
|
$result = $pdo->exec($sql);
|
||||||
print_r($result);
|
print_r($result);
|
||||||
} catch (PDOException $e) {
|
} catch (PDOException $e) {
|
||||||
print_r($e->getMessage());
|
print_r($e->getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
// replace _wp_attachment_metadata meta_key.
|
// replace _wp_attachment_metadata meta_key.
|
||||||
$image_metas = [];
|
$image_metas = [];
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
||||||
// Error Handling
|
// Error Handling
|
||||||
$sql = "SELECT * FROM {$wp_postmeta} WHERE meta_value LIKE '%-scaled.jpg%' AND meta_key='_wp_attachment_metadata'";
|
$sql = "SELECT * FROM {$wp_postmeta} WHERE meta_value LIKE '%-scaled.jpg%' AND meta_key='_wp_attachment_metadata'";
|
||||||
$statement = $pdo->query($sql);
|
$statement = $pdo->query($sql);
|
||||||
$image_metas = $statement->fetchAll();
|
$image_metas = $statement->fetchAll();
|
||||||
foreach ($image_metas as $meta) {
|
foreach ($image_metas as $meta) {
|
||||||
$meta_value = unserialize($meta['meta_value']);
|
$meta_value = unserialize($meta['meta_value']);
|
||||||
$file = $meta_value['file'];
|
$file = $meta_value['file'];
|
||||||
$meta_value['file'] = str_replace('-scaled.jpg', '.jpg', $file);
|
$meta_value['file'] = str_replace('-scaled.jpg', '.jpg', $file);
|
||||||
update_post_meta($meta['post_id'], $meta['meta_key'], $meta_value);
|
update_post_meta($meta['post_id'], $meta['meta_key'], $meta_value);
|
||||||
$result = get_post_meta($meta['post_id'], $meta['meta_key']);
|
$result = get_post_meta($meta['post_id'], $meta['meta_key']);
|
||||||
print_r($result);
|
print_r($result);
|
||||||
}
|
}
|
||||||
} catch (PDOException $e) {
|
} catch (PDOException $e) {
|
||||||
print_r($e->getMessage());
|
print_r($e->getMessage());
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -22,12 +22,11 @@ $templates = ['404.twig'];
|
||||||
*
|
*
|
||||||
* @throws Exception une exception est levée s'il est impossible d'obtenir la date de modification du fichier à charger
|
* @throws Exception une exception est levée s'il est impossible d'obtenir la date de modification du fichier à charger
|
||||||
*/
|
*/
|
||||||
function load_page_resources(): void
|
function load_page_resources(): void {
|
||||||
{
|
Resource::enqueue_style_file(
|
||||||
Resource::enqueue_style_file(
|
handle: 'haiku-atelier-2024-styles-page-a-propos',
|
||||||
handle: 'haiku-atelier-2024-styles-page-a-propos',
|
path: '/assets/css/pages/page-modele-simple.css',
|
||||||
path: '/assets/css/pages/page-modele-simple.css',
|
);
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
add_action('wp_enqueue_scripts', load_page_resources(...));
|
add_action('wp_enqueue_scripts', load_page_resources(...));
|
||||||
|
|
|
||||||
|
|
@ -17,14 +17,14 @@ $context = Timber::context();
|
||||||
$templates = ['accueil.twig'];
|
$templates = ['accueil.twig'];
|
||||||
|
|
||||||
add_action('wp_enqueue_scripts', function (): void {
|
add_action('wp_enqueue_scripts', function (): void {
|
||||||
Resource::enqueue_style_file(
|
Resource::enqueue_style_file(
|
||||||
handle: 'haiku-atelier-2024-styles-page-accueil',
|
handle: 'haiku-atelier-2024-styles-page-accueil',
|
||||||
path: '/assets/css/pages/page-accueil.css',
|
path: '/assets/css/pages/page-accueil.css',
|
||||||
);
|
);
|
||||||
Resource::enqueue_script_module_file(
|
Resource::enqueue_script_module_file(
|
||||||
id: 'haiku-atelier-2024-scripts-page-accueil',
|
id: 'haiku-atelier-2024-scripts-page-accueil',
|
||||||
path: '/assets/js/scripts-page-accueil.js',
|
path: '/assets/js/scripts-page-accueil.js',
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
Timber::render(data: $context, filenames: $templates);
|
Timber::render(data: $context, filenames: $templates);
|
||||||
|
|
|
||||||
|
|
@ -24,20 +24,20 @@ $templates = ['a-propos.twig'];
|
||||||
$image_dimensions = getimagesize(filename: get_template_directory() . '/assets/img/about/haikuabout.png');
|
$image_dimensions = getimagesize(filename: get_template_directory() . '/assets/img/about/haikuabout.png');
|
||||||
|
|
||||||
if (is_bool($image_dimensions)) {
|
if (is_bool($image_dimensions)) {
|
||||||
throw new Exception("Impossible d'obtenir les dimensions de l'image principale de la page.");
|
throw new Exception("Impossible d'obtenir les dimensions de l'image principale de la page.");
|
||||||
}
|
}
|
||||||
|
|
||||||
$context['image_dimensions'] = $image_dimensions;
|
$context['image_dimensions'] = $image_dimensions;
|
||||||
|
|
||||||
add_action('wp_enqueue_scripts', function (): void {
|
add_action('wp_enqueue_scripts', function (): void {
|
||||||
Resource::enqueue_style_file(
|
Resource::enqueue_style_file(
|
||||||
handle: 'haiku-atelier-2024-styles-page-a-propos',
|
handle: 'haiku-atelier-2024-styles-page-a-propos',
|
||||||
path: '/assets/css/pages/page-a-propos.css',
|
path: '/assets/css/pages/page-a-propos.css',
|
||||||
);
|
);
|
||||||
Resource::enqueue_script_module_file(
|
Resource::enqueue_script_module_file(
|
||||||
id: 'haiku-atelier-2024-scripts-page-a-propos',
|
id: 'haiku-atelier-2024-scripts-page-a-propos',
|
||||||
path: '/assets/js/scripts-page-a-propos.js',
|
path: '/assets/js/scripts-page-a-propos.js',
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
Timber::render(data: $context, filenames: $templates);
|
Timber::render(data: $context, filenames: $templates);
|
||||||
|
|
|
||||||
|
|
@ -22,22 +22,20 @@ use WC_Session_Handler;
|
||||||
header('Content-Type: application/json; charset=utf-8');
|
header('Content-Type: application/json; charset=utf-8');
|
||||||
|
|
||||||
// TODO: Appliquer le bon calcul pour les montants vs. percentages
|
// TODO: Appliquer le bon calcul pour les montants vs. percentages
|
||||||
function get_discount_amount(WC_Coupon $coupon)
|
function get_discount_amount(WC_Coupon $coupon) {
|
||||||
{
|
if ($coupon->get_discount_type() === 'fixed_cart') {
|
||||||
if ($coupon->get_discount_type() === 'fixed_cart') {
|
return $coupon->get_amount() * 100;
|
||||||
return $coupon->get_amount() * 100;
|
} else {
|
||||||
} else {
|
return $coupon->get_amount();
|
||||||
return $coupon->get_amount();
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function get_discount_duration(WC_Coupon $coupon): string
|
function get_discount_duration(WC_Coupon $coupon): string {
|
||||||
{
|
if ($coupon->get_discount_type() === 'fixed_cart') {
|
||||||
if ($coupon->get_discount_type() === 'fixed_cart') {
|
return 'once';
|
||||||
return 'once';
|
} else {
|
||||||
} else {
|
return 'forever';
|
||||||
return 'forever';
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Récupère les informations nécessaires
|
// Récupère les informations nécessaires
|
||||||
|
|
@ -46,37 +44,37 @@ $session_wc = WC()->session;
|
||||||
|
|
||||||
/** @var array<string,string> $urls URLs utilisables pour rediriger l'Utilisateur. */
|
/** @var array<string,string> $urls URLs utilisables pour rediriger l'Utilisateur. */
|
||||||
$urls = [
|
$urls = [
|
||||||
'accueil' => get_page_link(get_page_by_path('home')),
|
'accueil' => get_page_link(get_page_by_path('home')),
|
||||||
'succes_commande' => get_page_link(get_page_by_path('successful-order')),
|
'succes_commande' => get_page_link(get_page_by_path('successful-order')),
|
||||||
'echec_commande' => get_page_link(get_page_by_path('failed-order')),
|
'echec_commande' => get_page_link(get_page_by_path('failed-order')),
|
||||||
];
|
];
|
||||||
|
|
||||||
// Redirige à la page d'accueil si le Panier est vide
|
// Redirige à la page d'accueil si le Panier est vide
|
||||||
if (WC()->cart->is_empty()) {
|
if (WC()->cart->is_empty()) {
|
||||||
header('Location: ' . $urls['accueil']);
|
header('Location: ' . $urls['accueil']);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Vérifie que les paramètres d'URLs nécessaires soient présents
|
// Vérifie que les paramètres d'URLs nécessaires soient présents
|
||||||
/** @var string $order_id */
|
/** @var string $order_id */
|
||||||
$order_id = $_GET['order_id'];
|
$order_id = $_GET['order_id'];
|
||||||
if (!$order_id) {
|
if (!$order_id) {
|
||||||
$reponse = ['succes' => false, 'status' => 'order_key is missing'];
|
$reponse = ['succes' => false, 'status' => 'order_key is missing'];
|
||||||
echo json_encode($reponse);
|
echo json_encode($reponse);
|
||||||
http_response_code(400);
|
http_response_code(400);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @var string $order_key */
|
/** @var string $order_key */
|
||||||
$order_key = $_GET['order_key'];
|
$order_key = $_GET['order_key'];
|
||||||
if (!$order_key) {
|
if (!$order_key) {
|
||||||
$reponse = ['succes' => false, 'status' => 'order_key is missing'];
|
$reponse = ['succes' => false, 'status' => 'order_key is missing'];
|
||||||
echo json_encode($reponse);
|
echo json_encode($reponse);
|
||||||
http_response_code(400);
|
http_response_code(400);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Récupère le Panier et l'Email du Client
|
// Récupère le Panier et l'Email du Client
|
||||||
|
|
@ -88,29 +86,29 @@ $email_client = WC()->session->get('customer')['email'];
|
||||||
|
|
||||||
/** @var list<Product> $articles */
|
/** @var list<Product> $articles */
|
||||||
$articles = collect($panier->get_cart())
|
$articles = collect($panier->get_cart())
|
||||||
->map(static function ($article_panier) {
|
->map(static function ($article_panier) {
|
||||||
$titre_produit = match ('variable' === $article_panier['data']?->get_type()) {
|
$titre_produit = match ('variable' === $article_panier['data']?->get_type()) {
|
||||||
true => $article_panier['data']?->get_title()
|
true => $article_panier['data']?->get_title()
|
||||||
. ' ('
|
. ' ('
|
||||||
. explode(': ', (string) $article_panier['data']?->get_attribute_summary())[1]
|
. explode(': ', (string) $article_panier['data']?->get_attribute_summary())[1]
|
||||||
. ')',
|
. ')',
|
||||||
false => $article_panier['data']?->get_title(),
|
false => $article_panier['data']?->get_title(),
|
||||||
};
|
};
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'price_data' => [
|
'price_data' => [
|
||||||
'currency' => 'EUR',
|
'currency' => 'EUR',
|
||||||
'product_data' => [
|
'product_data' => [
|
||||||
'name' => $titre_produit,
|
'name' => $titre_produit,
|
||||||
'images' => [wp_get_attachment_image_url($article_panier['data']?->get_image_id())],
|
'images' => [wp_get_attachment_image_url($article_panier['data']?->get_image_id())],
|
||||||
],
|
],
|
||||||
'unit_amount' => $article_panier['data']?->get_price() * 100,
|
'unit_amount' => $article_panier['data']?->get_price() * 100,
|
||||||
],
|
],
|
||||||
'quantity' => $article_panier['quantity'],
|
'quantity' => $article_panier['quantity'],
|
||||||
];
|
];
|
||||||
})
|
})
|
||||||
->values()
|
->values()
|
||||||
->toArray();
|
->toArray();
|
||||||
|
|
||||||
// Récupère la Commande et la Méthode de Livraison
|
// Récupère la Commande et la Méthode de Livraison
|
||||||
/** @var WC_Order $commande */
|
/** @var WC_Order $commande */
|
||||||
|
|
@ -120,7 +118,7 @@ $methode_livraison = ['nom' => $commande->get_shipping_method(), 'cout' => $comm
|
||||||
|
|
||||||
// Le nom de la méthode de livraison ne peut être une chaîne vide.
|
// Le nom de la méthode de livraison ne peut être une chaîne vide.
|
||||||
if (empty($methode_livraison['nom'])) {
|
if (empty($methode_livraison['nom'])) {
|
||||||
$methode_livraison['nom'] = 'Free';
|
$methode_livraison['nom'] = 'Free';
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sélectionne la clé API Stripe
|
// Sélectionne la clé API Stripe
|
||||||
|
|
@ -129,39 +127,39 @@ Stripe::setApiKey(Config::get('STRIPE_API_SECRET'));
|
||||||
// Met à jour les Codes promos
|
// Met à jour les Codes promos
|
||||||
$coupons_stripe = collect(Coupon::all()->data);
|
$coupons_stripe = collect(Coupon::all()->data);
|
||||||
$coupons_wc = collect(WC()->cart->get_coupons())
|
$coupons_wc = collect(WC()->cart->get_coupons())
|
||||||
->map(static fn(WC_Coupon $coupon): array => [
|
->map(static fn(WC_Coupon $coupon): array => [
|
||||||
'currency' => 'EUR',
|
'currency' => 'EUR',
|
||||||
'duration' => get_discount_duration($coupon),
|
'duration' => get_discount_duration($coupon),
|
||||||
'fixed_cart' === $coupon->get_discount_type() ? 'amount_off' : 'percent_off' => get_discount_amount($coupon),
|
'fixed_cart' === $coupon->get_discount_type() ? 'amount_off' : 'percent_off' => get_discount_amount($coupon),
|
||||||
'id' => $coupon->get_code(),
|
'id' => $coupon->get_code(),
|
||||||
'name' => $coupon->get_code(),
|
'name' => $coupon->get_code(),
|
||||||
])
|
])
|
||||||
->each(static function (array $item) use ($coupons_stripe): void {
|
->each(static function (array $item) use ($coupons_stripe): void {
|
||||||
// Si le code promo n'existe pas, le créer
|
// Si le code promo n'existe pas, le créer
|
||||||
if (!$coupons_stripe->contains('name', $item['name'])) {
|
if (!$coupons_stripe->contains('name', $item['name'])) {
|
||||||
Coupon::create($item);
|
Coupon::create($item);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
$reductions_stripe = $coupons_wc
|
$reductions_stripe = $coupons_wc
|
||||||
->map(static fn($coupon): array => ['coupon' => $coupon['name']])
|
->map(static fn($coupon): array => ['coupon' => $coupon['name']])
|
||||||
->values()
|
->values()
|
||||||
->toArray();
|
->toArray();
|
||||||
|
|
||||||
/** @var Session $session_checkout_stripe */
|
/** @var Session $session_checkout_stripe */
|
||||||
$session_checkout_stripe = Session::create([
|
$session_checkout_stripe = Session::create([
|
||||||
'cancel_url' => $urls['echec_commande'],
|
'cancel_url' => $urls['echec_commande'],
|
||||||
'customer_email' => $email_client,
|
'customer_email' => $email_client,
|
||||||
'discounts' => $reductions_stripe,
|
'discounts' => $reductions_stripe,
|
||||||
'line_items' => $articles,
|
'line_items' => $articles,
|
||||||
'mode' => 'payment',
|
'mode' => 'payment',
|
||||||
'success_url' => $urls['succes_commande'] . '?session_id={CHECKOUT_SESSION_ID}',
|
'success_url' => $urls['succes_commande'] . '?session_id={CHECKOUT_SESSION_ID}',
|
||||||
'metadata' => ['order_id' => $order_id, 'order_key' => $order_key],
|
'metadata' => ['order_id' => $order_id, 'order_key' => $order_key],
|
||||||
'shipping_options' => [['shipping_rate_data' => [
|
'shipping_options' => [['shipping_rate_data' => [
|
||||||
'display_name' => $methode_livraison['nom'],
|
'display_name' => $methode_livraison['nom'],
|
||||||
'fixed_amount' => ['amount' => $methode_livraison['cout'], 'currency' => 'EUR'],
|
'fixed_amount' => ['amount' => $methode_livraison['cout'], 'currency' => 'EUR'],
|
||||||
'tax_behavior' => 'inclusive',
|
'tax_behavior' => 'inclusive',
|
||||||
'type' => 'fixed_amount',
|
'type' => 'fixed_amount',
|
||||||
]]],
|
]]],
|
||||||
], ['idempotency_key' => Uuid::v4()]);
|
], ['idempotency_key' => Uuid::v4()]);
|
||||||
// echo json_encode($session_checkout_stripe);
|
// echo json_encode($session_checkout_stripe);
|
||||||
header('HTTP/1.1 303 See Other');
|
header('HTTP/1.1 303 See Other');
|
||||||
|
|
|
||||||
|
|
@ -17,10 +17,10 @@ $context = Timber::context();
|
||||||
$templates = ['echec-commande.twig'];
|
$templates = ['echec-commande.twig'];
|
||||||
|
|
||||||
add_action('wp_enqueue_scripts', function (): void {
|
add_action('wp_enqueue_scripts', function (): void {
|
||||||
Resource::enqueue_style_file(
|
Resource::enqueue_style_file(
|
||||||
handle: 'haiku-atelier-2024-styles-page-modele-simple',
|
handle: 'haiku-atelier-2024-styles-page-modele-simple',
|
||||||
path: '/assets/css/pages/page-modele-simple.css',
|
path: '/assets/css/pages/page-modele-simple.css',
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Rendu
|
// Rendu
|
||||||
|
|
|
||||||
|
|
@ -17,10 +17,10 @@ $context = Timber::context();
|
||||||
$templates = ['cgv.twig'];
|
$templates = ['cgv.twig'];
|
||||||
|
|
||||||
add_action('wp_enqueue_scripts', function (): void {
|
add_action('wp_enqueue_scripts', function (): void {
|
||||||
Resource::enqueue_style_file(
|
Resource::enqueue_style_file(
|
||||||
handle: '/assets/css/pages/page-modele-simple.css',
|
handle: '/assets/css/pages/page-modele-simple.css',
|
||||||
path: '/assets/css/pages/page-modele-simple.css',
|
path: '/assets/css/pages/page-modele-simple.css',
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Rendu
|
// Rendu
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,9 @@ use function add_action;
|
||||||
use function assert;
|
use function assert;
|
||||||
use function collect;
|
use function collect;
|
||||||
use function is_array;
|
use function is_array;
|
||||||
|
use function is_string;
|
||||||
use function wc_get_product;
|
use function wc_get_product;
|
||||||
|
use function wp_create_nonce;
|
||||||
use function wp_json_encode;
|
use function wp_json_encode;
|
||||||
|
|
||||||
$context = Timber::context();
|
$context = Timber::context();
|
||||||
|
|
@ -66,12 +68,19 @@ $product_tags = $raw_product->get_tag_ids()
|
||||||
|> (static fn(/** @var list<Option<WC_Term>> */ $tags) => Arr::map($tags, static fn($tag) => $tag->unwrap()));
|
|> (static fn(/** @var list<Option<WC_Term>> */ $tags) => Arr::map($tags, static fn($tag) => $tag->unwrap()));
|
||||||
$tags = get_terms(['taxonomy' => 'product_tag', 'hide_empty' => true]);
|
$tags = get_terms(['taxonomy' => 'product_tag', 'hide_empty' => true]);
|
||||||
|
|
||||||
// echo '<pre>';
|
// Injecte les états initiaux des données du Produit sous forme de JSON dans le contexte.
|
||||||
// print_r($product_tags);
|
$page_states = [
|
||||||
// print_r($tags);
|
'nonce' => wp_create_nonce('wc_store_api'),
|
||||||
// echo '</pre>';
|
'product' => [
|
||||||
|
'attributes' => $product->attributes,
|
||||||
// exit();
|
'id' => $product->id,
|
||||||
|
'price' => $product->price,
|
||||||
|
'variations' => $product->variations,
|
||||||
|
],
|
||||||
|
]
|
||||||
|
|> wp_json_encode(...);
|
||||||
|
assert(is_string($page_states));
|
||||||
|
$context['page_states'] = $page_states;
|
||||||
|
|
||||||
add_action('wp_enqueue_scripts', function (): void {
|
add_action('wp_enqueue_scripts', function (): void {
|
||||||
Resource::enqueue_script_module_file(
|
Resource::enqueue_script_module_file(
|
||||||
|
|
|
||||||
|
|
@ -9,39 +9,36 @@ declare(strict_types=1);
|
||||||
use Carbon_Fields\Container;
|
use Carbon_Fields\Container;
|
||||||
use Carbon_Fields\Field;
|
use Carbon_Fields\Field;
|
||||||
|
|
||||||
function cree_champs_personnalises_produit(): void
|
function cree_champs_personnalises_produit(): void {
|
||||||
{
|
Container::make('post_meta', "Product's Details")
|
||||||
Container::make('post_meta', "Product's Details")
|
->where('post_type', '=', 'product')
|
||||||
->where('post_type', '=', 'product')
|
->add_fields([
|
||||||
->add_fields([
|
// Galerie des photos Produit
|
||||||
// Galerie des photos Produit
|
Field::make('media_gallery', 'photos_colonne_gauche', __('Left Column Photos'))
|
||||||
Field::make('media_gallery', 'photos_colonne_gauche', __('Left Column Photos'))
|
->set_type(['image'])
|
||||||
->set_type(['image'])
|
->set_duplicates_allowed(false),
|
||||||
->set_duplicates_allowed(false),
|
// Galerie des photos portées
|
||||||
// Galerie des photos portées
|
Field::make('media_gallery', 'photos_colonne_droite', __('Right Column Photos'))
|
||||||
Field::make('media_gallery', 'photos_colonne_droite', __('Right Column Photos'))
|
->set_type(['image'])
|
||||||
->set_type(['image'])
|
->set_duplicates_allowed(false),
|
||||||
->set_duplicates_allowed(false),
|
// Texte des détails du Produit
|
||||||
// Texte des détails du Produit
|
Field::make('rich_text', 'haiku_details_produit', __("Product's Details")),
|
||||||
Field::make('rich_text', 'haiku_details_produit', __("Product's Details")),
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
function cree_champ_personnalise_commande($order): void
|
|
||||||
{
|
|
||||||
woocommerce_wp_text_input([
|
|
||||||
'id' => 'tracking_number',
|
|
||||||
'label' => 'Tracking Number:',
|
|
||||||
'value' => $order->get_meta('tracking_number'),
|
|
||||||
'wrapper_class' => 'form-field-wide',
|
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
function maj_champ_personnalise_commande($order_id): void
|
function cree_champ_personnalise_commande($order): void {
|
||||||
{
|
woocommerce_wp_text_input([
|
||||||
$order = wc_get_order($order_id);
|
'id' => 'tracking_number',
|
||||||
$order->update_meta_data('tracking_number', wc_clean($_POST['tracking_number']));
|
'label' => 'Tracking Number:',
|
||||||
$order->save();
|
'value' => $order->get_meta('tracking_number'),
|
||||||
|
'wrapper_class' => 'form-field-wide',
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
function maj_champ_personnalise_commande($order_id): void {
|
||||||
|
$order = wc_get_order($order_id);
|
||||||
|
$order->update_meta_data('tracking_number', wc_clean($_POST['tracking_number']));
|
||||||
|
$order->save();
|
||||||
}
|
}
|
||||||
|
|
||||||
add_action('carbon_fields_register_fields', 'cree_champs_personnalises_produit');
|
add_action('carbon_fields_register_fields', 'cree_champs_personnalises_produit');
|
||||||
|
|
|
||||||
|
|
@ -8,74 +8,69 @@
|
||||||
|
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
function enregistre_controle_personnalise_tinymce(): void
|
function enregistre_controle_personnalise_tinymce(): void {
|
||||||
{
|
/**
|
||||||
|
* TinyMCE Custom Control.
|
||||||
|
*
|
||||||
|
* @author Anthony Hortin <http://maddisondesigns.com>
|
||||||
|
* @license http://www.gnu.org/licenses/gpl-2.0.html
|
||||||
|
*
|
||||||
|
* @see https://github.com/maddisondesigns
|
||||||
|
*/
|
||||||
|
final class ControlesPersonnalises extends WP_Customize_Control {
|
||||||
|
/** The type of control being rendered. */
|
||||||
|
public $type = 'editeur_tinymce';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TinyMCE Custom Control.
|
* Enqueue our scripts and styles.
|
||||||
*
|
|
||||||
* @author Anthony Hortin <http://maddisondesigns.com>
|
|
||||||
* @license http://www.gnu.org/licenses/gpl-2.0.html
|
|
||||||
*
|
|
||||||
* @see https://github.com/maddisondesigns
|
|
||||||
*/
|
*/
|
||||||
final class ControlesPersonnalises extends WP_Customize_Control
|
public function enqueue(): void {
|
||||||
{
|
wp_enqueue_script(
|
||||||
/** The type of control being rendered. */
|
handle: 'controle-personnalise-tinymce',
|
||||||
public $type = 'editeur_tinymce';
|
src: get_template_directory_uri() . '/assets/vendor/controle-personnalise-tinymce.js',
|
||||||
|
deps: ['jquery'],
|
||||||
|
ver: '1.3',
|
||||||
|
args: true,
|
||||||
|
);
|
||||||
|
wp_enqueue_editor();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enqueue our scripts and styles.
|
* Render the control in the customizer.
|
||||||
*/
|
*/
|
||||||
public function enqueue(): void
|
public function render_content(): void { ?>
|
||||||
{
|
|
||||||
wp_enqueue_script(
|
|
||||||
handle: 'controle-personnalise-tinymce',
|
|
||||||
src: get_template_directory_uri() . '/assets/vendor/controle-personnalise-tinymce.js',
|
|
||||||
deps: ['jquery'],
|
|
||||||
ver: '1.3',
|
|
||||||
args: true,
|
|
||||||
);
|
|
||||||
wp_enqueue_editor();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Render the control in the customizer.
|
|
||||||
*/
|
|
||||||
public function render_content(): void
|
|
||||||
{ ?>
|
|
||||||
<div class="tinymce-control">
|
<div class="tinymce-control">
|
||||||
<span class="customize-control-title"><?php echo esc_html($this->label); ?></span>
|
<span class="customize-control-title"><?php echo esc_html($this->label); ?></span>
|
||||||
<?php if (!empty($this->description)) { ?>
|
<?php if (!empty($this->description)) { ?>
|
||||||
<span class="customize-control-description"><?php echo esc_html($this->description); ?></span>
|
<span class="customize-control-description"><?php echo esc_html($this->description); ?></span>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
<textarea id="<?php echo
|
<textarea id="<?php echo
|
||||||
esc_attr($this->id)
|
esc_attr($this->id)
|
||||||
; ?>" class="customize-control-tinymce-editor" <?php $this->link(); ?>><?php echo
|
; ?>" class="customize-control-tinymce-editor" <?php $this->link(); ?>><?php echo
|
||||||
esc_html($this->value())
|
esc_html($this->value())
|
||||||
; ?></textarea>
|
; ?></textarea>
|
||||||
</div>
|
</div>
|
||||||
<?php }
|
<?php }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pass our TinyMCE toolbar string to JavaScript.
|
* Pass our TinyMCE toolbar string to JavaScript.
|
||||||
*/
|
*/
|
||||||
public function to_json(): void
|
public function to_json(): void {
|
||||||
{
|
parent::to_json();
|
||||||
parent::to_json();
|
|
||||||
|
|
||||||
$this->json['skyrockettinymcetoolbar1'] = isset($this->input_attrs['toolbar1'])
|
$this->json['skyrockettinymcetoolbar1'] = isset($this->input_attrs['toolbar1'])
|
||||||
? esc_attr($this->input_attrs['toolbar1'])
|
? esc_attr($this->input_attrs['toolbar1'])
|
||||||
: 'bold italic bullist numlist alignleft aligncenter alignright link';
|
: 'bold italic bullist numlist alignleft aligncenter alignright link';
|
||||||
|
|
||||||
$this->json['skyrockettinymcetoolbar2'] = isset($this->input_attrs['toolbar2'])
|
$this->json['skyrockettinymcetoolbar2'] = isset($this->input_attrs['toolbar2'])
|
||||||
? esc_attr($this->input_attrs['toolbar2'])
|
? esc_attr($this->input_attrs['toolbar2'])
|
||||||
: '';
|
: '';
|
||||||
$this->json['skyrocketmediabuttons'] = isset($this->input_attrs['mediaButtons'])
|
$this->json['skyrocketmediabuttons'] = isset($this->input_attrs['mediaButtons'])
|
||||||
&& $this->input_attrs['mediaButtons'] === true
|
&& $this->input_attrs['mediaButtons'] === true
|
||||||
? true
|
? true
|
||||||
: false;
|
: false;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
add_action('customize_register', 'enregistre_controle_personnalise_tinymce');
|
add_action('customize_register', 'enregistre_controle_personnalise_tinymce');
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,8 @@ final readonly class Attribute {
|
||||||
$terms = $attribute->get_terms() ?? [];
|
$terms = $attribute->get_terms() ?? [];
|
||||||
/** @var list<AttributeOption> */
|
/** @var list<AttributeOption> */
|
||||||
$options = Arr::map($terms, AttributeOption::new(...))
|
$options = Arr::map($terms, AttributeOption::new(...))
|
||||||
|> (static fn($options) => Arr::sort($options, static fn($attribute) => $attribute->id));
|
|> (static fn($options) => Arr::sort($options, static fn($attribute) => $attribute->id))
|
||||||
|
|> array_values(...);
|
||||||
|
|
||||||
return new self(name: $name, slug: $slug, options: $options);
|
return new self(name: $name, slug: $slug, options: $options);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,116 +11,113 @@ use function is_float;
|
||||||
use function is_int;
|
use function is_int;
|
||||||
use function is_string;
|
use function is_string;
|
||||||
|
|
||||||
final readonly class Cart
|
final readonly class Cart {
|
||||||
{
|
public function __construct() {}
|
||||||
public function __construct() {}
|
|
||||||
|
|
||||||
/** La valeur par défaut d'une donnée invalide du Panier. */
|
/** La valeur par défaut d'une donnée invalide du Panier. */
|
||||||
private const string DEFAULT_VALUE = '0.00';
|
private const string DEFAULT_VALUE = '0.00';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retourne la liste des pays acceptés pour la livraison.
|
* Retourne la liste des pays acceptés pour la livraison.
|
||||||
*
|
*
|
||||||
* @return array<int,string>
|
* @return array<int,string>
|
||||||
*/
|
*/
|
||||||
public static function get_allowed_countries(): array
|
public static function get_allowed_countries(): array {
|
||||||
{
|
return [
|
||||||
return [
|
'AD',
|
||||||
'AD',
|
'AL',
|
||||||
'AL',
|
'AM',
|
||||||
'AM',
|
'AR',
|
||||||
'AR',
|
'AT',
|
||||||
'AT',
|
'AU',
|
||||||
'AU',
|
'BA',
|
||||||
'BA',
|
'BE',
|
||||||
'BE',
|
'BG',
|
||||||
'BG',
|
'BR',
|
||||||
'BR',
|
'CA',
|
||||||
'CA',
|
'CH',
|
||||||
'CH',
|
'CL',
|
||||||
'CL',
|
'CR',
|
||||||
'CR',
|
'CU',
|
||||||
'CU',
|
'CY',
|
||||||
'CY',
|
'CZ',
|
||||||
'CZ',
|
'DE',
|
||||||
'DE',
|
'DK',
|
||||||
'DK',
|
'DZ',
|
||||||
'DZ',
|
'EE',
|
||||||
'EE',
|
'EG',
|
||||||
'EG',
|
'ES',
|
||||||
'ES',
|
'FI',
|
||||||
'FI',
|
'FR',
|
||||||
'FR',
|
'GF',
|
||||||
'GF',
|
'GP',
|
||||||
'GP',
|
'GR',
|
||||||
'GR',
|
'HR',
|
||||||
'HR',
|
'HU',
|
||||||
'HU',
|
'IE',
|
||||||
'IE',
|
'IS',
|
||||||
'IS',
|
'IT',
|
||||||
'IT',
|
'JP',
|
||||||
'JP',
|
'KR',
|
||||||
'KR',
|
'LB',
|
||||||
'LB',
|
'LI',
|
||||||
'LI',
|
'LT',
|
||||||
'LT',
|
'LU',
|
||||||
'LU',
|
'LV',
|
||||||
'LV',
|
'MA',
|
||||||
'MA',
|
'MD',
|
||||||
'MD',
|
'ME',
|
||||||
'ME',
|
'MF',
|
||||||
'MF',
|
'MQ',
|
||||||
'MQ',
|
'MT',
|
||||||
'MT',
|
'MX',
|
||||||
'MX',
|
'NC',
|
||||||
'NC',
|
'NL',
|
||||||
'NL',
|
'NO',
|
||||||
'NO',
|
'NZ',
|
||||||
'NZ',
|
'PF',
|
||||||
'PF',
|
'PL',
|
||||||
'PL',
|
'PM',
|
||||||
'PM',
|
'PS',
|
||||||
'PS',
|
'PT',
|
||||||
'PT',
|
'RE',
|
||||||
'RE',
|
'RO',
|
||||||
'RO',
|
'SE',
|
||||||
'SE',
|
'SI',
|
||||||
'SI',
|
'SK',
|
||||||
'SK',
|
'SM',
|
||||||
'SM',
|
'TN',
|
||||||
'TN',
|
'TR',
|
||||||
'TR',
|
'TW',
|
||||||
'TW',
|
'US',
|
||||||
'US',
|
'YT',
|
||||||
'YT',
|
'ZA',
|
||||||
'ZA',
|
];
|
||||||
];
|
}
|
||||||
|
|
||||||
|
public static function parse_cart_value(int|float|string|bool $cart_value): string {
|
||||||
|
if (is_int($cart_value) || is_float($cart_value)) {
|
||||||
|
return self::format_number($cart_value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function parse_cart_value(int|float|string|bool $cart_value): string
|
if (is_string($cart_value)) {
|
||||||
{
|
$number = Number::parseInt($cart_value);
|
||||||
if (is_int($cart_value) || is_float($cart_value)) {
|
$number = is_bool($number) ? 0 : $number;
|
||||||
return self::format_number($cart_value);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is_string($cart_value)) {
|
return self::format_number($number);
|
||||||
$number = Number::parseInt($cart_value);
|
|
||||||
$number = is_bool($number) ? 0 : $number;
|
|
||||||
|
|
||||||
return self::format_number($number);
|
|
||||||
}
|
|
||||||
|
|
||||||
return '0.00';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static function format_number(int|float $number): string
|
return '0.00';
|
||||||
{
|
}
|
||||||
$formatted_number = Number::format(
|
|
||||||
number: $number,
|
private static function format_number(int|float $number): string {
|
||||||
// precision et max_precision sont mutuellement exclusifs.
|
$formatted_number = Number::format(
|
||||||
precision: 2,
|
number: $number,
|
||||||
locale: 'fr',
|
// precision et max_precision sont mutuellement exclusifs.
|
||||||
);
|
precision: 2,
|
||||||
return is_bool($formatted_number) ? self::DEFAULT_VALUE : $formatted_number;
|
locale: 'fr',
|
||||||
}
|
);
|
||||||
|
|
||||||
|
return is_bool($formatted_number) ? self::DEFAULT_VALUE : $formatted_number;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,34 +6,32 @@ namespace HaikuAtelier\Data;
|
||||||
|
|
||||||
use WC_Product;
|
use WC_Product;
|
||||||
|
|
||||||
final readonly class ProductVariation
|
final readonly class ProductVariation {
|
||||||
{
|
/**
|
||||||
/**
|
* @param int $id L'ID de la Variation
|
||||||
* @param int $id L'ID de la Variation
|
* @param string $price Le prix de la Variation
|
||||||
* @param string $price Le prix de la Variation
|
* @param list<ProductVariationAttribute> $attributes Les attributs appliqués à la Variation
|
||||||
* @param list<ProductVariationAttribute> $attributes Les attributs appliqués à la Variation
|
*/
|
||||||
*/
|
private function __construct(
|
||||||
private function __construct(
|
public int $id,
|
||||||
public int $id,
|
public string $price,
|
||||||
public string $price,
|
public array $attributes,
|
||||||
public array $attributes,
|
) {}
|
||||||
) {}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Créé une nouvelle instance de `ProductVariation` à partir d'un `WC_Product`.
|
* Créé une nouvelle instance de `ProductVariation` à partir d'un `WC_Product`.
|
||||||
*/
|
*/
|
||||||
public static function new(WC_Product $product): self
|
public static function new(WC_Product $product): self {
|
||||||
{
|
$id = $product->get_id();
|
||||||
$id = $product->get_id();
|
$price = $product->get_price();
|
||||||
$price = $product->get_price();
|
/** @var list<ProductVariationAttribute> */
|
||||||
/** @var list<ProductVariationAttribute> */
|
$attributes = array_map(
|
||||||
$attributes = array_map(
|
/** @phpstan-ignore argument.type (Impossible à satisfaire) */
|
||||||
/** @phpstan-ignore argument.type (Impossible à satisfaire) */
|
static fn(string $key, string $value) => new ProductVariationAttribute($key, $value),
|
||||||
static fn(string $key, string $value) => new ProductVariationAttribute($key, $value),
|
array_keys($product->get_attributes()),
|
||||||
array_keys($product->get_attributes()),
|
array_values($product->get_attributes()),
|
||||||
array_values($product->get_attributes()),
|
);
|
||||||
);
|
|
||||||
|
|
||||||
return new self($id, $price, $attributes);
|
return new self($id, $price, $attributes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,14 +4,13 @@ declare(strict_types=1);
|
||||||
|
|
||||||
namespace HaikuAtelier\Data;
|
namespace HaikuAtelier\Data;
|
||||||
|
|
||||||
final readonly class ProductVariationAttribute
|
final readonly class ProductVariationAttribute {
|
||||||
{
|
/**
|
||||||
/**
|
* @param string $attribute Le slug de l'Attribut
|
||||||
* @param string $attribute Le slug de l'Attribut
|
* @param string $value Le slug de la valeur de l'Attribut
|
||||||
* @param string $value Le slug de la valeur de l'Attribut
|
*/
|
||||||
*/
|
public function __construct(
|
||||||
public function __construct(
|
public string $attribute,
|
||||||
public string $attribute,
|
public string $value,
|
||||||
public string $value,
|
) {}
|
||||||
) {}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,9 +9,8 @@ declare(strict_types=1);
|
||||||
namespace HaikuAtelier;
|
namespace HaikuAtelier;
|
||||||
|
|
||||||
// Désactive divers transformations du contenu par WordPress
|
// Désactive divers transformations du contenu par WordPress
|
||||||
function desactive_wpautop(): void
|
function desactive_wpautop(): void {
|
||||||
{
|
remove_filter('the_content', 'wpautop');
|
||||||
remove_filter('the_content', 'wpautop');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -21,17 +20,16 @@ function desactive_wpautop(): void
|
||||||
*
|
*
|
||||||
* @return array<string, bool> le même tableau avec des configurations en plus
|
* @return array<string, bool> le même tableau avec des configurations en plus
|
||||||
*/
|
*/
|
||||||
function desactive_transformation_contenu_tinymce(array $configuration): array
|
function desactive_transformation_contenu_tinymce(array $configuration): array {
|
||||||
{
|
// Ne supprime pas les retours à la ligne
|
||||||
// Ne supprime pas les retours à la ligne
|
$configuration['remove_linebreaks'] = false;
|
||||||
$configuration['remove_linebreaks'] = false;
|
// Convertis les caractères de retours à la ligne en <br>
|
||||||
// Convertis les caractères de retours à la ligne en <br>
|
$configuration['convert_newlines_to_brs'] = true;
|
||||||
$configuration['convert_newlines_to_brs'] = true;
|
// Supprime les <br> redondants
|
||||||
// Supprime les <br> redondants
|
$configuration['remove_redundant_brs'] = false;
|
||||||
$configuration['remove_redundant_brs'] = false;
|
|
||||||
|
|
||||||
// Retourne $configuration à WordPress
|
// Retourne $configuration à WordPress
|
||||||
return $configuration;
|
return $configuration;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -41,22 +39,19 @@ function desactive_transformation_contenu_tinymce(array $configuration): array
|
||||||
*
|
*
|
||||||
* @return array<string, string> le même tableau avec SVG en plus
|
* @return array<string, string> le même tableau avec SVG en plus
|
||||||
*/
|
*/
|
||||||
function autorise_import_svg_mediatheque(array $file_types): array
|
function autorise_import_svg_mediatheque(array $file_types): array {
|
||||||
{
|
$new_filetypes = [];
|
||||||
$new_filetypes = [];
|
$new_filetypes['svg'] = 'image/svg+xml';
|
||||||
$new_filetypes['svg'] = 'image/svg+xml';
|
|
||||||
|
|
||||||
return [...$file_types, ...$new_filetypes];
|
return [...$file_types, ...$new_filetypes];
|
||||||
}
|
}
|
||||||
|
|
||||||
function retire_motifs_blocs_gutenberg(): void
|
function retire_motifs_blocs_gutenberg(): void {
|
||||||
{
|
remove_theme_support('core-block-patterns');
|
||||||
remove_theme_support('core-block-patterns');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function retire_styles_core_block(): void
|
function retire_styles_core_block(): void {
|
||||||
{
|
wp_dequeue_style('core-block-supports');
|
||||||
wp_dequeue_style('core-block-supports');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Désactive les appels à l'API de la mise à jour des traductions
|
// Désactive les appels à l'API de la mise à jour des traductions
|
||||||
|
|
|
||||||
|
|
@ -14,33 +14,32 @@ use function register_taxonomy;
|
||||||
/**
|
/**
|
||||||
* Enregistre la Taxonomie « Collection ».
|
* Enregistre la Taxonomie « Collection ».
|
||||||
*/
|
*/
|
||||||
function enregistre_taxonomie_collection(): void
|
function enregistre_taxonomie_collection(): void {
|
||||||
{
|
$labels = [
|
||||||
$labels = [
|
'add_new_item' => __('Add New Collection'),
|
||||||
'add_new_item' => __('Add New Collection'),
|
'all_items' => __('All Collections'),
|
||||||
'all_items' => __('All Collections'),
|
'edit_item' => __('Edit Collection'),
|
||||||
'edit_item' => __('Edit Collection'),
|
'menu_name' => __('Collections'),
|
||||||
'menu_name' => __('Collections'),
|
'name' => __('Collections'),
|
||||||
'name' => __('Collections'),
|
'new_item_name' => __('New Collection Name'),
|
||||||
'new_item_name' => __('New Collection Name'),
|
'search_items' => __('Search Collections'),
|
||||||
'search_items' => __('Search Collections'),
|
'singular_name' => __('Collection'),
|
||||||
'singular_name' => __('Collection'),
|
'update_item' => __('Update Collection'),
|
||||||
'update_item' => __('Update Collection'),
|
];
|
||||||
];
|
$args = [
|
||||||
$args = [
|
'description' => __('An ensemble of pieces thematically or chronologically grouped together.'),
|
||||||
'description' => __('An ensemble of pieces thematically or chronologically grouped together.'),
|
'hierarchical' => false,
|
||||||
'hierarchical' => false,
|
'labels' => $labels,
|
||||||
'labels' => $labels,
|
'publicly_queryable' => false,
|
||||||
'publicly_queryable' => false,
|
'query_var' => true,
|
||||||
'query_var' => true,
|
'rewrite' => ['slug' => 'collection'],
|
||||||
'rewrite' => ['slug' => 'collection'],
|
'show_admin_column' => true,
|
||||||
'show_admin_column' => true,
|
'show_in_menu' => true,
|
||||||
'show_in_menu' => true,
|
'show_in_quick_edit' => true,
|
||||||
'show_in_quick_edit' => true,
|
'show_ui' => true,
|
||||||
'show_ui' => true,
|
];
|
||||||
];
|
|
||||||
|
|
||||||
register_taxonomy('collection', ['product'], $args);
|
register_taxonomy('collection', ['product'], $args);
|
||||||
}
|
}
|
||||||
|
|
||||||
add_action('init', enregistre_taxonomie_collection(...));
|
add_action('init', enregistre_taxonomie_collection(...));
|
||||||
|
|
|
||||||
|
|
@ -14,50 +14,46 @@ use function is_array;
|
||||||
use function Psl\Option\none;
|
use function Psl\Option\none;
|
||||||
use function Psl\Option\some;
|
use function Psl\Option\some;
|
||||||
|
|
||||||
final readonly class Post
|
final readonly class Post {
|
||||||
{
|
/**
|
||||||
/**
|
* @return Option\Option<mixed>
|
||||||
* @return Option\Option<mixed>
|
*/
|
||||||
*/
|
public static function get_post_meta(int $post_id, string $key): Option\Option {
|
||||||
public static function get_post_meta(int $post_id, string $key): Option\Option
|
/** @var false|mixed|string */
|
||||||
{
|
$value = get_post_meta($post_id, $key, true);
|
||||||
/** @var false|mixed|string */
|
|
||||||
$value = get_post_meta($post_id, $key, true);
|
|
||||||
|
|
||||||
if ($value === false) {
|
if ($value === false) {
|
||||||
return none();
|
return none();
|
||||||
}
|
|
||||||
|
|
||||||
return some($value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
return some($value);
|
||||||
* @return Option\Option<array<mixed>>
|
}
|
||||||
*/
|
|
||||||
public static function get_post_meta_array(int $post_id, string $key): Option\Option
|
|
||||||
{
|
|
||||||
/** @var array<mixed>|false */
|
|
||||||
$value = get_post_meta($post_id, $key, false);
|
|
||||||
|
|
||||||
if (is_array($value)) {
|
/**
|
||||||
return some($value);
|
* @return Option\Option<array<mixed>>
|
||||||
}
|
*/
|
||||||
|
public static function get_post_meta_array(int $post_id, string $key): Option\Option {
|
||||||
|
/** @var array<mixed>|false */
|
||||||
|
$value = get_post_meta($post_id, $key, false);
|
||||||
|
|
||||||
return none();
|
if (is_array($value)) {
|
||||||
|
return some($value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
return none();
|
||||||
* @return Option\Option<array<mixed>>
|
}
|
||||||
*/
|
|
||||||
public static function get_terms(int $post_id, string $taxonomy_name): Option\Option
|
|
||||||
{
|
|
||||||
/** @var false|list<WP_Term>|WP_Error */
|
|
||||||
$terms = get_the_terms($post_id, $taxonomy_name);
|
|
||||||
|
|
||||||
if (is_array($terms)) {
|
/**
|
||||||
return some($terms);
|
* @return Option\Option<array<mixed>>
|
||||||
}
|
*/
|
||||||
|
public static function get_terms(int $post_id, string $taxonomy_name): Option\Option {
|
||||||
|
/** @var false|list<WP_Term>|WP_Error */
|
||||||
|
$terms = get_the_terms($post_id, $taxonomy_name);
|
||||||
|
|
||||||
return none();
|
if (is_array($terms)) {
|
||||||
|
return some($terms);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return none();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,50 @@
|
||||||
|
import { Context, Effect, Layer, Schema } from "effect";
|
||||||
|
import { ENTETE_WC_NONCE, ROUTE_API_AJOUTE_ARTICLE_PANIER } from "../scripts/constantes/api.ts";
|
||||||
|
import { CartProduct } from "./schemas/api.ts";
|
||||||
|
|
||||||
|
const REQUEST_TIMEOUT = 5_000;
|
||||||
|
|
||||||
|
class APIError extends Schema.TaggedErrorClass<APIError>()("APIError", {
|
||||||
|
cause: Schema.Defect,
|
||||||
|
}) {}
|
||||||
|
|
||||||
|
class WooCommerceAPI extends Context.Service<
|
||||||
|
WooCommerceAPI,
|
||||||
|
{
|
||||||
|
AddProductToCart: (nonce: string, requestBody: CartProduct) => Effect.Effect<Response, APIError>;
|
||||||
|
}
|
||||||
|
>()("haikuatelier.fr/WooCommerceAPI") {
|
||||||
|
static readonly layer = Layer.effect(
|
||||||
|
WooCommerceAPI,
|
||||||
|
// oxlint-disable-next-line require-yield
|
||||||
|
Effect.gen(function*() {
|
||||||
|
const AddProductToCart = Effect.fn("AddProductToCart")(function*(nonce: string, product: CartProduct) {
|
||||||
|
const response = yield* Effect.tryPromise({
|
||||||
|
catch: error => new APIError({ cause: error }),
|
||||||
|
try: async () =>
|
||||||
|
fetch(ROUTE_API_AJOUTE_ARTICLE_PANIER, {
|
||||||
|
// Convertis en chaîne de caractères (équivalent à JSON.stringify).
|
||||||
|
body: Schema.encodeSync(Schema.fromJsonString(CartProduct))(product),
|
||||||
|
credentials: "same-origin",
|
||||||
|
headers: {
|
||||||
|
Accept: "application/json",
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
[ENTETE_WC_NONCE]: nonce,
|
||||||
|
},
|
||||||
|
method: "POST",
|
||||||
|
mode: "same-origin",
|
||||||
|
signal: AbortSignal.timeout(REQUEST_TIMEOUT),
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
return response;
|
||||||
|
});
|
||||||
|
|
||||||
|
return WooCommerceAPI.of({
|
||||||
|
AddProductToCart,
|
||||||
|
});
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export { WooCommerceAPI };
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
import { Schema } from "effect";
|
||||||
|
import { ProductId, ProductQuantity, ProductVariationAttribute } from "./product.ts";
|
||||||
|
|
||||||
|
class CartProduct extends Schema.Class<CartProduct>("CartProduct")({
|
||||||
|
id: ProductId,
|
||||||
|
quantity: ProductQuantity,
|
||||||
|
variation: Schema.Array(ProductVariationAttribute),
|
||||||
|
}) {}
|
||||||
|
|
||||||
|
export { CartProduct };
|
||||||
|
|
@ -0,0 +1,83 @@
|
||||||
|
// oxlint-disable no-magic-numbers -- Pas besoin ici.
|
||||||
|
import { Effect, Option, pipe, Schema, SchemaIssue, SchemaTransformation } from "effect";
|
||||||
|
import type { SchemaError } from "effect/Schema";
|
||||||
|
|
||||||
|
/** Représente l'identifiant numérique unique d'un Produit. */
|
||||||
|
const ProductId = Schema.Int.pipe(Schema.brand("ProductId")).check(Schema.isGreaterThan(0));
|
||||||
|
|
||||||
|
/** Représente l'identifiant numérique unique d'un Attribut. */
|
||||||
|
const AttributeId = Schema.Int.pipe(Schema.brand("AttributeId")).check(Schema.isGreaterThan(0));
|
||||||
|
|
||||||
|
/** Réprésente une quantité (nombre d'unités) de Produit. */
|
||||||
|
const ProductQuantity = Schema.Int.pipe(Schema.brand("ProductQuantity")).check(Schema.isGreaterThanOrEqualTo(0));
|
||||||
|
/** Schéma transformant une chaîne de caractères en `ProductId` avec validation. */
|
||||||
|
const ProductQuantityFromString = Schema.String.pipe(
|
||||||
|
Schema.decodeTo(
|
||||||
|
ProductQuantity,
|
||||||
|
SchemaTransformation.transformOrFail({
|
||||||
|
decode: (value: string) =>
|
||||||
|
pipe(
|
||||||
|
globalThis.Number(value),
|
||||||
|
(number: number) => ProductQuantity.makeEffect(number),
|
||||||
|
Effect.mapError((error: SchemaError) => new SchemaIssue.InvalidValue(Option.some(value), { cause: error })),
|
||||||
|
),
|
||||||
|
encode: (value: number) => Effect.succeed(String(value)),
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
class AttributeValue extends Schema.Class<AttributeValue>("AttributeValue")({
|
||||||
|
/** L'identifiant numérique de la Valeur de l'Attribut. */
|
||||||
|
id: AttributeId,
|
||||||
|
/** Le nom (texte affiché) de la Valeur de l'Attribut. */
|
||||||
|
name: Schema.String,
|
||||||
|
/** L'identifiant alphanumérique _(slug)_ de la Valeur de l'Attribut. */
|
||||||
|
slug: Schema.String,
|
||||||
|
}) {}
|
||||||
|
|
||||||
|
class ProductAttribute extends Schema.Class<ProductAttribute>("ProductAttribute")({
|
||||||
|
/** Le nom de l'Attribut. */
|
||||||
|
name: Schema.String,
|
||||||
|
options: Schema.Array(AttributeValue),
|
||||||
|
/** L'identifiant _(slug)_ de l'Attribut. */
|
||||||
|
slug: Schema.String,
|
||||||
|
}) {}
|
||||||
|
|
||||||
|
class ProductVariationAttribute extends Schema.Class<ProductVariationAttribute>("ProductVariationAttribute")({
|
||||||
|
/** L'identifiant _(slug)_ de l'Attribut. */
|
||||||
|
attribute: Schema.String,
|
||||||
|
/** La valeur de l'attribut. */
|
||||||
|
value: Schema.String,
|
||||||
|
}) {}
|
||||||
|
|
||||||
|
class ProductVariation extends Schema.Class<ProductVariation>("ProductVariation")({
|
||||||
|
/** Les Attributs présents pour cette Variation. */
|
||||||
|
attributes: Schema.Array(ProductVariationAttribute),
|
||||||
|
/** L'identifiant numérique unique de la Variation. */
|
||||||
|
id: ProductId,
|
||||||
|
/** Le prix de la Variation. */
|
||||||
|
price: ProductQuantityFromString,
|
||||||
|
}) {}
|
||||||
|
|
||||||
|
class Product extends Schema.Class<Product>("Product")({
|
||||||
|
/** Les Attributs applicables au Produit (en cas de Produit simple). */
|
||||||
|
attributes: Schema.Union([Schema.Record(Schema.String, ProductAttribute), Schema.Array(ProductAttribute)]),
|
||||||
|
/** L'identifiant numérique unique du Produit. */
|
||||||
|
id: ProductId,
|
||||||
|
/** Le prix du Produit. */
|
||||||
|
price: ProductQuantityFromString,
|
||||||
|
/** Les Variations existantes du Produit (en cas de Produit variable). */
|
||||||
|
variations: Schema.Array(ProductVariation),
|
||||||
|
}) {}
|
||||||
|
|
||||||
|
export {
|
||||||
|
AttributeId,
|
||||||
|
AttributeValue,
|
||||||
|
Product,
|
||||||
|
ProductAttribute,
|
||||||
|
ProductId,
|
||||||
|
ProductQuantity,
|
||||||
|
ProductQuantityFromString,
|
||||||
|
ProductVariation,
|
||||||
|
ProductVariationAttribute,
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
import { Schema, SchemaIssue } from "effect";
|
||||||
|
import { NoSuchElementError } from "effect/Cause";
|
||||||
|
import { SchemaError } from "effect/Schema";
|
||||||
|
|
||||||
|
class IncoherentDOMError extends Schema.TaggedErrorClass<IncoherentDOMError>()("IncoherentDOMError", {
|
||||||
|
cause: Schema.String,
|
||||||
|
}) {
|
||||||
|
static readonly fromSchemaError = (error: SchemaError): IncoherentDOMError =>
|
||||||
|
new IncoherentDOMError({
|
||||||
|
cause: SchemaIssue.makeFormatterDefault()(error.issue),
|
||||||
|
});
|
||||||
|
static readonly fromNoSuchElementError = (error: NoSuchElementError): IncoherentDOMError =>
|
||||||
|
new IncoherentDOMError({
|
||||||
|
cause: `Impossible de trouver l'Element suivant dans le DOM : ${error.message}.`,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export { IncoherentDOMError };
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
import { Console, Layer, ManagedRuntime, pipe } from "effect";
|
||||||
|
import { WooCommerceAPI } from "../../scripts-effect/api-service.ts";
|
||||||
|
import ProductPageDOM from "./service-dom.ts";
|
||||||
|
import ProductPageElements from "./service-elements.ts";
|
||||||
|
|
||||||
|
const ProductPageRuntime = ManagedRuntime.make(
|
||||||
|
pipe(
|
||||||
|
ProductPageDOM.layer,
|
||||||
|
Layer.provide(ProductPageElements.layer),
|
||||||
|
Layer.provide(WooCommerceAPI.layer),
|
||||||
|
Layer.tapError(error => Console.error("ProductPageRuntime", "Impossible de créer le Layer :", error)),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
export default ProductPageRuntime;
|
||||||
|
|
@ -0,0 +1,316 @@
|
||||||
|
// oxlint-disable typescript/dot-notation
|
||||||
|
import {
|
||||||
|
Array as FxArray,
|
||||||
|
Console,
|
||||||
|
Context,
|
||||||
|
Effect,
|
||||||
|
HashMap,
|
||||||
|
Layer,
|
||||||
|
Option,
|
||||||
|
pipe,
|
||||||
|
Ref,
|
||||||
|
Schema,
|
||||||
|
SchemaIssue,
|
||||||
|
Stream,
|
||||||
|
} from "effect";
|
||||||
|
import type { NoSuchElementError } from "effect/Cause";
|
||||||
|
import type { SchemaError } from "effect/Schema";
|
||||||
|
import { WooCommerceAPI } from "../../scripts-effect/api-service.ts";
|
||||||
|
import { AddProductToCart, CartProduct } from "../../scripts-effect/schemas/api.ts";
|
||||||
|
import { Product, ProductVariation, ProductVariationAttribute } from "../../scripts-effect/schemas/product.ts";
|
||||||
|
import {
|
||||||
|
ATTRIBUT_ARIA_CONTROLS,
|
||||||
|
ATTRIBUT_ARIA_EXPANDED,
|
||||||
|
ATTRIBUT_CHARGEMENT,
|
||||||
|
ATTRIBUT_DESACTIVE,
|
||||||
|
ATTRIBUT_HIDDEN,
|
||||||
|
} from "../constantes/dom.ts";
|
||||||
|
import { lanceAnimationCycleLoading } from "../lib/animations.ts";
|
||||||
|
import { IncoherentDOMError } from "./errors.ts";
|
||||||
|
import ProductPageElements from "./service-elements.ts";
|
||||||
|
import type { DetailEnsemble } from "./types.d.ts";
|
||||||
|
|
||||||
|
const PageStatesSchema = Schema.Struct({
|
||||||
|
nonce: Schema.NonEmptyString,
|
||||||
|
product: Product,
|
||||||
|
});
|
||||||
|
|
||||||
|
class InvalidPageStateError extends Schema.TaggedErrorClass<InvalidPageStateError>()("InvalidPageStateError", {
|
||||||
|
cause: Schema.String,
|
||||||
|
}) {
|
||||||
|
static readonly fromSchemaError = (schemaError: SchemaError): InvalidPageStateError =>
|
||||||
|
new InvalidPageStateError({
|
||||||
|
cause: SchemaIssue.makeFormatterDefault()(schemaError.issue),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
class ProductPageDOM extends Context.Service<
|
||||||
|
ProductPageDOM,
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Initialise l'état initial du Bouton d'ajout au Panier.
|
||||||
|
*/
|
||||||
|
initAddToCartButtonInitialState: () => Effect.Effect<void>;
|
||||||
|
/**
|
||||||
|
* Initialise les mises à jour du Bouton d'ajout au Panier en fonction des interactions de l'Utilisateur.
|
||||||
|
*/
|
||||||
|
initAddToCartButtonUpdates: () => Effect.Effect<void>;
|
||||||
|
/**
|
||||||
|
* Initialise les interactions des Sections de la Description du Produit.
|
||||||
|
*/
|
||||||
|
initDetailInteractions: () => Effect.Effect<void, NoSuchElementError>;
|
||||||
|
/**
|
||||||
|
* Initialise la mise à jour du Prix affiché en fonction du choix de la Varation de Produit.
|
||||||
|
*/
|
||||||
|
initPriceUpdatesOnVariationChange: () => Effect.Effect<void, NoSuchElementError | string>;
|
||||||
|
/**
|
||||||
|
* Replie toutes les sections de la description du Produit.
|
||||||
|
*/
|
||||||
|
initAddToCartButtonClicks: () => unknown;
|
||||||
|
PageStates: typeof PageStatesSchema.Type;
|
||||||
|
CurrentVariation: Ref.Ref<Option.Option<ProductVariation>>;
|
||||||
|
}
|
||||||
|
>()("haikuatelier.fr/Produit/ProductPageDOM") {
|
||||||
|
static readonly layer = Layer.effect(
|
||||||
|
ProductPageDOM,
|
||||||
|
Effect.gen(function*() {
|
||||||
|
const {
|
||||||
|
AddToCartButton,
|
||||||
|
Details,
|
||||||
|
DetailsButtons,
|
||||||
|
ProductPrice,
|
||||||
|
VariationChoiceForm,
|
||||||
|
VariationSelectors,
|
||||||
|
PageStatesRawJson,
|
||||||
|
} = yield* ProductPageElements;
|
||||||
|
const API = yield* WooCommerceAPI;
|
||||||
|
|
||||||
|
const PageStates = yield* pipe(
|
||||||
|
PageStatesRawJson.textContent,
|
||||||
|
(textContent: string) =>
|
||||||
|
Schema.decodeUnknownEffect(Schema.fromJsonString(PageStatesSchema))(textContent, { errors: "all" }),
|
||||||
|
Effect.mapError(InvalidPageStateError.fromSchemaError),
|
||||||
|
Effect.tapError(Console.error),
|
||||||
|
);
|
||||||
|
|
||||||
|
const CurrentProduct = yield* Ref.make(Option.none<ProductVariation>());
|
||||||
|
|
||||||
|
const onFormChangeHandler = Effect.fn("onFormChangeHandler")(function*(evt: Event) {
|
||||||
|
// La cible ne peut qu'être un Formulaire.
|
||||||
|
const target: HTMLFormElement = evt.target as HTMLFormElement;
|
||||||
|
const isClickAllowed = target.checkValidity() === false;
|
||||||
|
|
||||||
|
// Active/désactive le Bouton en fonction de la validité du Formulaire du Produit.
|
||||||
|
AddToCartButton.toggleAttribute(ATTRIBUT_DESACTIVE, isClickAllowed);
|
||||||
|
|
||||||
|
return yield* Effect.void;
|
||||||
|
});
|
||||||
|
|
||||||
|
const toggleAllDetails: (shouldOpen: boolean) => Effect.Effect<void> = (shouldOpen: boolean) =>
|
||||||
|
Effect.sync((): void => {
|
||||||
|
console.debug("toggleAllDetails");
|
||||||
|
pipe(
|
||||||
|
// Récupère les Sections sous forme d'Ensembles.
|
||||||
|
[...HashMap.values(Details)],
|
||||||
|
FxArray.forEach((detail: DetailEnsemble) => {
|
||||||
|
detail.button.toggleAttribute(ATTRIBUT_ARIA_EXPANDED, shouldOpen);
|
||||||
|
detail.content.toggleAttribute(ATTRIBUT_HIDDEN, !shouldOpen);
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
const onDetailButtonClickHandler = Effect.fn("onDetailButtonClickHandler")(
|
||||||
|
function*(evt: Event) {
|
||||||
|
// Empêche la pollution de l'historique de navigation
|
||||||
|
evt.preventDefault();
|
||||||
|
|
||||||
|
// La cible est connue.
|
||||||
|
const target = evt.target as HTMLButtonElement;
|
||||||
|
|
||||||
|
// Récupère le contenu correspondant au Bouton.
|
||||||
|
const linkedSection = yield* pipe(
|
||||||
|
Option.fromNullishOr(target.getAttribute(ATTRIBUT_ARIA_CONTROLS)),
|
||||||
|
Option.flatMap((contentId: string) => HashMap.get(Details, contentId)),
|
||||||
|
Effect.fromOption,
|
||||||
|
Effect.mapError(
|
||||||
|
() => new IncoherentDOMError({ cause: "Un bouton de section ne correspond à aucun contenu." }),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
// Sauvegarde l'état d'ouverture de la Section avant de toutes les fermer.
|
||||||
|
const wasCurrentSection: boolean = target.getAttribute(ATTRIBUT_ARIA_EXPANDED) === "true";
|
||||||
|
|
||||||
|
// Replie toutes les Sections.
|
||||||
|
yield* toggleAllDetails(false);
|
||||||
|
|
||||||
|
// Ne fais rien de plus si l'onglet sélectionné était le courant.
|
||||||
|
if (wasCurrentSection === true) {
|
||||||
|
return yield* Effect.void;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ouvre le nouvel onglet sélectionné.
|
||||||
|
target.toggleAttribute(ATTRIBUT_ARIA_EXPANDED, true);
|
||||||
|
linkedSection.content.toggleAttribute(ATTRIBUT_HIDDEN, false);
|
||||||
|
|
||||||
|
return yield* Effect.void;
|
||||||
|
},
|
||||||
|
Effect.tapError(Console.error),
|
||||||
|
// Ouvre toutes les Sections en cas d'erreur.
|
||||||
|
Effect.catch(() => toggleAllDetails(true)),
|
||||||
|
);
|
||||||
|
|
||||||
|
const getChosenProductAttributesFromDOM = Effect.fn("getChosenProductAttributesFromDOM")(function*() {
|
||||||
|
return yield* pipe(
|
||||||
|
FxArray.map(VariationSelectors, (select: HTMLSelectElement) => ({
|
||||||
|
attribute: select.id,
|
||||||
|
value: select.value,
|
||||||
|
})),
|
||||||
|
variations =>
|
||||||
|
Schema.decodeEffect(Schema.Array(ProductVariationAttribute))(variations, {
|
||||||
|
errors: "all",
|
||||||
|
onExcessProperty: "error",
|
||||||
|
}),
|
||||||
|
Effect.mapError(IncoherentDOMError.fromSchemaError),
|
||||||
|
Effect.tapError(Console.error),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
const onVariationChangeHandler = Effect.fn("onVariationChangeHandler")(function*() {
|
||||||
|
yield* Console.log("onVariationChangeHandler");
|
||||||
|
// Ne fais rien si le Formulaire n'est pas valide.
|
||||||
|
if (VariationChoiceForm.checkValidity() === false) {
|
||||||
|
yield* Console.debug("onVariationChangeHandler", "Le formulaire est invalide.");
|
||||||
|
return yield* Effect.void;
|
||||||
|
}
|
||||||
|
|
||||||
|
const equivalence = Schema.toEquivalence(Schema.Array(ProductVariationAttribute));
|
||||||
|
const chosenProductAttributes = yield* getChosenProductAttributesFromDOM();
|
||||||
|
yield* Console.debug("onVariationChangeHandler", "chosenProductAttributes", chosenProductAttributes);
|
||||||
|
const chosenVariation = yield* pipe(
|
||||||
|
FxArray.findFirst(
|
||||||
|
PageStates.product.variations,
|
||||||
|
variation => equivalence(variation.attributes, chosenProductAttributes),
|
||||||
|
),
|
||||||
|
Effect.fromOption,
|
||||||
|
Effect.mapError(error => new Error("Impossible de trouver la variation demandée.", { cause: error })),
|
||||||
|
);
|
||||||
|
yield* Console.debug("onVariationChangeHandler", "chosenVariation", chosenVariation);
|
||||||
|
|
||||||
|
// Met à jour la valeur de la Variation choisie dans le Service.
|
||||||
|
yield* Ref.set(Option.some(chosenVariation))(CurrentProduct);
|
||||||
|
|
||||||
|
const newPrice = String(chosenVariation.price);
|
||||||
|
ProductPrice.textContent = `${newPrice}€`;
|
||||||
|
|
||||||
|
return yield* Effect.void;
|
||||||
|
}, Effect.tapError(Console.error));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Déclenche une ajout du Produit demandé au Panier auprès du Backend.
|
||||||
|
*/
|
||||||
|
const addToCartButtonClickHandler = Effect.fn("addToCartButtonClickHandler")(function*() {
|
||||||
|
yield* Console.log("addToCartButtonClickHandler");
|
||||||
|
|
||||||
|
// Créé le corps de la requête
|
||||||
|
const requestBody: CartProduct = yield* pipe(
|
||||||
|
Ref.get(CurrentProduct),
|
||||||
|
Effect.flatMap(Effect.fromOption),
|
||||||
|
// Pour un Produit simple, le Ref sera vide.
|
||||||
|
Effect.orElseSucceed(() =>
|
||||||
|
ProductVariation.make({
|
||||||
|
attributes: [],
|
||||||
|
id: PageStates.product.id,
|
||||||
|
price: PageStates.product.price,
|
||||||
|
})
|
||||||
|
),
|
||||||
|
Effect.map(({ id, attributes }) =>
|
||||||
|
// Les données ont été validées en amont.
|
||||||
|
Schema.decodeSync(CartProduct)({ id: id, quantity: 1, variation: attributes })
|
||||||
|
),
|
||||||
|
Effect.tap(body => Console.debug("addToCartButtonClickHandler", "requestBody", body)),
|
||||||
|
);
|
||||||
|
|
||||||
|
// Désactive les interactions le temps de la requête.
|
||||||
|
AddToCartButton.toggleAttribute(ATTRIBUT_DESACTIVE);
|
||||||
|
AddToCartButton.toggleAttribute(ATTRIBUT_CHARGEMENT);
|
||||||
|
lanceAnimationCycleLoading(AddToCartButton, 500);
|
||||||
|
|
||||||
|
const responseBody = yield* pipe(
|
||||||
|
API.AddProductToCart(PageStates.nonce, requestBody),
|
||||||
|
Effect.flatMap((response: Response) => Effect.tryPromise(async () => response.json())),
|
||||||
|
Effect.tap((response: JSONValue) => Console.debug("addToCartButtonClickHandler", "response", response)),
|
||||||
|
);
|
||||||
|
|
||||||
|
return responseBody;
|
||||||
|
});
|
||||||
|
|
||||||
|
const initAddToCartButtonInitialState = Effect.fn("initAddToCartButtonInitialState")(function*() {
|
||||||
|
/** Est-ce que le Produit affiché est en stock ? */
|
||||||
|
const isProductInStock = AddToCartButton.hasAttribute("data-in-stock") === true;
|
||||||
|
|
||||||
|
// S'('y a pas de stock, ne rien faire.
|
||||||
|
if (isProductInStock === false) {
|
||||||
|
return yield* Effect.void;
|
||||||
|
}
|
||||||
|
|
||||||
|
// S'il n'y a pas de Sélecteurs de variations, activer le Bouton d'ajout au Panier.
|
||||||
|
if (FxArray.isReadonlyArrayEmpty(VariationSelectors)) {
|
||||||
|
AddToCartButton.removeAttribute(ATTRIBUT_DESACTIVE);
|
||||||
|
}
|
||||||
|
|
||||||
|
return yield* Effect.void;
|
||||||
|
});
|
||||||
|
|
||||||
|
const initAddToCartButtonUpdates = Effect.fn("initAddToCartInteractionUpdates")(
|
||||||
|
function*(): Effect.fn.Return<void> {
|
||||||
|
return yield* pipe(
|
||||||
|
Stream.fromEventListener(VariationChoiceForm, "change"),
|
||||||
|
Stream.tap(onFormChangeHandler),
|
||||||
|
Stream.runDrain,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
const initAddToCartButtonClicks = Effect.fn("initAddToCartButtonClicks")(function*() {
|
||||||
|
return yield* pipe(
|
||||||
|
Stream.fromEventListener(AddToCartButton, "click"),
|
||||||
|
Stream.tap(addToCartButtonClickHandler),
|
||||||
|
Stream.runDrain,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
const initPriceUpdatesOnVariationChange = Effect.fn("initPriceUpdatesOnVariationChange")(function*() {
|
||||||
|
return yield* pipe(
|
||||||
|
Stream.fromEventListener(VariationChoiceForm, "change"),
|
||||||
|
Stream.tap(onVariationChangeHandler),
|
||||||
|
Stream.runDrain,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
const initDetailInteractions = Effect.fn("initDetailInteractions")(function*() {
|
||||||
|
return yield* pipe(
|
||||||
|
// Créé un Stream par Bouton de Section.
|
||||||
|
FxArray.map(
|
||||||
|
DetailsButtons,
|
||||||
|
(button: HTMLButtonElement) =>
|
||||||
|
pipe(Stream.fromEventListener(button, "click"), Stream.tap(onDetailButtonClickHandler)),
|
||||||
|
),
|
||||||
|
Stream.mergeAll({ concurrency: "unbounded" }),
|
||||||
|
Stream.runDrain,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
return ProductPageDOM.of({
|
||||||
|
CurrentVariation: CurrentProduct,
|
||||||
|
initAddToCartButtonClicks,
|
||||||
|
initAddToCartButtonInitialState,
|
||||||
|
initAddToCartButtonUpdates,
|
||||||
|
initDetailInteractions,
|
||||||
|
initPriceUpdatesOnVariationChange,
|
||||||
|
PageStates,
|
||||||
|
});
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ProductPageDOM;
|
||||||
|
|
@ -0,0 +1,71 @@
|
||||||
|
import { Array as FxArray, Context, Effect, HashMap, Layer, Option, pipe } from "effect";
|
||||||
|
import type { NonEmptyReadonlyArray } from "effect/Array";
|
||||||
|
import type { NoSuchElementError } from "effect/Cause";
|
||||||
|
import { getAllSelectorFromDocument, getFirstSelectorFromDocument } from "../../scripts-effect/lib/dom.ts";
|
||||||
|
import {
|
||||||
|
ATTRIBUT_ARIA_CONTROLS,
|
||||||
|
DOM_BOUTON_AJOUT_PANIER,
|
||||||
|
DOM_BOUTONS_ACCORDEON,
|
||||||
|
DOM_CONTENUS_ACCORDEON,
|
||||||
|
DOM_PRIX_PRODUIT,
|
||||||
|
} from "../constantes/dom.ts";
|
||||||
|
import { IncoherentDOMError } from "./errors.ts";
|
||||||
|
import type { DetailEnsemble } from "./types.d.ts";
|
||||||
|
|
||||||
|
class ProductPageElements extends Context.Service<
|
||||||
|
ProductPageElements,
|
||||||
|
{
|
||||||
|
AddToCartButton: HTMLButtonElement;
|
||||||
|
Details: HashMap.HashMap<string, DetailEnsemble>;
|
||||||
|
DetailsButtons: NonEmptyReadonlyArray<HTMLButtonElement>;
|
||||||
|
DetailsContents: NonEmptyReadonlyArray<HTMLDivElement>;
|
||||||
|
PageStatesRawJson: HTMLScriptElement;
|
||||||
|
ProductPrice: HTMLParagraphElement;
|
||||||
|
VariationChoiceForm: HTMLFormElement;
|
||||||
|
VariationSelectors: ReadonlyArray<HTMLSelectElement>;
|
||||||
|
}
|
||||||
|
>()("haikuatelier.fr/Produit/ProductPageElements") {
|
||||||
|
static readonly layer = Layer.effect(
|
||||||
|
ProductPageElements,
|
||||||
|
Effect.gen(function*() {
|
||||||
|
const AddToCartButton = yield* getFirstSelectorFromDocument<HTMLButtonElement>(DOM_BOUTON_AJOUT_PANIER);
|
||||||
|
const DetailsButtons = yield* getAllSelectorFromDocument<HTMLButtonElement>(DOM_BOUTONS_ACCORDEON);
|
||||||
|
const DetailsContents = yield* getAllSelectorFromDocument<HTMLDivElement>(DOM_CONTENUS_ACCORDEON);
|
||||||
|
const PageStatesRawJson = yield* getFirstSelectorFromDocument<HTMLScriptElement>("#page-states");
|
||||||
|
const ProductPrice = yield* getFirstSelectorFromDocument<HTMLParagraphElement>(DOM_PRIX_PRODUIT);
|
||||||
|
const VariationChoiceForm = yield* getFirstSelectorFromDocument<HTMLFormElement>("#variation-choice");
|
||||||
|
const VariationSelectors = yield* pipe(
|
||||||
|
getAllSelectorFromDocument<HTMLSelectElement>(".selecteur-produit select"),
|
||||||
|
Option.orElseSome(() => FxArray.empty<HTMLSelectElement>()),
|
||||||
|
);
|
||||||
|
|
||||||
|
const Details = yield* pipe(
|
||||||
|
DetailsButtons,
|
||||||
|
FxArray.map(
|
||||||
|
(button: HTMLButtonElement, index: number): Effect.Effect<[string, DetailEnsemble], NoSuchElementError> =>
|
||||||
|
Effect.gen(function*() {
|
||||||
|
const contentId = yield* Option.fromNullishOr(button.getAttribute(ATTRIBUT_ARIA_CONTROLS));
|
||||||
|
const content = yield* FxArray.get(DetailsContents, index);
|
||||||
|
|
||||||
|
return [contentId, { button, content } satisfies DetailEnsemble];
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
Effect.all,
|
||||||
|
Effect.map(HashMap.fromIterable<string, DetailEnsemble>),
|
||||||
|
);
|
||||||
|
|
||||||
|
return ProductPageElements.of({
|
||||||
|
AddToCartButton,
|
||||||
|
Details,
|
||||||
|
DetailsButtons,
|
||||||
|
DetailsContents,
|
||||||
|
PageStatesRawJson,
|
||||||
|
ProductPrice,
|
||||||
|
VariationChoiceForm,
|
||||||
|
VariationSelectors,
|
||||||
|
});
|
||||||
|
}).pipe(Effect.mapError(IncoherentDOMError.fromNoSuchElementError)),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ProductPageElements;
|
||||||
7
web/app/themes/haiku-atelier-2024/src/scripts/page-produit/types.d.ts
vendored
Normal file
7
web/app/themes/haiku-atelier-2024/src/scripts/page-produit/types.d.ts
vendored
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
/** Représente un ensemble bouton-contenu d'une Section dans la description du Produit. */
|
||||||
|
type DetailEnsemble = {
|
||||||
|
button: HTMLButtonElement;
|
||||||
|
content: HTMLDivElement;
|
||||||
|
};
|
||||||
|
|
||||||
|
export { DetailEnsemble };
|
||||||
|
|
@ -1,281 +0,0 @@
|
||||||
// oxlint-disable typescript/dot-notation
|
|
||||||
import {
|
|
||||||
Array as FxArray,
|
|
||||||
Console,
|
|
||||||
Context,
|
|
||||||
Effect,
|
|
||||||
HashMap,
|
|
||||||
Layer,
|
|
||||||
ManagedRuntime,
|
|
||||||
Option,
|
|
||||||
pipe,
|
|
||||||
Stream,
|
|
||||||
} from "effect";
|
|
||||||
import type { NonEmptyReadonlyArray } from "effect/Array";
|
|
||||||
import type { NoSuchElementError } from "effect/Cause";
|
|
||||||
import { getAllSelectorFromDocument, getFirstSelectorFromDocument } from "../scripts-effect/lib/dom.ts";
|
|
||||||
import {
|
|
||||||
ATTRIBUT_ARIA_CONTROLS,
|
|
||||||
ATTRIBUT_ARIA_EXPANDED,
|
|
||||||
ATTRIBUT_DESACTIVE,
|
|
||||||
ATTRIBUT_HIDDEN,
|
|
||||||
DOM_BOUTON_AJOUT_PANIER,
|
|
||||||
DOM_BOUTONS_ACCORDEON,
|
|
||||||
DOM_CONTENUS_ACCORDEON,
|
|
||||||
DOM_PRIX_PRODUIT,
|
|
||||||
} from "./constantes/dom.ts";
|
|
||||||
import type { WCStoreCartAddItemArgsItems } from "./lib/types/api/cart-add-item.d.ts";
|
|
||||||
|
|
||||||
/** Représente un ensemble bouton-contenu d'une Section dans la description du Produit. */
|
|
||||||
type DetailEnsemble = {
|
|
||||||
button: HTMLButtonElement;
|
|
||||||
content: HTMLDivElement;
|
|
||||||
};
|
|
||||||
|
|
||||||
class ProductPageElements extends Context.Service<
|
|
||||||
ProductPageElements,
|
|
||||||
{
|
|
||||||
AddToCartButton: HTMLButtonElement;
|
|
||||||
Details: HashMap.HashMap<string, DetailEnsemble>;
|
|
||||||
DetailsButtons: NonEmptyReadonlyArray<HTMLButtonElement>;
|
|
||||||
DetailsContents: NonEmptyReadonlyArray<HTMLDivElement>;
|
|
||||||
ProductPrice: HTMLParagraphElement;
|
|
||||||
ProductRawJson: HTMLScriptElement;
|
|
||||||
VariationChoiceForm: HTMLFormElement;
|
|
||||||
VariationSelectors: ReadonlyArray<HTMLSelectElement>;
|
|
||||||
}
|
|
||||||
>()("haikuatelier.fr/Produit/ProductPageElements") {
|
|
||||||
static readonly layer = Layer.effect(
|
|
||||||
ProductPageElements,
|
|
||||||
Effect.gen(function*() {
|
|
||||||
const AddToCartButton = yield* getFirstSelectorFromDocument<HTMLButtonElement>(DOM_BOUTON_AJOUT_PANIER);
|
|
||||||
const DetailsButtons = yield* getAllSelectorFromDocument<HTMLButtonElement>(DOM_BOUTONS_ACCORDEON);
|
|
||||||
const DetailsContents = yield* getAllSelectorFromDocument<HTMLDivElement>(DOM_CONTENUS_ACCORDEON);
|
|
||||||
const ProductPrice = yield* getFirstSelectorFromDocument<HTMLParagraphElement>(DOM_PRIX_PRODUIT);
|
|
||||||
const ProductRawJson = yield* getFirstSelectorFromDocument<HTMLScriptElement>("#product-json");
|
|
||||||
const VariationChoiceForm = yield* getFirstSelectorFromDocument<HTMLFormElement>("#variation-choice");
|
|
||||||
const VariationSelectors = yield* pipe(
|
|
||||||
getAllSelectorFromDocument<HTMLSelectElement>(".selecteur-produit select"),
|
|
||||||
Option.orElseSome(() => FxArray.empty<HTMLSelectElement>()),
|
|
||||||
);
|
|
||||||
|
|
||||||
const Details = yield* pipe(
|
|
||||||
DetailsButtons,
|
|
||||||
FxArray.map(
|
|
||||||
(button: HTMLButtonElement, index: number): Effect.Effect<[string, DetailEnsemble], NoSuchElementError> =>
|
|
||||||
Effect.gen(function*() {
|
|
||||||
const contentId = yield* Option.fromNullishOr(button.getAttribute(ATTRIBUT_ARIA_CONTROLS));
|
|
||||||
const content = yield* FxArray.get(DetailsContents, index);
|
|
||||||
|
|
||||||
return [contentId, { button, content } satisfies DetailEnsemble];
|
|
||||||
}),
|
|
||||||
),
|
|
||||||
Effect.all,
|
|
||||||
Effect.map(HashMap.fromIterable<string, DetailEnsemble>),
|
|
||||||
);
|
|
||||||
|
|
||||||
return ProductPageElements.of({
|
|
||||||
AddToCartButton,
|
|
||||||
Details,
|
|
||||||
DetailsButtons,
|
|
||||||
DetailsContents,
|
|
||||||
ProductPrice,
|
|
||||||
ProductRawJson,
|
|
||||||
VariationChoiceForm,
|
|
||||||
VariationSelectors,
|
|
||||||
});
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
class ProductPageDOM extends Context.Service<
|
|
||||||
ProductPageDOM,
|
|
||||||
{
|
|
||||||
initPriceUpdatesOnVariationChange: () => Effect.Effect<void>;
|
|
||||||
onVariationChangeHandler: () => Effect.Effect<void>;
|
|
||||||
/**
|
|
||||||
* Récupère les Attributs du Produit depuis les Elements au sein du DOM.
|
|
||||||
*/
|
|
||||||
getProductAttributesFromDOM: () => Effect.Effect<ReadonlyArray<WCStoreCartAddItemArgsItems>>;
|
|
||||||
/**
|
|
||||||
* Initialise l'état initial du Bouton d'ajout au Panier.
|
|
||||||
*/
|
|
||||||
initAddToCartButtonInitialState: () => Effect.Effect<void>;
|
|
||||||
/**
|
|
||||||
* Initialise les mises à jour du Bouton d'ajout au Panier en fonction des interactions de l'Utilisateur.
|
|
||||||
*/
|
|
||||||
initAddToCartButtonUpdates: () => Effect.Effect<void>;
|
|
||||||
/**
|
|
||||||
* Initialise les interactions des Sections de la Description du Produit.
|
|
||||||
*/
|
|
||||||
initDetailInteractions: () => Effect.Effect<void, NoSuchElementError>;
|
|
||||||
/**
|
|
||||||
* Met à jour l'état des Sections de la Description du Produit.
|
|
||||||
*/
|
|
||||||
onDetailButtonClickHandler: (evt: Event) => Effect.Effect<void, NoSuchElementError>;
|
|
||||||
/**
|
|
||||||
* Met à jour l'état du Bouton d'ajout au Panier.
|
|
||||||
*/
|
|
||||||
onFormChangeHandler: (evt: Event) => Effect.Effect<void>;
|
|
||||||
/**
|
|
||||||
* Replie toutes les sections de la description du Produit.
|
|
||||||
*/
|
|
||||||
toggleAllDetails: () => Effect.Effect<void>;
|
|
||||||
}
|
|
||||||
>()("haikuatelier.fr/Produit/ProductPageDOM") {
|
|
||||||
static readonly layer = Layer.effect(
|
|
||||||
ProductPageDOM,
|
|
||||||
Effect.gen(function*() {
|
|
||||||
const { AddToCartButton, Details, ProductPrice, DetailsButtons, ProductRawJson, VariationChoiceForm, VariationSelectors } =
|
|
||||||
yield* ProductPageElements;
|
|
||||||
|
|
||||||
const onFormChangeHandler = Effect.fnUntraced(function*(evt: Event) {
|
|
||||||
// La cible ne peut qu'être un Formulaire.
|
|
||||||
const target: HTMLFormElement = evt.target as HTMLFormElement;
|
|
||||||
const isClickAllowed = target.checkValidity() === false;
|
|
||||||
|
|
||||||
// Active/désactive le Bouton en fonction de la validité du Formulaire du Produit.
|
|
||||||
AddToCartButton.toggleAttribute(ATTRIBUT_DESACTIVE, isClickAllowed);
|
|
||||||
|
|
||||||
return yield* Effect.void;
|
|
||||||
});
|
|
||||||
|
|
||||||
const toggleAllDetails: () => Effect.Effect<void> = () =>
|
|
||||||
Effect.sync((): void => {
|
|
||||||
pipe(
|
|
||||||
// Récupère les Sections sous forme d'Ensembles.
|
|
||||||
[...HashMap.values(Details)],
|
|
||||||
FxArray.forEach((detail: DetailEnsemble) => {
|
|
||||||
detail.button.toggleAttribute(ATTRIBUT_ARIA_EXPANDED, false);
|
|
||||||
detail.content.toggleAttribute(ATTRIBUT_HIDDEN, true);
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
const onDetailButtonClickHandler = Effect.fnUntraced(function*(evt: Event) {
|
|
||||||
// Empêche la pollution de l'historique de navigation
|
|
||||||
evt.preventDefault();
|
|
||||||
|
|
||||||
// La cible est connue.
|
|
||||||
const target = evt.target as HTMLButtonElement;
|
|
||||||
|
|
||||||
// Récupère le contenu correspondant au Bouton.
|
|
||||||
const linkedSection = yield* pipe(
|
|
||||||
Option.fromNullishOr(target.getAttribute(ATTRIBUT_ARIA_CONTROLS)),
|
|
||||||
Option.flatMap((contentId: string) => HashMap.get(Details, contentId)),
|
|
||||||
);
|
|
||||||
|
|
||||||
// Sauvegarde l'état d'ouverture de la Section avant de toutes les fermer.
|
|
||||||
const wasCurrentSection: boolean = target.getAttribute(ATTRIBUT_ARIA_EXPANDED) === "true";
|
|
||||||
|
|
||||||
// Replie toutes les Sections.
|
|
||||||
yield* toggleAllDetails();
|
|
||||||
|
|
||||||
// Ne fais rien de plus si l'onglet sélectionné était le courant
|
|
||||||
if (wasCurrentSection === true) {
|
|
||||||
return yield* Effect.void;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ouvre le nouvel onglet sélectionné
|
|
||||||
target.toggleAttribute(ATTRIBUT_ARIA_EXPANDED, true);
|
|
||||||
linkedSection.content.toggleAttribute(ATTRIBUT_HIDDEN, false);
|
|
||||||
|
|
||||||
return yield* Effect.void;
|
|
||||||
});
|
|
||||||
|
|
||||||
const getProductAttributesFromDOM: () => Effect.Effect<ReadonlyArray<WCStoreCartAddItemArgsItems>> = () =>
|
|
||||||
Effect.sync(() =>
|
|
||||||
FxArray.map(VariationSelectors, (select: HTMLSelectElement) => ({
|
|
||||||
attribute: select.id,
|
|
||||||
value: select.value,
|
|
||||||
}))
|
|
||||||
);
|
|
||||||
|
|
||||||
const initAddToCartButtonInitialState = Effect.fn("initAddToCartButtonInitialState")(function*() {
|
|
||||||
/** Est-ce que le Produit affiché est en stock ? */
|
|
||||||
const isProductInStock = AddToCartButton.hasAttribute("data-in-stock") === true;
|
|
||||||
|
|
||||||
// S'il n'y a pas de stock, ne rien faire.
|
|
||||||
if (isProductInStock === false) {
|
|
||||||
return yield* Effect.void;
|
|
||||||
}
|
|
||||||
|
|
||||||
// S'il n'y a pas de Sélecteurs de variations, activer le Bouton d'ajout au Panier.
|
|
||||||
if (FxArray.isReadonlyArrayEmpty(VariationSelectors)) {
|
|
||||||
AddToCartButton.removeAttribute(ATTRIBUT_DESACTIVE);
|
|
||||||
}
|
|
||||||
|
|
||||||
return yield* Effect.void;
|
|
||||||
});
|
|
||||||
|
|
||||||
const initAddToCartButtonUpdates = Effect.fn("initAddToCartInteractionUpdates")(function*() {
|
|
||||||
return yield* pipe(
|
|
||||||
Stream.fromEventListener(VariationChoiceForm, "change"),
|
|
||||||
Stream.tap(onFormChangeHandler),
|
|
||||||
Stream.runDrain,
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
const initPriceUpdatesOnVariationChange = Effect.fn("initPriceUpdatesOnVariationChange")(function*(){
|
|
||||||
return yield* pipe(
|
|
||||||
Stream.fromEventListener(VariationChoiceForm, "change"),
|
|
||||||
Stream.tap(onVariationChangeHandler),
|
|
||||||
Stream.runDrain,
|
|
||||||
)
|
|
||||||
});
|
|
||||||
|
|
||||||
const onVariationChangeHandler = Effect.fn("onVariationChangeHandler")(function*(){
|
|
||||||
if (VariationChoiceForm.checkValidity() === false) {
|
|
||||||
return yield* Effect.void;
|
|
||||||
}
|
|
||||||
|
|
||||||
const variations = JSON.parse(ProductRawJson.textContent)?.variations as ReadonlyArray<unknown>;
|
|
||||||
const chosenAttributes = yield* getProductAttributesFromDOM();
|
|
||||||
|
|
||||||
const equivalence = FxArray.makeEquivalence<{attribute: string,value: string}>((a,b) => {
|
|
||||||
return a.attribute === b.attribute && a.value === b.value;
|
|
||||||
});
|
|
||||||
const chosenVariation = yield* FxArray.findFirst(variations, variation => equivalence(variation.attributes, chosenAttributes));
|
|
||||||
const newPrice = chosenVariation.price;
|
|
||||||
|
|
||||||
ProductPrice.textContent = `${newPrice}€`;
|
|
||||||
return yield* Effect.void;
|
|
||||||
});
|
|
||||||
|
|
||||||
const initDetailInteractions = Effect.fn("initDetailInteractions")(function*() {
|
|
||||||
return yield* pipe(
|
|
||||||
// Créé un Stream par Bouton de Section.
|
|
||||||
FxArray.map(
|
|
||||||
DetailsButtons,
|
|
||||||
(button: HTMLButtonElement) =>
|
|
||||||
pipe(Stream.fromEventListener(button, "click"), Stream.tap(onDetailButtonClickHandler)),
|
|
||||||
),
|
|
||||||
Stream.mergeAll({ concurrency: "unbounded" }),
|
|
||||||
Stream.runDrain,
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
return ProductPageDOM.of({
|
|
||||||
getProductAttributesFromDOM,
|
|
||||||
initAddToCartButtonInitialState,
|
|
||||||
initAddToCartButtonUpdates,
|
|
||||||
initDetailInteractions,
|
|
||||||
initPriceUpdatesOnVariationChange,
|
|
||||||
onDetailButtonClickHandler,
|
|
||||||
onFormChangeHandler,
|
|
||||||
onVariationChangeHandler,
|
|
||||||
toggleAllDetails,
|
|
||||||
});
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const ProductPageRuntime = ManagedRuntime.make(
|
|
||||||
pipe(
|
|
||||||
ProductPageDOM.layer,
|
|
||||||
Layer.provide(ProductPageElements.layer),
|
|
||||||
Layer.tapError(error => Console.error("ManagedRuntime", "Impossible de créer le Layer :", error.name)),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
export { type DetailEnsemble, ProductPageDOM, ProductPageElements, ProductPageRuntime };
|
|
||||||
|
|
@ -1,46 +1,29 @@
|
||||||
// Scripts pour la Page Produit
|
// Scripts pour la Page Produit
|
||||||
|
|
||||||
import { pipe } from "@mobily/ts-belt";
|
import { Console, Effect } from "effect";
|
||||||
import { Console, Effect, pipe as epipe } from "effect";
|
import ProductPageRuntime from "./page-produit/runtime.ts";
|
||||||
|
import ProductPageDOM from "./page-produit/service-dom.ts";
|
||||||
|
|
||||||
|
document.addEventListener("DOMContentLoaded", (): void => {
|
||||||
|
Effect.gen(function*() {
|
||||||
|
const DOM = yield* ProductPageDOM;
|
||||||
|
|
||||||
import { ProductPageRuntime } from "./scripts-page-produit-service.ts";
|
const effects = Effect.all(
|
||||||
|
[
|
||||||
|
DOM.initAddToCartButtonInitialState(),
|
||||||
|
DOM.initAddToCartButtonUpdates(),
|
||||||
|
DOM.initAddToCartButtonClicks(),
|
||||||
|
DOM.initDetailInteractions(),
|
||||||
|
DOM.initPriceUpdatesOnVariationChange(),
|
||||||
|
],
|
||||||
|
{
|
||||||
|
concurrency: "unbounded",
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
/** États utiles pour les scripts de la page. */
|
yield* effects.pipe(Effect.tapCause(Console.error));
|
||||||
type EtatsPage = {
|
}).pipe(ProductPageRuntime.runFork);
|
||||||
/** L'ID en base de données du Produit. */
|
});
|
||||||
idProduit: number;
|
|
||||||
/** Un nonce pour l'authentification de requêtes API vers le backend WooCommerce. */
|
|
||||||
nonce: string;
|
|
||||||
};
|
|
||||||
|
|
||||||
// @ts-expect-error -- États injectés par le modèle PHP
|
|
||||||
const ETATS_PAGE: EtatsPage = _etats;
|
|
||||||
|
|
||||||
const areArraysEqual = <T>(array1: Array<T>, array2: Array<T>): boolean => {
|
|
||||||
if (array1 !== array2) {
|
|
||||||
const a1 = JSON.stringify(array1.toSorted());
|
|
||||||
const a2 = JSON.stringify(array2.toSorted());
|
|
||||||
return a1 === a2;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
|
|
||||||
const updatePriceOnAttributeChange = (): void => {
|
|
||||||
E.VARIATION_CHOICE_FORM.addEventListener("change", (): void => {
|
|
||||||
if (E.VARIATION_CHOICE_FORM.checkValidity() === false) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const productVariations: Array<unknown> = epipe(E.PRODUCT_JSON.textContent, JSON.parse)?.variations;
|
|
||||||
const chosenAttributes = getAttributesFromDom();
|
|
||||||
|
|
||||||
const chosenVariation = productVariations.find(v => areArraysEqual(v.attributes, chosenAttributes));
|
|
||||||
const newPrice: string = chosenVariation.price;
|
|
||||||
|
|
||||||
E.PRIX_PRODUIT.textContent = `${newPrice}€`;
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
// const ajouteProduitAuPanier = (event: MouseEvent): void => {
|
// const ajouteProduitAuPanier = (event: MouseEvent): void => {
|
||||||
// event.preventDefault();
|
// event.preventDefault();
|
||||||
|
|
@ -129,10 +112,3 @@ const updatePriceOnAttributeChange = (): void => {
|
||||||
// })
|
// })
|
||||||
// .run();
|
// .run();
|
||||||
// };
|
// };
|
||||||
|
|
||||||
document.addEventListener("DOMContentLoaded", (): void => {
|
|
||||||
ProductPageRuntime.runFork(pipe(initAddToCartButton(), Effect.tapCause(Console.error)));
|
|
||||||
ProductPageRuntime.runFork(pipe(initAddToCartInteractionUpdates(), Effect.tapCause(Console.error)));
|
|
||||||
ProductPageRuntime.runFork(pipe(initDetailInteractions(), Effect.tapCause(Console.error)));
|
|
||||||
updatePriceOnAttributeChange();
|
|
||||||
});
|
|
||||||
|
|
|
||||||
|
|
@ -1,23 +1,6 @@
|
||||||
{% extends 'base.twig' %}
|
{% extends 'base.twig' %}
|
||||||
|
|
||||||
{% block head %}
|
{% block head %}
|
||||||
<script id="injection">
|
|
||||||
// dprint-ignore-file
|
|
||||||
// Injection d'états pour les Scripts de la page.
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @typedef {Object} Etats - États utiles pour les scripts de la page.
|
|
||||||
* @property {number} idProduit - L'ID en base de données du Produit.
|
|
||||||
* @property {string} nonce - Un nonce pour l'authentification de requêtes API.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @type {Etats} */
|
|
||||||
const _etats = {
|
|
||||||
idProduit: {{ product.id }},
|
|
||||||
nonce: "{{ nonce_wc }}",
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<!-- markup-fmt-ignore -->
|
<!-- markup-fmt-ignore -->
|
||||||
<script
|
<script
|
||||||
id="product-json"
|
id="product-json"
|
||||||
|
|
@ -25,6 +8,14 @@
|
||||||
>
|
>
|
||||||
{{ product_json }}
|
{{ product_json }}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<!-- markup-fmt-ignore -->
|
||||||
|
<script
|
||||||
|
id="page-states"
|
||||||
|
type="application/json"
|
||||||
|
>
|
||||||
|
{{ page_states }}
|
||||||
|
</script>
|
||||||
{% endblock head %}
|
{% endblock head %}
|
||||||
|
|
||||||
{% block contenu %}
|
{% block contenu %}
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ use Illuminate\Support\Str;
|
||||||
use Timber\Timber;
|
use Timber\Timber;
|
||||||
|
|
||||||
if (!defined('ABSPATH')) {
|
if (!defined('ABSPATH')) {
|
||||||
exit();
|
exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialise Timber
|
// Initialise Timber
|
||||||
|
|
@ -30,13 +30,13 @@ $commande = $order;
|
||||||
$date = new Carbon($commande->get_date_created());
|
$date = new Carbon($commande->get_date_created());
|
||||||
|
|
||||||
$email = [
|
$email = [
|
||||||
'commande' => ['date' => $date->toDateString(), 'id' => $commande->get_id()],
|
'commande' => ['date' => $date->toDateString(), 'id' => $commande->get_id()],
|
||||||
'livraison' => [
|
'livraison' => [
|
||||||
'transporteur' => Str::of($commande->get_shipping_method())->replace(' (Free)', ''),
|
'transporteur' => Str::of($commande->get_shipping_method())->replace(' (Free)', ''),
|
||||||
'numero_suivi' => blank($commande->get_meta('tracking_number'))
|
'numero_suivi' => blank($commande->get_meta('tracking_number'))
|
||||||
? 'UNKNOWN_TRACKING_NUMBER'
|
? 'UNKNOWN_TRACKING_NUMBER'
|
||||||
: $commande->get_meta('tracking_number'),
|
: $commande->get_meta('tracking_number'),
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
|
|
||||||
$context['commande'] = $email;
|
$context['commande'] = $email;
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ use Illuminate\Support\Str;
|
||||||
use Timber\Timber;
|
use Timber\Timber;
|
||||||
|
|
||||||
if (!defined('ABSPATH')) {
|
if (!defined('ABSPATH')) {
|
||||||
exit();
|
exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialise Timber
|
// Initialise Timber
|
||||||
|
|
@ -31,49 +31,44 @@ $commande = $order;
|
||||||
$date = new Carbon($commande->get_date_created());
|
$date = new Carbon($commande->get_date_created());
|
||||||
|
|
||||||
$email = [
|
$email = [
|
||||||
'adresses' => [
|
'adresses' => ['facturation' => $commande->get_address('billing'), 'livraison' => $commande->get_address('shipping')],
|
||||||
'facturation' => $commande->get_address('billing'),
|
'commande' => ['date' => $date->toDateString(), 'id' => $commande->get_id()],
|
||||||
'livraison' => $commande->get_address('shipping'),
|
'livraison' => [
|
||||||
],
|
'methode' => $commande->get_shipping_method(),
|
||||||
'commande' => ['date' => $date->toDateString(), 'id' => $commande->get_id()],
|
'numero_suivi' => $commande->get_meta('tracking_number'),
|
||||||
'livraison' => [
|
],
|
||||||
'methode' => $commande->get_shipping_method(),
|
'paiement' => ['methode' => ''],
|
||||||
'numero_suivi' => $commande->get_meta('tracking_number'),
|
'produits' => collect($commande->get_items())->map(static function (WC_Order_Item_Product $article) {
|
||||||
],
|
$produit = $article->get_product();
|
||||||
'paiement' => ['methode' => ''],
|
|
||||||
'produits' => collect($commande->get_items())->map(static function (WC_Order_Item_Product $article) {
|
|
||||||
$produit = $article->get_product();
|
|
||||||
|
|
||||||
if (is_bool($produit) || $produit === null) {
|
if (is_bool($produit) || $produit === null) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
return [
|
return [
|
||||||
// Récupère l'Attribut d'un Produit variable ou renvoie un tableau vide
|
// Récupère l'Attribut d'un Produit variable ou renvoie un tableau vide
|
||||||
'attribut' => $produit->is_type('variable')
|
'attribut' => $produit->is_type('variable')
|
||||||
? collect($produit->get_attributes())
|
? collect($produit->get_attributes())
|
||||||
->mapWithKeys(static fn($_atr, $cle): array => [
|
->mapWithKeys(static fn($_atr, $cle): array => [
|
||||||
'nom' => Str::lower(wc_attribute_label($cle, $produit)),
|
'nom' => Str::lower(wc_attribute_label($cle, $produit)),
|
||||||
'valeur' => $produit->get_attribute($cle),
|
'valeur' => $produit->get_attribute($cle),
|
||||||
])
|
])
|
||||||
->toArray()
|
->toArray()
|
||||||
: [],
|
: [],
|
||||||
'lien' => $produit->get_permalink(),
|
'lien' => $produit->get_permalink(),
|
||||||
'nom' => $produit->get_title(),
|
'nom' => $produit->get_title(),
|
||||||
'prix_total' => $article->get_total(),
|
'prix_total' => $article->get_total(),
|
||||||
'quantite' => $article->get_quantity(),
|
'quantite' => $article->get_quantity(),
|
||||||
];
|
];
|
||||||
}),
|
}),
|
||||||
'totaux' => [
|
'totaux' => [
|
||||||
'sous_total_livraison' => '0' === $commande->get_shipping_total()
|
'sous_total_livraison' => '0' === $commande->get_shipping_total() ? 'Free' : $commande->get_shipping_total() . '€',
|
||||||
? 'Free'
|
'sous_total_produits' => $commande->get_subtotal() . '€',
|
||||||
: $commande->get_shipping_total() . '€',
|
'sous_total_reduction' => '0.00' === $commande->get_discount_total()
|
||||||
'sous_total_produits' => $commande->get_subtotal() . '€',
|
? '0'
|
||||||
'sous_total_reduction' => '0.00' === $commande->get_discount_total()
|
: Number::format((float) $commande->get_discount_total(), maxPrecision: 2) . '€',
|
||||||
? '0'
|
'total' => Number::format((float) $commande->get_total(), maxPrecision: 2) . '€',
|
||||||
: Number::format((float) $commande->get_discount_total(), maxPrecision: 2) . '€',
|
],
|
||||||
'total' => Number::format((float) $commande->get_total(), maxPrecision: 2) . '€',
|
|
||||||
],
|
|
||||||
];
|
];
|
||||||
// Transforme les codes de pays en noms de pays
|
// Transforme les codes de pays en noms de pays
|
||||||
$email['adresses']['livraison']['country'] = WC()->countries->countries[$commande->get_shipping_country()];
|
$email['adresses']['livraison']['country'] = WC()->countries->countries[$commande->get_shipping_country()];
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ use Illuminate\Support\Str;
|
||||||
use Timber\Timber;
|
use Timber\Timber;
|
||||||
|
|
||||||
if (!defined('ABSPATH')) {
|
if (!defined('ABSPATH')) {
|
||||||
exit();
|
exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialise Timber
|
// Initialise Timber
|
||||||
|
|
@ -31,45 +31,40 @@ $commande = $order;
|
||||||
$date = new Carbon($commande->get_date_created());
|
$date = new Carbon($commande->get_date_created());
|
||||||
|
|
||||||
$email = [
|
$email = [
|
||||||
'adresses' => [
|
'adresses' => ['facturation' => $commande->get_address('billing'), 'livraison' => $commande->get_address('shipping')],
|
||||||
'facturation' => $commande->get_address('billing'),
|
'commande' => ['date' => $date->toDateString(), 'id' => $commande->get_id()],
|
||||||
'livraison' => $commande->get_address('shipping'),
|
'paiement' => ['methode' => ''],
|
||||||
],
|
'produits' => collect($commande->get_items())->map(static function (WC_Order_Item_Product $article) {
|
||||||
'commande' => ['date' => $date->toDateString(), 'id' => $commande->get_id()],
|
$produit = $article->get_product();
|
||||||
'paiement' => ['methode' => ''],
|
|
||||||
'produits' => collect($commande->get_items())->map(static function (WC_Order_Item_Product $article) {
|
|
||||||
$produit = $article->get_product();
|
|
||||||
|
|
||||||
if (is_bool($produit) || $produit === null) {
|
if (is_bool($produit) || $produit === null) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
return [
|
return [
|
||||||
// Récupère l'Attribut d'un Produit variable ou renvoie un tableau vide
|
// Récupère l'Attribut d'un Produit variable ou renvoie un tableau vide
|
||||||
'attribut' => $article->is_type('variable')
|
'attribut' => $article->is_type('variable')
|
||||||
? collect($produit->get_attributes())
|
? collect($produit->get_attributes())
|
||||||
->mapWithKeys(static fn($_atr, $cle): array => [
|
->mapWithKeys(static fn($_atr, $cle): array => [
|
||||||
'nom' => Str::lower(wc_attribute_label($cle, $produit)),
|
'nom' => Str::lower(wc_attribute_label($cle, $produit)),
|
||||||
'valeur' => $produit->get_attribute($cle),
|
'valeur' => $produit->get_attribute($cle),
|
||||||
])
|
])
|
||||||
->toArray()
|
->toArray()
|
||||||
: [],
|
: [],
|
||||||
'lien' => $produit->get_permalink(),
|
'lien' => $produit->get_permalink(),
|
||||||
'nom' => $produit->get_title(),
|
'nom' => $produit->get_title(),
|
||||||
'prix_total' => $article->get_total(),
|
'prix_total' => $article->get_total(),
|
||||||
'quantite' => $article->get_quantity(),
|
'quantite' => $article->get_quantity(),
|
||||||
];
|
];
|
||||||
}),
|
}),
|
||||||
'totaux' => [
|
'totaux' => [
|
||||||
'sous_total_livraison' => '0' === $commande->get_shipping_total()
|
'sous_total_livraison' => '0' === $commande->get_shipping_total() ? 'Free' : $commande->get_shipping_total() . '€',
|
||||||
? 'Free'
|
'sous_total_produits' => $commande->get_subtotal() . '€',
|
||||||
: $commande->get_shipping_total() . '€',
|
'sous_total_reduction' => '0.00' === $commande->get_discount_total()
|
||||||
'sous_total_produits' => $commande->get_subtotal() . '€',
|
? '0'
|
||||||
'sous_total_reduction' => '0.00' === $commande->get_discount_total()
|
: Number::format((float) $commande->get_discount_total(), maxPrecision: 2) . '€',
|
||||||
? '0'
|
'total' => Number::format((float) $commande->get_total(), maxPrecision: 2) . '€',
|
||||||
: Number::format((float) $commande->get_discount_total(), maxPrecision: 2) . '€',
|
],
|
||||||
'total' => Number::format((float) $commande->get_total(), maxPrecision: 2) . '€',
|
|
||||||
],
|
|
||||||
];
|
];
|
||||||
// Transforme les codes de pays en noms de pays
|
// Transforme les codes de pays en noms de pays
|
||||||
$email['adresses']['livraison']['country'] = WC()->countries->countries[$commande->get_shipping_country()];
|
$email['adresses']['livraison']['country'] = WC()->countries->countries[$commande->get_shipping_country()];
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue