This commit is contained in:
gcch 2026-04-03 08:49:14 +02:00
commit d631949388
42 changed files with 594 additions and 403 deletions

View file

@ -12,7 +12,7 @@ $finder = new Finder()->in(__DIR__)->exclude([
'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()
@ -29,7 +29,7 @@ return new Config()
'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,
@ -103,7 +103,7 @@ return new Config()
'return', 'return',
'switch_case', 'switch_case',
'yield', 'yield',
'yield_from' 'yield_from',
]], ]],
'no_unneeded_final_method' => true, 'no_unneeded_final_method' => true,
'no_unneeded_import_alias' => true, 'no_unneeded_import_alias' => true,
@ -138,7 +138,7 @@ return new Config()
'random_api_migration' => ['replacements' => [ 'random_api_migration' => ['replacements' => [
'getrandmax' => 'mt_getrandmax', 'getrandmax' => 'mt_getrandmax',
'rand' => 'mt_rand', 'rand' => 'mt_rand',
'srand' => 'mt_srand' 'srand' => 'mt_srand',
]], ]],
'return_assignment' => true, 'return_assignment' => true,
'self_accessor' => true, 'self_accessor' => true,
@ -177,7 +177,7 @@ return new Config()
'no_superfluous_phpdoc_tags' => [ 'no_superfluous_phpdoc_tags' => [
'allow_hidden_params' => false, 'allow_hidden_params' => false,
'allow_mixed' => false, 'allow_mixed' => false,
'allow_unused_params' => false 'allow_unused_params' => false,
], ],
// PHPDoc should contain @param for all params. // PHPDoc should contain @param for all params.
'phpdoc_add_missing_param_annotation' => ['only_untyped' => false], 'phpdoc_add_missing_param_annotation' => ['only_untyped' => false],
@ -223,7 +223,7 @@ return new Config()
'never-returns', 'never-returns',
'no-return', 'no-return',
'real', 'real',
'str' 'str',
]], ]],
// 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. // 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.
'phpdoc_separation' => [ 'phpdoc_separation' => [
@ -232,9 +232,9 @@ return new Config()
['author', 'copyright', 'license'], ['author', 'copyright', 'license'],
['category', 'package', 'subpackage'], ['category', 'package', 'subpackage'],
['property', 'property-read', 'property-write'], ['property', 'property-read', 'property-write'],
['deprecated', 'link', 'see', 'since'] ['deprecated', 'link', 'see', 'since'],
], ],
'skip_unlisted_annotations' => false 'skip_unlisted_annotations' => false,
], ],
// Single line @var PHPDoc should have proper spacing. // Single line @var PHPDoc should have proper spacing.
'phpdoc_single_line_var_spacing' => true, 'phpdoc_single_line_var_spacing' => true,
@ -253,7 +253,7 @@ return new Config()
// @var and @type annotations must have type and name in the correct order. // @var and @type annotations must have type and name in the correct order.
'phpdoc_var_annotation_correct_order' => true, 'phpdoc_var_annotation_correct_order' => true,
// @var and @type annotations of classy properties should not contain the name. // @var and @type annotations of classy properties should not contain the name.
'phpdoc_var_without_name' => true 'phpdoc_var_without_name' => true,
]) ])
->setFinder($finder) ->setFinder($finder)
->setParallelConfig(Runner\Parallel\ParallelConfigFactory::detect()); ->setParallelConfig(Runner\Parallel\ParallelConfigFactory::detect());

View file

@ -17,12 +17,12 @@
"devDependencies": { "devDependencies": {
"@effect/language-service": "^0.84.3", "@effect/language-service": "^0.84.3",
"@gcch/configuration-eslint": "git+https://git.gcch.fr/gcch/configuration-eslint#62ee424274", "@gcch/configuration-eslint": "git+https://git.gcch.fr/gcch/configuration-eslint#62ee424274",
"@gcch/configuration-oxlint": "git+https://git.gcch.fr/gcch/configuration-oxlint#c53b1c1f78", "@gcch/configuration-oxlint": "git+https://git.gcch.fr/gcch/configuration-oxlint#93dd909919",
"@gcch/configuration-prettier": "git+https://git.gcch.fr/gcch/configuration-prettier#8de937e801", "@gcch/configuration-prettier": "git+https://git.gcch.fr/gcch/configuration-prettier#8de937e801",
"@playwright/test": "^1.59.1", "@playwright/test": "^1.59.1",
"@sentry/core": "^10.47.0", "@sentry/core": "^10.47.0",
"@types/bun": "^1.3.11", "@types/bun": "^1.3.11",
"@types/node": "^25.5.0", "@types/node": "^25.5.1",
"@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",
@ -36,7 +36,7 @@
"fdir": "^6.5.0", "fdir": "^6.5.0",
"globals": "^17.4.0", "globals": "^17.4.0",
"jiti": "^2.6.1", "jiti": "^2.6.1",
"knip": "^6.1.1", "knip": "^6.3.0",
"lightningcss": "^1.32.0", "lightningcss": "^1.32.0",
"lightningcss-cli": "^1.32.0", "lightningcss-cli": "^1.32.0",
"oxlint": "^1.58.0", "oxlint": "^1.58.0",
@ -45,7 +45,7 @@
"prettier": "^3.8.1", "prettier": "^3.8.1",
"prettier-plugin-pkg": "^0.22.1", "prettier-plugin-pkg": "^0.22.1",
"prettier-plugin-sh": "^0.18.0", "prettier-plugin-sh": "^0.18.0",
"sass-embedded": "^1.98.0", "sass-embedded": "^1.99.0",
"stylelint": "^17.6.0", "stylelint": "^17.6.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",
@ -296,7 +296,7 @@
"@gcch/configuration-eslint": ["@gcch/configuration-eslint@git+https://git.gcch.fr/gcch/configuration-eslint#62ee424274f0bfebd5135a728960644f4b1cdcb8", { "dependencies": { "@eslint/js": "^10.0.1", "astro-eslint-parser": "^1.3.0", "eslint": "^10.0.3", "eslint-plugin-astro": "^1.6.0", "eslint-plugin-functional": "^9.0.4", "eslint-plugin-jsdoc": "^62.8.0", "eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-perfectionist": "^5.6.0", "eslint-plugin-sonarjs": "^4.0.2", "eslint-plugin-unicorn": "^63.0.0", "globals": "^17.4.0", "typescript-eslint": "^8.57.0" }, "peerDependencies": { "eslint": "^10.0.3", "typescript": "^6.0.1-rc" } }, "62ee424274f0bfebd5135a728960644f4b1cdcb8"], "@gcch/configuration-eslint": ["@gcch/configuration-eslint@git+https://git.gcch.fr/gcch/configuration-eslint#62ee424274f0bfebd5135a728960644f4b1cdcb8", { "dependencies": { "@eslint/js": "^10.0.1", "astro-eslint-parser": "^1.3.0", "eslint": "^10.0.3", "eslint-plugin-astro": "^1.6.0", "eslint-plugin-functional": "^9.0.4", "eslint-plugin-jsdoc": "^62.8.0", "eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-perfectionist": "^5.6.0", "eslint-plugin-sonarjs": "^4.0.2", "eslint-plugin-unicorn": "^63.0.0", "globals": "^17.4.0", "typescript-eslint": "^8.57.0" }, "peerDependencies": { "eslint": "^10.0.3", "typescript": "^6.0.1-rc" } }, "62ee424274f0bfebd5135a728960644f4b1cdcb8"],
"@gcch/configuration-oxlint": ["@gcch/configuration-oxlint@git+https://git.gcch.fr/gcch/configuration-oxlint#c53b1c1f78ab2ac790cf7d3d8d22810e440a47e9", { "dependencies": { "globals": "^17.4.0", "oxlint": "^1.58.0", "oxlint-tsgolint": "^0.19.0" }, "optionalDependencies": { "eslint-plugin-astro": "^1.6.0" }, "peerDependencies": { "eslint-plugin-astro": "^1.6.0", "eslint-plugin-functional": "^9.0.4", "eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-perfectionist": "^5.7.0", "eslint-plugin-sonarjs": "^4.0.2", "oxlint": "^1.58.0", "oxlint-tsgolint": "^0.19.0", "typescript": "^6.0.2" } }, "c53b1c1f78ab2ac790cf7d3d8d22810e440a47e9"], "@gcch/configuration-oxlint": ["@gcch/configuration-oxlint@git+https://git.gcch.fr/gcch/configuration-oxlint#93dd9099199603d2fe2c334227e8051104b8f1a0", { "dependencies": { "globals": "^17.4.0", "oxlint": "^1.58.0", "oxlint-tsgolint": "^0.19.0" }, "optionalDependencies": { "eslint-plugin-astro": "^1.6.0" }, "peerDependencies": { "eslint-plugin-astro": "^1.6.0", "eslint-plugin-functional": "^9.0.4", "eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-perfectionist": "^5.7.0", "eslint-plugin-sonarjs": "^4.0.2", "oxlint": "^1.58.0", "oxlint-tsgolint": "^0.19.0", "typescript": "^6.0.2" } }, "93dd9099199603d2fe2c334227e8051104b8f1a0"],
"@gcch/configuration-prettier": ["@gcch/configuration-prettier@git+https://git.gcch.fr/gcch/configuration-prettier#8de937e801bd44784ac91e0ff6e038d838f7eea1", { "dependencies": { "prettier": "^3.8.1", "prettier-plugin-curly": "^0.4.1", "prettier-plugin-ini": "^1.3.0", "prettier-plugin-jsdoc": "^1.8.0", "prettier-plugin-pkg": "^0.22.0", "prettier-plugin-sh": "^0.18.0", "prettier-plugin-sort-json": "^4.2.0" }, "peerDependencies": { "prettier": "^3.8.1" } }, "8de937e801bd44784ac91e0ff6e038d838f7eea1"], "@gcch/configuration-prettier": ["@gcch/configuration-prettier@git+https://git.gcch.fr/gcch/configuration-prettier#8de937e801bd44784ac91e0ff6e038d838f7eea1", { "dependencies": { "prettier": "^3.8.1", "prettier-plugin-curly": "^0.4.1", "prettier-plugin-ini": "^1.3.0", "prettier-plugin-jsdoc": "^1.8.0", "prettier-plugin-pkg": "^0.22.0", "prettier-plugin-sh": "^0.18.0", "prettier-plugin-sort-json": "^4.2.0" }, "peerDependencies": { "prettier": "^3.8.1" } }, "8de937e801bd44784ac91e0ff6e038d838f7eea1"],
@ -580,7 +580,7 @@
"@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="],
"@types/node": ["@types/node@25.5.0", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw=="], "@types/node": ["@types/node@25.5.1", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-lgrR3HRNQdTEeeXBnLURFO4JIIbpcVcMlLM9IG0jsNRTRNSbMkm9S2hyhxhnokke1NM25Dr9QghgeB5PQKolrw=="],
"@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="], "@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="],
@ -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.2.0", "", { "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-4OMUMJARvNble8e8TeFv12flp4fKzAITrQec1eKO4g2eA4HnNqEa8CXy2UOPLjuYuAETpe0N0r25jF9yY9FLig=="], "knip": ["knip@6.3.0", "", { "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-g6dVPoTw6iNm3cubC5IWxVkVsd0r5hXhTBTbAGIEQN53GdA2ZM/slMTPJ7n5l8pBebNQPHpxjmKxuR4xVQ2/hQ=="],
"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=="],
@ -1382,43 +1382,43 @@
"sass": ["sass@1.98.0", "", { "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.1.5", "source-map-js": ">=0.6.2 <2.0.0" }, "optionalDependencies": { "@parcel/watcher": "^2.4.1" }, "bin": { "sass": "sass.js" } }, "sha512-+4N/u9dZ4PrgzGgPlKnaaRQx64RO0JBKs9sDhQ2pLgN6JQZ25uPQZKQYaBJU48Kd5BxgXoJ4e09Dq7nMcOUW3A=="], "sass": ["sass@1.98.0", "", { "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.1.5", "source-map-js": ">=0.6.2 <2.0.0" }, "optionalDependencies": { "@parcel/watcher": "^2.4.1" }, "bin": { "sass": "sass.js" } }, "sha512-+4N/u9dZ4PrgzGgPlKnaaRQx64RO0JBKs9sDhQ2pLgN6JQZ25uPQZKQYaBJU48Kd5BxgXoJ4e09Dq7nMcOUW3A=="],
"sass-embedded": ["sass-embedded@1.98.0", "", { "dependencies": { "@bufbuild/protobuf": "^2.5.0", "colorjs.io": "^0.5.0", "immutable": "^5.1.5", "rxjs": "^7.4.0", "supports-color": "^8.1.1", "sync-child-process": "^1.0.2", "varint": "^6.0.0" }, "optionalDependencies": { "sass-embedded-all-unknown": "1.98.0", "sass-embedded-android-arm": "1.98.0", "sass-embedded-android-arm64": "1.98.0", "sass-embedded-android-riscv64": "1.98.0", "sass-embedded-android-x64": "1.98.0", "sass-embedded-darwin-arm64": "1.98.0", "sass-embedded-darwin-x64": "1.98.0", "sass-embedded-linux-arm": "1.98.0", "sass-embedded-linux-arm64": "1.98.0", "sass-embedded-linux-musl-arm": "1.98.0", "sass-embedded-linux-musl-arm64": "1.98.0", "sass-embedded-linux-musl-riscv64": "1.98.0", "sass-embedded-linux-musl-x64": "1.98.0", "sass-embedded-linux-riscv64": "1.98.0", "sass-embedded-linux-x64": "1.98.0", "sass-embedded-unknown-all": "1.98.0", "sass-embedded-win32-arm64": "1.98.0", "sass-embedded-win32-x64": "1.98.0" }, "bin": { "sass": "dist/bin/sass.js" } }, "sha512-Do7u6iRb6K+lrllcTkB1BXcHwOxcKe3rEfOF/GcCLE2w3WpddakRAosJOHFUR37DpsvimQXEt5abs3NzUjEIqg=="], "sass-embedded": ["sass-embedded@1.99.0", "", { "dependencies": { "@bufbuild/protobuf": "^2.5.0", "colorjs.io": "^0.5.0", "immutable": "^5.1.5", "rxjs": "^7.4.0", "supports-color": "^8.1.1", "sync-child-process": "^1.0.2", "varint": "^6.0.0" }, "optionalDependencies": { "sass-embedded-all-unknown": "1.99.0", "sass-embedded-android-arm": "1.99.0", "sass-embedded-android-arm64": "1.99.0", "sass-embedded-android-riscv64": "1.99.0", "sass-embedded-android-x64": "1.99.0", "sass-embedded-darwin-arm64": "1.99.0", "sass-embedded-darwin-x64": "1.99.0", "sass-embedded-linux-arm": "1.99.0", "sass-embedded-linux-arm64": "1.99.0", "sass-embedded-linux-musl-arm": "1.99.0", "sass-embedded-linux-musl-arm64": "1.99.0", "sass-embedded-linux-musl-riscv64": "1.99.0", "sass-embedded-linux-musl-x64": "1.99.0", "sass-embedded-linux-riscv64": "1.99.0", "sass-embedded-linux-x64": "1.99.0", "sass-embedded-unknown-all": "1.99.0", "sass-embedded-win32-arm64": "1.99.0", "sass-embedded-win32-x64": "1.99.0" }, "bin": { "sass": "dist/bin/sass.js" } }, "sha512-gF/juR1aX02lZHkvwxdF80SapkQeg2fetoDF6gIQkNbSw5YEUFspMkyGTjPjgZSgIHuZpy+Wz4PlebKnLXMjdg=="],
"sass-embedded-all-unknown": ["sass-embedded-all-unknown@1.98.0", "", { "dependencies": { "sass": "1.98.0" }, "cpu": [ "!arm", "!x64", "!arm64", ] }, "sha512-6n4RyK7/1mhdfYvpP3CClS3fGoYqDvRmLClCESS6I7+SAzqjxvGG6u5Fo+cb1nrPNbbilgbM4QKdgcgWHO9NCA=="], "sass-embedded-all-unknown": ["sass-embedded-all-unknown@1.99.0", "", { "dependencies": { "sass": "1.99.0" }, "cpu": [ "!arm", "!x64", "!arm64", ] }, "sha512-qPIRG8Uhjo6/OKyAKixTnwMliTz+t9K6Duk0mx5z+K7n0Ts38NSJz2sjDnc7cA/8V9Lb3q09H38dZ1CLwD+ssw=="],
"sass-embedded-android-arm": ["sass-embedded-android-arm@1.98.0", "", { "os": "android", "cpu": "arm" }, "sha512-LjGiMhHgu7VL1n7EJxTCre1x14bUsWd9d3dnkS2rku003IWOI/fxc7OXgaKagoVzok1kv09rzO3vFXJR5ZeONQ=="], "sass-embedded-android-arm": ["sass-embedded-android-arm@1.99.0", "", { "os": "android", "cpu": "arm" }, "sha512-EHvJ0C7/VuP78Qr6f8gIUVUmCqIorEQpw2yp3cs3SMg02ZuumlhjXvkTcFBxHmFdFR23vTNk1WnhY6QSeV1nFQ=="],
"sass-embedded-android-arm64": ["sass-embedded-android-arm64@1.98.0", "", { "os": "android", "cpu": "arm64" }, "sha512-M9Ra98A6vYJHpwhoC/5EuH1eOshQ9ZyNwC8XifUDSbRl/cGeQceT1NReR9wFj3L7s1pIbmes1vMmaY2np0uAKQ=="], "sass-embedded-android-arm64": ["sass-embedded-android-arm64@1.99.0", "", { "os": "android", "cpu": "arm64" }, "sha512-fNHhdnP23yqqieCbAdym4N47AleSwjbNt6OYIYx4DdACGdtERjQB4iOX/TaKsW034MupfF7SjnAAK8w7Ptldtg=="],
"sass-embedded-android-riscv64": ["sass-embedded-android-riscv64@1.98.0", "", { "os": "android", "cpu": "none" }, "sha512-WPe+0NbaJIZE1fq/RfCZANMeIgmy83x4f+SvFOG7LhUthHpZWcOcrPTsCKKmN3xMT3iw+4DXvqTYOCYGRL3hcQ=="], "sass-embedded-android-riscv64": ["sass-embedded-android-riscv64@1.99.0", "", { "os": "android", "cpu": "none" }, "sha512-4zqDFRvgGDTL5vTHuIhRxUpXFoh0Cy7Gm5Ywk19ASd8Settmd14YdPRZPmMxfgS1GH292PofV1fq1ifiSEJWBw=="],
"sass-embedded-android-x64": ["sass-embedded-android-x64@1.98.0", "", { "os": "android", "cpu": "x64" }, "sha512-zrD25dT7OHPEgLWuPEByybnIfx4rnCtfge4clBgjZdZ3lF6E7qNLRBtSBmoFflh6Vg0RlEjJo5VlpnTMBM5MQQ=="], "sass-embedded-android-x64": ["sass-embedded-android-x64@1.99.0", "", { "os": "android", "cpu": "x64" }, "sha512-Uk53k/dGYt04RjOL4gFjZ0Z9DH9DKh8IA8WsXUkNqsxerAygoy3zqRBS2zngfE9K2jiOM87q+1R1p87ory9oQQ=="],
"sass-embedded-darwin-arm64": ["sass-embedded-darwin-arm64@1.98.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-cgr1z9rBnCdMf8K+JabIaYd9Rag2OJi5mjq08XJfbJGMZV/TA6hFJCLGkr5/+ZOn4/geTM5/3aSfQ8z5EIJAOg=="], "sass-embedded-darwin-arm64": ["sass-embedded-darwin-arm64@1.99.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-u61/7U3IGLqoO6gL+AHeiAtlTPFwJK1+964U8gp45ZN0hzh1yrARf5O1mivXv8NnNgJvbG2wWJbiNZP0lG/lTg=="],
"sass-embedded-darwin-x64": ["sass-embedded-darwin-x64@1.98.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-OLBOCs/NPeiMqTdOrMFbVHBQFj19GS3bSVSxIhcCq16ZyhouUkYJEZjxQgzv9SWA2q6Ki8GCqp4k6jMeUY9dcA=="], "sass-embedded-darwin-x64": ["sass-embedded-darwin-x64@1.99.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-j/kkk/NcXdIameLezSfXjgCiBkVcA+G60AXrX768/3g0miK1g7M9dj7xOhCb1i7/wQeiEI3rw2LLuO63xRIn4A=="],
"sass-embedded-linux-arm": ["sass-embedded-linux-arm@1.98.0", "", { "os": "linux", "cpu": "arm" }, "sha512-03baQZCxVyEp8v1NWBRlzGYrmVT/LK7ZrHlF1piscGiGxwfdxoLXVuxsylx3qn/dD/4i/rh7Bzk7reK1br9jvQ=="], "sass-embedded-linux-arm": ["sass-embedded-linux-arm@1.99.0", "", { "os": "linux", "cpu": "arm" }, "sha512-d4IjJZrX2+AwB2YCy1JySwdptJECNP/WfAQLUl8txI3ka8/d3TUI155GtelnoZUkio211PwIeFvvAeZ9RXPQnw=="],
"sass-embedded-linux-arm64": ["sass-embedded-linux-arm64@1.98.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-axOE3t2MTBwCtkUCbrdM++Gj0gC0fdHJPrgzQ+q1WUmY9NoNMGqflBtk5mBZaWUeha2qYO3FawxCB8lctFwCtw=="], "sass-embedded-linux-arm64": ["sass-embedded-linux-arm64@1.99.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-btNcFpItcB56L40n8hDeL7sRSMLDXQ56nB5h2deddJx1n60rpKSElJmkaDGHtpkrY+CTtDRV0FZDjHeTJddYew=="],
"sass-embedded-linux-musl-arm": ["sass-embedded-linux-musl-arm@1.98.0", "", { "os": "linux", "cpu": "arm" }, "sha512-OBkjTDPYR4hSaueOGIM6FDpl9nt/VZwbSRpbNu9/eEJcxE8G/vynRugW8KRZmCFjPy8j/jkGBvvS+k9iOqKV3g=="], "sass-embedded-linux-musl-arm": ["sass-embedded-linux-musl-arm@1.99.0", "", { "os": "linux", "cpu": "arm" }, "sha512-2gvHOupgIw3ytatXT4nFUow71LFbuOZPEwG+HUzcNQDH8ue4Ez8cr03vsv5MDv3lIjOKcXwDvWD980t18MwkoQ=="],
"sass-embedded-linux-musl-arm64": ["sass-embedded-linux-musl-arm64@1.98.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-LeqNxQA8y4opjhe68CcFvMzCSrBuJqYVFbwElEj9bagHXQHTp9xVPJRn6VcrC+0VLEDq13HVXMv7RslIuU0zmA=="], "sass-embedded-linux-musl-arm64": ["sass-embedded-linux-musl-arm64@1.99.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-Hi2bt/IrM5P4FBKz6EcHAlniwfpoz9mnTdvSd58y+avA3SANM76upIkAdSayA8ZGwyL3gZokru1AKDPF9lJDNw=="],
"sass-embedded-linux-musl-riscv64": ["sass-embedded-linux-musl-riscv64@1.98.0", "", { "os": "linux", "cpu": "none" }, "sha512-7w6hSuOHKt8FZsmjRb3iGSxEzM87fO9+M8nt5JIQYMhHTj5C+JY/vcske0v715HCVj5e1xyTnbGXf8FcASeAIw=="], "sass-embedded-linux-musl-riscv64": ["sass-embedded-linux-musl-riscv64@1.99.0", "", { "os": "linux", "cpu": "none" }, "sha512-mKqGvVaJ9rHMqyZsF0kikQe4NO0f4osb67+X6nLhBiVDKvyazQHJ3zJQreNefIE36yL2sjHIclSB//MprzaQDg=="],
"sass-embedded-linux-musl-x64": ["sass-embedded-linux-musl-x64@1.98.0", "", { "os": "linux", "cpu": "x64" }, "sha512-QikNyDEJOVqPmxyCFkci8ZdCwEssdItfjQFJB+D+Uy5HFqcS5Lv3d3GxWNX/h1dSb23RPyQdQc267ok5SbEyJw=="], "sass-embedded-linux-musl-x64": ["sass-embedded-linux-musl-x64@1.99.0", "", { "os": "linux", "cpu": "x64" }, "sha512-huhgOMmOc30r7CH7qbRbT9LerSEGSnWuS4CYNOskr9BvNeQp4dIneFufNRGZ7hkOAxUM8DglxIZJN/cyAT95Ew=="],
"sass-embedded-linux-riscv64": ["sass-embedded-linux-riscv64@1.98.0", "", { "os": "linux", "cpu": "none" }, "sha512-E7fNytc/v4xFBQKzgzBddV/jretA4ULAPO6XmtBiQu4zZBdBozuSxsQLe2+XXeb0X4S2GIl72V7IPABdqke/vA=="], "sass-embedded-linux-riscv64": ["sass-embedded-linux-riscv64@1.99.0", "", { "os": "linux", "cpu": "none" }, "sha512-mevFPIFAVhrH90THifxLfOntFmHtcEKOcdWnep2gJ0X4DVva4AiVIRlQe/7w9JFx5+gnDRE1oaJJkzuFUuYZsA=="],
"sass-embedded-linux-x64": ["sass-embedded-linux-x64@1.98.0", "", { "os": "linux", "cpu": "x64" }, "sha512-VsvP0t/uw00mMNPv3vwyYKUrFbqzxQHnRMO+bHdAMjvLw4NFf6mscpym9Bzf+NXwi1ZNKnB6DtXjmcpcvqFqYg=="], "sass-embedded-linux-x64": ["sass-embedded-linux-x64@1.99.0", "", { "os": "linux", "cpu": "x64" }, "sha512-9k7IkULqIZdCIVt4Mboryt6vN8Mjmm3EhI1P3mClU5y5i3wLK5ExC3cbVWk047KsID/fvB1RLslqghXJx5BoxA=="],
"sass-embedded-unknown-all": ["sass-embedded-unknown-all@1.98.0", "", { "dependencies": { "sass": "1.98.0" }, "os": [ "!linux", "!win32", "!darwin", "!android", ] }, "sha512-C4MMzcAo3oEDQnW7L8SBgB9F2Fq5qHPnaYTZRMOH3Mp/7kM4OooBInXpCiiFjLnjY95hzP4KyctVx0uYR6MYlQ=="], "sass-embedded-unknown-all": ["sass-embedded-unknown-all@1.99.0", "", { "dependencies": { "sass": "1.99.0" }, "os": [ "!linux", "!win32", "!darwin", "!android", ] }, "sha512-P7MxiUtL/XzGo3PX0CaB8lNNEFLQWKikPA8pbKytx9ZCLZSDkt2NJcdAbblB/sqMs4AV3EK2NadV8rI/diq3xg=="],
"sass-embedded-win32-arm64": ["sass-embedded-win32-arm64@1.98.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-nP/10xbAiPbhQkMr3zQfXE4TuOxPzWRQe1Hgbi90jv2R4TbzbqQTuZVOaJf7KOAN4L2Bo6XCTRjK5XkVnwZuwQ=="], "sass-embedded-win32-arm64": ["sass-embedded-win32-arm64@1.99.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-8whpsW7S+uO8QApKfQuc36m3P9EISzbVZOgC79goob4qGy09u8Gz/rYvw8h1prJDSjltpHGhOzBE6LDz7WvzVw=="],
"sass-embedded-win32-x64": ["sass-embedded-win32-x64@1.98.0", "", { "os": "win32", "cpu": "x64" }, "sha512-/lbrVsfbcbdZQ5SJCWcV0NVPd6YRs+FtAnfedp4WbCkO/ZO7Zt/58MvI4X2BVpRY/Nt5ZBo1/7v2gYcQ+J4svQ=="], "sass-embedded-win32-x64": ["sass-embedded-win32-x64@1.99.0", "", { "os": "win32", "cpu": "x64" }, "sha512-ipuOv1R2K4MHeuCEAZGpuUbAgma4gb0sdacyrTjJtMOy/OY9UvWfVlwErdB09KIkp4fPDpQJDJfvYN6bC8jeNg=="],
"scslre": ["scslre@0.3.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.8.0", "refa": "^0.12.0", "regexp-ast-analysis": "^0.7.0" } }, "sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ=="], "scslre": ["scslre@0.3.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.8.0", "refa": "^0.12.0", "regexp-ast-analysis": "^0.7.0" } }, "sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ=="],
@ -1648,6 +1648,8 @@
"browserslist-to-esbuild/meow": ["meow@13.2.0", "", {}, "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA=="], "browserslist-to-esbuild/meow": ["meow@13.2.0", "", {}, "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA=="],
"bun-types/@types/node": ["@types/node@25.5.0", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw=="],
"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=="],
"clean-regexp/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], "clean-regexp/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="],
@ -1676,6 +1678,10 @@
"rolldown/@oxc-project/types": ["@oxc-project/types@0.122.0", "", {}, "sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA=="], "rolldown/@oxc-project/types": ["@oxc-project/types@0.122.0", "", {}, "sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA=="],
"sass-embedded-all-unknown/sass": ["sass@1.99.0", "", { "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.1.5", "source-map-js": ">=0.6.2 <2.0.0" }, "optionalDependencies": { "@parcel/watcher": "^2.4.1" }, "bin": { "sass": "sass.js" } }, "sha512-kgW13M54DUB7IsIRM5LvJkNlpH+WhMpooUcaWGFARkF1Tc82v9mIWkCbCYf+MBvpIUBSeSOTilpZjEPr2VYE6Q=="],
"sass-embedded-unknown-all/sass": ["sass@1.99.0", "", { "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.1.5", "source-map-js": ">=0.6.2 <2.0.0" }, "optionalDependencies": { "@parcel/watcher": "^2.4.1" }, "bin": { "sass": "sass.js" } }, "sha512-kgW13M54DUB7IsIRM5LvJkNlpH+WhMpooUcaWGFARkF1Tc82v9mIWkCbCYf+MBvpIUBSeSOTilpZjEPr2VYE6Q=="],
"stylelint/file-entry-cache": ["file-entry-cache@11.1.2", "", { "dependencies": { "flat-cache": "^6.1.20" } }, "sha512-N2WFfK12gmrK1c1GXOqiAJ1tc5YE+R53zvQ+t5P8S5XhnmKYVB5eZEiLNZKDSmoG8wqqbF9EXYBBW/nef19log=="], "stylelint/file-entry-cache": ["file-entry-cache@11.1.2", "", { "dependencies": { "flat-cache": "^6.1.20" } }, "sha512-N2WFfK12gmrK1c1GXOqiAJ1tc5YE+R53zvQ+t5P8S5XhnmKYVB5eZEiLNZKDSmoG8wqqbF9EXYBBW/nef19log=="],
"stylelint/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], "stylelint/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="],

View file

@ -53,11 +53,10 @@
], ],
"require": { "require": {
"php": ">=8.5", "php": ">=8.5",
"php-standard-library/php-standard-library": "^4.3",
"composer/installers": "^2.3", "composer/installers": "^2.3",
"crell/fp": "^1.0", "crell/fp": "^1.0",
"htmlburger/carbon-fields": "^3.6.9", "htmlburger/carbon-fields": "^3.6.9",
"illuminate/support": "^12.56", "illuminate/support": "^13.3",
"laravel/helpers": "^1.8.3", "laravel/helpers": "^1.8.3",
"log1x/wp-smtp": "^1.0.2", "log1x/wp-smtp": "^1.0.2",
"lstrojny/functional-php": "^1.18", "lstrojny/functional-php": "^1.18",
@ -67,9 +66,10 @@
"roots/bedrock-autoloader": "^1.1.0", "roots/bedrock-autoloader": "^1.1.0",
"roots/bedrock-disallow-indexing": "^2.1", "roots/bedrock-disallow-indexing": "^2.1",
"roots/wordpress": "^6.9.4", "roots/wordpress": "^6.9.4",
"php-standard-library/php-standard-library": "^6.1.1",
"roots/wp-config": "^1.0", "roots/wp-config": "^1.0",
"stripe/stripe-php": "^19.4.1", "stripe/stripe-php": "^19.4.1",
"symfony/uid": "^8.0.4", "symfony/uid": "^8.0.8",
"timber/timber": "^2.3.3", "timber/timber": "^2.3.3",
"vlucas/phpdotenv": "^5.6.3", "vlucas/phpdotenv": "^5.6.3",
"wpackagist-plugin/falcon": "^2.9.3", "wpackagist-plugin/falcon": "^2.9.3",
@ -78,7 +78,7 @@
"wpackagist-plugin/redis-cache": "^2.7.0", "wpackagist-plugin/redis-cache": "^2.7.0",
"wpackagist-plugin/wc-multishipping": "^3.0.2", "wpackagist-plugin/wc-multishipping": "^3.0.2",
"wpackagist-plugin/woo-preview-emails": "^2.2.14", "wpackagist-plugin/woo-preview-emails": "^2.2.14",
"wpackagist-plugin/woocommerce": "^10.6.1", "wpackagist-plugin/woocommerce": "^10.6.2",
"wpackagist-plugin/wp-mail-logging": "^1.16.0", "wpackagist-plugin/wp-mail-logging": "^1.16.0",
"wpackagist-plugin/wp-mail-smtp": "^4.7.1", "wpackagist-plugin/wp-mail-smtp": "^4.7.1",
"wpackagist-plugin/wp-openapi": "^1.0.27", "wpackagist-plugin/wp-openapi": "^1.0.27",
@ -88,7 +88,7 @@
"friendsofphp/php-cs-fixer": "^3.94.2", "friendsofphp/php-cs-fixer": "^3.94.2",
"php-standard-library/phpstan-extension": "^2.1", "php-standard-library/phpstan-extension": "^2.1",
"phpstan/extension-installer": "^1.4.3", "phpstan/extension-installer": "^1.4.3",
"phpstan/phpstan": "^2.1.45", "phpstan/phpstan": "^2.1.46",
"roave/security-advisories": "dev-latest", "roave/security-advisories": "dev-latest",
"szepeviktor/phpstan-wordpress": "2.x-dev", "szepeviktor/phpstan-wordpress": "2.x-dev",
"vincentlanglet/twig-cs-fixer": "^3.14" "vincentlanglet/twig-cs-fixer": "^3.14"

443
composer.lock generated
View file

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "d29045fefbe0199423856ab6ff3d9888", "content-hash": "8fa8994b91f6fdfb99db59a67eb54ac5",
"packages": [ "packages": [
{ {
"name": "carbonphp/carbon-doctrine-types", "name": "carbonphp/carbon-doctrine-types",
@ -585,35 +585,34 @@
}, },
{ {
"name": "illuminate/collections", "name": "illuminate/collections",
"version": "v12.56.0", "version": "v13.3.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/illuminate/collections.git", "url": "https://github.com/illuminate/collections.git",
"reference": "83313b009c4afb6f02dbc090bdb67809756eefa2" "reference": "389c5008087f8c48d35b85585b4315107b5a0f9e"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/illuminate/collections/zipball/83313b009c4afb6f02dbc090bdb67809756eefa2", "url": "https://api.github.com/repos/illuminate/collections/zipball/389c5008087f8c48d35b85585b4315107b5a0f9e",
"reference": "83313b009c4afb6f02dbc090bdb67809756eefa2", "reference": "389c5008087f8c48d35b85585b4315107b5a0f9e",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"illuminate/conditionable": "^12.0", "illuminate/conditionable": "^13.0",
"illuminate/contracts": "^12.0", "illuminate/contracts": "^13.0",
"illuminate/macroable": "^12.0", "illuminate/macroable": "^13.0",
"php": "^8.2", "php": "^8.3",
"symfony/polyfill-php83": "^1.33",
"symfony/polyfill-php84": "^1.33", "symfony/polyfill-php84": "^1.33",
"symfony/polyfill-php85": "^1.33" "symfony/polyfill-php85": "^1.33"
}, },
"suggest": { "suggest": {
"illuminate/http": "Required to convert collections to API resources (^12.0).", "illuminate/http": "Required to convert collections to API resources (^13.0).",
"symfony/var-dumper": "Required to use the dump method (^7.2)." "symfony/var-dumper": "Required to use the dump method (^7.4 || ^8.0)."
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "12.x-dev" "dev-master": "13.0.x-dev"
} }
}, },
"autoload": { "autoload": {
@ -641,29 +640,29 @@
"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-11T14:13:25+00:00" "time": "2026-03-30T19:06:46+00:00"
}, },
{ {
"name": "illuminate/conditionable", "name": "illuminate/conditionable",
"version": "v12.56.0", "version": "v13.3.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/illuminate/conditionable.git", "url": "https://github.com/illuminate/conditionable.git",
"reference": "ec677967c1f2faf90b8428919124d2184a4c9b49" "reference": "7f1ef52d9a346f829421b296adfb7644a951b216"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/illuminate/conditionable/zipball/ec677967c1f2faf90b8428919124d2184a4c9b49", "url": "https://api.github.com/repos/illuminate/conditionable/zipball/7f1ef52d9a346f829421b296adfb7644a951b216",
"reference": "ec677967c1f2faf90b8428919124d2184a4c9b49", "reference": "7f1ef52d9a346f829421b296adfb7644a951b216",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": "^8.2" "php": "^8.3"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "12.x-dev" "dev-master": "13.0.x-dev"
} }
}, },
"autoload": { "autoload": {
@ -687,31 +686,31 @@
"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": "2025-05-13T15:08:45+00:00" "time": "2026-02-25T16:07:55+00:00"
}, },
{ {
"name": "illuminate/contracts", "name": "illuminate/contracts",
"version": "v12.56.0", "version": "v13.3.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/illuminate/contracts.git", "url": "https://github.com/illuminate/contracts.git",
"reference": "099fd9b56ccaf776facaa27699b960a3f2451127" "reference": "8796cc5f30124b81210ae2f3b2ae0f69ad4fc7f8"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/illuminate/contracts/zipball/099fd9b56ccaf776facaa27699b960a3f2451127", "url": "https://api.github.com/repos/illuminate/contracts/zipball/8796cc5f30124b81210ae2f3b2ae0f69ad4fc7f8",
"reference": "099fd9b56ccaf776facaa27699b960a3f2451127", "reference": "8796cc5f30124b81210ae2f3b2ae0f69ad4fc7f8",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": "^8.2", "php": "^8.3",
"psr/container": "^1.1.1|^2.0.1", "psr/container": "^1.1.1 || ^2.0.1",
"psr/simple-cache": "^1.0|^2.0|^3.0" "psr/simple-cache": "^1.0 || ^2.0 || ^3.0"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "12.x-dev" "dev-master": "13.0.x-dev"
} }
}, },
"autoload": { "autoload": {
@ -735,20 +734,20 @@
"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-02-20T14:37:40+00:00" "time": "2026-03-26T17:13:01+00:00"
}, },
{ {
"name": "illuminate/macroable", "name": "illuminate/macroable",
"version": "v12.56.0", "version": "v13.3.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/illuminate/macroable.git", "url": "https://github.com/illuminate/macroable.git",
"reference": "e862e5648ee34004fa56046b746f490dfa86c613" "reference": "f108cb3a8680f26e23c6ce7367c64525412d85b0"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/illuminate/macroable/zipball/e862e5648ee34004fa56046b746f490dfa86c613", "url": "https://api.github.com/repos/illuminate/macroable/zipball/f108cb3a8680f26e23c6ce7367c64525412d85b0",
"reference": "e862e5648ee34004fa56046b746f490dfa86c613", "reference": "f108cb3a8680f26e23c6ce7367c64525412d85b0",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -757,7 +756,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "12.x-dev" "dev-master": "13.0.x-dev"
} }
}, },
"autoload": { "autoload": {
@ -781,31 +780,31 @@
"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": "2024-07-23T16:31:01+00:00" "time": "2026-03-28T19:16:13+00:00"
}, },
{ {
"name": "illuminate/reflection", "name": "illuminate/reflection",
"version": "v12.56.0", "version": "v13.3.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/illuminate/reflection.git", "url": "https://github.com/illuminate/reflection.git",
"reference": "348cf5da9de89b596d7723be6425fb048e2bf4bb" "reference": "4fe1659f068ab2b50131cf906c5d8bba4e34df0c"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/illuminate/reflection/zipball/348cf5da9de89b596d7723be6425fb048e2bf4bb", "url": "https://api.github.com/repos/illuminate/reflection/zipball/4fe1659f068ab2b50131cf906c5d8bba4e34df0c",
"reference": "348cf5da9de89b596d7723be6425fb048e2bf4bb", "reference": "4fe1659f068ab2b50131cf906c5d8bba4e34df0c",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"illuminate/collections": "^12.0", "illuminate/collections": "^13.0",
"illuminate/contracts": "^12.0", "illuminate/contracts": "^13.0",
"php": "^8.2" "php": "^8.3"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "12.x-dev" "dev-master": "13.0.x-dev"
} }
}, },
"autoload": { "autoload": {
@ -832,20 +831,20 @@
"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-02-25T15:25:18+00:00" "time": "2026-03-10T20:04:12+00:00"
}, },
{ {
"name": "illuminate/support", "name": "illuminate/support",
"version": "v12.56.0", "version": "v13.3.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/illuminate/support.git", "url": "https://github.com/illuminate/support.git",
"reference": "cd8a3c5a95501b9ae0828ac785b5af5ffccdca45" "reference": "f31e168e236a90d96d7894cd1f107b1ba095de69"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/illuminate/support/zipball/cd8a3c5a95501b9ae0828ac785b5af5ffccdca45", "url": "https://api.github.com/repos/illuminate/support/zipball/f31e168e236a90d96d7894cd1f107b1ba095de69",
"reference": "cd8a3c5a95501b9ae0828ac785b5af5ffccdca45", "reference": "f31e168e236a90d96d7894cd1f107b1ba095de69",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -853,14 +852,13 @@
"ext-ctype": "*", "ext-ctype": "*",
"ext-filter": "*", "ext-filter": "*",
"ext-mbstring": "*", "ext-mbstring": "*",
"illuminate/collections": "^12.0", "illuminate/collections": "^13.0",
"illuminate/conditionable": "^12.0", "illuminate/conditionable": "^13.0",
"illuminate/contracts": "^12.0", "illuminate/contracts": "^13.0",
"illuminate/macroable": "^12.0", "illuminate/macroable": "^13.0",
"illuminate/reflection": "^12.0", "illuminate/reflection": "^13.0",
"nesbot/carbon": "^3.8.4", "nesbot/carbon": "^3.8.4",
"php": "^8.2", "php": "^8.3",
"symfony/polyfill-php83": "^1.33",
"symfony/polyfill-php85": "^1.33", "symfony/polyfill-php85": "^1.33",
"voku/portable-ascii": "^2.0.2" "voku/portable-ascii": "^2.0.2"
}, },
@ -871,20 +869,20 @@
"spatie/once": "*" "spatie/once": "*"
}, },
"suggest": { "suggest": {
"illuminate/filesystem": "Required to use the Composer class (^12.0).", "illuminate/filesystem": "Required to use the Composer class (^13.0).",
"laravel/serializable-closure": "Required to use the once function (^1.3|^2.0).", "laravel/serializable-closure": "Required to use the once function (^2.0.10).",
"league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^2.7).", "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^2.7).",
"league/uri": "Required to use the Uri class (^7.5.1).", "league/uri": "Required to use the Uri class (^7.5.1).",
"ramsey/uuid": "Required to use Str::uuid() (^4.7).", "ramsey/uuid": "Required to use Str::uuid() (^4.7).",
"symfony/process": "Required to use the Composer class (^7.2).", "symfony/process": "Required to use the Composer class (^7.4 || ^8.0).",
"symfony/uid": "Required to use Str::ulid() (^7.2).", "symfony/uid": "Required to use Str::ulid() (^7.4 || ^8.0).",
"symfony/var-dumper": "Required to use the dd function (^7.2).", "symfony/var-dumper": "Required to use the dd function (^7.4 || ^8.0).",
"vlucas/phpdotenv": "Required to use the Env class and env helper (^5.6.1)." "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.6.1)."
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "12.x-dev" "dev-master": "13.0.x-dev"
} }
}, },
"autoload": { "autoload": {
@ -912,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-03-17T13:55:49+00:00" "time": "2026-03-30T13:32:27+00:00"
}, },
{ {
"name": "laravel/helpers", "name": "laravel/helpers",
@ -1382,16 +1380,16 @@
}, },
{ {
"name": "php-standard-library/php-standard-library", "name": "php-standard-library/php-standard-library",
"version": "4.3.0", "version": "6.1.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/php-standard-library/php-standard-library.git", "url": "https://github.com/php-standard-library/php-standard-library.git",
"reference": "74c95be0214eb7ea39146ed00ac4eb71b45d787b" "reference": "b7d151cb1c21589cdde17a6adff50d3375de0919"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/php-standard-library/php-standard-library/zipball/74c95be0214eb7ea39146ed00ac4eb71b45d787b", "url": "https://api.github.com/repos/php-standard-library/php-standard-library/zipball/b7d151cb1c21589cdde17a6adff50d3375de0919",
"reference": "74c95be0214eb7ea39146ed00ac4eb71b45d787b", "reference": "b7d151cb1c21589cdde17a6adff50d3375de0919",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1399,16 +1397,88 @@
"ext-intl": "*", "ext-intl": "*",
"ext-json": "*", "ext-json": "*",
"ext-mbstring": "*", "ext-mbstring": "*",
"ext-openssl": "*",
"ext-sodium": "*", "ext-sodium": "*",
"php": "~8.3.0 || ~8.4.0 || ~8.5.0", "php": "~8.4.0 || ~8.5.0",
"revolt/event-loop": "^1.0.7" "revolt/event-loop": "^1.0.8"
},
"conflict": {
"azjezz/psl": "*"
},
"replace": {
"php-standard-library/ansi": "self.version",
"php-standard-library/async": "self.version",
"php-standard-library/binary": "self.version",
"php-standard-library/cache": "self.version",
"php-standard-library/channel": "self.version",
"php-standard-library/cidr": "self.version",
"php-standard-library/class": "self.version",
"php-standard-library/collection": "self.version",
"php-standard-library/comparison": "self.version",
"php-standard-library/compression": "self.version",
"php-standard-library/crypto": "self.version",
"php-standard-library/data-structure": "self.version",
"php-standard-library/date-time": "self.version",
"php-standard-library/default": "self.version",
"php-standard-library/dict": "self.version",
"php-standard-library/either": "self.version",
"php-standard-library/encoding": "self.version",
"php-standard-library/env": "self.version",
"php-standard-library/file": "self.version",
"php-standard-library/filesystem": "self.version",
"php-standard-library/foundation": "self.version",
"php-standard-library/fun": "self.version",
"php-standard-library/graph": "self.version",
"php-standard-library/h2": "self.version",
"php-standard-library/hash": "self.version",
"php-standard-library/hpack": "self.version",
"php-standard-library/html": "self.version",
"php-standard-library/interface": "self.version",
"php-standard-library/interoperability": "self.version",
"php-standard-library/io": "self.version",
"php-standard-library/ip": "self.version",
"php-standard-library/iri": "self.version",
"php-standard-library/iter": "self.version",
"php-standard-library/json": "self.version",
"php-standard-library/locale": "self.version",
"php-standard-library/math": "self.version",
"php-standard-library/network": "self.version",
"php-standard-library/observer": "self.version",
"php-standard-library/option": "self.version",
"php-standard-library/os": "self.version",
"php-standard-library/password": "self.version",
"php-standard-library/process": "self.version",
"php-standard-library/promise": "self.version",
"php-standard-library/pseudo-random": "self.version",
"php-standard-library/punycode": "self.version",
"php-standard-library/random-sequence": "self.version",
"php-standard-library/range": "self.version",
"php-standard-library/regex": "self.version",
"php-standard-library/result": "self.version",
"php-standard-library/runtime": "self.version",
"php-standard-library/secure-random": "self.version",
"php-standard-library/shell": "self.version",
"php-standard-library/socks": "self.version",
"php-standard-library/str": "self.version",
"php-standard-library/tcp": "self.version",
"php-standard-library/terminal": "self.version",
"php-standard-library/tls": "self.version",
"php-standard-library/trait": "self.version",
"php-standard-library/tree": "self.version",
"php-standard-library/type": "self.version",
"php-standard-library/udp": "self.version",
"php-standard-library/unix": "self.version",
"php-standard-library/uri": "self.version",
"php-standard-library/url": "self.version",
"php-standard-library/vec": "self.version"
}, },
"require-dev": { "require-dev": {
"carthage-software/mago": "^1.6.0", "carthage-software/mago": "^1.15.2",
"infection/infection": "^0.31.2", "ext-brotli": "*",
"php-coveralls/php-coveralls": "^2.7.0", "infection/infection": "^0.32.6",
"phpbench/phpbench": "^1.4.0", "php-coveralls/php-coveralls": "^2.9.1",
"phpunit/phpunit": "^9.6.22" "phpbench/phpbench": "^1.5.1",
"phpunit/phpunit": "^13.0.5"
}, },
"suggest": { "suggest": {
"php-standard-library/phpstan-extension": "PHPStan integration", "php-standard-library/phpstan-extension": "PHPStan integration",
@ -1416,17 +1486,132 @@
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"thanks": { "branch-alias": {
"url": "https://github.com/hhvm/hsl", "dev-next": "6.1.x-dev"
"name": "hhvm/hsl"
} }
}, },
"autoload": { "autoload": {
"files": [ "files": [
"src/bootstrap.php" "packages/foundation/src/Psl/bootstrap.php",
"packages/ansi/src/Psl/bootstrap.php",
"packages/async/src/Psl/bootstrap.php",
"packages/binary/src/Psl/bootstrap.php",
"packages/cache/src/Psl/bootstrap.php",
"packages/channel/src/Psl/bootstrap.php",
"packages/class/src/Psl/bootstrap.php",
"packages/comparison/src/Psl/bootstrap.php",
"packages/compression/src/Psl/bootstrap.php",
"packages/crypto/src/Psl/bootstrap.php",
"packages/date-time/src/Psl/bootstrap.php",
"packages/dict/src/Psl/bootstrap.php",
"packages/encoding/src/Psl/bootstrap.php",
"packages/env/src/Psl/bootstrap.php",
"packages/file/src/Psl/bootstrap.php",
"packages/filesystem/src/Psl/bootstrap.php",
"packages/fun/src/Psl/bootstrap.php",
"packages/graph/src/Psl/bootstrap.php",
"packages/h2/src/Psl/bootstrap.php",
"packages/hash/src/Psl/bootstrap.php",
"packages/hpack/src/Psl/bootstrap.php",
"packages/html/src/Psl/bootstrap.php",
"packages/interface/src/Psl/bootstrap.php",
"packages/io/src/Psl/bootstrap.php",
"packages/iter/src/Psl/bootstrap.php",
"packages/json/src/Psl/bootstrap.php",
"packages/math/src/Psl/bootstrap.php",
"packages/network/src/Psl/bootstrap.php",
"packages/option/src/Psl/bootstrap.php",
"packages/os/src/Psl/bootstrap.php",
"packages/password/src/Psl/bootstrap.php",
"packages/pseudo-random/src/Psl/bootstrap.php",
"packages/punycode/src/Psl/bootstrap.php",
"packages/range/src/Psl/bootstrap.php",
"packages/regex/src/Psl/bootstrap.php",
"packages/result/src/Psl/bootstrap.php",
"packages/runtime/src/Psl/bootstrap.php",
"packages/secure-random/src/Psl/bootstrap.php",
"packages/shell/src/Psl/bootstrap.php",
"packages/socks/src/Psl/bootstrap.php",
"packages/str/src/Psl/bootstrap.php",
"packages/tcp/src/Psl/bootstrap.php",
"packages/terminal/src/Psl/bootstrap.php",
"packages/tls/src/Psl/bootstrap.php",
"packages/trait/src/Psl/bootstrap.php",
"packages/tree/src/Psl/bootstrap.php",
"packages/type/src/Psl/bootstrap.php",
"packages/udp/src/Psl/bootstrap.php",
"packages/unix/src/Psl/bootstrap.php",
"packages/uri/src/Psl/bootstrap.php",
"packages/url/src/Psl/bootstrap.php",
"packages/iri/src/Psl/bootstrap.php",
"packages/vec/src/Psl/bootstrap.php"
], ],
"psr-4": { "psr-4": {
"Psl\\": "src/Psl" "Psl\\": "packages/foundation/src/Psl/",
"Psl\\H2\\": "packages/h2/src/Psl/H2/",
"Psl\\IO\\": "packages/io/src/Psl/IO/",
"Psl\\IP\\": "packages/ip/src/Psl/IP/",
"Psl\\OS\\": "packages/os/src/Psl/OS/",
"Psl\\Env\\": "packages/env/src/Psl/Env/",
"Psl\\Fun\\": "packages/fun/src/Psl/Fun/",
"Psl\\IRI\\": "packages/iri/src/Psl/IRI/",
"Psl\\Str\\": "packages/str/src/Psl/Str/",
"Psl\\TCP\\": "packages/tcp/src/Psl/TCP/",
"Psl\\TLS\\": "packages/tls/src/Psl/TLS/",
"Psl\\UDP\\": "packages/udp/src/Psl/UDP/",
"Psl\\URI\\": "packages/uri/src/Psl/URI/",
"Psl\\URL\\": "packages/url/src/Psl/URL/",
"Psl\\Vec\\": "packages/vec/src/Psl/Vec/",
"Psl\\Ansi\\": "packages/ansi/src/Psl/Ansi/",
"Psl\\CIDR\\": "packages/cidr/src/Psl/CIDR/",
"Psl\\Dict\\": "packages/dict/src/Psl/Dict/",
"Psl\\File\\": "packages/file/src/Psl/File/",
"Psl\\Hash\\": "packages/hash/src/Psl/Hash/",
"Psl\\Html\\": "packages/html/src/Psl/Html/",
"Psl\\Iter\\": "packages/iter/src/Psl/Iter/",
"Psl\\Json\\": "packages/json/src/Psl/Json/",
"Psl\\Math\\": "packages/math/src/Psl/Math/",
"Psl\\Tree\\": "packages/tree/src/Psl/Tree/",
"Psl\\Type\\": "packages/type/src/Psl/Type/",
"Psl\\Unix\\": "packages/unix/src/Psl/Unix/",
"Psl\\Async\\": "packages/async/src/Psl/Async/",
"Psl\\Cache\\": "packages/cache/src/Psl/Cache/",
"Psl\\Class\\": "packages/class/src/Psl/Class/",
"Psl\\Graph\\": "packages/graph/src/Psl/Graph/",
"Psl\\HPACK\\": "packages/hpack/src/Psl/HPACK/",
"Psl\\Range\\": "packages/range/src/Psl/Range/",
"Psl\\Regex\\": "packages/regex/src/Psl/Regex/",
"Psl\\Shell\\": "packages/shell/src/Psl/Shell/",
"Psl\\Socks\\": "packages/socks/src/Psl/Socks/",
"Psl\\Trait\\": "packages/trait/src/Psl/Trait/",
"Psl\\Binary\\": "packages/binary/src/Psl/Binary/",
"Psl\\Crypto\\": "packages/crypto/src/Psl/Crypto/",
"Psl\\Either\\": "packages/either/src/Psl/Either/",
"Psl\\Locale\\": "packages/locale/src/Psl/Locale/",
"Psl\\Option\\": "packages/option/src/Psl/Option/",
"Psl\\Result\\": "packages/result/src/Psl/Result/",
"Psl\\Channel\\": "packages/channel/src/Psl/Channel/",
"Psl\\Default\\": "packages/default/src/Psl/Default/",
"Psl\\Network\\": "packages/network/src/Psl/Network/",
"Psl\\Process\\": "packages/process/src/Psl/Process/",
"Psl\\Promise\\": "packages/promise/src/Psl/Promise/",
"Psl\\Runtime\\": "packages/runtime/src/Psl/Runtime/",
"Psl\\DateTime\\": "packages/date-time/src/Psl/DateTime/",
"Psl\\Encoding\\": "packages/encoding/src/Psl/Encoding/",
"Psl\\Observer\\": "packages/observer/src/Psl/Observer/",
"Psl\\Password\\": "packages/password/src/Psl/Password/",
"Psl\\Punycode\\": "packages/punycode/src/Psl/Punycode/",
"Psl\\Terminal\\": "packages/terminal/src/Psl/Terminal/",
"Psl\\Interface\\": "packages/interface/src/Psl/Interface/",
"Psl\\Collection\\": "packages/collection/src/Psl/Collection/",
"Psl\\Comparison\\": "packages/comparison/src/Psl/Comparison/",
"Psl\\Filesystem\\": "packages/filesystem/src/Psl/Filesystem/",
"Psl\\Compression\\": "packages/compression/src/Psl/Compression/",
"Psl\\PseudoRandom\\": "packages/pseudo-random/src/Psl/PseudoRandom/",
"Psl\\SecureRandom\\": "packages/secure-random/src/Psl/SecureRandom/",
"Psl\\DataStructure\\": "packages/data-structure/src/Psl/DataStructure/",
"Psl\\RandomSequence\\": "packages/random-sequence/src/Psl/RandomSequence/",
"Psl\\Interoperability\\": "packages/interoperability/src/Psl/Interoperability/"
} }
}, },
"notification-url": "https://packagist.org/downloads/", "notification-url": "https://packagist.org/downloads/",
@ -1442,7 +1627,7 @@
"description": "PHP Standard Library", "description": "PHP Standard Library",
"support": { "support": {
"issues": "https://github.com/php-standard-library/php-standard-library/issues", "issues": "https://github.com/php-standard-library/php-standard-library/issues",
"source": "https://github.com/php-standard-library/php-standard-library/tree/4.3.0" "source": "https://github.com/php-standard-library/php-standard-library/tree/6.1.1"
}, },
"funding": [ "funding": [
{ {
@ -1454,7 +1639,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2026-02-24T01:58:53+00:00" "time": "2026-03-20T08:09:20+00:00"
}, },
{ {
"name": "phpoption/phpoption", "name": "phpoption/phpoption",
@ -2571,86 +2756,6 @@
], ],
"time": "2025-01-02T08:10:11+00:00" "time": "2025-01-02T08:10:11+00:00"
}, },
{
"name": "symfony/polyfill-php83",
"version": "v1.33.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php83.git",
"reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5",
"reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5",
"shasum": ""
},
"require": {
"php": ">=7.2"
},
"type": "library",
"extra": {
"thanks": {
"url": "https://github.com/symfony/polyfill",
"name": "symfony/polyfill"
}
},
"autoload": {
"files": [
"bootstrap.php"
],
"psr-4": {
"Symfony\\Polyfill\\Php83\\": ""
},
"classmap": [
"Resources/stubs"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Nicolas Grekas",
"email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
"polyfill",
"portable",
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://github.com/nicolas-grekas",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2025-07-08T02:45:35+00:00"
},
{ {
"name": "symfony/polyfill-php84", "name": "symfony/polyfill-php84",
"version": "v1.33.0", "version": "v1.33.0",
@ -5024,12 +5129,12 @@
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/Roave/SecurityAdvisories.git", "url": "https://github.com/Roave/SecurityAdvisories.git",
"reference": "61130731cdf896e60028ed82193a1bc3c50d032a" "reference": "958bc6ccdb194912236265e4f36256e55bb0c9da"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/61130731cdf896e60028ed82193a1bc3c50d032a", "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/958bc6ccdb194912236265e4f36256e55bb0c9da",
"reference": "61130731cdf896e60028ed82193a1bc3c50d032a", "reference": "958bc6ccdb194912236265e4f36256e55bb0c9da",
"shasum": "" "shasum": ""
}, },
"conflict": { "conflict": {
@ -5080,9 +5185,9 @@
"aureuserp/aureuserp": "<1.3.0.0-beta1", "aureuserp/aureuserp": "<1.3.0.0-beta1",
"austintoddj/canvas": "<=3.4.2", "austintoddj/canvas": "<=3.4.2",
"auth0/auth0-php": ">=3.3,<=8.18", "auth0/auth0-php": ">=3.3,<=8.18",
"auth0/login": "<7.20", "auth0/login": "<=7.20",
"auth0/symfony": "<=5.5", "auth0/symfony": "<=5.7",
"auth0/wordpress": "<=5.4", "auth0/wordpress": "<=5.5",
"automad/automad": "<2.0.0.0-alpha5", "automad/automad": "<2.0.0.0-alpha5",
"automattic/jetpack": "<9.8", "automattic/jetpack": "<9.8",
"avideo/avideo": "<=26", "avideo/avideo": "<=26",
@ -6066,7 +6171,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2026-04-02T00:32:12+00:00" "time": "2026-04-03T04:48:53+00:00"
}, },
{ {
"name": "sebastian/diff", "name": "sebastian/diff",
@ -7378,5 +7483,5 @@
"php": ">=8.5" "php": ">=8.5"
}, },
"platform-dev": {}, "platform-dev": {},
"plugin-api-version": "2.9.0" "plugin-api-version": "2.6.0"
} }

View file

@ -27,8 +27,9 @@ format:
# TwigCsFixher # TwigCsFixher
-vendor/bin/twig-cs-fixer fix web/app/themes/haiku-atelier-2024/ -vendor/bin/twig-cs-fixer fix web/app/themes/haiku-atelier-2024/
# PhpCsFixer # PhpCsFixer
-vendor/bin/php-cs-fixer fix --allow-risky yes # -vendor/bin/php-cs-fixer fix --allow-risky yes
dprint --config "~/.config/dprint/dprint.jsonc" fmt dprint --config "~/.config/dprint/dprint.jsonc" fmt
mago format
fish scripts/format-sort-files.fish fish scripts/format-sort-files.fish
# Compile, minifie et optimise Sass vers CSS. # Compile, minifie et optimise Sass vers CSS.

View file

@ -8,6 +8,82 @@ threads = 8
includes = ["config", "vendor", "web/app/plugins", "web/vendor", "web/wp"] includes = ["config", "vendor", "web/app/plugins", "web/vendor", "web/wp"]
paths = ["web/app/themes/haiku-atelier-2024"] paths = ["web/app/themes/haiku-atelier-2024"]
[formatter]
# Brace style for classes, traits, etc.
classlike-brace-style = "same_line"
# Brace style for closures.
closure-brace-style = "same_line"
# Brace style for control structures.
control-brace-style = "same_line"
# Brace style for functions.
function-brace-style = "same_line"
# Brace style for methods.
method-brace-style = "same_line"
# Maximum line length that the printer will wrap on.
print-width = 120
# Remove the trailing PHP close tag (?>) from files.
remove-trailing-close-tag = true
# Prefer single quotes over double quotes for strings.
single-quote = true
# Number of spaces per indentation level.
tab-width = 2
# Add a trailing comma to multi-line arrays, parameter lists, etc.
trailing-comma = true
# Use tabs instead of spaces for indentation.
use-tabs = false
# Place empty control structure bodies on the same line.
inline-empty-control-braces = true
# Place empty function bodies on the same line.
inline-empty-function-braces = true
# Place empty constructor bodies on the same line.
inline-empty-constructor-braces = true
# Place empty method bodies on the same line.
inline-empty-method-braces = true
# Place empty anonymous class bodies on the same line.
inline-empty-anonymous-class-braces = true
# How to break method chains.
method-chain-breaking-style = "next_line"
# Preserve existing line breaks in method chains.
preserve-breaking-member-access-chain = false
# Preserve existing line breaks in argument lists.
preserve-breaking-argument-list = false
# Preserve existing line breaks in array-like structures.
preserve-breaking-array-like = false
# Preserve existing line breaks in parameter lists.
preserve-breaking-parameter-list = false
# Preserve existing line breaks in attribute lists.
preserve-breaking-attribute-list = false
# Preserve existing line breaks in ternary expressions.
preserve-breaking-conditional-expression = false
# Always break parameter lists with promoted properties.
break-promoted-properties-list = true
# Place the binary operator on the next line when breaking.
line-before-binary-operator = true
# Always break named argument lists into multiple lines.
always-break-named-arguments-list = true
# Always break named argument lists in attributes.
always-break-attribute-named-argument-lists = true
# Use table-style alignment for arrays.
array-table-style-alignment = true
# Sort use statements alphabetically.
sort-uses = true
# Insert a blank line between different types of use statements.
separate-use-types = true
# Expand grouped use statements into individual statements.
expand-use-groups = true
# How to format null type hints (null|T vs ?T).
null-type-hint = "null_pipe"
# Add parentheses around new in member access ((new Foo)->bar()).
parentheses-around-new-in-member-access = false
# Add parentheses to new expressions without arguments (new Foo()).
parentheses-in-new-expression = true
# Add parentheses to exit and die constructs.
parentheses-in-exit-and-die = true
# Add parentheses to attributes without arguments.
parentheses-in-attribute = true
# Add a space before arrow function parameters.
space-before-arrow-function-parameter-list-parenthesis = false
[linter] [linter]
integrations = ["wordpress"] integrations = ["wordpress"]

View file

@ -23,12 +23,12 @@
"devDependencies": { "devDependencies": {
"@effect/language-service": "^0.84.3", "@effect/language-service": "^0.84.3",
"@gcch/configuration-eslint": "git+https://git.gcch.fr/gcch/configuration-eslint#62ee424274", "@gcch/configuration-eslint": "git+https://git.gcch.fr/gcch/configuration-eslint#62ee424274",
"@gcch/configuration-oxlint": "git+https://git.gcch.fr/gcch/configuration-oxlint#c53b1c1f78", "@gcch/configuration-oxlint": "git+https://git.gcch.fr/gcch/configuration-oxlint#93dd909919",
"@gcch/configuration-prettier": "git+https://git.gcch.fr/gcch/configuration-prettier#8de937e801", "@gcch/configuration-prettier": "git+https://git.gcch.fr/gcch/configuration-prettier#8de937e801",
"@playwright/test": "^1.59.1", "@playwright/test": "^1.59.1",
"@sentry/core": "^10.47.0", "@sentry/core": "^10.47.0",
"@types/bun": "^1.3.11", "@types/bun": "^1.3.11",
"@types/node": "^25.5.0", "@types/node": "^25.5.1",
"@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",
@ -42,7 +42,7 @@
"fdir": "^6.5.0", "fdir": "^6.5.0",
"globals": "^17.4.0", "globals": "^17.4.0",
"jiti": "^2.6.1", "jiti": "^2.6.1",
"knip": "^6.1.1", "knip": "^6.3.0",
"lightningcss": "^1.32.0", "lightningcss": "^1.32.0",
"lightningcss-cli": "^1.32.0", "lightningcss-cli": "^1.32.0",
"oxlint": "^1.58.0", "oxlint": "^1.58.0",
@ -51,7 +51,7 @@
"prettier": "^3.8.1", "prettier": "^3.8.1",
"prettier-plugin-pkg": "^0.22.1", "prettier-plugin-pkg": "^0.22.1",
"prettier-plugin-sh": "^0.18.0", "prettier-plugin-sh": "^0.18.0",
"sass-embedded": "^1.98.0", "sass-embedded": "^1.99.0",
"stylelint": "^17.6.0", "stylelint": "^17.6.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",

View file

@ -1,40 +1,63 @@
import { BunFile, YAML } from "bun"; import { YAML } from "bun";
import { Array, Console, Effect, Option, pipe, Record, Schema } from "effect"; import { Array as EffectArray, Console, Data, Effect, pipe, Record, Schema, SchemaIssue } from "effect";
import { type UnknownException } from "effect/Cause"; import { NoSuchElementError } from "effect/Cause";
import { type ParseError } from "effect/ParseResult";
import { type ReadonlyRecord } from "effect/Record"; import { type ReadonlyRecord } from "effect/Record";
import { SchemaError } from "effect/Schema";
const COMPOSE_PATH = "compose.yaml"; const COMPOSE_PATH = "compose.yaml";
const getServicesKey = (yaml: ReadonlyRecord<string | symbol, any>): Option.Option<ReadonlyArray<string>> => class ScriptError extends Data.TaggedError("ScriptError")<{ cause: unknown }> {}
const ComposeSchema = Schema.Record(Schema.Union([Schema.String, Schema.Symbol]), Schema.Any);
type ComposeYaml = ReadonlyRecord<string | symbol, any>;
const getObjectKey = (key: string, yaml: ComposeYaml): Effect.Effect<ReadonlyArray<string>, ScriptError> =>
pipe( pipe(
Record.get("services")(yaml), Record.get(key)(yaml),
Option.andThen((yaml) => Record.keys(yaml)), Effect.fromOption,
Effect.map((yaml: any) => Record.keys(yaml)),
Effect.mapError((e: NoSuchElementError) => new ScriptError({ cause: e })),
); );
const getComposeYaml = <A, I, R>( const getFileContent = Effect.fn("getFileContent")(function* (filePath: string) {
filePath: string, const fileRef = Bun.file(filePath);
schema: Schema.Schema<A, I, R>,
): Effect.Effect<A, UnknownException | ParseError, R> =>
pipe(
Effect.try(() => Bun.file(filePath)),
Effect.andThen((file: BunFile) => Effect.tryPromise(() => file.text())),
Effect.andThen((text: string) => Effect.try(() => YAML.parse(text))),
Effect.andThen((yaml: unknown) => Schema.decodeUnknown(schema)(yaml)),
);
const programEffect: Effect.Effect<ReadonlyArray<string>> = Effect.gen(function* () { yield* Effect.tryPromise({
return yield* pipe( try: () => fileRef.exists(),
// Récupère le contenu du fichier compose.yaml sous forme de Record. catch: (_) => new ScriptError({ cause: "The wanted file does not exist." }),
getComposeYaml(COMPOSE_PATH, Schema.Record({ key: Schema.String, value: Schema.Unknown })), });
// Récupère la clé des services.
Effect.andThen((yaml: ReadonlyRecord<string | symbol, unknown>) => getServicesKey(yaml)), return yield* Effect.tryPromise({
// Retire la clé de l'image WordPress. try: () => fileRef.text(),
Effect.andThen((keys: ReadonlyArray<string>) => Array.filter(keys, (key) => key !== "wordpress")), catch: (_) => new ScriptError({ cause: "Can't retrieve the file's text content." }),
Effect.orElseSucceed(() => [""]), });
// Exécute la commande podman.
Effect.tap((services) => Bun.spawn({ cmd: ["podman", "compose", "pull", ...services], timeout: 10000 })),
);
}); });
Effect.runFork(programEffect).pipe(Effect.tapErrorCause(Console.error)); const getComposeYaml = <A>(filePath: string, schema: Schema.Schema<A>) =>
pipe(
getFileContent(filePath),
Effect.map((text: string) => YAML.parse(text)),
Effect.flatMap((yaml: unknown) => Schema.decodeUnknownEffect(schema)(yaml, { errors: "all" })),
Effect.mapError((error) => {
if (error instanceof SchemaError) {
return new ScriptError({ cause: SchemaIssue.makeFormatterStandardSchemaV1()(error.issue) });
} else {
return error;
}
}),
);
const program: Effect.Effect<ReadonlyArray<string>, ScriptError> = pipe(
getComposeYaml(COMPOSE_PATH, ComposeSchema),
Effect.flatMap((yaml: ComposeYaml) => getObjectKey("services", yaml)),
Effect.map((keys: ReadonlyArray<string>) => EffectArray.filter(keys, (key) => key !== "wordpress")),
Effect.orElseSucceed(() => [""]),
Effect.tap((services: ReadonlyArray<string>) => {
Bun.spawn({ cmd: ["podman", "compose", "pull", ...services], timeout: 10000 });
return Effect.succeed(services);
}),
Effect.tapCause(Console.error),
);
Effect.runFork(program);

View file

@ -11,7 +11,7 @@ export type BackendHeaders = {
*/ */
export const getBackendHeadersFromHtml = async (page: Page): Promise<BackendHeaders> => { export const getBackendHeadersFromHtml = async (page: Page): Promise<BackendHeaders> => {
const backendHeaders: BackendHeaders | undefined = pipe( const backendHeaders: BackendHeaders | undefined = pipe(
Option.fromNullable(await page.locator("#injection-v2").textContent()), Option.fromNullishOr(await page.locator("#injection-v2").textContent()),
Option.andThen((j) => JSON.parse(j) as BackendHeaders), Option.andThen((j) => JSON.parse(j) as BackendHeaders),
Option.getOrUndefined, Option.getOrUndefined,
); );

View file

@ -25,7 +25,7 @@ $templates = ['404.twig'];
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',
); );
} }
@ -33,5 +33,5 @@ add_action('wp_enqueue_scripts', load_page_resources(...));
Timber::render( Timber::render(
data: $context, data: $context,
filenames: $templates filenames: $templates,
); );

View file

@ -28,7 +28,7 @@ $wc_products = wc_get_products(['limit' => 12, 'order' => 'DESC', 'orderby' => '
$products = array_map( $products = array_map(
callback: Product::new(...), callback: Product::new(...),
array: $wc_products array: $wc_products,
); );
$context['products'] = $products; $context['products'] = $products;
@ -40,15 +40,15 @@ $context['products'] = $products;
function load_page_resources(): void { function load_page_resources(): void {
Resource::enqueue_style_file( Resource::enqueue_style_file(
handle: 'haiku-atelier-2024-styles-page-boutique', handle: 'haiku-atelier-2024-styles-page-boutique',
path: '/assets/css/pages/page-boutique.css' path: '/assets/css/pages/page-boutique.css',
); );
Resource::enqueue_script_module_file( Resource::enqueue_script_module_file(
id: 'haiku-atelier-2024-scripts-page-boutique', id: 'haiku-atelier-2024-scripts-page-boutique',
path: '/assets/js/scripts-page-boutique.js' path: '/assets/js/scripts-page-boutique.js',
); );
Resource::enqueue_script_module_file( Resource::enqueue_script_module_file(
id: 'haiku-atelier-2024-scripts-menu-categories', id: 'haiku-atelier-2024-scripts-menu-categories',
path: '/assets/js/scripts-menu-categories.js' path: '/assets/js/scripts-menu-categories.js',
); );
} }
@ -56,5 +56,5 @@ add_action('wp_enqueue_scripts', load_page_resources(...));
Timber::render( Timber::render(
data: $context, data: $context,
filenames: $templates filenames: $templates,
); );

View file

@ -25,11 +25,11 @@ $templates = ['accueil.twig'];
function load_resources(): void { function load_resources(): 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',
); );
} }
@ -37,5 +37,5 @@ add_action('wp_enqueue_scripts', load_resources(...));
Timber::render( Timber::render(
data: $context, data: $context,
filenames: $templates filenames: $templates,
); );

View file

@ -33,19 +33,19 @@ function load_scripts(): void {
id: 'haiku-atelier-2024-bouton-panier', id: 'haiku-atelier-2024-bouton-panier',
deps: [], deps: [],
src: get_template_directory_uri() . '/assets/js/scripts-bouton-panier.js', src: get_template_directory_uri() . '/assets/js/scripts-bouton-panier.js',
version: filemtime(get_template_directory() . '/assets/js/scripts-bouton-panier.js') version: filemtime(get_template_directory() . '/assets/js/scripts-bouton-panier.js'),
); );
wp_enqueue_script_module( wp_enqueue_script_module(
id: 'haiku-atelier-2024-menu-mobile', id: 'haiku-atelier-2024-menu-mobile',
deps: [], deps: [],
src: get_template_directory_uri() . '/assets/js/scripts-menu-mobile.js', src: get_template_directory_uri() . '/assets/js/scripts-menu-mobile.js',
version: filemtime(get_template_directory() . '/assets/js/scripts-menu-mobile.js') version: filemtime(get_template_directory() . '/assets/js/scripts-menu-mobile.js'),
); );
wp_enqueue_script_module( wp_enqueue_script_module(
id: 'haiku-atelier-2024-bouton-retour-sommet', id: 'haiku-atelier-2024-bouton-retour-sommet',
deps: [], deps: [],
src: get_template_directory_uri() . '/assets/js/scripts-bouton-retour-sommet.js', src: get_template_directory_uri() . '/assets/js/scripts-bouton-retour-sommet.js',
version: filemtime(get_template_directory() . '/assets/js/scripts-bouton-retour-sommet.js') version: filemtime(get_template_directory() . '/assets/js/scripts-bouton-retour-sommet.js'),
); );
} }
@ -58,7 +58,7 @@ function charge_styles_haiku_atelier_2024(): void {
src: get_template_directory_uri() . '/assets/css/main.css', src: get_template_directory_uri() . '/assets/css/main.css',
deps: [], deps: [],
ver: filemtime(get_template_directory() . '/assets/css/main.css'), ver: filemtime(get_template_directory() . '/assets/css/main.css'),
media: 'all' media: 'all',
); );
} }
@ -74,7 +74,7 @@ function enregistre_personnalisations_theme(mixed $wp_customize): void {
// Section « Réseaux sociaux » // Section « Réseaux sociaux »
$wp_customize->add_section('liens_reseaux_sociaux', [ $wp_customize->add_section('liens_reseaux_sociaux', [
'title' => __('Liens des réseaux sociaux'), 'title' => __('Liens des réseaux sociaux'),
'description' => __("Liens des réseaux sociaux s'affichant dans le pied de page.") 'description' => __("Liens des réseaux sociaux s'affichant dans le pied de page."),
]); ]);
// Instagram // Instagram
@ -82,7 +82,7 @@ function enregistre_personnalisations_theme(mixed $wp_customize): void {
$wp_customize->add_control('lien_instagram', [ $wp_customize->add_control('lien_instagram', [
'type' => 'url', 'type' => 'url',
'section' => 'liens_reseaux_sociaux', 'section' => 'liens_reseaux_sociaux',
'label' => __('Profil Instagram') 'label' => __('Profil Instagram'),
]); ]);
// Facebook // Facebook
@ -90,7 +90,7 @@ function enregistre_personnalisations_theme(mixed $wp_customize): void {
$wp_customize->add_control('lien_facebook', [ $wp_customize->add_control('lien_facebook', [
'type' => 'url', 'type' => 'url',
'section' => 'liens_reseaux_sociaux', 'section' => 'liens_reseaux_sociaux',
'label' => __('Profil Facebook') 'label' => __('Profil Facebook'),
]); ]);
// Pinterest // Pinterest
@ -98,13 +98,13 @@ function enregistre_personnalisations_theme(mixed $wp_customize): void {
$wp_customize->add_control('lien_pinterest', [ $wp_customize->add_control('lien_pinterest', [
'type' => 'url', 'type' => 'url',
'section' => 'liens_reseaux_sociaux', 'section' => 'liens_reseaux_sociaux',
'label' => __('Profil Pinterest') 'label' => __('Profil Pinterest'),
]); ]);
// Section « Descriptions Produits » // Section « Descriptions Produits »
$wp_customize->add_section('descriptions_produits', [ $wp_customize->add_section('descriptions_produits', [
'title' => __('Textes des descriptions Produits'), 'title' => __('Textes des descriptions Produits'),
'description' => __('Textes des descriptions apparaissant sur les pages Produit.') 'description' => __('Textes des descriptions apparaissant sur les pages Produit.'),
]); ]);
$wp_customize->add_setting('texte_conditions_livraison', [ $wp_customize->add_setting('texte_conditions_livraison', [
@ -112,7 +112,7 @@ function enregistre_personnalisations_theme(mixed $wp_customize): void {
'default' => '', 'default' => '',
'sanitize_callback' => 'wp_kses_post', 'sanitize_callback' => 'wp_kses_post',
'transport' => 'postMessage', 'transport' => 'postMessage',
'type' => 'theme_mod' 'type' => 'theme_mod',
]); ]);
$wp_customize->add_control(new Controle_Personnalise_TinyMCE($wp_customize, 'texte_conditions_livraison', [ $wp_customize->add_control(new Controle_Personnalise_TinyMCE($wp_customize, 'texte_conditions_livraison', [
'label' => __('Conditions de livraison'), 'label' => __('Conditions de livraison'),
@ -120,8 +120,8 @@ function enregistre_personnalisations_theme(mixed $wp_customize): void {
'section' => 'descriptions_produits', 'section' => 'descriptions_produits',
'input_attrs' => [ 'input_attrs' => [
'toolbar1' => 'bold italic bullist numlist alignleft aligncenter alignright link', 'toolbar1' => 'bold italic bullist numlist alignleft aligncenter alignright link',
'mediaButtons' => true 'mediaButtons' => true,
] ],
])); ]));
$wp_customize->add_setting('texte_entretien_produit', [ $wp_customize->add_setting('texte_entretien_produit', [
@ -129,7 +129,7 @@ function enregistre_personnalisations_theme(mixed $wp_customize): void {
'default' => '', 'default' => '',
'sanitize_callback' => 'wp_kses_post', 'sanitize_callback' => 'wp_kses_post',
'transport' => 'postMessage', 'transport' => 'postMessage',
'type' => 'theme_mod' 'type' => 'theme_mod',
]); ]);
$wp_customize->add_control(new Controle_Personnalise_TinyMCE($wp_customize, 'texte_entretien_produit', [ $wp_customize->add_control(new Controle_Personnalise_TinyMCE($wp_customize, 'texte_entretien_produit', [
'label' => __('Entretien du Produit'), 'label' => __('Entretien du Produit'),
@ -137,8 +137,8 @@ function enregistre_personnalisations_theme(mixed $wp_customize): void {
'section' => 'descriptions_produits', 'section' => 'descriptions_produits',
'input_attrs' => [ 'input_attrs' => [
'toolbar1' => 'bold italic bullist numlist alignleft aligncenter alignright link', 'toolbar1' => 'bold italic bullist numlist alignleft aligncenter alignright link',
'mediaButtons' => true 'mediaButtons' => true,
] ],
])); ]));
} }

View file

@ -9,5 +9,5 @@ $templates = ['base.twig'];
Timber::render( Timber::render(
data: $context, data: $context,
filenames: $templates filenames: $templates,
); );

View file

@ -37,11 +37,11 @@ $context['image_dimensions'] = $image_dimensions;
function load_resources(): void { function load_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-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',
); );
} }
@ -49,5 +49,5 @@ add_action('wp_enqueue_scripts', load_resources(...));
Timber::render( Timber::render(
data: $context, data: $context,
filenames: $templates filenames: $templates,
); );

View file

@ -101,7 +101,7 @@ $allowed_countries = [
'TW', 'TW',
'US', 'US',
'YT', 'YT',
'ZA' 'ZA',
]; ];
// Récupère les informations affichés des Produits du Panier // Récupère les informations affichés des Produits du Panier
@ -140,12 +140,12 @@ foreach (WC()->cart->get_cart() as $cle_panier => $article_panier) {
'id_variation' => $article_panier['variation_id'], 'id_variation' => $article_panier['variation_id'],
'image' => pipe($article_panier['data']?->get_image_id(), static fn($id): string => genere_balise_img_multiformats( 'image' => pipe($article_panier['data']?->get_image_id(), static fn($id): string => genere_balise_img_multiformats(
id: (string) $id, id: (string) $id,
lazy: true lazy: true,
)), )),
'prix' => $article_panier['data']?->get_price(), 'prix' => $article_panier['data']?->get_price(),
'quantite' => $article_panier['quantity'], 'quantite' => $article_panier['quantity'],
'url' => $article_panier['data']?->get_permalink(), 'url' => $article_panier['data']?->get_permalink(),
'titre' => $article_panier['data']?->get_title() 'titre' => $article_panier['data']?->get_title(),
]; ];
} }
@ -161,7 +161,7 @@ $methodes_livraison = collect(WC()->session->get('shipping_for_package_0')['rate
'id' => $methode->get_method_id(), 'id' => $methode->get_method_id(),
'prix' => Number::format((int) $methode->get_cost(), maxPrecision: 2), 'prix' => Number::format((int) $methode->get_cost(), maxPrecision: 2),
'selectionnee' => collect(WC()->session->get('chosen_shipping_methods'))->first() === $methode->get_id(), 'selectionnee' => collect(WC()->session->get('chosen_shipping_methods'))->first() === $methode->get_id(),
'titre' => $methode->get_label() 'titre' => $methode->get_label(),
]); ]);
$contexte['email'] = $email; $contexte['email'] = $email;
@ -185,11 +185,11 @@ $contexte['methodes_livraison'] = $methodes_livraison;
function load_resources(): void { function load_resources(): void {
Resource::enqueue_style_file( Resource::enqueue_style_file(
handle: 'haiku-atelier-2024-styles-page-panier', handle: 'haiku-atelier-2024-styles-page-panier',
path: '/assets/css/pages/page-panier.css' path: '/assets/css/pages/page-panier.css',
); );
Resource::enqueue_script_module_file( Resource::enqueue_script_module_file(
id: 'haiku-atelier-2024-scripts-page-panier', id: 'haiku-atelier-2024-scripts-page-panier',
path: '/assets/js/scripts-page-panier.js' path: '/assets/js/scripts-page-panier.js',
); );
} }
@ -198,5 +198,5 @@ add_action('wp_enqueue_scripts', load_resources(...));
// Rendu // Rendu
Timber::render( Timber::render(
filenames: $modeles, filenames: $modeles,
data: $contexte data: $contexte,
); );

View file

@ -40,7 +40,7 @@ $session_wc = WC()->session;
$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
@ -86,7 +86,7 @@ $articles = collect($panier->get_cart())
. ' (' . ' ('
. 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 [
@ -94,11 +94,11 @@ $articles = collect($panier->get_cart())
'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()
@ -126,7 +126,7 @@ $coupons_wc = collect(WC()->cart->get_coupons())
'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
@ -152,8 +152,8 @@ $session_checkout_stripe = \Stripe\Checkout\Session::create([
'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');

View file

@ -19,7 +19,7 @@ function charge_scripts_styles_page_contact(): void {
src: get_template_directory_uri() . '/assets/css/pages/page-modele-simple.css', src: get_template_directory_uri() . '/assets/css/pages/page-modele-simple.css',
deps: [], deps: [],
ver: filemtime(get_template_directory() . '/assets/css/pages/page-modele-simple.css'), ver: filemtime(get_template_directory() . '/assets/css/pages/page-modele-simple.css'),
media: 'all' media: 'all',
); );
} }
@ -28,5 +28,5 @@ add_action('wp_enqueue_scripts', 'charge_scripts_styles_page_contact');
// Rendu // Rendu
Timber::render( Timber::render(
filenames: $modeles, filenames: $modeles,
data: $contexte data: $contexte,
); );

View file

@ -19,7 +19,7 @@ function charge_scripts_styles_page_echec_commande(): void {
src: get_template_directory_uri() . '/assets/css/pages/page-modele-simple.css', src: get_template_directory_uri() . '/assets/css/pages/page-modele-simple.css',
deps: [], deps: [],
ver: filemtime(get_template_directory() . '/assets/css/pages/page-modele-simple.css'), ver: filemtime(get_template_directory() . '/assets/css/pages/page-modele-simple.css'),
media: 'all' media: 'all',
); );
} }
@ -28,5 +28,5 @@ add_action('wp_enqueue_scripts', 'charge_scripts_styles_page_echec_commande');
// Rendu // Rendu
Timber::render( Timber::render(
filenames: $modeles, filenames: $modeles,
data: $contexte data: $contexte,
); );

View file

@ -85,12 +85,12 @@ try {
'id_produit' => $id_produit, 'id_produit' => $id_produit,
'image' => pipe($produit->get_image_id(), static fn($id): string => genere_balise_img_multiformats( 'image' => pipe($produit->get_image_id(), static fn($id): string => genere_balise_img_multiformats(
id: $id, id: $id,
lazy: true lazy: true,
)), )),
'permalien' => $produit->get_permalink(), 'permalien' => $produit->get_permalink(),
'prix' => $produit_commande->get_data()['total'], 'prix' => $produit_commande->get_data()['total'],
'quantite' => $produit_commande->get_quantity(), 'quantite' => $produit_commande->get_quantity(),
'titre' => $produit->get_title() 'titre' => $produit->get_title(),
]; ];
}); });
@ -103,7 +103,7 @@ try {
src: get_template_directory_uri() . '/assets/css/pages/page-succes-commande.css', src: get_template_directory_uri() . '/assets/css/pages/page-succes-commande.css',
deps: [], deps: [],
ver: filemtime(get_template_directory() . '/assets/css/pages/page-succes-commande.css'), ver: filemtime(get_template_directory() . '/assets/css/pages/page-succes-commande.css'),
media: 'all' media: 'all',
); );
} }
@ -112,7 +112,7 @@ try {
// Rendu // Rendu
Timber::render( Timber::render(
filenames: $modeles, filenames: $modeles,
data: $contexte data: $contexte,
); );
} catch (Error $error) { } catch (Error $error) {
http_response_code(500); http_response_code(500);

View file

@ -19,7 +19,7 @@ function charge_scripts_styles_page_cgv(): void {
src: get_template_directory_uri() . '/assets/css/pages/page-modele-simple.css', src: get_template_directory_uri() . '/assets/css/pages/page-modele-simple.css',
deps: [], deps: [],
ver: filemtime(get_template_directory() . '/assets/css/pages/page-modele-simple.css'), ver: filemtime(get_template_directory() . '/assets/css/pages/page-modele-simple.css'),
media: 'all' media: 'all',
); );
} }
@ -28,5 +28,5 @@ add_action('wp_enqueue_scripts', 'charge_scripts_styles_page_cgv');
// Rendu // Rendu
Timber::render( Timber::render(
filenames: $modeles, filenames: $modeles,
data: $contexte data: $contexte,
); );

View file

@ -31,7 +31,7 @@ $maximum_price = collect($product->variations)->max('price');
$same_collection_products = array_map( $same_collection_products = array_map(
array: recupere_produits_meme_collection($product->collection)($product->id), array: recupere_produits_meme_collection($product->collection)($product->id),
callback: Product::new(...) callback: Product::new(...),
); );
$context['product'] = $product; $context['product'] = $product;
@ -47,13 +47,13 @@ function charge_scripts_page_produit(): void {
id: 'haiku-atelier-2024-scripts-page-produit', id: 'haiku-atelier-2024-scripts-page-produit',
src: get_template_directory_uri() . '/assets/js/scripts-page-produit.js', src: get_template_directory_uri() . '/assets/js/scripts-page-produit.js',
deps: [], deps: [],
version: filemtime(get_template_directory() . '/assets/js/scripts-page-produit.js') version: filemtime(get_template_directory() . '/assets/js/scripts-page-produit.js'),
); );
wp_enqueue_script_module( wp_enqueue_script_module(
id: 'haiku-atelier-2024-scripts-menu-categories', id: 'haiku-atelier-2024-scripts-menu-categories',
src: get_template_directory_uri() . '/assets/js/scripts-menu-categories.js', src: get_template_directory_uri() . '/assets/js/scripts-menu-categories.js',
deps: [], deps: [],
version: filemtime(get_template_directory() . '/assets/js/scripts-menu-categories.js') version: filemtime(get_template_directory() . '/assets/js/scripts-menu-categories.js'),
); );
} }
@ -62,5 +62,5 @@ add_action('wp_enqueue_scripts', 'charge_scripts_page_produit');
// Rendu // Rendu
Timber::render( Timber::render(
filenames: $templates, filenames: $templates,
data: $context data: $context,
); );

View file

@ -54,21 +54,21 @@ final class StarterSite extends Site {
$liens_reseaux_sociaux = [ $liens_reseaux_sociaux = [
'facebook' => ['nom' => 'Facebook', 'url' => $personnalisations_theme['lien_facebook'] ?? ''], 'facebook' => ['nom' => 'Facebook', 'url' => $personnalisations_theme['lien_facebook'] ?? ''],
'instagram' => ['nom' => 'Instagram', 'url' => $personnalisations_theme['lien_instagram'] ?? ''], 'instagram' => ['nom' => 'Instagram', 'url' => $personnalisations_theme['lien_instagram'] ?? ''],
'pinterest' => ['nom' => 'Pinterest', 'url' => $personnalisations_theme['lien_pinterest'] ?? ''] 'pinterest' => ['nom' => 'Pinterest', 'url' => $personnalisations_theme['lien_pinterest'] ?? ''],
]; ];
$context['liens_reseaux_sociaux'] = $liens_reseaux_sociaux; $context['liens_reseaux_sociaux'] = $liens_reseaux_sociaux;
// Récupère les textes apparaissant sur les pages Produits // Récupère les textes apparaissant sur les pages Produits
$descriptions_produits = [ $descriptions_produits = [
'texte_conditions_livraison' => wpautop($personnalisations_theme['texte_conditions_livraison']) ?? '', 'texte_conditions_livraison' => wpautop($personnalisations_theme['texte_conditions_livraison']) ?? '',
'texte_entretien_produit' => wpautop($personnalisations_theme['texte_entretien_produit']) ?? '' 'texte_entretien_produit' => wpautop($personnalisations_theme['texte_entretien_produit']) ?? '',
]; ];
$context['descriptions_produits'] = $descriptions_produits; $context['descriptions_produits'] = $descriptions_produits;
// Logo personnalisée // Logo personnalisée
$context['logo'] = pipe(get_theme_mod('custom_logo'), static fn($id) => wp_get_attachment_image_src( $context['logo'] = pipe(get_theme_mod('custom_logo'), static fn($id) => wp_get_attachment_image_src(
attachment_id: $id, attachment_id: $id,
size: 'full' size: 'full',
)); ));
// Informations des Pages // Informations des Pages
@ -88,7 +88,7 @@ final class StarterSite extends Site {
'failed_order' => $recupere_informations_page('failed_order'), 'failed_order' => $recupere_informations_page('failed_order'),
'home' => $recupere_informations_page('home'), 'home' => $recupere_informations_page('home'),
'shop' => $recupere_informations_page('shop'), 'shop' => $recupere_informations_page('shop'),
'successful_order' => $recupere_informations_page('successful_order') 'successful_order' => $recupere_informations_page('successful_order'),
]; ];
// Récupère la Page courante // Récupère la Page courante
@ -96,19 +96,19 @@ final class StarterSite extends Site {
$context['page_courante'] = $url_courante; $context['page_courante'] = $url_courante;
$context['est_page_tous_produits'] = preg_match( $context['est_page_tous_produits'] = preg_match(
pattern: '/(\bshop\b)/', pattern: '/(\bshop\b)/',
subject: $url_courante subject: $url_courante,
); );
$context['est_page_boutique'] = preg_match( $context['est_page_boutique'] = preg_match(
pattern: '/(\bshop\b)/', pattern: '/(\bshop\b)/',
subject: $url_courante subject: $url_courante,
) )
|| preg_match( || preg_match(
pattern: '/(\bproduct\b)/', pattern: '/(\bproduct\b)/',
subject: $url_courante subject: $url_courante,
) )
|| preg_match( || preg_match(
pattern: '/(\bproduct-category\b)/', pattern: '/(\bproduct-category\b)/',
subject: $url_courante subject: $url_courante,
); );
// Politique de confidentialité // Politique de confidentialité
@ -125,15 +125,15 @@ final class StarterSite extends Site {
// Détermine si l'URL courante est celle de la Page d'Archive d'une Catégorie de Produits // Détermine si l'URL courante est celle de la Page d'Archive d'une Catégorie de Produits
'courante' => preg_match( 'courante' => preg_match(
pattern: "/(\\b{$categorie->slug}\\b)/", pattern: "/(\\b{$categorie->slug}\\b)/",
subject: (string) pipe(URLHelper::get_current_url(), URLHelper::get_rel_url(...)) subject: (string) pipe(URLHelper::get_current_url(), URLHelper::get_rel_url(...)),
) ),
]; ];
$entrees_menu_categories = pipe( $entrees_menu_categories = pipe(
get_categories(['hide_empty' => false, 'orderby' => 'menu_order', 'taxonomy' => 'product_cat']), get_categories(['hide_empty' => false, 'orderby' => 'menu_order', 'taxonomy' => 'product_cat']),
static fn($categories): array => array_map( static fn($categories): array => array_map(
callback: $cree_entree_menu, callback: $cree_entree_menu,
array: $categories array: $categories,
) ),
); );
$context['categories_produits'] = $entrees_menu_categories; $context['categories_produits'] = $entrees_menu_categories;
@ -152,7 +152,7 @@ final class StarterSite extends Site {
$context['nonce_wc'] = $nonce_wc; $context['nonce_wc'] = $nonce_wc;
// TODO: Utiliser des variables d'environnement // TODO: Utiliser des variables d'environnement
$auth_string = base64_encode( $auth_string = base64_encode(
Config::get('WOOCOMMERCE_API_CONSUMER_KEY') . ':' . Config::get('WOOCOMMERCE_API_CONSUMER_SECRET') Config::get('WOOCOMMERCE_API_CONSUMER_KEY') . ':' . Config::get('WOOCOMMERCE_API_CONSUMER_SECRET'),
); );
$context['auth_string'] = $auth_string; $context['auth_string'] = $auth_string;
@ -184,6 +184,7 @@ final class StarterSite extends Site {
public function maj_environnement_twig(array $options): array { public function maj_environnement_twig(array $options): array {
return $options; return $options;
} }
// public function charge_traductions_theme(): void { // public function charge_traductions_theme(): void {
// load_theme_textdomain("haiku-atelier-2024", get_template_directory() . "/languages"); // load_theme_textdomain("haiku-atelier-2024", get_template_directory() . "/languages");
// } // }

View file

@ -22,7 +22,7 @@ function cree_champs_personnalises_produit(): void {
->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")),
]); ]);
} }
@ -31,7 +31,7 @@ function cree_champ_personnalise_commande($order): void {
'id' => 'tracking_number', 'id' => 'tracking_number',
'label' => 'Tracking Number:', 'label' => 'Tracking Number:',
'value' => $order->get_meta('tracking_number'), 'value' => $order->get_meta('tracking_number'),
'wrapper_class' => 'form-field-wide' 'wrapper_class' => 'form-field-wide',
]); ]);
} }

View file

@ -30,7 +30,7 @@ function enregistre_controle_personnalise_tinymce(): void {
src: get_template_directory_uri() . '/assets/vendor/controle-personnalise-tinymce.js', src: get_template_directory_uri() . '/assets/vendor/controle-personnalise-tinymce.js',
deps: ['jquery'], deps: ['jquery'],
ver: '1.3', ver: '1.3',
args: true args: true,
); );
wp_enqueue_editor(); wp_enqueue_editor();
} }

View file

@ -15,7 +15,7 @@ final readonly class Attribute {
public function __construct( public function __construct(
public string $name, public string $name,
public string $slug, public string $slug,
public array $options public array $options,
) {} ) {}
public static function new(WC_Product_Attribute $attribute): self { public static function new(WC_Product_Attribute $attribute): self {
@ -29,7 +29,7 @@ final readonly class Attribute {
return new self( return new self(
name: $name, name: $name,
slug: $slug, slug: $slug,
options: $options options: $options,
); );
} }
} }

View file

@ -10,7 +10,7 @@ final readonly class AttributeOption {
public function __construct( public function __construct(
public int $id, public int $id,
public string $name, public string $name,
public string $slug public string $slug,
) {} ) {}
public static function new(WP_Term $term): self { public static function new(WP_Term $term): self {
@ -21,7 +21,7 @@ final readonly class AttributeOption {
return new self( return new self(
id: $id, id: $id,
name: $name, name: $name,
slug: $slug slug: $slug,
); );
} }
} }

View file

@ -35,7 +35,7 @@ final readonly class Product {
public string $slug, public string $slug,
public int $stock, public int $stock,
public array $variations, public array $variations,
public string $url public string $url,
) {} ) {}
/** /**
@ -94,7 +94,7 @@ final readonly class Product {
slug: $slug, slug: $slug,
stock: $stock, stock: $stock,
variations: $variations, variations: $variations,
url: $url url: $url,
); );
} }
} }

View file

@ -15,7 +15,7 @@ final readonly class ProductVariation {
private function __construct( private function __construct(
public int $id, public int $id,
public string $price, public string $price,
public array $attributes public array $attributes,
) {} ) {}
/** /**
@ -29,7 +29,7 @@ final readonly class ProductVariation {
/** @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);

View file

@ -11,6 +11,6 @@ final readonly class ProductVariationAttribute {
*/ */
public function __construct( public function __construct(
public string $attribute, public string $attribute,
public string $value public string $value,
) {} ) {}
} }

View file

@ -131,7 +131,7 @@ function retire_merdes_wc(): void {
*/ */
function genere_balises_img_dans_produit_dans_reponse_rest( function genere_balises_img_dans_produit_dans_reponse_rest(
WP_REST_Response $response, WP_REST_Response $response,
mixed $_product mixed $_product,
): WP_REST_Response { ): WP_REST_Response {
// Vérifie que la Réponse a des données // Vérifie que la Réponse a des données
if (empty($response->data)) { if (empty($response->data)) {
@ -143,16 +143,16 @@ function genere_balises_img_dans_produit_dans_reponse_rest(
$response->data['meta_data'], $response->data['meta_data'],
static fn($metadata): array => array_filter( static fn($metadata): array => array_filter(
array: $metadata, array: $metadata,
callback: static fn($entree): bool => '_photos_colonne_gauche|||0|value' === $entree->key callback: static fn($entree): bool => '_photos_colonne_gauche|||0|value' === $entree->key,
), ),
static fn($metadata): array => array_map( static fn($metadata): array => array_map(
array: $metadata, array: $metadata,
callback: static fn($entree): string => genere_balise_img_multiformats( callback: static fn($entree): string => genere_balise_img_multiformats(
id: $entree?->value, id: $entree?->value,
lazy: true lazy: true,
)
), ),
static fn($image) => array_values(array: $image)[0] ),
static fn($image) => array_values(array: $image)[0],
); );
// Génère la balise <img> pour l'image au survol // Génère la balise <img> pour l'image au survol
@ -160,16 +160,16 @@ function genere_balises_img_dans_produit_dans_reponse_rest(
$response->data['meta_data'], $response->data['meta_data'],
static fn($metadata): array => array_filter( static fn($metadata): array => array_filter(
array: $metadata, array: $metadata,
callback: static fn($entree): bool => '_photos_colonne_droite|||0|value' === $entree->key callback: static fn($entree): bool => '_photos_colonne_droite|||0|value' === $entree->key,
), ),
static fn($metadata): array => array_map( static fn($metadata): array => array_map(
array: $metadata, array: $metadata,
callback: static fn($entree): string => genere_balise_img_multiformats( callback: static fn($entree): string => genere_balise_img_multiformats(
id: $entree?->value, id: $entree?->value,
lazy: true lazy: true,
)
), ),
static fn($image) => array_values(array: $image)[0] ),
static fn($image) => array_values(array: $image)[0],
); );
return $response; return $response;
@ -182,7 +182,7 @@ add_filter('woocommerce_rest_prepare_product_object', 'genere_balises_img_dans_p
*/ */
function genere_prix_maximal_produit_variable_dans_reponse_rest( function genere_prix_maximal_produit_variable_dans_reponse_rest(
WP_REST_Response $reponse, WP_REST_Response $reponse,
WC_Data $_produit WC_Data $_produit,
): WP_REST_Response { ): WP_REST_Response {
// Vérifie que la Réponse a des données // Vérifie que la Réponse a des données
if (empty($reponse->data)) { if (empty($reponse->data)) {

View file

@ -1,17 +0,0 @@
<?php
/**
* Fonctions pour la génération de HTML.
*/
declare(strict_types=1);
/**
* Génère la balise `<img>` d'un Média attaché à un Produit selon son ID.
*/
function genere_balise_img(int $id_image): string {
return wp_get_attachment_image(
attachment_id: $id_image,
size: 'full'
);
}

View file

@ -19,7 +19,7 @@ function enregistre_taxonomie_collection(): void {
'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.'),
@ -31,7 +31,7 @@ function enregistre_taxonomie_collection(): void {
'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);

View file

@ -35,14 +35,13 @@ function genere_balise_img_multiformats(string $id, bool $lazy = false): string
$avif = $chemin ? realpath(pathinfo($chemin)['dirname'] . '/' . pathinfo($chemin)['filename'] . '.avif') : false; $avif = $chemin ? realpath(pathinfo($chemin)['dirname'] . '/' . pathinfo($chemin)['filename'] . '.avif') : false;
$jxl = $chemin ? realpath(pathinfo($chemin)['dirname'] . '/' . pathinfo($chemin)['filename'] . '.jxl') : false; $jxl = $chemin ? realpath(pathinfo($chemin)['dirname'] . '/' . pathinfo($chemin)['filename'] . '.jxl') : false;
$webp = $chemin ? realpath(pathinfo($chemin)['dirname'] . '/' . pathinfo($chemin)['filename'] . '.webp') : false;
// Génère un tableau avec les différents formats valides // Génère un tableau avec les différents formats valides
$formats = pipe( $formats = pipe(
[$avif, $jxl, $webp], [$avif, $jxl],
static fn($tableau): array => array_filter( static fn($tableau): array => array_filter(
array: $tableau, array: $tableau,
callback: static fn($chemin_format): bool => false !== $chemin_format callback: static fn($chemin_format): bool => false !== $chemin_format,
), ),
static fn($tableau): array => array_map( static fn($tableau): array => array_map(
array: $tableau, array: $tableau,
@ -54,13 +53,13 @@ function genere_balise_img_multiformats(string $id, bool $lazy = false): string
. '/' . '/'
. pathinfo($url)['filename'] . pathinfo($url)['filename']
. '.' . '.'
. pathinfo((string) $chemin_format)['extension'] . pathinfo((string) $chemin_format)['extension'],
] ],
) ),
); );
usort( usort(
array: $formats, array: $formats,
callback: static fn($a, $b): int => $a['taille'] <=> $b['taille'] callback: static fn($a, $b): int => $a['taille'] <=> $b['taille'],
); );
// Construis les balises <source> avec les formats valides // Construis les balises <source> avec les formats valides
@ -109,17 +108,17 @@ function recupere_informations_produit_shop(WC_Product $produit): mixed {
// Récupère les informations de chaque Variation // Récupère les informations de chaque Variation
static fn($enfants): array => array_map( static fn($enfants): array => array_map(
callback: wc_get_product(...), callback: wc_get_product(...),
array: $enfants array: $enfants,
), ),
// Trie les Variations par prix descendant // Trie les Variations par prix descendant
static fn($variations): array => array_map( static fn($variations): array => array_map(
callback: static fn($variation) => $variation->get_price(), callback: static fn($variation) => $variation->get_price(),
array: $variations array: $variations,
), ),
// Récupère le Prix de la Variation la plus chère // Récupère le Prix de la Variation la plus chère
static fn($prix) => collect($prix)->max(), static fn($prix) => collect($prix)->max(),
// Récupère le Prix pour la Variation la plus chère OU le prix du Produit simple // Récupère le Prix pour la Variation la plus chère OU le prix du Produit simple
static fn($prix_variation_maximale) => $prix_variation_maximale ?? $produit->get_price() static fn($prix_variation_maximale) => $prix_variation_maximale ?? $produit->get_price(),
); );
// TEMP: Cas de la Carte Cadeau où aucun prix ne doit être affiché. Idéalement utiliser un système d'étiquettes pour ces cas là. // TEMP: Cas de la Carte Cadeau où aucun prix ne doit être affiché. Idéalement utiliser un système d'étiquettes pour ces cas là.
@ -137,15 +136,15 @@ function recupere_informations_produit_shop(WC_Product $produit): mixed {
// Photo du Produit affichée par défaut // Photo du Produit affichée par défaut
'photo_repos' => genere_balise_img_multiformats( 'photo_repos' => genere_balise_img_multiformats(
get_post_meta($post_id = $produit->get_id(), $key = '_photos_colonne_gauche|||0|value')[0] ?? -1, get_post_meta($post_id = $produit->get_id(), $key = '_photos_colonne_gauche|||0|value')[0] ?? -1,
false false,
), ),
// Photo du Produit affichée au survol de l'image // Photo du Produit affichée au survol de l'image
'photo_survol' => genere_balise_img_multiformats( 'photo_survol' => genere_balise_img_multiformats(
get_post_meta($post_id = $produit->get_id(), $key = '_photos_colonne_droite|||0|value')[0] ?? -1, get_post_meta($post_id = $produit->get_id(), $key = '_photos_colonne_droite|||0|value')[0] ?? -1,
true true,
), ),
// URL du Produit pour les liens vers celui-ci // URL du Produit pour les liens vers celui-ci
'url' => $produit->get_permalink() 'url' => $produit->get_permalink(),
]; ];
} }
@ -175,19 +174,19 @@ function recupere_informations_produit_page_produit(WC_Product $product): mixed
'prix' => $product->get_price(), 'prix' => $product->get_price(),
'photos_colonne_gauche' => array_map( 'photos_colonne_gauche' => array_map(
callback: genere_balise_img_multiformats(...), callback: genere_balise_img_multiformats(...),
array: get_post_meta($post_id = $product->get_id(), $key = '_photos_colonne_gauche|||0|value') array: get_post_meta($post_id = $product->get_id(), $key = '_photos_colonne_gauche|||0|value'),
), ),
'photos_colonne_droite' => array_map( 'photos_colonne_droite' => array_map(
callback: genere_balise_img_multiformats(...), callback: genere_balise_img_multiformats(...),
array: carbon_get_the_post_meta('photos_colonne_droite') array: carbon_get_the_post_meta('photos_colonne_droite'),
), ),
'photo_repos' => genere_balise_img_multiformats( 'photo_repos' => genere_balise_img_multiformats(
get_post_meta($post_id = $product->get_id(), $key = '_photos_colonne_gauche|||0|value')[0] ?? -1, get_post_meta($post_id = $product->get_id(), $key = '_photos_colonne_gauche|||0|value')[0] ?? -1,
false false,
), ),
'photo_survol' => genere_balise_img_multiformats( 'photo_survol' => genere_balise_img_multiformats(
get_post_meta($post_id = $product->get_id(), $key = '_photos_colonne_droite|||0|value')[0] ?? -1, get_post_meta($post_id = $product->get_id(), $key = '_photos_colonne_droite|||0|value')[0] ?? -1,
true true,
), ),
// Slug du Produit // Slug du Produit
'slug' => $product->get_slug(), 'slug' => $product->get_slug(),
@ -196,7 +195,7 @@ function recupere_informations_produit_page_produit(WC_Product $product): mixed
// Variations du Produit // Variations du Produit
'variations_ids' => $product->get_children(), 'variations_ids' => $product->get_children(),
// URL du Produit // URL du Produit
'url' => $product->get_permalink() 'url' => $product->get_permalink(),
]; ];
} }
@ -214,7 +213,7 @@ function recupere_produits_meme_collection(string $slug_collection): mixed {
'order' => 'DESC', 'order' => 'DESC',
'orderby' => 'date', 'orderby' => 'date',
'status' => 'publish', 'status' => 'publish',
'tax_query' => [['taxonomy' => 'collection', 'field' => 'slug', 'terms' => $slug_collection]] 'tax_query' => [['taxonomy' => 'collection', 'field' => 'slug', 'terms' => $slug_collection]],
]); ]);
} }
@ -224,6 +223,6 @@ function recupere_et_formate_attributs_produit(mixed $attributs_produit): mixed
return [ return [
'taille' => ['nom' => 'Size', 'valeur' => $attributs_produit['pa_size'] ?? false], 'taille' => ['nom' => 'Size', 'valeur' => $attributs_produit['pa_size'] ?? false],
'pierre' => ['nom' => 'Stone', 'valeur' => $attributs_produit['pa_stone'] ?? false], 'pierre' => ['nom' => 'Stone', 'valeur' => $attributs_produit['pa_stone'] ?? false],
'cote' => ['nom' => 'Side', 'valeur' => $attributs_produit['pa_side'] ?? false] 'cote' => ['nom' => 'Side', 'valeur' => $attributs_produit['pa_side'] ?? false],
]; ];
} }

View file

@ -25,7 +25,7 @@ final readonly class Resource {
id: $id, id: $id,
src: $file_uri, src: $file_uri,
deps: [], deps: [],
version: $version version: $version,
); );
} }
@ -46,7 +46,7 @@ final readonly class Resource {
src: $file_uri, src: $file_uri,
deps: [], deps: [],
ver: $ver, ver: $ver,
media: 'all' media: 'all',
); );
} }
} }

View file

@ -9,7 +9,7 @@ export type ParentElement = Document | Element;
export const getFirstSelectorFromParent = export const getFirstSelectorFromParent =
(parent: ParentElement) => (parent: ParentElement) =>
<E extends Element = Element>(selector: string): Option.Option<NonNullable<E>> => <E extends Element = Element>(selector: string): Option.Option<NonNullable<E>> =>
Option.fromNullable(parent.querySelector<E>(selector)); Option.fromNullishOr(parent.querySelector<E>(selector));
export const getFirstSelectorFromDocument = <E extends Element = Element>( export const getFirstSelectorFromDocument = <E extends Element = Element>(
selector: string, selector: string,

View file

@ -27,13 +27,13 @@ $raw_products = wc_get_products([
'limit' => 12, 'limit' => 12,
'order' => 'DESC', 'order' => 'DESC',
'orderby' => 'date', 'orderby' => 'date',
'status' => 'publish' 'status' => 'publish',
]); ]);
/** @var list<Product> */ /** @var list<Product> */
$products = array_map( $products = array_map(
callback: Product::new(...), callback: Product::new(...),
array: $raw_products array: $raw_products,
); );
$context['products'] = $products; $context['products'] = $products;
@ -49,15 +49,15 @@ $context['products_category_id'] = $products_category_id;
function load_page_resources(): void { function load_page_resources(): void {
Resource::enqueue_style_file( Resource::enqueue_style_file(
handle: 'haiku-atelier-2024-styles-page-boutique', handle: 'haiku-atelier-2024-styles-page-boutique',
path: '/assets/css/pages/page-boutique.css' path: '/assets/css/pages/page-boutique.css',
); );
Resource::enqueue_script_module_file( Resource::enqueue_script_module_file(
id: 'haiku-atelier-2024-scripts-page-boutique', id: 'haiku-atelier-2024-scripts-page-boutique',
path: '/assets/js/scripts-page-boutique.js' path: '/assets/js/scripts-page-boutique.js',
); );
Resource::enqueue_script_module_file( Resource::enqueue_script_module_file(
id: 'haiku-atelier-2024-scripts-menu-categories', id: 'haiku-atelier-2024-scripts-menu-categories',
path: '/assets/js/scripts-menu-categories.js' path: '/assets/js/scripts-menu-categories.js',
); );
} }
@ -66,5 +66,5 @@ add_action('wp_enqueue_scripts', 'load_page_resources');
// Rendu // Rendu
Timber::render( Timber::render(
filenames: $templates, filenames: $templates,
data: $context data: $context,
); );

View file

@ -8,10 +8,6 @@
srcset="{{ rel_url }}.avif" srcset="{{ rel_url }}.avif"
type="image/avif" type="image/avif"
/> />
<source
srcset="{{ rel_url }}.webp"
type="image/webp"
/>
<source <source
srcset="{{ rel_url }}.png" srcset="{{ rel_url }}.png"
type="image/png" type="image/png"

View file

@ -35,13 +35,13 @@ $email = [
'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'),
] ],
]; ];
$contexte['commande'] = $email; $contexte['commande'] = $email;
// Rendu // Rendu
Timber::render( Timber::render(
filenames: $modeles, filenames: $modeles,
data: $contexte data: $contexte,
); );

View file

@ -35,7 +35,7 @@ $email = [
'commande' => ['date' => $date->toDateString(), 'id' => $commande->get_id()], 'commande' => ['date' => $date->toDateString(), 'id' => $commande->get_id()],
'livraison' => [ 'livraison' => [
'methode' => $commande->get_shipping_method(), 'methode' => $commande->get_shipping_method(),
'numero_suivi' => $commande->get_meta('tracking_number') 'numero_suivi' => $commande->get_meta('tracking_number'),
], ],
'paiement' => ['methode' => ''], 'paiement' => ['methode' => ''],
'produits' => collect($commande->get_items())->map(static function (WC_Order_Item_Product $article) { 'produits' => collect($commande->get_items())->map(static function (WC_Order_Item_Product $article) {
@ -51,14 +51,14 @@ $email = [
? 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' => [
@ -67,8 +67,8 @@ $email = [
'sous_total_reduction' => '0.00' === $commande->get_discount_total() 'sous_total_reduction' => '0.00' === $commande->get_discount_total()
? '0' ? '0'
: Number::format((float) $commande->get_discount_total(), maxPrecision: 2) . '€', : Number::format((float) $commande->get_discount_total(), maxPrecision: 2) . '€',
'total' => Number::format((float) $commande->get_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()];
@ -78,5 +78,5 @@ $contexte['commande'] = $email;
// Rendu // Rendu
Timber::render( Timber::render(
filenames: $modeles, filenames: $modeles,
data: $contexte data: $contexte,
); );

View file

@ -47,14 +47,14 @@ $email = [
? 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' => [
@ -63,8 +63,8 @@ $email = [
'sous_total_reduction' => '0.00' === $commande->get_discount_total() 'sous_total_reduction' => '0.00' === $commande->get_discount_total()
? '0' ? '0'
: Number::format((float) $commande->get_discount_total(), maxPrecision: 2) . '€', : Number::format((float) $commande->get_discount_total(), maxPrecision: 2) . '€',
'total' => Number::format((float) $commande->get_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()];
@ -75,5 +75,5 @@ $contexte['commande'] = $email;
// Rendu // Rendu
Timber::render( Timber::render(
filenames: $modeles, filenames: $modeles,
data: $contexte data: $contexte,
); );