<?xml version="1.0"?>
<ruleset name="WordPress Coding Standards for WPGraphQL Plugins" xsi:noNamespaceSchemaLocation="https://raw.githubusercontent.com/squizlabs/PHP_CodeSniffer/master/phpcs.xsd">
	<description>Sniffs for the WPGraphQL ecosystem - WooGraphQL</description>

	<!-- What to scan: include any root-level PHP files, and the /src folder -->
	<file>./wp-graphql-woocommerce.php</file>
	<file>./access-functions.php</file>
	<file>./includes/</file>
	<exclude-pattern>/vendor/</exclude-pattern>
	<exclude-pattern>/vendor-prefixed/</exclude-pattern>
	<exclude-pattern>/node_modules/</exclude-pattern>
	<exclude-pattern>/phpstan/</exclude-pattern>
	<exclude-pattern>local/*</exclude-pattern>
	<exclude-pattern>**/tests/**</exclude-pattern>
	<exclude-pattern>/tests/_support/Helper/crud-helpers</exclude-pattern>

	<!-- How to scan: include CLI args so you don't need to pass them manually -->
	<!-- Usage instructions: https://github.com/squizlabs/PHP_CodeSniffer/wiki/Usage -->
	<!-- Annotated ruleset: https://github.com/squizlabs/PHP_CodeSniffer/wiki/Annotated-ruleset.xml -->

	<!-- Show sniff and progress -->
	<arg value="sp"/>
	<!-- Strip the file paths down to the relevant bit -->
	<arg name="basepath" value="./"/>
	<!-- Enable colors in report -->
	<arg name="colors"/>
	<!-- Only lint php files by default -->
	<arg name="extensions" value="php"/>
	<!-- Whenever possible, cache the scan results and re-use those for unchanged files on the next scan. -->
	<arg name="cache" value="tests/_output/cache.json" />
	<!-- Enables parallel processing when available for faster results. -->
	<arg name="parallel" value="20"/>
	<!-- Set severity to 1 to see everything that isn't effectively turned off. -->
	<arg name="severity" value="1" />

	<!-- Ruleset Config: set these to match your project constraints-->

	<!--
		Tests for PHP version compatibility.
		https://github.com/WordPress-Coding-Standards/WordPress-Coding-Standards#Recomended-additional-rulesets
	-->
	<config name="testVersion" value="7.3-"/>

	<!--
		Tests for WordPress version compatibility.
		https://github.com/WordPress-Coding-Standards/WordPress-Coding-Standards/wiki/Customizable-sniff-properties
	-->
	<config name="minimum_wp_version" value="6.1"/>

	<!-- Rules: WPGraphQL Coding Standards -->
	<!-- https://github.com/AxeWP/WPGraphQL-Coding-Standards/WPGraphQL/ruleset.xml -->
	<rule ref="WPGraphQL">
		<!-- This is needed since we're not using an autoloader -->
		<exclude name="WordPressVIPMinimum.Files.IncludingFile.UsingCustomFunction" />
		<exclude name="WordPressVIPMinimum.Files.IncludingFile.UsingVariable" />

		<!-- @todo add and remediate -->
		<exclude name="Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed" />
		<exclude name="SlevomatCodingStandard.Variables.UnusedVariable.UnusedVariable" />
		<exclude name="WordPress.Security.EscapeOutput.ExceptionNotEscaped" />
		<!-- @todo review and allowlist -->
		<exclude name="WordPress.WP.Capabilities.Undetermined" />
		<exclude name="WordPressVIPMinimum.Functions.RestrictedFunctions.get_page_by_path_get_page_by_path" />
		<exclude name="WordPressVIPMinimum.Performance.WPQueryParams" />
		<exclude name="WordPressVIPMinimum.Variables.RestrictedVariables.user_meta__wpdb__users" />
		<!-- @todo maybe add later-->
		<exclude name="SlevomatCodingStandard.Functions.DisallowEmptyFunction.EmptyFunction" />
		<exclude name="SlevomatCodingStandard.TypeHints" />
	</rule>

	<!-- Individual rule configuration -->
	<rule ref="WordPress.NamingConventions.PrefixAllGlobals">
		<exclude-pattern>/tests/</exclude-pattern>
		<properties>
			<!-- Value: replace the function, class, and variable prefixes used. Separate multiple prefixes with a comma. -->
			<property name="prefixes" type="array" value="WPGraphQL\WooCommerce,woographql,WPGRAPHQL_WOOCOMMERCE,WP_GraphQL_WooCommerce,graphql_,wc_graphql_"/>
		</properties>
	</rule>
	<rule ref="WordPress.WP.I18n">
		<properties>
			<!-- Value: replace the text domain used. -->
			<property name="text_domain" type="array" value="wp-graphql-woocommerce"/>
		</properties>
	</rule>
	<rule ref="WordPress.WP.Capabilities">
		<properties>
			<!-- Add 3rd-party and custom capabilities -->
			<property name="custom_capabilities" type="array" value="manage_woocommerce,edit_shop_orders" />
		</properties>
	</rule>

	<!-- Rules to exclude for test files -->
	<rule ref="PSR2.Methods.MethodDeclaration.Underscore">
		<exclude-pattern>/tests/</exclude-pattern>
	</rule>
	<rule ref="SlevomatCodingStandard.Variables.DuplicateAssignmentToVariable">
		<exclude-pattern>/tests/</exclude-pattern>
	</rule>
	<rule ref="Squiz.Commenting.ClassComment.Missing">
		<exclude-pattern>/tests/</exclude-pattern>
	</rule>
	<rule ref="Squiz.Commenting.FileComment.Missing">
		<exclude-pattern>/tests/</exclude-pattern>
	</rule>
	<rule ref="Squiz.Commenting.FileComment.MissingPackageTag">
		<exclude-pattern>/tests/</exclude-pattern>
	</rule>
	<rule ref="Squiz.Commenting.FunctionComment.Missing">
		<exclude-pattern>/tests/</exclude-pattern>
	</rule>
	<rule ref="Squiz.Commenting.FunctionComment.MissingParamTag">
		<exclude-pattern>/tests/</exclude-pattern>
	</rule>
	<rule ref="Squiz.Commenting.FunctionComment.WrongStyle">
		<exclude-pattern>/tests/</exclude-pattern>
	</rule>
	<rule ref="Squiz.Commenting.InlineComment.InvalidEndChar">
		<exclude-pattern>/tests/</exclude-pattern>
	</rule>
	<rule ref="Squiz.Commenting.VariableComment.Missing">
		<exclude-pattern>/tests/</exclude-pattern>
	</rule>
	<rule ref="Squiz.PHP.CommentedOutCode.Found">
		<exclude-pattern>/tests/</exclude-pattern>
	</rule>
	<rule ref="Squiz.PHP.DisallowMultipleAssignments">
		<exclude-pattern>/tests/</exclude-pattern>
	</rule>
	<rule ref="Universal.NamingConventions.NoReservedKeywordParameterNames">
		<exclude-pattern>/tests/</exclude-pattern>
	</rule>
	<rule ref="WordPress.Files.FileName">
		<exclude-pattern>/tests/</exclude-pattern>
	</rule>
	<rule ref="WordPress.NamingConventions.ValidFunctionName.MethodNameInvalid">
		<exclude-pattern>/tests/</exclude-pattern>
	</rule>
	<rule ref="WordPress.WP.AlternativeFunctions">
		<exclude-pattern>/tests/</exclude-pattern>
	</rule>
	<rule ref="WordPressVIPMinimum.Variables.RestrictedVariables.cache_constraints___SERVER__REMOTE_ADDR__">
		<exclude-pattern>/tests/</exclude-pattern>
	</rule>
</ruleset>
