fix: validate storage provider readiness - #1065
Conversation
|
Warning Review limit reached
More reviews will be available in 22 minutes and 5 seconds. Learn how PR review limits work. Your organization has used up its prepaid credits, and credit purchases are no longer available. Enable the review add-on in the billing tab to keep reviews running — you're only billed for reviews past your plan's rate limits ($0.25/file). ⌛ How to resolve this issue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based credits. 🚦 How do rate limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan refill rate. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, the refill rate gradually slows as usage increases. The highest same-day bursts are limited more strictly. Please see our Fair Usage Limits Policy for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Pro Run ID: ⛔ Files ignored due to path filters (1)
📒 Files selected for processing (76)
📝 WalkthroughWalkthrough
Changes스토리지 공급자 준비도 강화
Sequence Diagram(s)sequenceDiagram
participant Consumer
participant DiagnosticsProvider as CloudflareImages/Cloudinary<br/>DiagnosticsProvider
participant validateConfig as validateConfig()
participant readinessCheck as readinessCheck()
participant normalizeError as normalizeError()
Consumer->>DiagnosticsProvider: getHealth(signal?)
DiagnosticsProvider->>validateConfig: Partial<Config> 검증
alt 검증 실패 (missing-config / validation-failed)
validateConfig-->>DiagnosticsProvider: throw Problem
DiagnosticsProvider-->>Consumer: HealthStatus { status: "unhealthy", problem }
else readinessCheck 미설정
DiagnosticsProvider-->>Consumer: HealthStatus { status: "healthy", liveCheck: "not_configured" }
else readinessCheck 성공
DiagnosticsProvider->>readinessCheck: { config, signal } 전달
readinessCheck-->>DiagnosticsProvider: ReadinessCheckResult (sanitize 후 반영)
DiagnosticsProvider-->>Consumer: HealthStatus { status: "healthy", liveCheck: "passed", details }
else readinessCheck 실패/예외
readinessCheck-->>DiagnosticsProvider: throw error
DiagnosticsProvider->>normalizeError: error → Problem 변환
normalizeError-->>DiagnosticsProvider: retryable-upstream / terminal-upstream / validation-failed
DiagnosticsProvider-->>Consumer: HealthStatus { status: "degraded", problem, details }
end
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
📊 Benchmark Results❌ Some benchmarks failed Gate failures
Updated: 2026-06-22T09:18:52.988Z · Commit: ae8bee3 |
3c7d335 to
0fb7711
Compare
There was a problem hiding this comment.
Actionable comments posted: 4
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In
`@packages/docs/src/content/docs/api/storage-cloudflare/src/classes/CloudflareImagesMissingConfigProblem.md`:
- Line 8: The class description for CloudflareImagesMissingConfigProblem is
incorrectly generic and describes a base Problem class instead of the specific
purpose of this class. Update the class description on line 8 to accurately
reflect that CloudflareImagesMissingConfigProblem is a specialized Problem type
that represents the scenario when Cloudflare Images configuration is missing or
not properly configured, rather than describing it as a generic RFC 7807 Problem
Details base class.
In `@packages/storage-cloudflare/src/tests/CloudflareImagesLiveSmoke.spec.ts`:
- Around line 41-56: The error throwing pattern is inconsistent in the readiness
check logic. The first error throw (when response.ok is false) creates an Error
instance with Object.assign to add properties, but the second error throw (when
payload.success is false) throws a plain object instead of an Error instance.
Make both error throws consistent by changing the second throw statement to use
Object.assign with a new Error instance, similar to how the first error is
constructed, ensuring both paths throw proper Error instances with their
respective properties (code and message) attached.
In `@packages/storage-cloudinary/src/libs/CloudinaryDiagnosticsProvider.ts`:
- Around line 297-310: The getCloudinaryErrorMessage() function only extracts
the top-level message property but Cloudinary SDK returns errors in a nested
structure like { error: { message } }. Add an additional check in
getCloudinaryErrorMessage() to also look for the message property within the
nested error.error structure before returning the fallback. Similarly, update
the createCloudinaryStorageErrorContext() function to parse nested error
properties by checking record?.error for additional fields like status,
http_code, and statusCode that may be nested within the error object, ensuring
these properties are extracted and included in the error context returned by the
function.
In `@packages/storage-cloudinary/src/libs/CloudinaryProvider.ts`:
- Around line 192-195: In the HTTP fetch failure handling block where
createHttpError is being called with fetchedResponse.status, replace this
generic Error creation with a Problem-based exception by calling
normalizeCloudinaryStorageError instead. Pass the appropriate error context and
the status code to normalizeCloudinaryStorageError, then throw the result
directly. This ensures consistency with the file's exception contract of
throwing only Problem subclasses rather than generic Error instances.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: 702e2939-7c5e-4a13-a5ac-0997861f78a5
⛔ Files ignored due to path filters (1)
pnpm-lock.yamlis excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (74)
.changeset/storage-provider-readiness.md.github/workflows/ci.ymlREADME.mddocs/package-catalog.jsondocs/package-docs-baseline.jsondocs/package-docs-report.mddocs/problem-code-registry.jsonpackages/docs/astro.config.mjspackages/docs/package.jsonpackages/docs/src/content/docs/api/problems-core/src/classes/Problem.mdpackages/docs/src/content/docs/api/storage-cloudflare/src/classes/CloudflareImagesDiagnosticsProvider.mdpackages/docs/src/content/docs/api/storage-cloudflare/src/classes/CloudflareImagesMissingConfigProblem.mdpackages/docs/src/content/docs/api/storage-cloudflare/src/classes/CloudflareImagesProvider.mdpackages/docs/src/content/docs/api/storage-cloudflare/src/classes/CloudflareImagesRetryableUpstreamProblem.mdpackages/docs/src/content/docs/api/storage-cloudflare/src/classes/CloudflareImagesTerminalUpstreamProblem.mdpackages/docs/src/content/docs/api/storage-cloudflare/src/classes/CloudflareImagesValidationProblem.mdpackages/docs/src/content/docs/api/storage-cloudflare/src/functions/createCloudflareImagesResponseProblem.mdpackages/docs/src/content/docs/api/storage-cloudflare/src/functions/normalizeCloudflareImagesError.mdpackages/docs/src/content/docs/api/storage-cloudflare/src/functions/validateCloudflareImagesOptions.mdpackages/docs/src/content/docs/api/storage-cloudflare/src/type-aliases/CloudflareImageDetails.mdpackages/docs/src/content/docs/api/storage-cloudflare/src/type-aliases/CloudflareImagesConfigKey.mdpackages/docs/src/content/docs/api/storage-cloudflare/src/type-aliases/CloudflareImagesDiagnosticsOptions.mdpackages/docs/src/content/docs/api/storage-cloudflare/src/type-aliases/CloudflareImagesErrorContext.mdpackages/docs/src/content/docs/api/storage-cloudflare/src/type-aliases/CloudflareImagesOptions.mdpackages/docs/src/content/docs/api/storage-cloudflare/src/type-aliases/CloudflareImagesReadinessCheckContext.mdpackages/docs/src/content/docs/api/storage-cloudflare/src/type-aliases/CloudflareImagesReadinessCheckResult.mdpackages/docs/src/content/docs/api/storage-cloudflare/src/type-aliases/CloudflareTransformOptions.mdpackages/docs/src/content/docs/api/storage-cloudflare/src/type-aliases/CloudflareUploadResponse.mdpackages/docs/src/content/docs/api/storage-cloudflare/src/variables/CLOUDFLARE_IMAGES_OPTIONS.mdpackages/docs/src/content/docs/api/storage-cloudinary/src/classes/CloudinaryDiagnosticsProvider.mdpackages/docs/src/content/docs/api/storage-cloudinary/src/classes/CloudinaryMissingConfigProblem.mdpackages/docs/src/content/docs/api/storage-cloudinary/src/classes/CloudinaryProvider.mdpackages/docs/src/content/docs/api/storage-cloudinary/src/classes/CloudinaryRetryableUpstreamProblem.mdpackages/docs/src/content/docs/api/storage-cloudinary/src/classes/CloudinaryTerminalUpstreamProblem.mdpackages/docs/src/content/docs/api/storage-cloudinary/src/classes/CloudinaryValidationProblem.mdpackages/docs/src/content/docs/api/storage-cloudinary/src/functions/getCloudinaryErrorMessage.mdpackages/docs/src/content/docs/api/storage-cloudinary/src/functions/isRetryableCloudinaryStorageError.mdpackages/docs/src/content/docs/api/storage-cloudinary/src/functions/normalizeCloudinaryStorageError.mdpackages/docs/src/content/docs/api/storage-cloudinary/src/functions/validateCloudinaryConfig.mdpackages/docs/src/content/docs/api/storage-cloudinary/src/type-aliases/CloudinaryConfig.mdpackages/docs/src/content/docs/api/storage-cloudinary/src/type-aliases/CloudinaryConfigKey.mdpackages/docs/src/content/docs/api/storage-cloudinary/src/type-aliases/CloudinaryDiagnosticsOptions.mdpackages/docs/src/content/docs/api/storage-cloudinary/src/type-aliases/CloudinaryReadinessCheckContext.mdpackages/docs/src/content/docs/api/storage-cloudinary/src/type-aliases/CloudinaryReadinessCheckResult.mdpackages/docs/src/content/docs/api/storage-cloudinary/src/type-aliases/CloudinaryStorageErrorContext.mdpackages/docs/src/content/docs/api/storage-cloudinary/src/type-aliases/CloudinaryTransformOptions.mdpackages/docs/src/content/docs/api/storage-cloudinary/src/type-aliases/CloudinaryUploadOptions.mdpackages/docs/src/content/docs/api/storage-cloudinary/src/variables/CLOUDINARY_CONFIG.mdpackages/docs/src/content/docs/api/storage-core/src/classes/BaseStorageProvider.mdpackages/docs/src/content/docs/en/reference/extension-matrix.mdpackages/docs/src/content/docs/en/reference/problem-recovery-cookbook.mdpackages/docs/src/content/docs/en/reference/provider-maturity.mdpackages/docs/tsconfig.typedoc.jsonpackages/storage-cloudflare/README.mdpackages/storage-cloudflare/package.jsonpackages/storage-cloudflare/src/index.tspackages/storage-cloudflare/src/libs/CloudflareImagesDiagnosticsProvider.tspackages/storage-cloudflare/src/libs/CloudflareImagesProvider.tspackages/storage-cloudflare/src/tests/CloudflareImagesDiagnosticsProvider.spec.tspackages/storage-cloudflare/src/tests/CloudflareImagesLiveSmoke.spec.tspackages/storage-cloudflare/src/tests/CloudflareImagesProvider.spec.tspackages/storage-cloudflare/tsconfig.jsonpackages/storage-cloudflare/vitest.config.tspackages/storage-cloudinary/README.mdpackages/storage-cloudinary/package.jsonpackages/storage-cloudinary/src/index.tspackages/storage-cloudinary/src/libs/CloudinaryDiagnosticsProvider.tspackages/storage-cloudinary/src/libs/CloudinaryProvider.tspackages/storage-cloudinary/src/tests/CloudinaryDiagnosticsProvider.spec.tspackages/storage-cloudinary/src/tests/CloudinaryLiveSmoke.spec.tspackages/storage-cloudinary/src/tests/CloudinaryProvider.spec.tspackages/storage-cloudinary/tsconfig.jsonpackages/storage-cloudinary/vitest.config.tspublic-api-surface.snapshot.json
💤 Files with no reviewable changes (1)
- docs/package-docs-baseline.json
0fb7711 to
228b3a2
Compare
800dc61 to
5892ef3
Compare
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/create-croco-app/src/tests/PublishedCli.spec.ts`:
- Around line 13-19: There is an inconsistency between the test validation and
package dependencies. The requiredPackageArtifacts array in PublishedCli.spec.ts
includes a check for diagnostics-core artifacts via
requiredLibraryArtifacts("diagnostics-core"), but `@croco/diagnostics-core` is not
listed as a dependency in the package.json. Since the generated templates
(saasDemo.ts and package.json.hbs) actually import DiagnosticsCollector from
`@croco/diagnostics-core`, you need to resolve this mismatch by either: (1)
removing the requiredLibraryArtifacts("diagnostics-core") line from the
requiredPackageArtifacts array in PublishedCli.spec.ts if it's not actually
needed, or (2) adding `@croco/diagnostics-core` as a dependency to package.json to
match what the templates require. Verify which approach is correct by checking
if the generated templates actually need the diagnostics-core package.
In `@README.md`:
- Around line 394-395: The package count numbers on lines 394-395 in the
README.md table for the beta and alpha/WIP status rows are incorrect and need to
be updated to match the actual number of packages in the matrix. Change the 57
to 13 for the 🟡 beta status row and change the 28 to 25 for the 🔴 alpha/WIP
status row to accurately reflect the actual package counts in the table.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: dca0feab-1e7e-480b-8701-3d5cbad2e446
📒 Files selected for processing (23)
.changeset/storage-provider-readiness.md.github/workflows/ci.ymlREADME.mddocs/package-catalog.jsondocs/package-docs-baseline.jsondocs/package-docs-report.mddocs/problem-code-registry.jsonpackages/create-croco-app/src/tests/PublishedCli.spec.tspackages/docs/astro.config.mjspackages/docs/package.jsonpackages/docs/src/content/docs/api/problems-core/src/classes/Problem.mdpackages/docs/src/content/docs/api/storage-cloudflare/src/classes/CloudflareImagesDiagnosticsProvider.mdpackages/docs/src/content/docs/api/storage-cloudflare/src/classes/CloudflareImagesMissingConfigProblem.mdpackages/docs/src/content/docs/api/storage-cloudflare/src/classes/CloudflareImagesProvider.mdpackages/docs/src/content/docs/api/storage-cloudflare/src/classes/CloudflareImagesRetryableUpstreamProblem.mdpackages/docs/src/content/docs/api/storage-cloudflare/src/classes/CloudflareImagesTerminalUpstreamProblem.mdpackages/docs/src/content/docs/api/storage-cloudflare/src/classes/CloudflareImagesValidationProblem.mdpackages/docs/src/content/docs/api/storage-cloudflare/src/functions/createCloudflareImagesResponseProblem.mdpackages/docs/src/content/docs/api/storage-cloudflare/src/functions/normalizeCloudflareImagesError.mdpackages/docs/src/content/docs/api/storage-cloudflare/src/functions/validateCloudflareImagesOptions.mdpackages/docs/src/content/docs/api/storage-cloudflare/src/type-aliases/CloudflareImageDetails.mdpackages/docs/src/content/docs/api/storage-cloudflare/src/type-aliases/CloudflareImagesConfigKey.mdpackages/docs/src/content/docs/api/storage-cloudflare/src/type-aliases/CloudflareImagesDiagnosticsOptions.md
💤 Files with no reviewable changes (13)
- packages/docs/src/content/docs/api/storage-cloudflare/src/functions/normalizeCloudflareImagesError.md
- packages/docs/src/content/docs/api/storage-cloudflare/src/functions/createCloudflareImagesResponseProblem.md
- packages/docs/src/content/docs/api/storage-cloudflare/src/type-aliases/CloudflareImagesDiagnosticsOptions.md
- packages/docs/src/content/docs/api/storage-cloudflare/src/functions/validateCloudflareImagesOptions.md
- packages/docs/src/content/docs/api/storage-cloudflare/src/classes/CloudflareImagesMissingConfigProblem.md
- packages/docs/src/content/docs/api/storage-cloudflare/src/classes/CloudflareImagesDiagnosticsProvider.md
- packages/docs/src/content/docs/api/storage-cloudflare/src/classes/CloudflareImagesProvider.md
- packages/docs/src/content/docs/api/storage-cloudflare/src/type-aliases/CloudflareImageDetails.md
- packages/docs/src/content/docs/api/storage-cloudflare/src/classes/CloudflareImagesValidationProblem.md
- packages/docs/src/content/docs/api/storage-cloudflare/src/classes/CloudflareImagesTerminalUpstreamProblem.md
- packages/docs/src/content/docs/api/storage-cloudflare/src/classes/CloudflareImagesRetryableUpstreamProblem.md
- docs/package-docs-baseline.json
- packages/docs/src/content/docs/api/storage-cloudflare/src/type-aliases/CloudflareImagesConfigKey.md
5892ef3 to
db6ef39
Compare
Fixes #944.
Summary
Verification
pnpm --filter @croco/storage-cloudflare testpnpm --filter @croco/storage-cloudinary testpnpm --filter @croco/storage-cloudflare typecheckpnpm --filter @croco/storage-cloudinary typecheckpnpm --filter @croco/storage-cloudflare buildpnpm --filter @croco/storage-cloudinary buildpnpm docs:catalog:checkpnpm public-api:checkpnpm problem-registry:checkpnpm package-manifests:checkpnpm changeset-required:check -- --base origin/trunk --head HEADpnpm exec oxlint packages/storage-cloudflare packages/storage-cloudinary packages/docs/astro.config.mjs packages/docs/tsconfig.typedoc.jsongit diff --checkgit diff --name-only --diff-filter=ACM -z | xargs -0 pnpm exec oxfmt --checkpnpm testhook: 223 tasks passedpnpm typecheckhook: 222 tasks passedSelf-review gates
list()method was added toStorageProvider; live provider credentials are not required in default CI; Cloudflare remains alpha due documented metadata limits.Risk
Summary by CodeRabbit
릴리스 노트
New Features
Documentation
Improvements
Tests