From a9dff95625b3a9c1e6a135a2684c1d96863dcc1a Mon Sep 17 00:00:00 2001 From: Samuel Bodin <1637651+bodinsamuel@users.noreply.github.com> Date: Mon, 18 Sep 2023 14:44:18 +0200 Subject: [PATCH] fix: add failsafe for loading invalid deps, broaden some terraform deps --- src/loader.ts | 5 +++++ src/rules/api/gcp.aiplatform.ts | 6 +++++- src/rules/api/gcp.cloudbuild.ts | 6 +++++- src/rules/api/gcp.dialogflow.ts | 6 +++++- src/rules/api/gcp.maps.ts | 1 - src/rules/api/gcp.translate.ts | 1 - src/rules/db/firebase.firestore.ts | 6 +++++- src/rules/db/gcp.bigquery.ts | 7 ++----- src/rules/db/gcp.bigtable.ts | 7 ++----- src/rules/db/gcp.datastore.ts | 3 ++- src/rules/db/gcp.secretmanager.ts | 3 ++- src/rules/db/gcp.sql.ts | 7 ++----- src/rules/hosting/aws.amplifyhosting.ts | 7 +++++-- src/rules/hosting/gcp.cloudrun.ts | 7 ++----- src/rules/hosting/gcp.functions.ts | 7 ++----- src/rules/hosting/gcp.gce.ts | 6 +++++- src/rules/hosting/gcp.gke.ts | 6 +++++- src/rules/hosting/gcp.tasks.ts | 3 ++- src/rules/messaging/gcp.pubsub.ts | 3 ++- src/rules/monitoring/datadog.ts | 8 +++++--- src/rules/network/gcp.dns.ts | 6 +++++- .../spec/terraform/__snapshots__/resource.test.ts.snap | 1 - src/rules/storage/gcp.gcs.ts | 6 +++++- 23 files changed, 73 insertions(+), 45 deletions(-) diff --git a/src/loader.ts b/src/loader.ts index 2a3dc398..6b75a754 100644 --- a/src/loader.ts +++ b/src/loader.ts @@ -46,6 +46,11 @@ export function loadAllRules() { export function loadOne(rule: Rule) { if (rule.dependencies) { rule.dependencies.map((dep) => { + if (dep.name === '') { + throw new Error( + `empty dependency name for ${rule.name} (${rule.type} > ${rule.tech})` + ); + } dependencies[dep.type].push({ match: typeof dep.name === 'string' ? new RegExp(`^${dep.name}$`) : dep.name, diff --git a/src/rules/api/gcp.aiplatform.ts b/src/rules/api/gcp.aiplatform.ts index da935238..c5891908 100644 --- a/src/rules/api/gcp.aiplatform.ts +++ b/src/rules/api/gcp.aiplatform.ts @@ -6,7 +6,11 @@ register({ type: 'api', dependencies: [ { type: 'npm', name: '@google-cloud/aiplatform' }, - { type: 'terraform.resource', name: 'google_vertex_ai_index' }, + { + type: 'terraform.resource', + name: /^google_vertex_/, + example: 'google_vertex_ai_dataset', + }, { type: 'ruby', name: /^google-cloud-ai_platform/, diff --git a/src/rules/api/gcp.cloudbuild.ts b/src/rules/api/gcp.cloudbuild.ts index cd590b5a..05abc82f 100644 --- a/src/rules/api/gcp.cloudbuild.ts +++ b/src/rules/api/gcp.cloudbuild.ts @@ -6,7 +6,11 @@ register({ type: 'api', dependencies: [ { type: 'npm', name: '@google-cloud/cloudbuild' }, - { type: 'terraform.resource', name: 'google_cloudbuild_trigger' }, + { + type: 'terraform.resource', + name: /^google_cloudbuild_/, + example: 'google_cloudbuild_trigger', + }, { type: 'ruby', name: /^google-cloud-build/, diff --git a/src/rules/api/gcp.dialogflow.ts b/src/rules/api/gcp.dialogflow.ts index 6ae97516..4e1578ff 100644 --- a/src/rules/api/gcp.dialogflow.ts +++ b/src/rules/api/gcp.dialogflow.ts @@ -6,7 +6,11 @@ register({ type: 'api', dependencies: [ { type: 'npm', name: '@google-cloud/dialogflow' }, - { type: 'terraform.resource', name: 'google_dialogflow_agent' }, + { + type: 'terraform.resource', + name: /^google_dialogflow_/, + example: 'google_dialogflow_agent', + }, { type: 'ruby', name: /^google-cloud-dialogflow/, diff --git a/src/rules/api/gcp.maps.ts b/src/rules/api/gcp.maps.ts index dd6b09fb..995560e8 100644 --- a/src/rules/api/gcp.maps.ts +++ b/src/rules/api/gcp.maps.ts @@ -6,7 +6,6 @@ register({ type: 'api', dependencies: [ { type: 'npm', name: '@google-cloud/maps' }, - { type: 'terraform.resource', name: '' }, { type: 'ruby', name: 'google_maps_service' }, { type: 'golang', name: 'cloud.google.com/go/maps' }, ], diff --git a/src/rules/api/gcp.translate.ts b/src/rules/api/gcp.translate.ts index 1ebeebad..de38a1e3 100644 --- a/src/rules/api/gcp.translate.ts +++ b/src/rules/api/gcp.translate.ts @@ -9,7 +9,6 @@ register({ { type: 'npm', name: 'google-translate-api-browser' }, { type: 'npm', name: '@vitalets/google-translate-api' }, { type: 'npm', name: '@iamtraction/google-translate' }, - { type: 'terraform.resource', name: '' }, { type: 'ruby', name: /^google-cloud-translate/, diff --git a/src/rules/db/firebase.firestore.ts b/src/rules/db/firebase.firestore.ts index 9b2d8301..a0432f20 100644 --- a/src/rules/db/firebase.firestore.ts +++ b/src/rules/db/firebase.firestore.ts @@ -5,7 +5,11 @@ register({ name: 'Firebase Firestore', type: 'db', dependencies: [ - { type: 'terraform.resource', name: 'google_firestore_database' }, + { + type: 'terraform.resource', + name: /^google_firestore_/, + example: 'google_firestore_database', + }, { type: 'php', name: 'google/cloud-firestore' }, ], }); diff --git a/src/rules/db/gcp.bigquery.ts b/src/rules/db/gcp.bigquery.ts index c2e4e8cf..c3c022ca 100644 --- a/src/rules/db/gcp.bigquery.ts +++ b/src/rules/db/gcp.bigquery.ts @@ -8,11 +8,8 @@ register({ { type: 'npm', name: '@google-cloud/bigquery' }, { type: 'terraform.resource', - name: 'google_bigquery_dataset', - }, - { - type: 'terraform.resource', - name: 'google_bigquery_table', + name: /google_bigquery_/, + example: 'google_bigquery_dataset', }, { type: 'rust', name: 'gcp-bigquery-client' }, { type: 'ruby', name: 'google-cloud-bigquery' }, diff --git a/src/rules/db/gcp.bigtable.ts b/src/rules/db/gcp.bigtable.ts index 59eacf51..96983167 100644 --- a/src/rules/db/gcp.bigtable.ts +++ b/src/rules/db/gcp.bigtable.ts @@ -8,11 +8,8 @@ register({ { type: 'npm', name: '@google-cloud/bigtable' }, { type: 'terraform.resource', - name: 'google_bigtable_instance', - }, - { - type: 'terraform.resource', - name: 'google_bigtable_table', + name: /^google_bigtable_/, + example: 'google_bigtable_instance', }, { type: 'ruby', name: 'google-cloud-bigtable' }, { type: 'golang', name: 'cloud.google.com/go/bigtable' }, diff --git a/src/rules/db/gcp.datastore.ts b/src/rules/db/gcp.datastore.ts index 39270cf9..8aaecb39 100644 --- a/src/rules/db/gcp.datastore.ts +++ b/src/rules/db/gcp.datastore.ts @@ -8,7 +8,8 @@ register({ { type: 'npm', name: '@google-cloud/datastore' }, { type: 'terraform.resource', - name: 'google_datastore_index', + name: /^google_datastore_/, + example: 'google_datastore_index', }, { type: 'ruby', name: 'google-cloud-datastore' }, { type: 'golang', name: 'cloud.google.com/go/datastore' }, diff --git a/src/rules/db/gcp.secretmanager.ts b/src/rules/db/gcp.secretmanager.ts index 9c11c6df..e88cb6a8 100644 --- a/src/rules/db/gcp.secretmanager.ts +++ b/src/rules/db/gcp.secretmanager.ts @@ -8,7 +8,8 @@ register({ { type: 'npm', name: '@google-cloud/secret-manager' }, { type: 'terraform.resource', - name: 'google_secret_manager_secret', + name: /^google_secret_manager/, + example: 'google_secret_manager_secret', }, { type: 'ruby', diff --git a/src/rules/db/gcp.sql.ts b/src/rules/db/gcp.sql.ts index 198a77b1..509f30bb 100644 --- a/src/rules/db/gcp.sql.ts +++ b/src/rules/db/gcp.sql.ts @@ -8,11 +8,8 @@ register({ { type: 'npm', name: '@google-cloud/cloud-sql-connector' }, { type: 'terraform.resource', - name: 'google_sql_database_instance', - }, - { - type: 'terraform.resource', - name: 'google_sql_database', + name: /google_sql_/, + example: 'google_sql_database_instance', }, { type: 'ruby', diff --git a/src/rules/hosting/aws.amplifyhosting.ts b/src/rules/hosting/aws.amplifyhosting.ts index 72e255a5..ff8f10f7 100644 --- a/src/rules/hosting/aws.amplifyhosting.ts +++ b/src/rules/hosting/aws.amplifyhosting.ts @@ -7,7 +7,10 @@ register({ dependencies: [ { type: 'npm', name: 'aws-amplify' }, { type: 'npm', name: /^@aws-amplify\//, example: '@aws-amplify/ui-react' }, - { type: 'terraform.resource', name: 'aws_amplify_app' }, - { type: 'terraform.resource', name: 'aws_amplify_backend_environment' }, + { + type: 'terraform.resource', + name: /^aws_amplify_/, + example: 'aws_amplify_app', + }, ], }); diff --git a/src/rules/hosting/gcp.cloudrun.ts b/src/rules/hosting/gcp.cloudrun.ts index 7931d98d..ef28e04a 100644 --- a/src/rules/hosting/gcp.cloudrun.ts +++ b/src/rules/hosting/gcp.cloudrun.ts @@ -8,11 +8,8 @@ register({ { type: 'npm', name: '@google-cloud/run' }, { type: 'terraform.resource', - name: 'google_cloud_run_v2_service', - }, - { - type: 'terraform.resource', - name: 'google_cloud_run_v2_job', + name: /^google_cloud_run_/, + example: 'google_cloud_run_v2_service', }, { type: 'ruby', diff --git a/src/rules/hosting/gcp.functions.ts b/src/rules/hosting/gcp.functions.ts index 935b11b2..ef86551d 100644 --- a/src/rules/hosting/gcp.functions.ts +++ b/src/rules/hosting/gcp.functions.ts @@ -8,11 +8,8 @@ register({ { type: 'npm', name: '@google-cloud/functions-framework' }, { type: 'terraform.resource', - name: 'google_cloudfunctions_function', - }, - { - type: 'terraform.resource', - name: 'google_cloudfunctions2_function', + name: /^google_cloudfunctions/, + example: 'google_cloudfunctions_function', }, { type: 'ruby', diff --git a/src/rules/hosting/gcp.gce.ts b/src/rules/hosting/gcp.gce.ts index 601198a6..8d7ae5eb 100644 --- a/src/rules/hosting/gcp.gce.ts +++ b/src/rules/hosting/gcp.gce.ts @@ -6,7 +6,11 @@ register({ type: 'hosting', dependencies: [ { type: 'npm', name: '@google-cloud/compute' }, - { type: 'terraform.resource', name: 'google_compute_instance' }, + { + type: 'terraform.resource', + name: /^google_compute_/, + example: 'google_compute_instance', + }, { type: 'ruby', name: 'google-cloud-compute' }, { type: 'golang', name: 'cloud.google.com/go/compute' }, { type: 'php', name: 'google/cloud-compute' }, diff --git a/src/rules/hosting/gcp.gke.ts b/src/rules/hosting/gcp.gke.ts index 4679640c..b1bbacb2 100644 --- a/src/rules/hosting/gcp.gke.ts +++ b/src/rules/hosting/gcp.gke.ts @@ -5,7 +5,11 @@ register({ name: 'Google Kubernetes', type: 'hosting', dependencies: [ - { type: 'terraform.resource', name: 'google_container_cluster' }, + { + type: 'terraform.resource', + name: /^google_container_/, + example: 'google_container_cluster', + }, { type: 'githubAction', name: 'google-github-actions/get-gke-credentials' }, ], }); diff --git a/src/rules/hosting/gcp.tasks.ts b/src/rules/hosting/gcp.tasks.ts index a43868fd..082dfa94 100644 --- a/src/rules/hosting/gcp.tasks.ts +++ b/src/rules/hosting/gcp.tasks.ts @@ -8,7 +8,8 @@ register({ { type: 'npm', name: '@google-cloud/tasks' }, { type: 'terraform.resource', - name: 'google_cloud_tasks_queue', + name: /^google_cloud_tasks_/, + example: 'google_cloud_tasks_queue', }, { type: 'ruby', diff --git a/src/rules/messaging/gcp.pubsub.ts b/src/rules/messaging/gcp.pubsub.ts index 689aeaf2..845eec72 100644 --- a/src/rules/messaging/gcp.pubsub.ts +++ b/src/rules/messaging/gcp.pubsub.ts @@ -8,7 +8,8 @@ register({ { type: 'npm', name: '@google-cloud/pubsub' }, { type: 'terraform.resource', - name: 'google_pubsub_topic', + name: /^google_pubsub_/, + example: 'google_pubsub_topic', }, { type: 'golang', name: 'cloud.google.com/go/pubsub' }, { type: 'rust', name: 'google-cloud-pubsub' }, diff --git a/src/rules/monitoring/datadog.ts b/src/rules/monitoring/datadog.ts index a5239ea1..86aa1c19 100644 --- a/src/rules/monitoring/datadog.ts +++ b/src/rules/monitoring/datadog.ts @@ -9,9 +9,11 @@ register({ { type: 'npm', name: 'dd-trace' }, { type: 'npm', name: 'datadog-metrics' }, { type: 'terraform', name: 'registry.terraform.io/datadog/datadog' }, - { type: 'terraform.resource', name: 'datadog_metric_metadata' }, - { type: 'terraform.resource', name: 'datadog_application_key' }, - { type: 'terraform.resource', name: 'datadog_monitor' }, + { + type: 'terraform.resource', + name: /^datadog_/, + example: 'datadog_metric_metadata', + }, { type: 'rust', name: 'ddtrace' }, { type: 'rust', name: 'datadog-apm' }, { type: 'ruby', name: 'ddtrace' }, diff --git a/src/rules/network/gcp.dns.ts b/src/rules/network/gcp.dns.ts index 9adccdf8..99ea5459 100644 --- a/src/rules/network/gcp.dns.ts +++ b/src/rules/network/gcp.dns.ts @@ -6,7 +6,11 @@ register({ type: 'network', dependencies: [ { type: 'npm', name: '@google-cloud/dns' }, - { type: 'terraform.resource', name: 'google_dns_record_set' }, + { + type: 'terraform.resource', + name: /^google_dns_/, + example: 'google_dns_record_set', + }, { type: 'ruby', name: 'google-cloud-dns' }, ], }); diff --git a/src/rules/spec/terraform/__snapshots__/resource.test.ts.snap b/src/rules/spec/terraform/__snapshots__/resource.test.ts.snap index 99f2cc34..c54b56c0 100644 --- a/src/rules/spec/terraform/__snapshots__/resource.test.ts.snap +++ b/src/rules/spec/terraform/__snapshots__/resource.test.ts.snap @@ -64,7 +64,6 @@ exports[`terraform (resource) > should match everything 1`] = ` "gcp.gke", "gcp.kms", "gcp.logging", - "gcp.maps", "gcp.memorystore", "gcp.pubsub", "gcp.secretmanager", diff --git a/src/rules/storage/gcp.gcs.ts b/src/rules/storage/gcp.gcs.ts index 43698792..d43e9ace 100644 --- a/src/rules/storage/gcp.gcs.ts +++ b/src/rules/storage/gcp.gcs.ts @@ -6,7 +6,11 @@ register({ type: 'storage', dependencies: [ { type: 'npm', name: '@google-cloud/storage' }, - { type: 'terraform.resource', name: 'google_storage_bucket' }, + { + type: 'terraform.resource', + name: /^google_storage_/, + example: 'google_storage_bucket', + }, { type: 'golang', name: 'cloud.google.com/go/storage' }, { type: 'ruby', name: 'google-cloud-storage' }, { type: 'rust', name: 'google-cloud-storage' },