[Renovate] 組み込み Manager のキャプチャルール

# 組み込み manager のキャプチャルールを確認する
manager `custom.regex` を有効化すると、Renovate に処理をさせる上で必要なパッケージ依存関係の情報(`packageFileName`: パッケージファイルのパス、`packageName`: パッケージ名、currentVersion: 現在のバージョン、 `datasource`, `depName` etc.)の独自のキャプチャルールを設定できる。

しかし、Renovate [組み込みの manager](https://docs.renovatebot.com/modules/manager/) については、その具体的な設定がリファレンスに記述されていない。
組み込みの manager のキャプチャルールを知るためには、実装コードを読むしかない(と思われる)。

各 manager 固有の実装コードは、
GitHub のリポジトリ [renovatebot/renovate](https://github.com/renovatebot/renovate) の

[lib/modules/manager](https://github.com/renovatebot/renovate/tree/main/lib/modules/manager)/`<manager 名>/` 以下に配置するルールになっているようである。

# manager `terraform` のキャプチャルール
manager `terraform` については、[リファレンス](https://docs.renovatebot.com/modules/manager/terraform/) に記述がある。

- terraform ブロックの `required_version`
- terraform ブロックの `required_providers` 

…その他もろもろが対象になる雰囲気はある。
しかし、具体的なキャプチャルールを知ることはできない。

そこで、ソースコードを確認すると、例えば`teraform.required_version` のキャプチャルールは、以下の仕様になっているようだ。

- `currentValue`: .tf 内の terraform ブロックの required_version の値
- `depType`: 'required_version'
- `datasource`: 'github-releases'
- `depName`: 'hashicorp/terraform'
- `extractVersion`: 'v(?<version>.*)'
- `versioning`: 'hashicorp'

確認の起点としたソースコードは、[renovate/lib/modules/manager/terraform/extractors/terraform-block/terraform-version.ts](https://github.com/renovatebot/renovate/blob/main/lib/modules/manager/terraform/extractors/terraform-block/terraform-version.ts)。

(コメントつけてみた)

```terraform-version.ts
export class TerraformVersionExtractor extends DependencyExtractor {
  getCheckList(): string[] {
    return ['required_version'];
  }

  // ranovate/lib/modules/manager/terraform/hcl/types.ts より
  //
  // export interface TerraformDefinitionFile {
  //   terraform?: TerraformBlock[];
  //   module?: Record<string, TerraformModule[]>;
  //   resource?: TerraformResources;
  //   provider?: Record<string, TerraformProvider[]>;
  // }
  //
  // export interface TerraformBlock {
  //   required_providers?: TerraformRequiredProviderBlock[];
  //   required_version?: string;
  // }
  //
  // export interface TerraformRequiredProviderBlock {
  //   [s: string]: TerraformRequiredProvider | string;
  // }
  //
  // export interface TerraformRequiredProvider {
  //   source?: string;
  //   version?: string;
  // }
  extract(hclRoot: TerraformDefinitionFile): PackageDependency[] {
    // 各 .tf 内の terraform.required_version と terraform.required_providers.xxx.source, 
    // terraform.required_providers.xxx.version がわたされる
    const terraformBlocks = hclRoot?.terraform;
    if (is.nullOrUndefined(terraformBlocks)) {
      return [];
    }

    const dependencies = [];
    for (const terraformBlock of terraformBlocks) {
      const requiredVersion = terraformBlock.required_version;
      if (is.nullOrUndefined(requiredVersion)) {
        continue;
      }

      // - currentValue: .tf 内の terraform ブロックの required_version の値
      // - depType: 'required_version'
      // - datasource: 'github-releases'
      // - depName: 'hashicorp/terraform'
      // - extractVersion: 'v(?<version>.*)'
      // - versioning: 'hashicorp'
      dependencies.push(
        this.analyseTerraformVersion({
          currentValue: requiredVersion,
        }),
      );
    }
    return dependencies;
  }

  ...

  // - depType: 'required_version'
  // - datasource: 'github-releases'
  // - depName: 'hashicorp/terraform'
  // - extractVersion: 'v(?<version>.*)'
  // - versioning: 'hashicorp'
  protected analyseTerraformVersion(dep: PackageDependency): PackageDependency {
    dep.depType = 'required_version';
    dep.datasource = GithubReleasesDatasource.id;
    dep.depName = 'hashicorp/terraform';
    dep.extractVersion = 'v(?<version>.*)$';
    dep.versioning = hashicorp.id;
    return dep;
  }
}
```