Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Cleanup] Adopt eslint vue/recommended: Grant Finder: app files #2811

Merged
merged 5 commits into from
Mar 22, 2024

Conversation

jeffsmohan
Copy link
Contributor

Ticket #2767

Description

Brings the grants table vue files into compliance with new linting rules.

  • ./src/App.vue
  • ./src/main.js
  • ./src/components/Layout.vue

A few notes for the reviewer:

  1. Much of the diff is auto-fixed. Reviewing commit by commit should make this a bit easier to read.
  2. Renamed Layout->BaseLayout to comply with multi-word component lint rule.

Screenshots / Demo Video

Screenshot 2024-03-18 at 10 20 52 AM

Testing

Confirmed that basic layout behavior remains unaffected by the change.

Automated and Unit Tests

  • Added Unit tests

Manual tests for Reviewer

  • Added steps to test feature/functionality manually

Checklist

  • Provided ticket and description
  • Provided screenshots/demo
  • Provided testing information
  • Provided adequate test coverage for all new code
  • Added PR reviewers

@jeffsmohan jeffsmohan requested a review from sanason March 18, 2024 17:26
@github-actions github-actions bot added the javascript Pull requests that update Javascript code label Mar 18, 2024
Copy link

github-actions bot commented Mar 18, 2024

QA Summary

QA Check Result
🌐 Client Tests
🔗 Server Tests
🤝 E2E Tests
📏 ESLint
🧹 TFLint

Test Coverage

Coverage report for `packages/client`
St File % Stmts % Branch % Funcs % Lines Uncovered Line #s
🔴 All files 16.45 14.82 20.97 16.71
🟡  ...nents/src/arpa_reporter/components 50.9 26.66 62.16 50.9
🔴   AlertBox.vue 0 0 0 0 20-21
🟡   DownloadButton.vue 50 50 50 50 39,56-59
🟢   DownloadFileButton.vue 100 100 100 100
🟢   DownloadTemplateBtn.vue 100 100 100 100
🟡   Navigation.vue 63.15 100 62.5 63.15 137-143,152-159
🔴   StandardForm.vue 34.78 20 55.55 34.78 86-90,97-119
🟢  arpa_reporter/helpers 84.61 79.48 87.5 84.61
🟢   form-helpers.js 84.21 79.48 85.71 84.21 7,16,25,81-83
🟢   short-uuid.js 100 100 100 100
🔴  arpa_reporter/store 4.85 0 2.17 5.1
🔴   index.js 4.85 0 2.17 5.1 13-16,34-263
🔴  ...rter/views/src/arpa_reporter/views 38.69 30.5 69.69 38.69
🟢   Agencies.vue 100 100 100 100
🔴   Home.vue 14.28 0 50 14.28 77,90-160
🔴   Upload.vue 48.21 50 78.94 48.21 ...39,345-346,356
🔴   Uploads.vue 43.18 38.88 66.66 43.18 ...65,181,232-256
🔴   User.vue 38.7 28.57 68.75 38.7 73-118
🔴  ...nents/Modals/src/components/Modals 4 2.17 10.52 4.01
🔴   AddOrganization.vue 7.69 0 25 7.69 136-171
🔴   AddTeam.vue 37.5 33.33 60 37.5 178,184-212
🔴   EditOrganization.vue 11.11 0 28.57 11.11 50-76
🔴   EditTeam.vue 2.5 0 16.66 2.5 151-260
🔴   GrantDetailsLegacy.vue 0 0 0 0 103-268
🔴   ImportTeams.vue 0 0 0 0 44-79
🔴   ProfileSettings.vue 0 0 0 0 49-128
🔴   SavedSearchPanel.vue 0 0 0 0 98-208
🔴   SearchPanel.vue 1.75 0 0 1.78 266-452
🔴  components/src/components 4.86 3.77 9.85 4.86
🔴   ActivityTable.vue 0 0 0 0 68-137
🟡   BaseLayout.vue 50 66.66 53.84 50 285-300
🔴   ClosingDatesTable.vue 0 0 0 0 52-84
🔴   GrantsTable.vue 3.1 0 0 3.1 187-543
🔴   SearchFilter.vue 0 0 0 0 26-68
🔴   Uploader.vue 0 0 0 0 47-100
🔴   UserAvatar.vue 0 0 0 0 25-36
🔴  helpers 17.54 18.94 16.66 18.01
🟢   constants.js 100 100 100 100
🟢   currency.js 100 100 100 100
🟢   dates.js 100 100 100 100
🔴   fetchApi.js 5.55 12.5 5.55 5.55 10-102
🔴   filters.js 4 0 0 4.54 19-51
🔴   form-helpers.js 0 0 0 0 5-82
🟡   gtag.js 77.77 90 75 77.77 12,51
🟢  helpers/featureFlags 100 100 100 100
🟢   index.js 100 100 100 100
🟢   utils.js 100 100 100 100
🔴  mixin 23.8 0 28.57 23.8
🔴   resizableTable.js 23.8 0 28.57 23.8 16-31,36-37,42
🔴  router 20 11.53 17.64 20
🔴   index.js 20 11.53 17.64 20 ...74-175,179-198
🟢  store 100 100 100 100
🟢   index.js 100 100 100 100
🔴  store/modules 6.29 0 4.97 6.59
🔴   agencies.js 10 100 8.33 10.52 13-70
🔴   alerts.js 20 100 20 20 10-24
🔴   dashboard.js 4.65 0 4.54 4.65 22-96
🔴   grants.js 2.79 0 1.05 2.94 59-353
🔴   keywords.js 14.28 0 9.09 16.66 13-33
🔴   organization.js 33.33 100 33.33 33.33 21-25
🔴   roles.js 33.33 100 20 40 13-22
🔴   tenants.js 20 100 14.28 22.22 13-32
🔴   users.js 4.76 0 4.76 4.87 17-100
🟡  views 50 100 0 50
🟡   NotFoundView.vue 50 100 0 50 2-4
🔴  views/src/views 14.89 0 26 14.89
🔴   ArpaAnnualPerformanceReporter.vue 0 0 0 0 81-134
🔴   Dashboard.vue 26.31 0 36.36 26.31 ...12-122,137-148
🔴   LoginView.vue 0 0 0 0 76-128
🔴   Organizations.vue 40 100 40 40 64,74-77,88-92
🟡   Teams.vue 50 100 50 50 108,119-126
Coverage report for `packages/server`
St File % Stmts % Branch % Funcs % Lines Uncovered Line #s
🟡 All files 54.98 46.63 49.72 55.34
🟢  src 82.35 33.33 60 82.35
🟢   configure.js 82.35 33.33 60 82.35 44,63-70,99-101
🟢  src/arpa_reporter 98.75 66.66 100 98.75
🟢   configure.js 97.36 40 100 97.36 36
🟢   environment.js 100 100 100 100
🟢   use-request.js 100 100 100 100
🔴  src/arpa_reporter/db 38.58 32.92 44.44 40.16
🔴   arpa-subrecipients.js 13.15 4.34 15.38 14.28 23-92
🔴   reporting-periods.js 37.2 46.87 40 38.09 46,77-156
🟢   settings.js 100 83.33 100 100 13
🟡   uploads.js 50 28.57 52.38 51.42 18-29,83,98-123,140-149
🔴  src/arpa_reporter/lib 25.43 20.8 26.38 25.64
🟢   arpa-ec-codes.js 100 100 100 100
🔴   audit-report.js 23.14 20.68 27.77 22.65 ...78-479,505-635,683-709
🟡   ensure-async-context.js 75 100 50 100
🔴   format.js 13.79 0 0 19.04 28-82
🟡   log.js 75 50 50 75 13,25
🟡   preconditions.js 66.66 33.33 100 66.66 3
🔴   spreadsheet.js 9.09 0 0 9.09 15-32
🟢   validation-error.js 85.71 100 50 85.71 16
🔴  src/arpa_reporter/routes 40.08 14.92 14.28 40.69
🔴   agencies.js 22.58 0 0 23.33 13-21,26-53
🟡   application_settings.js 75 100 0 75 10-11
🟡   audit-report.js 69.86 58.33 100 69.86 57-58,64-78,100-115
🟢   exports.js 81.42 83.33 100 81.42 61-75,98-99
🔴   reporting-periods.js 20 0 0 20.43 ...25-137,143-149,154-180
🔴   subrecipients.js 23.8 0 0 23.8 12-13,17-27,31-48,52-63
🔴   uploads.js 28.28 7.89 9.09 29.16 ...33-154,164-166,173-180
🔴   users.js 19.6 0 0 20 15-35,39-44,48-81
🔴  src/arpa_reporter/services 42.57 30.12 45.39 42.95
🔴   generate-arpa-report.js 36.86 2.79 50 37.24 ...-944,953-966,1040-1107
🔴   get-template.js 21.62 0 0 21.62 18-79
🟡   persist-upload.js 68.6 90 69.56 68.67 ...58-200,221-235,273-295
🔴   records.js 20.95 0 11.11 21.35 38-202,219-274
🔴   revalidate-uploads.js 37.5 100 0 37.5 5-14
🔴   validate-upload.js 37.93 49.41 32.14 38.83 ...10,329,351,369-657,672
🟢   validation-rules.js 98.18 90 90.9 100 157,173
🟡  src/db 75.41 72.27 69.94 75.51
🟢   connection.js 100 50 100 100 6
🟢   constants.js 100 100 100 100
🟢   helpers.js 83.33 100 50 83.33 21-22
🟢   index.js 83.18 78.61 82.87 83.17 ...05-1571,1753-1754,1761
🟢   saved_search_migration.js 92 88.23 71.42 93.61 5,69,134
🔴   tenant_creation.js 10.58 2.7 0 11.11 15-40,48-210,220
🔴  src/db/arpa_reporter_db_shims 23.68 0 0 23.68
🔴   agencies.js 22.22 100 0 22.22 11-51
🔴   users.js 25 0 0 25 12-62
🟡  src/lib 66.21 62.54 61.7 67.13
🟢   access-helpers.js 93.44 89.18 100 93.44 91-92,97-98
🟢   agencyImporter.js 90.38 88.46 100 90.19 26,29,35,93-94
🔴   batchProcessor.js 2.94 0 0 3.03 35-104
🟢   email.js 91.89 78 100 91.72 ...12,154,295-298,335-336
🔴   gost-aws.js 21.05 11.11 20 19.44 13-58,65-116
🟢   grants-ingest.js 83.33 97.5 90 83.33 ...28-131,138-140,155-159
🔴   grantsgov.js 6.25 6.52 0 6.97 12-220
🟡   logging.js 77.77 85.71 100 77.77 11,13
🟢   redirect_validation.js 100 100 100 100
🟢   userImporter.js 82.27 58.33 88.88 81.57 32,47,53,62,73-81,143-152
🔴  src/lib/annualReports 27.38 0 0 27.38
🔴   doc-builder.js 7.69 0 0 7.69 19-352
🟡   index.js 80 100 0 80 6
🟢   placeholderTextStrings.js 100 100 100 100
🔴   reportBuilder.js 17.24 0 0 17.24 21-33,50-62,86-103
🟢  src/lib/arpa_reporter_shims 100 100 100 100
🟢   email.js 100 100 100 100
🟢  src/lib/email 92.85 87.5 100 92.3
🟢   constants.js 100 100 100 100
🟢   email-nodemailer.js 88.23 83.33 100 86.66 33,59
🟢   service-email.js 100 100 100 100
🟢  src/lib/fieldConfigs 100 100 100 100
🟢   fundingActivityCategories.js 100 100 100 100
🔴  src/lib/grantscraper 11.86 0 0 12.96
🔴   index.js 11.86 0 0 12.96 11-92,98-122
🟡  src/routes 68.36 57.52 60.49 68.43
🔴   agencies.js 45.54 30 40 45.54 ...33-141,145-166,174-180
🔴   annualReports.js 47.05 100 0 47.05 15-27
🔴   dashboard.js 21.42 0 0 21.42 8-53
🟢   eligibilityCodes.js 100 100 100 100
🟢   grants.js 80.43 71.02 73.52 81.25 ...80-381,396-399,412-413
🟡   grantsSavedSearch.js 80 83.33 100 80 38-39,56-57,70-72,78
🟢   health.js 100 100 100 100
🟡   interestedCodes.js 71.42 100 0 71.42 7-8
🟢   keywords.js 86.95 50 100 86.95 26-27,34
🟡   refresh.js 71.42 100 0 71.42 7-8
🟡   roles.js 75 100 0 75 8-9
🟡   searchConfig.js 58.33 100 0 58.33 9-14
🟡   sessions.js 63.93 39.39 50 63.93 ...-73,79-80,84-85,98-104
🔴   tenants.js 39.13 0 0 39.13 11-12,16-27,32-35
🟢   users.js 80.41 74.19 85.71 80.41 ...17,134-136,160,169-177

Pusher: @jeffsmohan, Action: pull_request_target, Workflow: Continuous Integration

Copy link

github-actions bot commented Mar 18, 2024

Terraform Summary

Step Result
🖌 Terraform Format & Style
⚙️ Terraform Initialization
🤖 Terraform Validation
📖 Terraform Plan

Hint: If "Terraform Format & Style" failed, run terraform fmt -recursive from the terraform/ directory and commit the results.

Output

Validation Output
Success! The configuration is valid.


Plan Output
Note: Objects have changed outside of Terraform

Terraform detected the following changes made outside of Terraform since the
last "terraform apply" which may have affected this plan:

  # module.api.aws_ecs_task_definition.default[0] has changed
  ~ resource "aws_ecs_task_definition" "default" {
        id                       = "gost-staging-api"
+       tags                     = {}
        # (13 unchanged attributes hidden)

+       volume {
+           name = "data"

+           efs_volume_configuration {
+               file_system_id          = "fs-08f95063c1cdbe191"
+               root_directory          = "/"
+               transit_encryption      = "ENABLED"
+               transit_encryption_port = 0

+               authorization_config {
+                   access_point_id = "fsap-03bc0296928aade4f"
                }
            }
        }
-       volume {
-           name = "data" -> null

-           efs_volume_configuration {
-               file_system_id     = "fs-08f95063c1cdbe191" -> null
-               root_directory     = "/" -> null
-               transit_encryption = "ENABLED" -> null

-               authorization_config {
-                   access_point_id = "fsap-03bc0296928aade4f" -> null
                }
            }
        }

        # (1 unchanged block hidden)
    }

  # module.api.aws_iam_role.execution[0] has changed
  ~ resource "aws_iam_role" "execution" {
        id                    = "gost-staging-api-ECSTaskExecution-20230217010414321500000009"
        name                  = "gost-staging-api-ECSTaskExecution-20230217010414321500000009"
      ~ role_last_used        = [
          ~ {
              ~ last_used_date = "2024-03-20T20:45:11Z" -> "2024-03-22T15:29:32Z"
                # (1 unchanged element hidden)
            },
        ]
        tags                  = {}
        # (11 unchanged attributes hidden)

        # (2 unchanged blocks hidden)
    }

  # module.api.aws_iam_role.task[0] has changed
  ~ resource "aws_iam_role" "task" {
        id                    = "gost-staging-api-ECSTask-2023021701041477300000000a"
        name                  = "gost-staging-api-ECSTask-2023021701041477300000000a"
      ~ role_last_used        = [
          ~ {
              ~ last_used_date = "2024-03-20T20:26:58Z" -> "2024-03-22T15:29:33Z"
                # (1 unchanged element hidden)
            },
        ]
        tags                  = {}
        # (11 unchanged attributes hidden)

        # (6 unchanged blocks hidden)
    }


Unless you have made equivalent changes to your configuration, or ignored the
relevant attributes using ignore_changes, the following plan may include
actions to undo or respond to these changes.

─────────────────────────────────────────────────────────────────────────────

Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
+   create
  ~ update in-place
-   destroy
+/- create replacement and then destroy

Terraform will perform the following actions:

  # module.api.aws_ecs_service.default[0] will be updated in-place
  ~ resource "aws_ecs_service" "default" {
        id                                 = "arn:aws:ecs:us-west-2:357150818708:service/gost-staging/gost-staging-api"
        name                               = "gost-staging-api"
        tags                               = {}
      ~ task_definition                    = "arn:aws:ecs:us-west-2:357150818708:task-definition/gost-staging-api:190" -> (known after apply)
        # (15 unchanged attributes hidden)

        # (4 unchanged blocks hidden)
    }

  # module.api.aws_ecs_task_definition.default[0] must be replaced
+/- resource "aws_ecs_task_definition" "default" {
      ~ arn                      = "arn:aws:ecs:us-west-2:357150818708:task-definition/gost-staging-api:190" -> (known after apply)
      ~ arn_without_revision     = "arn:aws:ecs:us-west-2:357150818708:task-definition/gost-staging-api" -> (known after apply)
      ~ container_definitions    = jsonencode(
          ~ [ # forces replacement
              ~ {
                  ~ dockerLabels           = {
                      ~ "com.datadoghq.tags.version" = "5751492e6865e85abd6f585caed71b1ab293f021" -> "5744cfb9e811075284f0c3a626b3e94c46622c98"
                        # (2 unchanged elements hidden)
                    }
                  ~ environment            = [
                        # (7 unchanged elements hidden)
                        {
                            name  = "DD_SERVICE"
                            value = "gost"
                        },
                      ~ {
                            name  = "DD_VERSION"
                          ~ value = "5751492e6865e85abd6f585caed71b1ab293f021" -> "5744cfb9e811075284f0c3a626b3e94c46622c98"
                        },
                        {
                            name  = "ENABLE_GRANTS_DIGEST"
                            value = "false"
                        },
                        # (12 unchanged elements hidden)
                    ]
                  ~ image                  = "ghcr.io/usdigitalresponse/usdr-gost-api:5751492e6865e85abd6f585caed71b1ab293f021@sha256:27361bd5a2f243b0fecd17435b821e111866a76f4205036d28c3bdc1ffa9e950" -> "ghcr.io/usdigitalresponse/usdr-gost-api:5744cfb9e811075284f0c3a626b3e94c46622c98@sha256:e48ba0f8aad3f5334e7418d10c537f29ebf2789e44ffe244470e7b13281e565d"
                    name                   = "api"
-                   systemControls         = [] -> null
-                   volumesFrom            = [] -> null
                    # (9 unchanged elements hidden)
                } # forces replacement,
              ~ {
                  ~ dockerLabels           = {
                      ~ "com.datadoghq.tags.version" = "5751492e6865e85abd6f585caed71b1ab293f021" -> "5744cfb9e811075284f0c3a626b3e94c46622c98"
                        # (2 unchanged elements hidden)
                    }
                  ~ environment            = [
                        # (3 unchanged elements hidden)
                        {
                            name  = "DD_SERVICE"
                            value = "gost"
                        },
                      ~ {
                            name  = "DD_VERSION"
                          ~ value = "5751492e6865e85abd6f585caed71b1ab293f021" -> "5744cfb9e811075284f0c3a626b3e94c46622c98"
                        },
                        {
                            name  = "ECS_FARGATE"
                            value = "true"
                        },
                    ]
-                   mountPoints            = [] -> null
                    name                   = "datadog"
-                   portMappings           = [] -> null
-                   systemControls         = [] -> null
-                   volumesFrom            = [] -> null
                    # (6 unchanged elements hidden)
                } # forces replacement,
            ]
        )
      ~ id                       = "gost-staging-api" -> (known after apply)
      ~ revision                 = 190 -> (known after apply)
-       tags                     = {} -> null
        # (9 unchanged attributes hidden)

-       volume {
-           name = "data" -> null

-           efs_volume_configuration {
-               file_system_id          = "fs-08f95063c1cdbe191" -> null
-               root_directory          = "/" -> null
-               transit_encryption      = "ENABLED" -> null
-               transit_encryption_port = 0 -> null

-               authorization_config {
-                   access_point_id = "fsap-03bc0296928aade4f" -> null
                }
            }
        }
+       volume {
+           name = "data"

+           efs_volume_configuration {
+               file_system_id     = "fs-08f95063c1cdbe191"
+               root_directory     = "/"
+               transit_encryption = "ENABLED"

+               authorization_config {
+                   access_point_id = "fsap-03bc0296928aade4f"
                }
            }
        }

        # (1 unchanged block hidden)
    }

  # module.arpa_audit_report.aws_ecs_service.default will be updated in-place
  ~ resource "aws_ecs_service" "default" {
        id                                 = "arn:aws:ecs:us-west-2:357150818708:service/gost-staging/gost-staging-arpa_audit_report"
        name                               = "gost-staging-arpa_audit_report"
        tags                               = {}
      ~ task_definition                    = "arn:aws:ecs:us-west-2:357150818708:task-definition/gost-staging-arpa_audit_report:159" -> (known after apply)
        # (15 unchanged attributes hidden)

        # (3 unchanged blocks hidden)
    }

  # module.arpa_audit_report.aws_ecs_task_definition.consumer must be replaced
+/- resource "aws_ecs_task_definition" "consumer" {
      ~ arn                      = "arn:aws:ecs:us-west-2:357150818708:task-definition/gost-staging-arpa_audit_report:159" -> (known after apply)
      ~ arn_without_revision     = "arn:aws:ecs:us-west-2:357150818708:task-definition/gost-staging-arpa_audit_report" -> (known after apply)
      ~ container_definitions    = (sensitive value) # forces replacement
      ~ id                       = "gost-staging-arpa_audit_report" -> (known after apply)
-       ipc_mode                 = "" -> null
-       pid_mode                 = "" -> null
      ~ revision                 = 159 -> (known after apply)
-       tags                     = {} -> null
        # (9 unchanged attributes hidden)

-       volume {
-           name = "data" -> null

-           efs_volume_configuration {
-               file_system_id          = "fs-08f95063c1cdbe191" -> null
-               root_directory          = "/" -> null
-               transit_encryption      = "ENABLED" -> null
-               transit_encryption_port = 0 -> null

-               authorization_config {
-                   access_point_id = "fsap-03bc0296928aade4f" -> null
                }
            }
        }
+       volume {
+           name = "data"

+           efs_volume_configuration {
+               file_system_id     = "fs-08f95063c1cdbe191"
+               root_directory     = "/"
+               transit_encryption = "ENABLED"

+               authorization_config {
+                   access_point_id = "fsap-03bc0296928aade4f"
                }
            }
        }

        # (1 unchanged block hidden)
    }

  # module.arpa_treasury_report.aws_ecs_service.default will be updated in-place
  ~ resource "aws_ecs_service" "default" {
        id                                 = "arn:aws:ecs:us-west-2:357150818708:service/gost-staging/gost-staging-treasury_report"
        name                               = "gost-staging-treasury_report"
        tags                               = {}
      ~ task_definition                    = "arn:aws:ecs:us-west-2:357150818708:task-definition/gost-staging-treasury_report:148" -> (known after apply)
        # (15 unchanged attributes hidden)

        # (3 unchanged blocks hidden)
    }

  # module.arpa_treasury_report.aws_ecs_task_definition.consumer must be replaced
+/- resource "aws_ecs_task_definition" "consumer" {
      ~ arn                      = "arn:aws:ecs:us-west-2:357150818708:task-definition/gost-staging-treasury_report:148" -> (known after apply)
      ~ arn_without_revision     = "arn:aws:ecs:us-west-2:357150818708:task-definition/gost-staging-treasury_report" -> (known after apply)
      ~ container_definitions    = (sensitive value) # forces replacement
      ~ id                       = "gost-staging-treasury_report" -> (known after apply)
-       ipc_mode                 = "" -> null
-       pid_mode                 = "" -> null
      ~ revision                 = 148 -> (known after apply)
-       tags                     = {} -> null
        # (9 unchanged attributes hidden)

-       volume {
-           name = "data" -> null

-           efs_volume_configuration {
-               file_system_id          = "fs-08f95063c1cdbe191" -> null
-               root_directory          = "/" -> null
-               transit_encryption      = "ENABLED" -> null
-               transit_encryption_port = 0 -> null

-               authorization_config {
-                   access_point_id = "fsap-03bc0296928aade4f" -> null
                }
            }
        }
+       volume {
+           name = "data"

+           efs_volume_configuration {
+               file_system_id     = "fs-08f95063c1cdbe191"
+               root_directory     = "/"
+               transit_encryption = "ENABLED"

+               authorization_config {
+                   access_point_id = "fsap-03bc0296928aade4f"
                }
            }
        }

        # (1 unchanged block hidden)
    }

  # module.consume_grants.aws_ecs_service.default will be updated in-place
  ~ resource "aws_ecs_service" "default" {
        id                                 = "arn:aws:ecs:us-west-2:357150818708:service/gost-staging/gost-staging-consume_grants"
        name                               = "gost-staging-consume_grants"
        tags                               = {}
      ~ task_definition                    = "arn:aws:ecs:us-west-2:357150818708:task-definition/gost-staging-consume_grants:175" -> (known after apply)
        # (15 unchanged attributes hidden)

        # (3 unchanged blocks hidden)
    }

  # module.consume_grants.aws_ecs_task_definition.consume_grants must be replaced
+/- resource "aws_ecs_task_definition" "consume_grants" {
      ~ arn                      = "arn:aws:ecs:us-west-2:357150818708:task-definition/gost-staging-consume_grants:175" -> (known after apply)
      ~ arn_without_revision     = "arn:aws:ecs:us-west-2:357150818708:task-definition/gost-staging-consume_grants" -> (known after apply)
      ~ container_definitions    = (sensitive value) # forces replacement
      ~ id                       = "gost-staging-consume_grants" -> (known after apply)
-       ipc_mode                 = "" -> null
-       pid_mode                 = "" -> null
      ~ revision                 = 175 -> (known after apply)
-       tags                     = {} -> null
        # (9 unchanged attributes hidden)

        # (1 unchanged block hidden)
    }

  # module.website.aws_s3_object.deploy-config[0] will be updated in-place
  ~ resource "aws_s3_object" "deploy-config" {
      ~ content                = <<-EOT
            window.APP_CONFIG = window.APP_CONFIG || {};
            window.APP_CONFIG.apiURLForGOST = 'https://api.staging.grants.usdr.dev/';
            window.apiURLForGOST = window.APP_CONFIG.apiURLForGOST; // Legacy
            
            window.APP_CONFIG.DD_RUM_ENABLED = true;
-           window.APP_CONFIG.DD_RUM_CONFIG = {"allowedTracingUrls":["https://api.staging.grants.usdr.dev"],"applicationId":"15db471e-2ccb-4d3c-a6bf-99b750d748f5","clientToken":"pub50834fcc1999d53e546519b1a0f03934","defaultPrivacyLevel":"mask","env":"staging","service":"gost","sessionReplaySampleRate":1,"sessionSampleRate":10,"site":"datadoghq.com","trackLongTasks":true,"trackResources":true,"trackUserInteractions":true,"version":"5751492e6865e85abd6f585caed71b1ab293f021"};
+           window.APP_CONFIG.DD_RUM_CONFIG = {"allowedTracingUrls":["https://api.staging.grants.usdr.dev"],"applicationId":"15db471e-2ccb-4d3c-a6bf-99b750d748f5","clientToken":"pub50834fcc1999d53e546519b1a0f03934","defaultPrivacyLevel":"mask","env":"staging","service":"gost","sessionReplaySampleRate":1,"sessionSampleRate":10,"site":"datadoghq.com","trackLongTasks":true,"trackResources":true,"trackUserInteractions":true,"version":"5744cfb9e811075284f0c3a626b3e94c46622c98"};
            
            window.APP_CONFIG.GOOGLE_TAG_ID = 'G-D5DFR7BN0N';
            
            window.APP_CONFIG.featureFlags = {"myProfileEnabled":true,"newGrantsDetailPageEnabled":true,"newTerminologyEnabled":true};
            
            window.APP_CONFIG.overrideFeatureFlag = (flagName, overrideValue) => {
              const storageKey = 'featureFlags';
              let overrides = {};
              try {
                overrides = JSON.parse(window.sessionStorage.getItem(storageKey)) || {};
              } catch (e) {
                console.error(`Error parsing window.sessionStorage.${storageKey} as JSON:`, e);
                console.warn(`window.sessionStorage.${storageKey} will be replaced.`);
              }
              overrides[flagName] = overrideValue;
              window.sessionStorage.setItem(storageKey, JSON.stringify(overrides));
              console.log('New feature flag overrides in page session:',
                window.sessionStorage.getItem(storageKey));
            };
        EOT
      ~ etag                   = "309013ae4b72ea6069d9b4b82848e11a" -> "0226c89b86908d83be33fab1052b2389"
        id                     = "/config/deploy-config.js"
        tags                   = {}
      ~ version_id             = "WyZMdoLp.phztgpoZVpDt554O55xH8MK" -> (known after apply)
        # (10 unchanged attributes hidden)
    }

  # module.website.aws_s3_object.origin_dist_artifact["css/main.5d456ea9.css"] will be created
+   resource "aws_s3_object" "origin_dist_artifact" {
+       acl                    = "private"
+       bucket                 = "gost-staging-origin-357150818708-us-west-2-website"
+       bucket_key_enabled     = (known after apply)
+       content_type           = "text/css"
+       etag                   = "d89ee55bed0adbf3f244c3fdea22440c"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/css/main.5d456ea9.css"
+       kms_key_id             = (known after apply)
+       server_side_encryption = "AES256"
+       source                 = "/home/runner/work/usdr-gost/usdr-gost/packages/client/dist/css/main.5d456ea9.css"
+       source_hash            = "d89ee55bed0adbf3f244c3fdea22440c"
+       storage_class          = (known after apply)
+       tags_all               = {
+           "env"        = "staging"
+           "management" = "terraform"
+           "owner"      = "grants"
+           "repo"       = "usdr-gost"
+           "service"    = "gost"
+           "usage"      = "workload"
        }
+       version_id             = (known after apply)
    }

  # module.website.aws_s3_object.origin_dist_artifact["css/main.67bb0e76.css"] will be destroyed
  # (because key ["css/main.67bb0e76.css"] is not in for_each map)
-   resource "aws_s3_object" "origin_dist_artifact" {
-       acl                    = "private" -> null
-       bucket                 = "gost-staging-origin-357150818708-us-west-2-website" -> null
-       bucket_key_enabled     = false -> null
-       content_type           = "text/css" -> null
-       etag                   = "0eb3f529e0871623e283ee0d64e423ff" -> null
-       force_destroy          = false -> null
-       id                     = "dist/css/main.67bb0e76.css" -> null
-       key                    = "dist/css/main.67bb0e76.css" -> null
-       metadata               = {} -> null
-       server_side_encryption = "AES256" -> null
-       source                 = "/home/runner/work/usdr-gost/usdr-gost/packages/client/dist/css/main.67bb0e76.css" -> null
-       source_hash            = "0eb3f529e0871623e283ee0d64e423ff" -> null
-       storage_class          = "STANDARD" -> null
-       tags                   = {} -> null
-       tags_all               = {
-           "env"        = "staging"
-           "management" = "terraform"
-           "owner"      = "grants"
-           "repo"       = "usdr-gost"
-           "service"    = "gost"
-           "usage"      = "workload"
        } -> null
-       version_id             = "x0wB5itiUz3qWCJUukW3Z2GgbADII13p" -> null
    }

  # module.website.aws_s3_object.origin_dist_artifact["index.html"] will be updated in-place
  ~ resource "aws_s3_object" "origin_dist_artifact" {
      ~ etag                   = "ed0f0f79b605de7ba1907cf05e5ef0c1" -> "588f4a5f56473931df5673f4ed7ac8be"
        id                     = "dist/index.html"
      ~ source_hash            = "ed0f0f79b605de7ba1907cf05e5ef0c1" -> "588f4a5f56473931df5673f4ed7ac8be"
        tags                   = {}
      ~ version_id             = "WOtVVA8ksy6Biz2nYwyogSAVMQg0IfN." -> (known after apply)
        # (11 unchanged attributes hidden)
    }

  # module.website.aws_s3_object.origin_dist_artifact["js/chunk-vendors.f6368cfa.js.map"] will be updated in-place
  ~ resource "aws_s3_object" "origin_dist_artifact" {
      ~ etag                   = "cd967123bc800ae4ec028dea0d1ad34d-2" -> "d4836e0e15d2d8b51f1ea8cf6e3b5b97"
        id                     = "dist/js/chunk-vendors.f6368cfa.js.map"
        tags                   = {}
      ~ version_id             = "vQ6EBMQggyX7zNgpgwtqxNBHbQhdn_4M" -> (known after apply)
        # (12 unchanged attributes hidden)
    }

  # module.website.aws_s3_object.origin_dist_artifact["js/main.cd9f7550.js"] will be created
+   resource "aws_s3_object" "origin_dist_artifact" {
+       acl                    = "private"
+       bucket                 = "gost-staging-origin-357150818708-us-west-2-website"
+       bucket_key_enabled     = (known after apply)
+       content_type           = "text/javascript"
+       etag                   = "ef8e3dbf86f20f526550f9bfb58a6ec6"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/js/main.cd9f7550.js"
+       kms_key_id             = (known after apply)
+       server_side_encryption = "AES256"
+       source                 = "/home/runner/work/usdr-gost/usdr-gost/packages/client/dist/js/main.cd9f7550.js"
+       source_hash            = "ef8e3dbf86f20f526550f9bfb58a6ec6"
+       storage_class          = (known after apply)
+       tags_all               = {
+           "env"        = "staging"
+           "management" = "terraform"
+           "owner"      = "grants"
+           "repo"       = "usdr-gost"
+           "service"    = "gost"
+           "usage"      = "workload"
        }
+       version_id             = (known after apply)
    }

  # module.website.aws_s3_object.origin_dist_artifact["js/main.cd9f7550.js.map"] will be created
+   resource "aws_s3_object" "origin_dist_artifact" {
+       acl                    = "private"
+       bucket                 = "gost-staging-origin-357150818708-us-west-2-website"
+       bucket_key_enabled     = (known after apply)
+       content_type           = "application/json"
+       etag                   = "cc4ab004b5075a2087d4891e717cb316"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/js/main.cd9f7550.js.map"
+       kms_key_id             = (known after apply)
+       server_side_encryption = "AES256"
+       source                 = "/home/runner/work/usdr-gost/usdr-gost/packages/client/dist/js/main.cd9f7550.js.map"
+       source_hash            = "cc4ab004b5075a2087d4891e717cb316"
+       storage_class          = (known after apply)
+       tags_all               = {
+           "env"        = "staging"
+           "management" = "terraform"
+           "owner"      = "grants"
+           "repo"       = "usdr-gost"
+           "service"    = "gost"
+           "usage"      = "workload"
        }
+       version_id             = (known after apply)
    }

  # module.website.aws_s3_object.origin_dist_artifact["js/main.dbc50207.js"] will be destroyed
  # (because key ["js/main.dbc50207.js"] is not in for_each map)
-   resource "aws_s3_object" "origin_dist_artifact" {
-       acl                    = "private" -> null
-       bucket                 = "gost-staging-origin-357150818708-us-west-2-website" -> null
-       bucket_key_enabled     = false -> null
-       content_type           = "text/javascript" -> null
-       etag                   = "37d74ec61567562a0f5f2c8ee930c93d" -> null
-       force_destroy          = false -> null
-       id                     = "dist/js/main.dbc50207.js" -> null
-       key                    = "dist/js/main.dbc50207.js" -> null
-       metadata               = {} -> null
-       server_side_encryption = "AES256" -> null
-       source                 = "/home/runner/work/usdr-gost/usdr-gost/packages/client/dist/js/main.dbc50207.js" -> null
-       source_hash            = "37d74ec61567562a0f5f2c8ee930c93d" -> null
-       storage_class          = "STANDARD" -> null
-       tags                   = {} -> null
-       tags_all               = {
-           "env"        = "staging"
-           "management" = "terraform"
-           "owner"      = "grants"
-           "repo"       = "usdr-gost"
-           "service"    = "gost"
-           "usage"      = "workload"
        } -> null
-       version_id             = "Mxc5sKR5Vh9JmAnoyLAV_WlSsYOm5e9R" -> null
    }

  # module.website.aws_s3_object.origin_dist_artifact["js/main.dbc50207.js.map"] will be destroyed
  # (because key ["js/main.dbc50207.js.map"] is not in for_each map)
-   resource "aws_s3_object" "origin_dist_artifact" {
-       acl                    = "private" -> null
-       bucket                 = "gost-staging-origin-357150818708-us-west-2-website" -> null
-       bucket_key_enabled     = false -> null
-       content_type           = "application/json" -> null
-       etag                   = "0105913f1c7648d7d7c0dadb58a5f379" -> null
-       force_destroy          = false -> null
-       id                     = "dist/js/main.dbc50207.js.map" -> null
-       key                    = "dist/js/main.dbc50207.js.map" -> null
-       metadata               = {} -> null
-       server_side_encryption = "AES256" -> null
-       source                 = "/home/runner/work/usdr-gost/usdr-gost/packages/client/dist/js/main.dbc50207.js.map" -> null
-       source_hash            = "0105913f1c7648d7d7c0dadb58a5f379" -> null
-       storage_class          = "STANDARD" -> null
-       tags                   = {} -> null
-       tags_all               = {
-           "env"        = "staging"
-           "management" = "terraform"
-           "owner"      = "grants"
-           "repo"       = "usdr-gost"
-           "service"    = "gost"
-           "usage"      = "workload"
        } -> null
-       version_id             = "rwkyEY2MT2UlV.3daz5t1XL_WKr2MXlZ" -> null
    }

Plan: 7 to add, 7 to change, 7 to destroy.

Pusher: @jeffsmohan, Action: pull_request_target, Workflow: Continuous Integration

Copy link
Contributor

@sanason sanason left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just one comment/question.

@@ -34,7 +34,7 @@ Vue.use(BootstrapVue);
Vue.use(IconsPlugin);
Vue.use(Vuelidate);
Vue.use(VueRouter);
Vue.component('v-select', vSelect);
Vue.component('VSelect', vSelect);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was surprised that this worked without updating all the places where <v-select> is used, until I read this - https://v2.vuejs.org/v2/guide/components-registration#Name-Casing. But it's still confusing maybe? Is there another PR where the <v-select> usages are updated to <VSelect>?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah good question! I meant to leave a note to this effect on the PR but forgot when writing it up.

As you saw at the link you pointed to, when a component is defined in PascalCase, you can reference it in either PascalCase or kebab-case in templates. That's why the change on this line didn't require the usages of v-select in templates across the site to change.

Do we want to enforce consistency here? I suppose it's arguable whether this falls under (a) "that's confusing, why is the name different?" or (b) "that's just how Vue works". But for my part, I tend to prefer consistency whenever possible (and especially when easy to enforce).

There's a lint rule available to do this — vue/component-name-in-template-casing — but apparently it's not included in the recommended set we adopted. So we have a couple options:

  1. We can add this rule to the linting migration before we go further down the implementation road.
  2. We could simply update existing v-select usages to match the VSelect casing, but skip enforcing anything with lint rules and accept that it might over time lose consistency.
  3. We could accept the status quo that Vue allows for either. (For example, we currently use most or all VueBootstrap components using kebab-casing.)

When I was talking with @TylerHendrickson about how to approach this migration, we went with the vue/recommended ruleset because it seemed like an easy way to adopt a community standard, but I'd personally be very open to going beyond and adding our own rules where it makes sense. And certainly including all the lint rules we want in a single migration project like https://github.com/usdigitalresponse/usdr-gost/milestone/21 is easier than kicking off another one later.

If we wanted to make a quick pass on other lint rules to add, I can evaluate the uncategorized vue linting rules and come up with a list of appealing ones. (For that matter, we could also take this opportunity to review how much of the @vue/airbnb base ruleset is helpful, and whether there are other eslint rules beyond vue ones that we want to add. But that all really amps up the scope of the project.)

Sorry for the essay, but what are your thoughts on a good path forward @sanason @TylerHendrickson ?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's perfectly fine if there's a desire to adopt additional standard conventions that go beyond vue/recommended. IMO the best path forward would be to document the proposed set of additional linting rules as an ADR in a pull request. That would give everyone a chance to review the proposal(s) and potentially weigh in with opinions on what should ultimately be accepted or rejected, which helps ensure that there's group accountability for the decision.

For my part, a few details I think would be useful for this ADR to include:

  1. Rationale/justification that makes clear the perceived benefit/detriment of (not) adopting each given rule.
  2. Whether any rules are not generally auto-fixable by eslint.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Alright, I may be able to take that on sometime soon, but that's obviously a bigger undertaking.

To unstick this ticket, I think I'd propose that we go with my option 3 above for now ("accept the status quo that Vue allows for either"). That is to say, unless and until we adopt stricter linting rules on the topic, we'll allow PascalCase or kebab-case for Vue components in templates, and expect devs to know and understand that they're interchangeable.

@jeffsmohan jeffsmohan requested a review from sanason March 22, 2024 16:47
@jeffsmohan
Copy link
Contributor Author

@sanason Thanks for raising a good question! After talking it through, I think my proposal would be to punt on solving it, unfortunately — see the comment thread above.

Merged main and fixed a couple conflicts. Please re-review when you get a chance!

Copy link
Contributor

@sanason sanason left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

@jeffsmohan jeffsmohan merged commit 1ed9b2c into main Mar 22, 2024
19 checks passed
@jeffsmohan jeffsmohan deleted the jmo-vue-recommended-app-files branch March 22, 2024 21:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
javascript Pull requests that update Javascript code
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants