-
Notifications
You must be signed in to change notification settings - Fork 331
Merge 3.2.0 release documentation #650
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
Conversation
#634) * KTOR-8469 Add documentation about wrapWithContent and wrap deprecation * implementing review comments * implementing TWr review comments
#634) * KTOR-8469 Add documentation about wrapWithContent and wrap deprecation * implementing review comments * implementing TWr review comments
* add HTMX integration to what's new doc * add a new HTMX topic, code example, and experimental label
Co-authored-by: Vik Nikolova <[email protected]>
[KTOR-8541](https://youtrack.jetbrains.com/issue/KTOR-8541/Documentation-for-Support-suspendable-module-methods) Support for suspendable module methods
…king requests and what's new (#644) * update: unix domain sockets, explained * update: start with the general request builder, with default request as a special case * update: adding UDS to what's new 3.2.0 --------- Co-authored-by: Vik Nikolova <[email protected]>
* Add documentation for DI in whats-new-320.md * Create a new topic for DI
WalkthroughThis change introduces a new HTMX integration sample module to the codebase, including its Gradle configuration, source code, and documentation. It also expands documentation to cover experimental HTMX support, dependency injection, new features in Ktor 3.2.0, and improvements in dependency management, development mode, and Unix domain socket support. Minor code and documentation updates are made elsewhere for consistency. Changes
Suggested reviewers
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. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
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.
Actionable comments posted: 5
🧹 Nitpick comments (8)
topics/server-fatjar.md (1)
35-36
: Consider adding "please" for politeness.The documentation improvement is good, but consider adding "please" for a more polite tone: "please let us know by leaving a comment"
-If this workaround does not solve the problem for you, let us know by leaving a comment in [KTOR-8464](https://youtrack.jetbrains.com/issue/KTOR-8464). +If this workaround does not solve the problem for you, please let us know by leaving a comment in [KTOR-8464](https://youtrack.jetbrains.com/issue/KTOR-8464).topics/docker.md (1)
55-55
: Consider adding "please" for politeness.Similar to the server-fatjar.md file, consider adding "please" for a more polite tone.
-If this workaround does not solve the problem for you, let us know by leaving a comment in [KTOR-8464](https://youtrack.jetbrains.com/issue/KTOR-8464). +If this workaround does not solve the problem for you, please let us know by leaving a comment in [KTOR-8464](https://youtrack.jetbrains.com/issue/KTOR-8464).topics/client-default-request.md (2)
37-37
: Fix the link fragment and improve wording.The wording improvement is good, but there's an invalid link fragment that needs to be fixed.
-Or call the `defaultRequest` function and [configure](#configure) required request parameters: +Or call the `defaultRequest` function and [configure](#configure) the required request parameters:Note: Verify that the
#configure
fragment exists in the document structure.
112-112
: Consider more expressive language.The static analysis suggests using more expressive language instead of "To do that".
-To do that, pass a `unixSocket` call with the path to the socket to the `defaultRequest` function, +To configure this, pass a `unixSocket` call with the path to the socket to the `defaultRequest` function,topics/client-requests.md (1)
19-20
: Add a trailing period for list-style consistencyAll other bullet points in the list terminate with a period, but this one does not.
Keeping punctuation consistent avoids accidental diff churn later.-* Specify a Unix domain socket +* Specify a Unix domain socket.codeSnippets/settings.gradle.kts (1)
165-166
: Keep module list alphabetical for easier maintenanceThe new
htmx-integration
entry is appended to the very end of a lexicographically-sorted block.
Placing it next to the other “h***” modules (html
,html-templates
, …) keeps the file easier to scan.-// …around existing “html” section -module("snippets", "html-templates") +module("snippets", "html-templates") +module("snippets", "htmx-integration") -// …current tail of the list -module("snippets", "tutorial-server-docker-compose") -module("snippets", "htmx-integration") +module("snippets", "tutorial-server-docker-compose")codeSnippets/snippets/htmx-integration/build.gradle.kts (1)
21-33
: Clean build script with minor dependency optimization needed.The build configuration is well-structured with appropriate HTMX integration dependencies. However, there's redundancy in the server core dependencies.
Consider removing the redundant dependency:
dependencies { implementation("io.ktor:ktor-server-core-jvm") implementation("io.ktor:ktor-server-netty") implementation("ch.qos.logback:logback-classic:$logback_version") - implementation("io.ktor:ktor-server-core") implementation("io.ktor:ktor-server-htmx") implementation("io.ktor:ktor-htmx") implementation("io.ktor:ktor-htmx-html") implementation("io.ktor:ktor-server-html-builder") implementation("io.ktor:ktor-server-config-yaml") testImplementation("io.ktor:ktor-server-test-host") testImplementation("org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version") }
The
ktor-server-core-jvm
already includes the core functionality, making the additionalktor-server-core
dependency redundant.topics/whats-new-320.md (1)
45-47
: Duplicate “Ktor Server” headingA second top-level
## Ktor Server
appears a few lines after the first one, fragmenting the section hierarchy.-## Ktor Server - -### Configuration file deserialization +### Configuration file deserializationRemove the duplicate heading to keep a single, clear server section.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (22)
codeSnippets/settings.gradle.kts
(1 hunks)codeSnippets/snippets/htmx-integration/README.md
(1 hunks)codeSnippets/snippets/htmx-integration/build.gradle.kts
(1 hunks)codeSnippets/snippets/htmx-integration/src/main/kotlin/Application.kt
(1 hunks)codeSnippets/snippets/htmx-integration/src/main/kotlin/Routing.kt
(1 hunks)codeSnippets/snippets/htmx-integration/src/main/resources/application.yaml
(1 hunks)codeSnippets/snippets/htmx-integration/src/main/resources/logback.xml
(1 hunks)codeSnippets/snippets/json-kotlinx/src/test/kotlin/jsonkotlinx/ApplicationTest.kt
(1 hunks)ktor.tree
(2 hunks)labels.list
(1 hunks)topics/client-default-request.md
(3 hunks)topics/client-dependencies.md
(1 hunks)topics/client-requests.md
(3 hunks)topics/client-responses.md
(1 hunks)topics/docker.md
(1 hunks)topics/htmx-integration.md
(1 hunks)topics/server-dependencies.topic
(3 hunks)topics/server-dependency-injection.md
(1 hunks)topics/server-development-mode.topic
(1 hunks)topics/server-fatjar.md
(1 hunks)topics/server-modules.md
(1 hunks)topics/whats-new-320.md
(1 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (1)
codeSnippets/snippets/htmx-integration/src/main/kotlin/Application.kt (1)
codeSnippets/snippets/htmx-integration/src/main/kotlin/Routing.kt (1)
configureHtmx
(21-83)
🪛 markdownlint-cli2 (0.17.2)
topics/client-dependencies.md
136-136: Unordered list style
Expected: dash; Actual: asterisk
(MD004, ul-style)
137-137: Unordered list style
Expected: dash; Actual: asterisk
(MD004, ul-style)
topics/client-default-request.md
37-37: Link fragments should be valid
(MD051, link-fragments)
🪛 LanguageTool
topics/client-default-request.md
[style] ~112-~112: Consider a more expressive alternative.
Context: ...lt request with a socket parameter. To do that, pass a unixSocket
call with the...
(DO_ACHIEVE)
topics/server-fatjar.md
[style] ~36-~36: Consider using polite language here.
Context: ...und does not solve the problem for you, let us know by leaving a comment in [KTOR-8464](htt...
(INSERT_PLEASE)
topics/docker.md
[style] ~55-~55: Consider using polite language here.
Context: ...und does not solve the problem for you, let us know by leaving a comment in [KTOR-8464](htt...
(INSERT_PLEASE)
topics/server-modules.md
[style] ~86-~86: Consider a more expressive alternative.
Context: ...ously when starting the application. To do that, add the suspend
keyword: ```ko...
(DO_ACHIEVE)
topics/whats-new-320.md
[uncategorized] ~89-~89: Did you just mean “,” or “)”?
Context: ...String, val password: String? = null, ) fun Application.module() { val datab...
(COMMA_PERIOD)
[style] ~282-~282: ‘Prior to’ might be wordy. Consider a shorter alternative.
Context: ...ilder.skipSavingBody()are deprecated Prior to Ktor 3.2.0, the
SaveBodyPlugin` was in...
(EN_WORDINESS_PREMIUM_PRIOR_TO)
[uncategorized] ~284-~284: Possible missing article found.
Context: ...ccessed multiple times. To avoid saving response body, the plugin had to be disabled exp...
(AI_HYDRA_LEO_MISSING_THE)
[formatting] ~318-~318: If the ‘because’ clause is essential to the meaning, do not use a comma before the clause.
Context: ...rent plugins accessing the response body, because the first plugin to read it consumes th...
(COMMA_BEFORE_BECAUSE)
🔇 Additional comments (28)
codeSnippets/snippets/json-kotlinx/src/test/kotlin/jsonkotlinx/ApplicationTest.kt (1)
36-36
: LGTM! Correctly uses the new mutable client property.This change effectively leverages the new
ApplicationTestBuilder.client
mutable property introduced in Ktor 3.2.0, allowing for cleaner test client configuration and reuse.labels.list (1)
12-14
: LGTM! New experimental label supports HTMX features.The addition of a primary experimental label properly supports the new experimental HTMX integration features being introduced. The distinction between primary and secondary experimental labels is clear and serves different documentation purposes.
topics/server-fatjar.md (1)
32-32
: LGTM! Improved wording for better clarity.The change from "To use this feature with KMP, you'll need to move the Ktor plugin to a separate project:" to "To be able to use them together:" is clearer and less directive.
topics/docker.md (1)
51-51
: LGTM! Consistent documentation improvement.The wording change maintains consistency with the same improvement made in
topics/server-fatjar.md
, providing clearer guidance for users.topics/client-default-request.md (2)
25-26
: LGTM! Clear installation instructions.The wording improvement makes the installation instructions more straightforward and professional.
103-131
: Excellent addition of Unix domain socket support documentation.The new section effectively documents the Unix domain socket feature with clear examples and proper CIO engine restrictions. The content is well-structured and provides both individual request and default configuration examples.
topics/client-requests.md (1)
125-131
: ✅ Verifiedserver-configuration-code.topic#cio-code
link
- The file
topics/server-configuration-code.topic
exists.- It defines
<chapter title="CIO" id="cio-code">
at line 144.No changes are needed.
topics/client-responses.md (1)
79-83
: LGTM – clear explanation of body caching vs. streamingThe added paragraph succinctly warns about memory usage and cross-links to the streaming section. No issues spotted.
codeSnippets/snippets/htmx-integration/README.md (1)
5-13
: Looks good – run command and context are clearThe README is concise and provides the exact Gradle invocation; no corrections needed.
codeSnippets/snippets/htmx-integration/src/main/resources/application.yaml (1)
1-6
: Configuration file is valid and minimalIndentation and keys match Ktor’s expected schema (
ktor.application.modules
,ktor.deployment.port
).
Nothing to change.codeSnippets/snippets/htmx-integration/src/main/kotlin/Application.kt (1)
1-11
: LGTM! Clean and standard Ktor application entry point.The implementation follows Ktor best practices:
- Standard main function delegating to EngineMain
- Proper module extension function structure
- Clean separation of concerns with
configureHtmx()
defined in the routing filetopics/client-dependencies.md (1)
108-150
: Excellent addition of version consistency guidance.The new "Ensure Ktor version consistency" section provides comprehensive examples for all major build systems (Gradle Kotlin/Groovy DSL and Maven). The BOM approach simplifies dependency management and reduces version conflicts.
codeSnippets/snippets/htmx-integration/src/main/resources/logback.xml (1)
1-12
: Standard and appropriate Logback configuration.The configuration follows best practices:
- Comprehensive console appender with detailed pattern
- Appropriate INFO level for root and framework loggers
- Clean structure suitable for a sample application
ktor.tree (3)
56-56
: Appropriate TOC addition for dependency injection documentation.The new
server-dependency-injection.md
entry is well-placed under the server configuration section, aligning with the logical organization of server setup topics.
380-380
: Well-positioned HTMX integration documentation.The
htmx-integration.md
entry is appropriately placed in the "Integrations" section, making it discoverable alongside other integration topics.
386-386
: Logical placement for release notes.The
whats-new-320.md
entry is properly positioned in the "Releases" section, following the established pattern for version-specific documentation.topics/server-development-mode.topic (2)
64-79
: Well-structured documentation improvement.The restructuring of the system property documentation into multiple paragraphs significantly improves readability and clarity. The separation of IntelliJ IDEA and Gradle instructions makes the content easier to follow.
83-99
: Clear and practical Gradle configuration options.The two approaches for enabling development mode in Gradle are well-documented and provide flexibility for different use cases. The distinction between persistent configuration and single-run flag is valuable.
topics/server-modules.md (2)
83-102
: Excellent addition of concurrent module loading documentation.The new section clearly explains the purpose and benefits of suspendable application modules. The example code demonstrates proper usage with the
suspend
keyword.
105-121
: Important clarification about threading model.The dependency injection examples are well-crafted and the note about single-threaded execution despite the "concurrent" name is crucial for preventing misconceptions about thread safety.
topics/htmx-integration.md (3)
1-33
: Comprehensive introduction to HTMX integration.The documentation structure is excellent, with clear module overview and proper experimental labeling. The three-module approach is well-explained and the experimental nature is appropriately highlighted.
94-116
: Excellent HTML DSL extension example.The code example clearly demonstrates the integration between Kotlin HTML DSL and HTMX attributes. The generated HTML output helps readers understand the transformation.
117-154
: Comprehensive server-side routing documentation.The routing examples cover various HTMX scenarios effectively, showing how to handle different request types and target-specific responses. The progression from basic to advanced usage is well-structured.
codeSnippets/snippets/htmx-integration/src/main/kotlin/Routing.kt (2)
21-53
: Excellent HTMX demonstration with practical examples.The
configureHtmx()
function provides a comprehensive demonstration of HTMX integration. The HTML structure with HTMX attributes is well-organized and shows real-world usage patterns.
55-83
: Well-structured routing examples for different HTMX scenarios.The routing logic effectively demonstrates how to handle regular requests, HTMX requests, and target-specific HTMX requests. The progression from general to specific handling is logical and educational.
topics/server-dependencies.topic (3)
195-200
: Good placement of logging dependency information.Moving the logging dependency section earlier in the document improves the logical flow and makes this essential information more discoverable.
209-283
: Excellent addition of version catalog documentation.The new version catalog section provides valuable information about centralized dependency management. The benefits are clearly outlined and the examples are practical and easy to follow.
209-209
: Smart use of variable for modularity.The
target_module
variable enables content reuse across server and client documentation, promoting consistency and maintainability.
call.respondHtml { | ||
head { | ||
// Include HTMX library | ||
script(src = "https://unpkg.com/[email protected]") {} |
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.
💡 Verification agent
🧩 Analysis chain
Consider pinning HTMX version for consistency.
The HTMX library is loaded from a CDN with a specific version (1.9.10). Consider verifying this is the intended version for the sample.
🌐 Web query:
What is the latest stable version of HTMX?
💡 Result:
The latest stable version of HTMX is 2.0.4, released on December 13, 2024. (github.com) This release introduced several improvements and bug fixes. For a comprehensive list of changes, you can refer to the HTMX changelog.
Citations:
Update HTMX version to the latest stable release
The snippet currently pins HTMX at 1.9.10, but the latest stable version is 2.0.4 (released December 13, 2024). Updating to 2.0.4 ensures you pick up the newest features and bug fixes.
• File: codeSnippets/snippets/htmx-integration/src/main/kotlin/Routing.kt
Line: 28
Suggested change:
- script(src = "https://unpkg.com/[email protected]") {}
+ script(src = "https://unpkg.com/[email protected]") {}
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
script(src = "https://unpkg.com/htmx.org@1.9.10") {} | |
script(src = "https://unpkg.com/htmx.org@2.0.4") {} |
🤖 Prompt for AI Agents
In codeSnippets/snippets/htmx-integration/src/main/kotlin/Routing.kt at line 28,
update the HTMX script source URL from version 1.9.10 to the latest stable
version 2.0.4 by changing the version number in the src attribute to ensure the
application uses the newest features and bug fixes.
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.
Actionable comments posted: 2
♻️ Duplicate comments (1)
topics/whats-new-320.md (1)
90-92
: Missing type parameter inproperty()
call still breaks compilation
property
is generic; omitting the type argument produces a compile-time error.- val databaseConfig: DatabaseConfig = property("database") + val databaseConfig: DatabaseConfig = property<DatabaseConfig>("database")
🧹 Nitpick comments (1)
topics/whats-new-320.md (1)
360-363
: Unified bullet marker style (MD004)The rest of the document uses
*
; switch from-
to maintain consistency and satisfy markdown-lint.-- HTMX-aware routing for handling HTMX requests based on headers. -- HTML DSL extensions to generate HTMX attributes in Kotlin. -- HTMX header constants and values to eliminate string literals. +* HTMX-aware routing for handling HTMX requests based on headers. +* HTML DSL extensions to generate HTMX attributes in Kotlin. +* HTMX header constants and values to eliminate string literals.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
topics/whats-new-320.md
(1 hunks)
🧰 Additional context used
🪛 LanguageTool
topics/whats-new-320.md
[uncategorized] ~87-~87: Did you just mean “,” or “)”?
Context: ...String, val password: String? = null, ) fun Application.module() { val datab...
(COMMA_PERIOD)
[style] ~278-~278: ‘Prior to’ might be wordy. Consider a shorter alternative.
Context: ...ilder.skipSavingBody()are deprecated Prior to Ktor 3.2.0, the
SaveBodyPlugin` was in...
(EN_WORDINESS_PREMIUM_PRIOR_TO)
[uncategorized] ~280-~280: Possible missing article found.
Context: ...ccessed multiple times. To avoid saving response body, the plugin had to be disabled exp...
(AI_HYDRA_LEO_MISSING_THE)
[formatting] ~314-~314: If the ‘because’ clause is essential to the meaning, do not use a comma before the clause.
Context: ...rent plugins accessing the response body, because the first plugin to read it consumes th...
(COMMA_BEFORE_BECAUSE)
🪛 markdownlint-cli2 (0.17.2)
topics/whats-new-320.md
360-360: Unordered list style
Expected: asterisk; Actual: dash
(MD004, ul-style)
361-361: Unordered list style
Expected: asterisk; Actual: dash
(MD004, ul-style)
362-362: Unordered list style
Expected: asterisk; Actual: dash
(MD004, ul-style)
val kubernetesConnection = dependencies.resolve() // suspends until provided | ||
} |
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.
dependencies.resolve()
must specify the target type
resolve()
is declared with a reified type parameter; calling it without one won’t compile.
- val kubernetesConnection = dependencies.resolve() // suspends until provided
+ val kubernetesConnection: KubernetesConnection =
+ dependencies.resolve<KubernetesConnection>() // suspends until provided
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
val kubernetesConnection = dependencies.resolve() // suspends until provided | |
} | |
val kubernetesConnection: KubernetesConnection = | |
dependencies.resolve<KubernetesConnection>() // suspends until provided | |
} |
🤖 Prompt for AI Agents
In topics/whats-new-320.md around lines 214 to 215, the call to
dependencies.resolve() is missing the required reified type parameter, causing a
compilation error. Fix this by specifying the target type explicitly in the
resolve() call, for example dependencies.resolve<DesiredType>(), to ensure the
code compiles correctly.
val connection: Connection = application.property("connection") | ||
``` |
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.
Type parameter missing in application.property
access
application.property()
is also generic. Add the type argument to obtain the correct object.
-val connection: Connection = application.property("connection")
+val connection: Connection = application.property<Connection>("connection")
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
val connection: Connection = application.property("connection") | |
``` | |
val connection: Connection = application.property<Connection>("connection") |
🤖 Prompt for AI Agents
In topics/whats-new-320.md around lines 268 to 269, the call to
application.property() is missing the required generic type parameter. Add the
appropriate type argument inside the angle brackets to application.property to
ensure it returns the correct typed object, for example
application.property<Type>(), replacing Type with the expected type.
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.
Actionable comments posted: 0
♻️ Duplicate comments (3)
topics/whats-new-320.md (3)
92-94
:property()
call missing generic type parameterThe sample won’t compile without specifying the target type.
- val databaseConfig: DatabaseConfig = property("database") + val databaseConfig: DatabaseConfig = property<DatabaseConfig>("database")
215-217
: Add type argument todependencies.resolve()
resolve()
is reified; omitting the type parameter causes a compilation error.- val kubernetesConnection = dependencies.resolve() // suspends until provided + val kubernetesConnection: KubernetesConnection = + dependencies.resolve<KubernetesConnection>() // suspends until provided
269-271
: Generic type needed forapplication.property()
Include the type argument so the example compiles:
-val connection: Connection = application.property("connection") +val connection: Connection = application.property<Connection>("connection")
🧹 Nitpick comments (3)
topics/server-modules.md (2)
110-112
: Use accurate code-fence language for Gradle snippets
none
disables syntax highlighting and is inconsistent with other Gradle-property examples.
Switch toproperties
for clearer rendering.-```none +```properties ktor.application.startup = concurrent
94-97
: Avoid ambiguity about “independent” vs single-threaded loadingStating that modules “launch independently” can imply multithreading, but the note on lines 129-132 clarifies the process remains single-threaded.
Consider appending “(still single-threaded)” to this sentence to prevent confusion.topics/whats-new-320.md (1)
281-283
: Simplify wording“Prior to” is overly formal—“Before Ktor 3.2.0” is shorter and clearer.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (2)
topics/server-modules.md
(1 hunks)topics/whats-new-320.md
(1 hunks)
🧰 Additional context used
🪛 LanguageTool
topics/whats-new-320.md
[uncategorized] ~89-~89: Did you just mean “,” or “)”?
Context: ...String, val password: String? = null, ) fun Application.module() { val datab...
(COMMA_PERIOD)
[style] ~280-~280: ‘Prior to’ might be wordy. Consider a shorter alternative.
Context: ...ilder.skipSavingBody()are deprecated Prior to Ktor 3.2.0, the
SaveBodyPlugin` was in...
(EN_WORDINESS_PREMIUM_PRIOR_TO)
[uncategorized] ~282-~282: Possible missing article found.
Context: ...ccessed multiple times. To avoid saving response body, the plugin had to be disabled exp...
(AI_HYDRA_LEO_MISSING_THE)
[formatting] ~316-~316: If the ‘because’ clause is essential to the meaning, do not use a comma before the clause.
Context: ...rent plugins accessing the response body, because the first plugin to read it consumes th...
(COMMA_BEFORE_BECAUSE)
topics/server-modules.md
[style] ~86-~86: Consider a more expressive alternative.
Context: ...ously when starting the application. To do that, add the suspend
keyword: ```ko...
(DO_ACHIEVE)
🪛 markdownlint-cli2 (0.17.2)
topics/whats-new-320.md
362-362: Unordered list style
Expected: asterisk; Actual: dash
(MD004, ul-style)
363-363: Unordered list style
Expected: asterisk; Actual: dash
(MD004, ul-style)
364-364: Unordered list style
Expected: asterisk; Actual: dash
(MD004, ul-style)
All changes included have been individually reviewed.