Skip to content

fix: parse nested JSON values for body flags#5

Merged
EvilFreelancer merged 1 commit intoEvilFreelancer:mainfrom
veged:fix/nested-body-json-flags
Mar 17, 2026
Merged

fix: parse nested JSON values for body flags#5
EvilFreelancer merged 1 commit intoEvilFreelancer:mainfrom
veged:fix/nested-body-json-flags

Conversation

@veged
Copy link
Copy Markdown
Contributor

@veged veged commented Mar 16, 2026

Summary

openapi-to-cli assembles JSON request bodies from CLI flags, but nested values (objects, arrays) are sent as raw strings instead of parsed JSON. This makes endpoints expecting nested payloads unusable.

Before (broken):

{
  "revision": "main",
  "input": "{\"values\":[{\"name\":\"FOO\",\"value\":\"bar\"}]}"
}

After (fixed):

{
  "revision": "main",
  "input": {
    "values": [{ "name": "FOO", "value": "bar" }]
  }
}

Root cause

In runApiCommand(), unknown flags (body fields) are copied into the request body as-is. Since parseArgs() treats all values as strings, JSON objects/arrays remain strings.

Changes

  • Added parseBodyFlagValue() helper in src/cli.ts that:
    • Parses values starting with { or [ as JSON
    • Converts true/false/null literals to JSON primitives
    • Throws a clear error on malformed JSON-like values
    • Leaves plain strings unchanged
  • Applied only to body fields (path/query parameters are unaffected)
  • Added 6 regression tests in tests/cli.test.ts

Intentional limitations

  • Numbers are not auto-coerced (avoids breaking APIs expecting "123" as a string)
  • This is not schema-aware — a follow-up could extract body options from the OpenAPI spec for richer --help and validation

Test plan

  • JSON object body flag → parsed as object
  • JSON array body flag → parsed as array
  • Boolean body flags (true/false) → parsed as booleans
  • null body flag → parsed as null
  • Plain string body flag → preserved as string
  • Invalid JSON-like body flag → throws clear error
  • All existing tests pass

🤖 Generated with Claude Code

Body flag values starting with `{` or `[` are now parsed as JSON objects/arrays
instead of being sent as raw strings. Boolean literals (`true`/`false`) and `null`
are also parsed into their JSON equivalents. Invalid JSON-like values throw a clear
error. Plain string values are preserved unchanged.

This fixes endpoints that expect nested JSON payloads (e.g. objects, arrays) in
request bodies assembled from CLI flags.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@EvilFreelancer
Copy link
Copy Markdown
Owner

Hi! Thanks, good PR.

@EvilFreelancer EvilFreelancer merged commit 3453d51 into EvilFreelancer:main Mar 17, 2026
@EvilFreelancer
Copy link
Copy Markdown
Owner

Your fix in v0.1.9

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants