diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index a388a043..a2894a61 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -83,11 +83,12 @@ jobs: echo "prefix=${prefix}" } >> "${GITHUB_OUTPUT}" + # Sentry release is shoc-frontend@${GITHUB_SHA} via VITE_APP_COMMIT_SHA, + # distinct from the S3/Terraform version_label. - name: Upload private source maps run: bash scripts/upload-sourcemaps.sh env: SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} - SENTRY_RELEASE: ${{ steps.release.outputs.version_label }} - name: Read previous release pointer id: pointer diff --git a/scripts/test-verify-cloudfront-release.sh b/scripts/test-verify-cloudfront-release.sh index fcbc6c2d..7cc5607b 100755 --- a/scripts/test-verify-cloudfront-release.sh +++ b/scripts/test-verify-cloudfront-release.sh @@ -8,7 +8,9 @@ CURRENT="bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb-2-1" PREVIOUS="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-1-1" NEW_HASH="1111111111111111111111111111111111111111111111111111111111111111" OLD_HASH="0000000000000000000000000000000000000000000000000000000000000000" -INDEX_HTML='' +# Vite writes index.html with a trailing newline. Keep it in the fixture so +# the expected hash covers every served byte, exactly like dist/index.html. +INDEX_HTML=$'\n' INDEX_HASH="$(printf '%s' "${INDEX_HTML}" | python3 -c 'import hashlib,sys; print(hashlib.sha256(sys.stdin.buffer.read()).hexdigest())')" failures=0 @@ -75,12 +77,12 @@ if [[ "${url}" == *"/assets/"* ]]; then [[ -z "${output}" ]] && printf '%s' "${body}" exit 0 fi -body="$(cat "${state_dir}/index.html")" +# Serve index.html byte-for-byte, trailing newline included, like real curl. [[ -n "${dump}" ]] && printf 'HTTP/1.1 200 OK\nCache-Control: no-cache,no-store,must-revalidate\n\n' > "${dump}" if [[ -n "${output}" ]]; then - printf '%s' "${body}" > "${output}" + cat "${state_dir}/index.html" > "${output}" else - printf '%s' "${body}" + cat "${state_dir}/index.html" fi exit 0 CURL diff --git a/scripts/upload-sourcemaps.sh b/scripts/upload-sourcemaps.sh index a5a91781..d790e674 100755 --- a/scripts/upload-sourcemaps.sh +++ b/scripts/upload-sourcemaps.sh @@ -6,18 +6,13 @@ set -euo pipefail SENTRY_ORG="${SENTRY_ORG:-seahaven}" SENTRY_PROJECT="${SENTRY_PROJECT:-shoc-frontend}" COMMIT_SHA="${VITE_APP_COMMIT_SHA:-${GITHUB_SHA:-}}" -RELEASE_LABEL="${SENTRY_RELEASE:-${RELEASE_LABEL:-}}" -if [[ -n "${RELEASE_LABEL}" ]]; then - RELEASE="${RELEASE_LABEL}" -else - if [[ ! "${COMMIT_SHA}" =~ ^[0-9a-fA-F]{40}$ ]]; then - echo "::error::Source-map upload requires a 40-character VITE_APP_COMMIT_SHA or GITHUB_SHA." >&2 - exit 1 - fi - COMMIT_SHA="$(printf '%s' "${COMMIT_SHA}" | tr '[:upper:]' '[:lower:]')" - RELEASE="shoc-frontend@${COMMIT_SHA}" +if [[ ! "${COMMIT_SHA}" =~ ^[0-9a-fA-F]{40}$ ]]; then + echo "::error::Source-map upload requires a 40-character VITE_APP_COMMIT_SHA or GITHUB_SHA." >&2 + exit 1 fi +COMMIT_SHA="$(printf '%s' "${COMMIT_SHA}" | tr '[:upper:]' '[:lower:]')" +RELEASE="shoc-frontend@${COMMIT_SHA}" npm exec --no -- sentry-cli sourcemaps upload \ --org "${SENTRY_ORG}" \ diff --git a/scripts/verify-cloudfront-release.sh b/scripts/verify-cloudfront-release.sh index 2382c37c..f0ed3b7c 100755 --- a/scripts/verify-cloudfront-release.sh +++ b/scripts/verify-cloudfront-release.sh @@ -80,10 +80,11 @@ observe() { last_status="$(printf '%s\n' "${parsed}" | sed -n '1p')" last_paths="$(printf '%s\n' "${parsed}" | sed -n '2p' | tr '\037' ' ')" last_path_ok="$(printf '%s\n' "${parsed}" | sed -n '3p')" - local body - body="$(curl -fsS --max-time 30 "${SITE_URL}/" || true)" - if [[ -n "${body}" ]]; then - last_hash="$(printf '%s' "${body}" | sha256_of)" + # Hash the response stream directly. Capturing the body in "$(...)" strips + # trailing newlines, so the hash never matched dist/index.html. + local hash + if hash="$(curl -fsS --max-time 30 "${SITE_URL}/" | sha256_of)" && [[ -n "${hash}" ]]; then + last_hash="${hash}" else last_hash="unreachable" fi diff --git a/src/app/(protected)/workorders/_components/comp-doc/comp-doc-details-section.tsx b/src/app/(protected)/workorders/_components/comp-doc/comp-doc-details-section.tsx index 3a38f2e3..26ba67fd 100644 --- a/src/app/(protected)/workorders/_components/comp-doc/comp-doc-details-section.tsx +++ b/src/app/(protected)/workorders/_components/comp-doc/comp-doc-details-section.tsx @@ -46,7 +46,7 @@ export function CompDocDetailsSection({ - +
- Site ID — {row.site} + Site ID — {site.code} - Amazon.com Services LLC {row.site} + Amazon.com Services LLC {site.code} {site.street}, diff --git a/src/app/(protected)/workorders/_components/comp-doc/comp-doc-preview-summary.tsx b/src/app/(protected)/workorders/_components/comp-doc/comp-doc-preview-summary.tsx index c9716b8d..e07e3726 100644 --- a/src/app/(protected)/workorders/_components/comp-doc/comp-doc-preview-summary.tsx +++ b/src/app/(protected)/workorders/_components/comp-doc/comp-doc-preview-summary.tsx @@ -73,10 +73,10 @@ export function CompDocPreviewSummary({ margin: "2px 0", }} > - Site ID — {row.site} + Site ID — {site.code} - Amazon.com Services LLC {row.site} + Amazon.com Services LLC {site.code} {site.street}, @@ -88,8 +88,8 @@ export function CompDocPreviewSummary({ Vendor / Technician:  - {row.tech || "—"} - {row.company ? ` · ${row.company}` : ""} + {site.tech || "—"} + {site.company ? ` · ${site.company}` : ""} ); diff --git a/src/app/(protected)/workorders/_components/comp-doc/comp-doc-preview-vendor-safety.tsx b/src/app/(protected)/workorders/_components/comp-doc/comp-doc-preview-vendor-safety.tsx index 807eca19..dec94e83 100644 --- a/src/app/(protected)/workorders/_components/comp-doc/comp-doc-preview-vendor-safety.tsx +++ b/src/app/(protected)/workorders/_components/comp-doc/comp-doc-preview-vendor-safety.tsx @@ -1,18 +1,18 @@ import { Text } from "@/components/ui/text"; -import type { WorkOrderTableRow } from "@/domain/work-orders/types/work-order-table-row"; +import type { CompDocSiteInfo } from "@/domain/work-orders/types/completion-doc"; import { SAFETY_BULLETS } from "@/domain/work-orders/utils/completion-doc-procedures"; type CompDocPreviewVendorSafetyProps = { - row: WorkOrderTableRow; + site: CompDocSiteInfo; }; -export function CompDocPreviewVendorSafety({ row }: CompDocPreviewVendorSafetyProps) { +export function CompDocPreviewVendorSafety({ site }: CompDocPreviewVendorSafetyProps) { return ( <> Vendor / Technician:  - {row.tech || "—"} - {row.company ? ` · ${row.company}` : ""} + {site.tech || "—"} + {site.company ? ` · ${site.company}` : ""}