-
Notifications
You must be signed in to change notification settings - Fork 21
docs: add Diátaxis taxonomy labels to documentation categories #1026
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
Merged
Merged
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| { | ||
| "label": "Explanation", | ||
| "position": 5, | ||
| "link": { | ||
| "type": "generated-index", | ||
| "description": "Conceptual guides understanding API design philosophy" | ||
| } | ||
| } |
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,102 @@ | ||
| # Decoding JSON from Headers, Query Parameters, and URL Parameters | ||
|
|
||
| Though we know headers, URL parameters, and query parameters will be received as a | ||
| `string` or `string[]` value, due to a limitation in api-ts, `httpRequest` only accepts | ||
| codecs that decode values starting from the `unknown` type. Consequently, decoding a | ||
| header, URL parameter, or query parameter with a codec like `JsonFromString`, which can | ||
| only decode values typed as `string`, will produce a error like: | ||
|
|
||
| ``` | ||
| Type 'Type<Json, string, string>' is not assignable to type 'Mixed'. | ||
| Types of property 'validate' are incompatible. | ||
| Type 'Validate<string, Json>' is not assignable to type 'Validate<unknown, any>'. | ||
| Type 'unknown' is not assignable to type 'string'. | ||
| ``` | ||
|
|
||
| There's a straightforward pattern you can use when you have a value typed as `unknown` | ||
| but need to decode it with a codec that can only decode a narrower type. This pattern is | ||
| called <em>codec chaining</em>: | ||
|
|
||
| ```typescript | ||
| declare const JsonFromString: t.Type<Json, string, string>; | ||
| declare const t.string: t.Type<string, string, unknown>; | ||
|
|
||
| const myCodec: t.Type<Json, string, unknown> = t.string.pipe(JsonFromString); | ||
| ``` | ||
|
|
||
| Here, `t.string` decodes a value from `unknown` to `string`, and then `JsonFromString` | ||
| decodes the same value from `string` to `Json`. | ||
|
|
||
| For example: | ||
|
|
||
| ```typescript | ||
| import * as t from 'io-ts'; | ||
| import { nonEmptyArray, JsonFromString, NumberFromString } from 'io-ts-types'; | ||
| import { httpRequest, optional } from '@api-ts/io-ts-http'; | ||
|
|
||
| // Define the Filter type for the JSON string | ||
| const Filter = t.type({ | ||
| category: t.string, | ||
| tags: t.array(t.string), | ||
| price: t.type({ | ||
| min: t.number, | ||
| max: t.number, | ||
| }), | ||
| }); | ||
|
|
||
| // Define the SearchRequest codec | ||
| const SearchRequest = httpRequest({ | ||
| params: { | ||
| userId: NumberFromString, | ||
| }, | ||
| query: { | ||
| q: t.string, | ||
| filter: t.string.pipe(JsonFromString).pipe(Filter), | ||
| tags: nonEmptyArray(t.string), | ||
| sort: optional(t.string), | ||
| }, | ||
| headers: { | ||
| authorization: t.string, | ||
| }, | ||
| }); | ||
|
|
||
| // Example request object | ||
| const example = { | ||
| params: { | ||
| userId: '84938492', | ||
| }, | ||
| query: { | ||
| q: 'test', | ||
| filter: | ||
| '{"category":"books","tags":["crypto","trading"],"price":{"min":10,"max":50}}', | ||
| tags: ['tag1', 'tag2', 'tag3'], | ||
| sort: 'price', | ||
| }, | ||
| headers: { | ||
| authorization: 'Bearer token', | ||
| }, | ||
| }; | ||
|
|
||
| // Decode the example | ||
| const decoded = SearchRequest.decode(example); | ||
| if (decoded._tag === 'Right') { | ||
| console.log(decoded); | ||
| /* | ||
| Expected decoded output | ||
| { | ||
| userId: 84938492, | ||
| q: 'test', | ||
| filter: { | ||
| category: 'books', | ||
| tags: ['crypto', 'trading'], | ||
| price: { min: 10, max: 50 }, | ||
| }, | ||
| tags: ['tag1', 'tag2', 'tag3'], | ||
| sort: 'price', | ||
| authorization: 'Bearer token', | ||
| }; | ||
| */ | ||
| } else { | ||
| console.error('Decoding failed:', decoded.left); | ||
| } | ||
| ``` |
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| { | ||
| "label": "Reference", | ||
| "position": 4, | ||
| "link": { | ||
| "type": "generated-index", | ||
| "description": "Technical specifications and API reference documentation" | ||
| } | ||
| } |
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
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.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@youngjungithub This duplicates content between the how-to guide and explanation. I've heard our technical writers mention how this can increase the maintenance burden, because now we have to keep two copies of the same data in sync over time.
Is this intentional, or do you have any ideas on how we can duplicate only the essential information?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes it is intentional. To minimize maintenance burden we:
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
How does that translate to a plan for this document? https://github.com/BitGo/api-ts/blob/audit-docs/website/docs/how-to-guides/parsing.json-strings.md
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is the plan I have:
parsing.json-strings file
parsing-codec-chaining file