fix(appkit): report only the actually-missing env vars in resource errors#486
Merged
Merged
Conversation
…rors ResourceRegistry.formatMissingResources and formatDevWarningBanner printed every field's env var for a missing resource via Object.values(entry.fields).map(f => f.env) — including vars already set and env-less discovery-only fields (which mapped to undefined, rendering as stray empty entries like 'set , , , PGHOST, ...'). With a multi-field resource such as Lakebase Postgres, a single unset var (e.g. PGPORT) produced a confusing message listing all seven fields. Add a private unsetEnvVars() helper that returns only the env vars that are actually unset/empty, skipping fields with no env, mirroring validate()'s own resolution check. Both formatters now list exactly what the caller must set. Add tests: only-unset-reported, and env-less fields omitted (a mutation reverting the fix fails both). Signed-off-by: MarioCadenas <MarioCadenas@users.noreply.github.com>
Contributor
|
Contributor
📦 Bundle size reportCompared against
|
| dist | raw | gzip |
|---|---|---|
| JS (runtime) | 732 KB (+3.9 KB) | 256 KB (+1.3 KB) |
| Type declarations | 276 KB (+1.9 KB) | 94 KB (+642 B) |
| Source maps | 1.4 MB (+12 KB) | 478 KB (+3.9 KB) |
| Other | 11 KB | 3.7 KB |
| Total | 2.4 MB (+17 KB) | 832 KB (+5.9 KB) |
Per-entry composition (own code — deps external (as shipped))
| Entry | Initial (gz) | Lazy (gz) | Total (gz) | node_modules (min) | Own code (min) |
|---|---|---|---|---|---|
. |
79 KB (+148 B) | 2.5 KB | 81 KB (+148 B) | external | 259 KB (+274 B) |
./beta |
39 KB (+457 B) | 231 B (+1 B) | 40 KB (+458 B) | external | 118 KB (+1.2 KB) |
./type-generator |
19 KB | 0 B | 19 KB | external | 54 KB |
Chunks:
| Entry | Chunk | Load | Size (gz) |
|---|---|---|---|
. |
index.js |
initial | 75 KB |
. |
utils.js |
initial | 4.0 KB |
. |
remote-tunnel-manager.js |
lazy | 2.5 KB |
./beta |
beta.js |
initial | 30 KB |
./beta |
databricks.js |
initial | 5.8 KB |
./beta |
service-context.js |
initial | 3.2 KB |
./beta |
client-options.js |
initial | 220 B |
./beta |
databricks.js |
lazy | 128 B |
./beta |
index.js |
lazy | 103 B |
./type-generator |
index.js |
initial | 19 KB |
@databricks/appkit-ui
npm tarball (packed): 295 KB — gzipped download (dist + bin; excludes release-only docs/NOTICE).
| dist | raw | gzip |
|---|---|---|
| JS (runtime) | 350 KB | 116 KB |
| Type declarations | 201 KB | 72 KB |
| Source maps | 669 KB | 218 KB |
| CSS | 16 KB | 3.3 KB |
| Total | 1.2 MB | 410 KB |
Per-entry composition (consumer bundle — deps bundled, peerDeps external)
| Entry | Initial (gz) | Lazy (gz) | Total (gz) | node_modules (min) | Own code (min) |
|---|---|---|---|---|---|
./js |
4.3 KB | 49 KB | 54 KB | 208 KB | 12 KB |
./js/beta |
20 B | 0 B | 20 B | 0 B | 0 B |
./react |
428 KB | 49 KB | 476 KB | 1.3 MB | 163 KB |
./react/beta |
20 B | 0 B | 20 B | 0 B | 0 B |
Chunks:
| Entry | Chunk | Load | Size (gz) |
|---|---|---|---|
./js |
index.js |
initial | 4.2 KB |
./js |
chunk |
initial | 120 B |
./js |
apache-arrow |
lazy | 49 KB |
./js/beta |
beta.js |
initial | 20 B |
./react |
index.js |
initial | 426 KB |
./react |
tslib |
initial | 2.1 KB |
./react |
apache-arrow |
lazy | 49 KB |
./react/beta |
beta.js |
initial | 20 B |
…porting The only-missing-env-var fix left three spots still using the old Object.values(fields).map(f => f.env) pattern: - validate() JSDoc @example printed every field's env var (incl. undefined for env-less fields) — now uses formatMissingResources(). - enforceValidation()'s ConfigurationError context built envVars the old way, so the structured error listed all fields while the message listed only unset ones — now uses unsetEnvVars(). - unsetEnvVars was inserted between formatMissingResources's doc comment and the method, orphaning the doc; reordered so each method keeps its own. Regenerated Class.ResourceRegistry.md. Signed-off-by: MarioCadenas <MarioCadenas@users.noreply.github.com>
MarioCadenas
enabled auto-merge (squash)
July 22, 2026 10:04
pkosiec
approved these changes
Jul 22, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
ResourceRegistry.formatMissingResources(and the dev-mode warning banner) printed every field's env var for a missing resource viaObject.values(entry.fields).map((f) => f.env)— regardless of whether that var was already set, and including env-less discovery-only fields (which map toundefinedand render as stray empty entries).For a multi-field resource like Lakebase Postgres, a single unset variable produced a confusing message listing all seven fields plus empty slots:
…even when only
PGPORTwas actually missing. The real problem was buried.Fix
Add a private
unsetEnvVars()helper that returns only the env vars that are actually unset/empty, skipping fields that declare noenv— mirroring the exact resolution check already invalidate(). BothformatMissingResourcesandformatDevWarningBannernow use it, so the error lists exactly what the caller must set:Tests
resource-registrysuite: 26/26 pass; appkit typecheck + biome clean.Scope
This is a reporting fix only. Separately, fields with a static
"value"default in the manifest (e.g.PGPORT: "5432") are still reported as missing becausevalidate()reads onlyprocess.envand ignores the"value"fallback — a deeper bug left out of this PR.Branched from
main; independent of the graceful-shutdown work in #441.This PR was created with GitHub MCP.