<?xml version="1.0"?>
<!--
  Substance-only phpcs ruleset for a WordPress/Divi plugin.
  Copy this into a plugin root as `phpcs.xml.dist`, then edit:
    - prefixes  (PFX / pfx)            <- the plugin's global prefix(es)
    - text_domain (divi-contact-form-helper)   <- the plugin's text domain
    - testVersion / minimum_wp_version <- per plugin header
    - any third-party/vendored folders to <exclude-pattern>
  Lint with the shared toolkit:  cd <plugin> && wpcs   (auto-reads this file)
-->
<ruleset name="PFX Plugin">
    <description>Substance-only checks (security, naming, i18n, best-practices, PHP compat). Formatting is owned by PhpStorm.</description>

    <file>.</file>

    <arg name="extensions" value="php"/>
    <arg name="basepath" value="."/>
    <arg name="colors"/>
    <arg name="parallel" value="8"/>
    <arg value="ps"/>

    <exclude-pattern>*/vendor/*</exclude-pattern>
    <exclude-pattern>*/node_modules/*</exclude-pattern>
    <exclude-pattern>*/build/*</exclude-pattern>
    <exclude-pattern>*/dist/*</exclude-pattern>
    <exclude-pattern>*.min.js</exclude-pattern>
    <exclude-pattern>*.asset.php</exclude-pattern>
    <exclude-pattern>*/languages/*</exclude-pattern>
    <!-- Bundled third-party / vendored libraries are NOT our code — add one line per such folder. -->
    <exclude-pattern>*/dashboard/license/*</exclude-pattern>
    <exclude-pattern>*/lib/*</exclude-pattern>
    <exclude-pattern>*/libraries/*</exclude-pattern>

    <rule ref="WordPress">
        <!-- ===== FORMATTING / WHITESPACE — owned by PhpStorm, not phpcs ===== -->
        <exclude name="WordPress.WhiteSpace"/>
        <exclude name="WordPress.Arrays"/>
        <exclude name="WordPress.PHP.YodaConditions"/>
        <exclude name="Generic.WhiteSpace"/>
        <exclude name="Generic.Formatting"/>
        <exclude name="Generic.Functions.OpeningFunctionBraceKernighanRitchie"/>
        <exclude name="Generic.Classes.OpeningBraceSameLine"/>
        <exclude name="Generic.Functions.FunctionCallArgumentSpacing"/>
        <exclude name="Generic.Files.EndFileNewline"/>
        <exclude name="Generic.Files.LineEndings"/>
        <exclude name="Generic.Files.LineLength"/>
        <exclude name="PEAR.Functions.FunctionCallSignature"/>
        <exclude name="PEAR.WhiteSpace"/>
        <exclude name="Squiz.WhiteSpace"/>
        <exclude name="Squiz.Strings"/>
        <exclude name="Squiz.Functions.FunctionDeclarationArgumentSpacing"/>
        <exclude name="Squiz.Functions.MultiLineFunctionDeclaration"/>
        <exclude name="Squiz.ControlStructures.ControlSignature"/>
        <exclude name="Squiz.PHP.EmbeddedPhp"/>
        <exclude name="NormalizedArrays"/>
        <exclude name="Universal.WhiteSpace"/>
        <exclude name="Universal.Arrays.DisallowShortArraySyntax"/>
        <exclude name="Universal.Operators.DisallowShortTernary"/>
        <exclude name="Universal.Operators.TypeSeparatorSpacing"/>
        <exclude name="Universal.Attributes.BracketSpacing"/>
        <exclude name="Universal.UseStatements.KeywordSpacing"/>
        <exclude name="PSR2.ControlStructures"/>
        <exclude name="PSR2.Files"/>
        <exclude name="PSR2.Methods.FunctionClosingBrace"/>
        <exclude name="PSR2.Classes.PropertyDeclaration"/>
        <exclude name="PSR12.Files"/>

        <!-- ===== COMMENTING — comment-light (editor/dev owns comments) ===== -->
        <exclude name="Squiz.Commenting"/>
        <exclude name="Generic.Commenting"/>

        <!-- File naming: PascalCase OOP class files mapped to namespaces, NOT class-x.php. -->
        <exclude name="WordPress.Files.FileName"/>
    </rule>

    <!-- PHP native DOM/API camelCase properties — cannot be renamed, whitelist them.
         (WPCS 3.x property name: allowed_custom_properties — was customPropertiesWhitelist in 2.x.) -->
    <rule ref="WordPress.NamingConventions.ValidVariableName">
        <properties>
            <property name="allowed_custom_properties" type="array">
                <element value="parentNode"/>
                <element value="childNodes"/>
                <element value="firstChild"/>
                <element value="lastChild"/>
                <element value="nextSibling"/>
                <element value="previousSibling"/>
                <element value="nodeValue"/>
                <element value="nodeName"/>
                <element value="nodeType"/>
                <element value="textContent"/>
                <element value="tagName"/>
                <element value="ownerDocument"/>
                <element value="documentElement"/>
                <!-- Common third-party API + JS-facing camelCase props (harmless if unused; keep the ones your plugin hits). -->
                <element value="boxName"/>
                <element value="usersList"/>
                <element value="postsList"/>
                <element value="termsList"/>
            </property>
        </properties>
    </rule>

    <!-- Enforce this plugin's prefixes (EDIT per plugin) -->
    <rule ref="WordPress.NamingConventions.PrefixAllGlobals">
        <properties>
            <property name="prefixes" type="array">
                <element value="KS_PAC_DCFH"/>
                <element value="ks_pac_dcfh"/>
                <element value="pwh_dcfh"/>
                <element value="dcfh"/>
            </property>
        </properties>
    </rule>

    <!-- Enforce the text domain (EDIT per plugin) -->
    <rule ref="WordPress.WP.I18n">
        <properties>
            <property name="text_domain" type="array">
                <element value="divi-contact-form-helper"/>
            </property>
        </properties>
    </rule>

    <config name="minimum_wp_version" value="6.5"/>
    <config name="testVersion" value="7.4-"/>
    <rule ref="PHPCompatibilityWP"/>
</ruleset>
