Conversation
|
Warning Rate limit exceeded
Your organization is not enrolled in usage-based pricing. Contact your admin to enable usage-based pricing to continue reviews beyond the rate limit, or try again in 13 minutes and 27 seconds. ⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout. Please see our FAQ for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: ⛔ Files ignored due to path filters (1)
📒 Files selected for processing (4)
📝 WalkthroughWalkthroughThis PR adds a new RSCG (Roslyn Source Code Generator) example for lomapper, a lightweight object mapper using compile-time source generation. It increments the total example count from 264 to 265, includes a complete working sample project with documentation, and updates all related indices, category lists, and website pages to reflect the new entry. Changes
Estimated code review effort🎯 2 (Simple) | ⏱️ ~10 minutes Poem
🚥 Pre-merge checks | ✅ 1 | ❌ 2❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (1 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 |
There was a problem hiding this comment.
Pull request overview
This PR adds a new RSCG example for LoMapper (object mapping via source generators) to the v2 examples set, and updates the website/book/export artifacts to include it in the “Serializer” category and overall counts.
Changes:
- Add a new
lomapperexample project (csproj + demo code) and its metadata (description/nuget/readme/video/tour). - Regenerate site/docs/book outputs and exports to include the new example and increment totals to 265.
- Update generator registry data (
GeneratorDataRec.json,all.csv, exports) to include the new entry.
Reviewed changes
Copilot reviewed 26 out of 28 changed files in this pull request and generated 6 comments.
Show a summary per file
| File | Description |
|---|---|
| v2/RSCGExamplesData/GeneratorDataRec.json | Registers the new generator entry (ID/category/start date). |
| v2/rscg_examples/lomapper/video.json | Adds the scripted video steps for the example. |
| v2/rscg_examples/lomapper/src/mapperDemo/Program.cs | Demo usage: maps Person to PersonDTO and prints FullName. |
| v2/rscg_examples/lomapper/src/mapperDemo/PersonDTO.cs | Defines DTO + mapper declaration via attributes. |
| v2/rscg_examples/lomapper/src/mapperDemo/Person.cs | Defines the source model used in the mapping demo. |
| v2/rscg_examples/lomapper/src/mapperDemo/mapperDemo.csproj | New .NET project referencing the LoMapper package. |
| v2/rscg_examples/lomapper/src/mapperDemo.slnx | Solution container for the demo project. |
| v2/rscg_examples/lomapper/readme.txt | Captures upstream readme content for the docs pipeline. |
| v2/rscg_examples/lomapper/nuget.txt | Short NuGet description text used by the generator pipeline. |
| v2/rscg_examples/lomapper/description.json | Adds generator metadata + lists demo files for documentation generation. |
| v2/rscg_examples_site/static/sources/lomapper.zip | Adds downloadable zipped source for the example. |
| v2/rscg_examples_site/static/exports/RSCG.xlsx | Updates Excel export to include the new example. |
| v2/rscg_examples_site/static/exports/RSCG.json | Updates JSON export to include the new example. |
| v2/rscg_examples_site/src/components/HomepageFeatures/index.js | Updates homepage count from 264 to 265. |
| v2/rscg_examples_site/docs/RSCG-Examples/lomapper.md | Adds the new Docusaurus page for the LoMapper example. |
| v2/rscg_examples_site/docs/RSCG-Examples/index.md | Updates category counts and inserts the new example into lists/graph. |
| v2/rscg_examples_site/docs/indexRSCG.md | Updates the master chronological list (now 265 entries). |
| v2/rscg_examples_site/docs/Categories/Serializer.md | Updates category page count and inserts the new example link. |
| v2/rscg_examples_site/docs/Categories/_PrimitiveSerializer.mdx | Updates “same category” include list to add the new example. |
| v2/rscg_examples_site/docs/Authors/Junaid_Desai.md | Adds a new author page for the LoMapper author. |
| v2/rscg_examples_site/docs/about.md | Updates the overall RSCG example count in the About page. |
| v2/Generator/all.csv | Appends the new generator to the CSV inventory list. |
| v2/book/pandocHTML.yaml | Adds lomapper.html to the book build inputs. |
| v2/book/list.html | Updates book index count and inserts the new example row. |
| v2/book/examples/lomapper.html | Adds the generated HTML page for the LoMapper example. |
| v2/.tours/lomapper.tour | Adds a CodeTour walkthrough for the new example. |
| README.md | Updates repo headline counts and “Latest Update” date, and inserts the new entry. |
| later.md | Updates the “Latest Update” date. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| } | ||
| }, | ||
| { | ||
| "ID":"loMapper", |
There was a problem hiding this comment.
The newly added generator ID is loMapper, but the example folder added in this PR is v2/rscg_examples/lomapper/ (lowercase). MultiGeneratorV2 builds paths with Path.Combine(rootFolder, generatorKey) and expects description.json under that exact folder name, so this casing mismatch will break generation on case-sensitive filesystems/CI. Align the ID (and downstream references) with the actual folder name, or rename the folder to match the ID consistently everywhere.
| "ID":"loMapper", | |
| "ID":"lomapper", |
| 262,SvgIconGenerator, https://github.com/helluvamatt/SvgIconGenerator,FilesToCode | ||
| 263,TaggedEnum, https://github.com/al0rid4l/SixTatami,Enum | ||
| 264,Najlot.Audit.SourceGenerator, https://github.com/najlot/Audit,Audit | ||
| 265,loMapper, https://github.com/jdtoon/lomapper,Mapper |
There was a problem hiding this comment.
The new CSV row uses the key loMapper, but the newly added example folder is v2/rscg_examples/lomapper/ and the site/docs mostly use lomapper. This key is used as the generator identifier in the pipeline; mismatched casing will cause lookups/path resolution issues on case-sensitive systems. Standardize the key casing across all.csv, GeneratorDataRec.json, and the example folder name.
| 265,loMapper, https://github.com/jdtoon/lomapper,Mapper | |
| 265,lomapper, https://github.com/jdtoon/lomapper,Mapper |
| "data":{ | ||
| "goodFor":["Generate mapping code at compile time using source generators."], | ||
| "csprojDemo":"mapperDemo.csproj", | ||
| "csFiles":["Program.cs","Person.cs","PersonDto.cs"], |
There was a problem hiding this comment.
description.json lists PersonDto.cs in csFiles, but the actual file added in this PR is PersonDTO.cs. The generator code searches by exact file name (case-sensitive on Linux), so this mismatch can cause generation failures on case-sensitive filesystems. Update csFiles to match the real filename (or rename the file to match the convention).
| "csFiles":["Program.cs","Person.cs","PersonDto.cs"], | |
| "csFiles":["Program.cs","Person.cs","PersonDTO.cs"], |
|
|
||
| {"typeStep":"text","arg": "To use it ,you will put the Nuget lomapper into the csproj "}, | ||
|
|
||
| {"typeStep":"stepvscode","arg": "-r -g D:\\gth\\RSCG_Examples\\v2\\rscg_examples\\loMapper\\src\\mapperDemo\\mapperDemo.csproj"}, |
There was a problem hiding this comment.
This script references the path v2\\rscg_examples\\loMapper\\... (capital M), but the example folder added in this PR is v2/rscg_examples/lomapper/ (lowercase). If these scripts are executed on a case-sensitive filesystem, steps that open files/projects will fail. Make the path casing consistent with the repository folder name (and with the generator key used elsewhere).
| {"typeStep":"stepvscode","arg": "-r -g D:\\gth\\RSCG_Examples\\v2\\rscg_examples\\loMapper\\src\\mapperDemo\\mapperDemo.csproj"}, | |
| {"typeStep":"stepvscode","arg": "-r -g D:\\gth\\RSCG_Examples\\v2\\rscg_examples\\lomapper\\src\\mapperDemo\\mapperDemo.csproj"}, |
| "file": "rscg_examples/loMapper/src/mapperDemo/mapperDemo.csproj", | ||
| "description": "First, we add Nuget [lomapper](https://www.nuget.org/packages/lomapper/) in csproj ", | ||
| "pattern": "lomapper" | ||
| } | ||
|
|
||
| ,{ | ||
| "file": "rscg_examples/loMapper/src/mapperDemo/PersonDTO.cs", | ||
| "description": "File PersonDTO.cs ", | ||
| "pattern": "this is the code" | ||
| } | ||
|
|
||
| ,{ | ||
| "file": "rscg_examples/loMapper/src/mapperDemo/Person.cs", | ||
| "description": "File Person.cs ", | ||
| "pattern": "this is the code" | ||
| } | ||
|
|
||
| ,{ | ||
| "file": "rscg_examples/loMapper/src/mapperDemo/Program.cs", | ||
| "description": "File Program.cs \r\n>> dotnet run --project rscg_examples/loMapper/src/mapperDemo/mapperDemo.csproj ", | ||
| "pattern": "this is the code" | ||
| } | ||
|
|
||
|
|
||
| ,{ | ||
| "file": "rscg_examples/loMapper/src/mapperDemo/obj/GX/LoMapper.Generator/LoMapper.Generator.LoMapperGenerator/UserMapper.g.cs", | ||
| "description": "Generated File 6 from 6 : UserMapper.g.cs ", | ||
| "line": 1 | ||
| } | ||
|
|
||
| ,{ | ||
| "file": "rscg_examples/loMapper/src/mapperDemo/obj/GX/LightweightObjectMapper/LightweightObjectMapper.LightweightObjectMapperSourceGenerator/PredefinedSpecialTypeMapping.Generated.cs", | ||
| "description": "Generated File 5 from 6 : PredefinedSpecialTypeMapping.Generated.cs ", | ||
| "line": 1 | ||
| } | ||
|
|
||
| ,{ | ||
| "file": "rscg_examples/loMapper/src/mapperDemo/obj/GX/LightweightObjectMapper/LightweightObjectMapper.LightweightObjectMapperSourceGenerator/LOMMapExtensions_mapperDemo_Person.g.cs", | ||
| "description": "Generated File 4 from 6 : LOMMapExtensions_mapperDemo_Person.g.cs ", | ||
| "line": 1 | ||
| } | ||
|
|
||
| ,{ | ||
| "file": "rscg_examples/loMapper/src/mapperDemo/obj/GX/LightweightObjectMapper/LightweightObjectMapper.LightweightObjectMapperSourceGenerator/LightweightObjectMapper.PreCodes.PredefinedSpecialTypeMapping.cs", | ||
| "description": "Generated File 3 from 6 : LightweightObjectMapper.PreCodes.PredefinedSpecialTypeMapping.cs ", | ||
| "line": 1 | ||
| } | ||
|
|
||
| ,{ | ||
| "file": "rscg_examples/loMapper/src/mapperDemo/obj/GX/LightweightObjectMapper/LightweightObjectMapper.LightweightObjectMapperSourceGenerator/LightweightObjectMapper.PreCodes.LightweightObjectMapperPreCodes.cs", | ||
| "description": "Generated File 2 from 6 : LightweightObjectMapper.PreCodes.LightweightObjectMapperPreCodes.cs ", | ||
| "line": 1 | ||
| } | ||
|
|
||
| ,{ | ||
| "file": "rscg_examples/loMapper/src/mapperDemo/obj/GX/LightweightObjectMapper/LightweightObjectMapper.LightweightObjectMapperSourceGenerator/Extensions.Generated.cs", |
There was a problem hiding this comment.
The CodeTour step file paths use rscg_examples/loMapper/... (capital M), but the example directory added in this PR is v2/rscg_examples/lomapper/ (lowercase). These references will not resolve on case-sensitive filesystems and will break the tour. Update the file paths to match the actual directory name (or rename the directory consistently).
| "file": "rscg_examples/loMapper/src/mapperDemo/mapperDemo.csproj", | |
| "description": "First, we add Nuget [lomapper](https://www.nuget.org/packages/lomapper/) in csproj ", | |
| "pattern": "lomapper" | |
| } | |
| ,{ | |
| "file": "rscg_examples/loMapper/src/mapperDemo/PersonDTO.cs", | |
| "description": "File PersonDTO.cs ", | |
| "pattern": "this is the code" | |
| } | |
| ,{ | |
| "file": "rscg_examples/loMapper/src/mapperDemo/Person.cs", | |
| "description": "File Person.cs ", | |
| "pattern": "this is the code" | |
| } | |
| ,{ | |
| "file": "rscg_examples/loMapper/src/mapperDemo/Program.cs", | |
| "description": "File Program.cs \r\n>> dotnet run --project rscg_examples/loMapper/src/mapperDemo/mapperDemo.csproj ", | |
| "pattern": "this is the code" | |
| } | |
| ,{ | |
| "file": "rscg_examples/loMapper/src/mapperDemo/obj/GX/LoMapper.Generator/LoMapper.Generator.LoMapperGenerator/UserMapper.g.cs", | |
| "description": "Generated File 6 from 6 : UserMapper.g.cs ", | |
| "line": 1 | |
| } | |
| ,{ | |
| "file": "rscg_examples/loMapper/src/mapperDemo/obj/GX/LightweightObjectMapper/LightweightObjectMapper.LightweightObjectMapperSourceGenerator/PredefinedSpecialTypeMapping.Generated.cs", | |
| "description": "Generated File 5 from 6 : PredefinedSpecialTypeMapping.Generated.cs ", | |
| "line": 1 | |
| } | |
| ,{ | |
| "file": "rscg_examples/loMapper/src/mapperDemo/obj/GX/LightweightObjectMapper/LightweightObjectMapper.LightweightObjectMapperSourceGenerator/LOMMapExtensions_mapperDemo_Person.g.cs", | |
| "description": "Generated File 4 from 6 : LOMMapExtensions_mapperDemo_Person.g.cs ", | |
| "line": 1 | |
| } | |
| ,{ | |
| "file": "rscg_examples/loMapper/src/mapperDemo/obj/GX/LightweightObjectMapper/LightweightObjectMapper.LightweightObjectMapperSourceGenerator/LightweightObjectMapper.PreCodes.PredefinedSpecialTypeMapping.cs", | |
| "description": "Generated File 3 from 6 : LightweightObjectMapper.PreCodes.PredefinedSpecialTypeMapping.cs ", | |
| "line": 1 | |
| } | |
| ,{ | |
| "file": "rscg_examples/loMapper/src/mapperDemo/obj/GX/LightweightObjectMapper/LightweightObjectMapper.LightweightObjectMapperSourceGenerator/LightweightObjectMapper.PreCodes.LightweightObjectMapperPreCodes.cs", | |
| "description": "Generated File 2 from 6 : LightweightObjectMapper.PreCodes.LightweightObjectMapperPreCodes.cs ", | |
| "line": 1 | |
| } | |
| ,{ | |
| "file": "rscg_examples/loMapper/src/mapperDemo/obj/GX/LightweightObjectMapper/LightweightObjectMapper.LightweightObjectMapperSourceGenerator/Extensions.Generated.cs", | |
| "file": "rscg_examples/lomapper/src/mapperDemo/mapperDemo.csproj", | |
| "description": "First, we add Nuget [lomapper](https://www.nuget.org/packages/lomapper/) in csproj ", | |
| "pattern": "lomapper" | |
| } | |
| ,{ | |
| "file": "rscg_examples/lomapper/src/mapperDemo/PersonDTO.cs", | |
| "description": "File PersonDTO.cs ", | |
| "pattern": "this is the code" | |
| } | |
| ,{ | |
| "file": "rscg_examples/lomapper/src/mapperDemo/Person.cs", | |
| "description": "File Person.cs ", | |
| "pattern": "this is the code" | |
| } | |
| ,{ | |
| "file": "rscg_examples/lomapper/src/mapperDemo/Program.cs", | |
| "description": "File Program.cs \r\n>> dotnet run --project rscg_examples/lomapper/src/mapperDemo/mapperDemo.csproj ", | |
| "pattern": "this is the code" | |
| } | |
| ,{ | |
| "file": "rscg_examples/lomapper/src/mapperDemo/obj/GX/LoMapper.Generator/LoMapper.Generator.LoMapperGenerator/UserMapper.g.cs", | |
| "description": "Generated File 6 from 6 : UserMapper.g.cs ", | |
| "line": 1 | |
| } | |
| ,{ | |
| "file": "rscg_examples/lomapper/src/mapperDemo/obj/GX/LightweightObjectMapper/LightweightObjectMapper.LightweightObjectMapperSourceGenerator/PredefinedSpecialTypeMapping.Generated.cs", | |
| "description": "Generated File 5 from 6 : PredefinedSpecialTypeMapping.Generated.cs ", | |
| "line": 1 | |
| } | |
| ,{ | |
| "file": "rscg_examples/lomapper/src/mapperDemo/obj/GX/LightweightObjectMapper/LightweightObjectMapper.LightweightObjectMapperSourceGenerator/LOMMapExtensions_mapperDemo_Person.g.cs", | |
| "description": "Generated File 4 from 6 : LOMMapExtensions_mapperDemo_Person.g.cs ", | |
| "line": 1 | |
| } | |
| ,{ | |
| "file": "rscg_examples/lomapper/src/mapperDemo/obj/GX/LightweightObjectMapper/LightweightObjectMapper.LightweightObjectMapperSourceGenerator/LightweightObjectMapper.PreCodes.PredefinedSpecialTypeMapping.cs", | |
| "description": "Generated File 3 from 6 : LightweightObjectMapper.PreCodes.PredefinedSpecialTypeMapping.cs ", | |
| "line": 1 | |
| } | |
| ,{ | |
| "file": "rscg_examples/lomapper/src/mapperDemo/obj/GX/LightweightObjectMapper/LightweightObjectMapper.LightweightObjectMapperSourceGenerator/LightweightObjectMapper.PreCodes.LightweightObjectMapperPreCodes.cs", | |
| "description": "Generated File 2 from 6 : LightweightObjectMapper.PreCodes.LightweightObjectMapperPreCodes.cs ", | |
| "line": 1 | |
| } | |
| ,{ | |
| "file": "rscg_examples/lomapper/src/mapperDemo/obj/GX/LightweightObjectMapper/LightweightObjectMapper.LightweightObjectMapperSourceGenerator/Extensions.Generated.cs", |
| "Name": "lomapper", | ||
| "Link": "https://ignatandrei.github.io/RSCG_Examples/v2/docs/loMapper", | ||
| "NuGet": "https://www.nuget.org/packages/lomapper/", | ||
| "Source": "https://github.com/jdtoon/lomapper", | ||
| "Category": "Mapper", | ||
| "AddedOn": "2026-04-07T00:00:00" |
There was a problem hiding this comment.
The export entry links to .../docs/loMapper (capital M), but the generated docs page in this PR uses slug: /lomapper and other references point to /docs/lomapper. On case-sensitive hosting this link will 404. Update the Link value to match the actual docs route.
There was a problem hiding this comment.
Actionable comments posted: 8
🧹 Nitpick comments (7)
v2/rscg_examples_site/docs/Authors/Junaid_Desai.md (1)
7-7: Consider removing trailing whitespace.Line 7 contains trailing whitespace. While not critical, cleaning this up improves file hygiene.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@v2/rscg_examples_site/docs/Authors/Junaid_Desai.md` at line 7, Remove the trailing whitespace on the empty/blank line in Authors/Junaid_Desai.md so the file has no trailing spaces; locate the blank line near the top of the file and delete the extra space characters (ensure the file ends/contains only clean line breaks).v2/rscg_examples/lomapper/nuget.txt (1)
1-1: Consider adding a trailing newline.The file contains a clear and concise description of the LoMapper package. However, POSIX and many coding standards recommend that text files end with a newline character. Consider adding a trailing newline for better compatibility with text processing tools and editors.
📝 Proposed fix to add trailing newline
-LoMapper - Lightweight Object Mapper using compile-time source generation. Zero runtime reflection. +LoMapper - Lightweight Object Mapper using compile-time source generation. Zero runtime reflection. +🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@v2/rscg_examples/lomapper/nuget.txt` at line 1, Add a POSIX-compliant trailing newline to the end of the nuget.txt file describing "LoMapper" so the file ends with a newline character; simply update the nuget.txt content (the LoMapper description line) to include a final newline character after the existing text.v2/rscg_examples/lomapper/src/mapperDemo/mapperDemo.csproj (1)
12-12: Make generated-files output path OS-neutral.Line 12 hardcodes a Windows-style separator. Prefer a separator-neutral path to avoid platform-specific behavior on Linux/macOS CI.
♻️ Suggested change
- <CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GX</CompilerGeneratedFilesOutputPath> + <CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)GX</CompilerGeneratedFilesOutputPath>🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@v2/rscg_examples/lomapper/src/mapperDemo/mapperDemo.csproj` at line 12, The CompilerGeneratedFilesOutputPath currently uses a Windows-style backslash ("$(BaseIntermediateOutputPath)\GX"), which is platform-specific; update the value of CompilerGeneratedFilesOutputPath to use a platform-neutral separator such as a forward slash (e.g. "$(BaseIntermediateOutputPath)/GX") so the generated-files output works on Linux/macOS CI; locate the CompilerGeneratedFilesOutputPath element in the .csproj and replace the backslash with a forward slash while keeping the existing BaseIntermediateOutputPath and "GX" token.v2/.tours/lomapper.tour (1)
32-66: Generated file numbering is reversed and potentially confusing.The descriptions label files as "Generated File 6 from 6", "5 from 6", etc., in descending order. This reverses the natural reading order. Consider renumbering them 1-6 in sequence for clarity.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@v2/.tours/lomapper.tour` around lines 32 - 66, The tour entries list generated files with descending "Generated File X from 6" numbers which is confusing; update the descriptions in the lomapper.tour entries (the JSON objects referencing files like UserMapper.g.cs, PredefinedSpecialTypeMapping.Generated.cs, LOMMapExtensions_mapperDemo_Person.g.cs, LightweightObjectMapper.PreCodes.* and Extensions.Generated.cs) so the "Generated File X from 6" labels are renumbered in ascending order (1 to 6) to reflect natural reading order and maintain consistency across the described files.v2/rscg_examples_site/docs/RSCG-Examples/lomapper.md (1)
1001-1001: Minor: Trailing space in link text.The link text has a trailing space before the closing bracket.
🔧 Proposed fix
-[Download Example project lomapper ](/sources/lomapper.zip) +[Download Example project lomapper](/sources/lomapper.zip)🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@v2/rscg_examples_site/docs/RSCG-Examples/lomapper.md` at line 1001, Remove the trailing space inside the link text for the Markdown link "[Download Example project lomapper ](/sources/lomapper.zip)"; edit the link text to be "[Download Example project lomapper](/sources/lomapper.zip)" so there is no space before the closing bracket.v2/rscg_examples/lomapper/readme.txt (1)
237-243: Add a heading or explanatory text before the benchmark run instructions.The bash commands for running benchmarks appear immediately after the
</details>closing tag without any introductory context. This makes the document flow unclear—readers may not understand these commands are separate from the collapsible section above.Suggested fix
Zero allocations beyond the mapped objects themselves. [Full Results](BenchmarkDotNet.Artifacts/results/) </details> + +**Run benchmarks yourself:** + ```bash cd benchmarks/LoMapper.Benchmarks dotnet run -c Release ```🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@v2/rscg_examples/lomapper/readme.txt` around lines 237 - 243, The README places bash commands immediately after a closing </details> with no context; add a short heading or sentence before the command block (e.g., "Run benchmarks locally" or "To execute the benchmarks, run:") and ensure the following lines are formatted as a fenced bash code block so readers understand the commands are separate from the collapsible section and how to run them (apply this change around the snippet containing the closing </details> and the subsequent bash commands).v2/rscg_examples/lomapper/src/mapperDemo/PersonDTO.cs (1)
2-2: Unused import:System.Xml.Serialization.This namespace is imported but not used anywhere in this file. Consider removing it to keep imports clean.
Suggested fix
using LoMapper; -using System.Xml.Serialization; namespace mapperDemo;🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@v2/rscg_examples/lomapper/src/mapperDemo/PersonDTO.cs` at line 2, Remove the unused using directive "using System.Xml.Serialization;" from the top of the file; verify the PersonDTO class (and any members in this file) do not rely on types or attributes from System.Xml.Serialization before removal to ensure no behaviors break.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@README.md`:
- Line 7: Update the README metadata dates that are set to the future (instances
of "2026-04-07") to the actual PR/open date (e.g., "2026-04-04") so the file
isn't future-dated; locate the occurrences in the README under the "## Latest
Update" header and the other matching line (both line 7 and line 31 in the
current diff) and replace the date strings consistently.
In `@v2/.tours/lomapper.tour`:
- Around line 13-29: The tour steps use a non-matching pattern ("this is the
code") for the three entries referencing PersonDTO.cs, Person.cs and Program.cs;
update each step in the lomapper.tour to either replace the "pattern": "this is
the code" with a valid "line": 1 property or set "pattern" to an actual string
that exists in the target file (e.g., a class or method name) so CodeTour can
locate the intended lines for PersonDTO.cs, Person.cs and Program.cs.
In `@v2/rscg_examples_site/static/exports/RSCG.json`:
- Around line 2117-2122: The lomapper JSON entry has inconsistent casing and
category: update the "Link" value from ".../loMapper" to use the lowercase path
".../lomapper" to match the actual documentation URL, and change the "Category"
value from "Serializer" to "Mapper"; leave the "Name", "NuGet", and "Source"
fields unchanged.
In `@v2/rscg_examples/lomapper/description.json`:
- Line 14: The csFiles array in description.json lists "PersonDto.cs" which
mismatches the actual file "PersonDTO.cs" and will fail on case-sensitive
filesystems; update the entry in the csFiles array (the "csFiles" property) to
"PersonDTO.cs" so the filename exactly matches the real file name.
In `@v2/rscg_examples/lomapper/video.json`:
- Around line 35-38: The JSON contains invalid syntax: the token SpeakTest=" "
is using = and is placed outside an object, and there is a trailing comma before
the closing array bracket; fix by converting SpeakTest to a proper key-value
pair inside the preceding object using colon (e.g., "SpeakTest": " "), ensure it
is comma-separated from other properties within the same object (referencing the
object with "typeStep":"browser"), and remove the trailing comma after the
{"typeStep":"waitseconds","arg":"30"} entry so the array ends validly.
- Line 29: The tour step in v2/rscg_examples/lomapper/video.json references the
string "src/.tours/" but that directory and its tour file are missing for the
lomapper example; create the src/.tours/ directory for lomapper and add the
appropriate tour file (matching the pattern used in other examples) so the
"typeStep":"tour" entry in video.json resolves to an actual tour file; commit
the new directory and tour file alongside video.json to ensure the step runs.
In `@v2/RSCGExamplesData/GeneratorDataRec.json`:
- Line 1605: The ID value "loMapper" in the JSON should be normalized to the
canonical slug "lomapper" to avoid case-sensitive lookup/link mismatches; locate
the JSON entry with "ID":"loMapper" (in GeneratorDataRec.json) and change it to
"lomapper", then search the codebase/metadata for any references to "loMapper"
and update them to "lomapper" so all lookups, links, and docs use the same
canonical identifier.
- Line 1606: The Category value for this generator entry is incorrect: the
"Category" field in the GeneratorDataRec.json entry currently uses 16
(Serializer) but this generator is an object mapper; update that "Category"
value to the enum/constant for Mapper (replace 16 with the Mapper enum numeric
value or symbol used in your taxonomy) so the generator is classified as a
Mapper rather than a Serializer.
---
Nitpick comments:
In `@v2/.tours/lomapper.tour`:
- Around line 32-66: The tour entries list generated files with descending
"Generated File X from 6" numbers which is confusing; update the descriptions in
the lomapper.tour entries (the JSON objects referencing files like
UserMapper.g.cs, PredefinedSpecialTypeMapping.Generated.cs,
LOMMapExtensions_mapperDemo_Person.g.cs, LightweightObjectMapper.PreCodes.* and
Extensions.Generated.cs) so the "Generated File X from 6" labels are renumbered
in ascending order (1 to 6) to reflect natural reading order and maintain
consistency across the described files.
In `@v2/rscg_examples_site/docs/Authors/Junaid_Desai.md`:
- Line 7: Remove the trailing whitespace on the empty/blank line in
Authors/Junaid_Desai.md so the file has no trailing spaces; locate the blank
line near the top of the file and delete the extra space characters (ensure the
file ends/contains only clean line breaks).
In `@v2/rscg_examples_site/docs/RSCG-Examples/lomapper.md`:
- Line 1001: Remove the trailing space inside the link text for the Markdown
link "[Download Example project lomapper ](/sources/lomapper.zip)"; edit the
link text to be "[Download Example project lomapper](/sources/lomapper.zip)" so
there is no space before the closing bracket.
In `@v2/rscg_examples/lomapper/nuget.txt`:
- Line 1: Add a POSIX-compliant trailing newline to the end of the nuget.txt
file describing "LoMapper" so the file ends with a newline character; simply
update the nuget.txt content (the LoMapper description line) to include a final
newline character after the existing text.
In `@v2/rscg_examples/lomapper/readme.txt`:
- Around line 237-243: The README places bash commands immediately after a
closing </details> with no context; add a short heading or sentence before the
command block (e.g., "Run benchmarks locally" or "To execute the benchmarks,
run:") and ensure the following lines are formatted as a fenced bash code block
so readers understand the commands are separate from the collapsible section and
how to run them (apply this change around the snippet containing the closing
</details> and the subsequent bash commands).
In `@v2/rscg_examples/lomapper/src/mapperDemo/mapperDemo.csproj`:
- Line 12: The CompilerGeneratedFilesOutputPath currently uses a Windows-style
backslash ("$(BaseIntermediateOutputPath)\GX"), which is platform-specific;
update the value of CompilerGeneratedFilesOutputPath to use a platform-neutral
separator such as a forward slash (e.g. "$(BaseIntermediateOutputPath)/GX") so
the generated-files output works on Linux/macOS CI; locate the
CompilerGeneratedFilesOutputPath element in the .csproj and replace the
backslash with a forward slash while keeping the existing
BaseIntermediateOutputPath and "GX" token.
In `@v2/rscg_examples/lomapper/src/mapperDemo/PersonDTO.cs`:
- Line 2: Remove the unused using directive "using System.Xml.Serialization;"
from the top of the file; verify the PersonDTO class (and any members in this
file) do not rely on types or attributes from System.Xml.Serialization before
removal to ensure no behaviors break.
🪄 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: defaults
Review profile: CHILL
Plan: Pro
Run ID: 974b14de-cfb0-446f-b41b-de653bebc091
⛔ Files ignored due to path filters (3)
v2/Generator/all.csvis excluded by!**/*.csvv2/rscg_examples_site/static/exports/RSCG.xlsxis excluded by!**/*.xlsxv2/rscg_examples_site/static/sources/lomapper.zipis excluded by!**/*.zip
📒 Files selected for processing (25)
README.mdlater.mdv2/.tours/lomapper.tourv2/RSCGExamplesData/GeneratorDataRec.jsonv2/book/examples/lomapper.htmlv2/book/list.htmlv2/book/pandocHTML.yamlv2/rscg_examples/lomapper/description.jsonv2/rscg_examples/lomapper/nuget.txtv2/rscg_examples/lomapper/readme.txtv2/rscg_examples/lomapper/src/mapperDemo.slnxv2/rscg_examples/lomapper/src/mapperDemo/Person.csv2/rscg_examples/lomapper/src/mapperDemo/PersonDTO.csv2/rscg_examples/lomapper/src/mapperDemo/Program.csv2/rscg_examples/lomapper/src/mapperDemo/mapperDemo.csprojv2/rscg_examples/lomapper/video.jsonv2/rscg_examples_site/docs/Authors/Junaid_Desai.mdv2/rscg_examples_site/docs/Categories/Serializer.mdv2/rscg_examples_site/docs/Categories/_PrimitiveSerializer.mdxv2/rscg_examples_site/docs/RSCG-Examples/index.mdv2/rscg_examples_site/docs/RSCG-Examples/lomapper.mdv2/rscg_examples_site/docs/about.mdv2/rscg_examples_site/docs/indexRSCG.mdv2/rscg_examples_site/src/components/HomepageFeatures/index.jsv2/rscg_examples_site/static/exports/RSCG.json
| This system serves as both a learning resource for .NET developers interested in source generators and an automated pipeline for maintaining up-to-date documentation about the RSCG ecosystem | ||
|
|
||
| ## Latest Update : 2026-04-06 => 06 April 2026 | ||
| ## Latest Update : 2026-04-07 => 07 April 2026 |
There was a problem hiding this comment.
Use non-future publication dates in README metadata.
Line 7 and Line 31 are set to 2026-04-07, but this PR was opened on April 4, 2026. This makes the README appear future-dated and can confuse chronology.
🛠️ Suggested date alignment
-## Latest Update : 2026-04-07 => 07 April 2026
+## Latest Update : 2026-04-04 => 04 April 2026
...
-Generated on : 2026-04-07 => 07 April 2026
+Generated on : 2026-04-04 => 04 April 2026Also applies to: 31-31
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@README.md` at line 7, Update the README metadata dates that are set to the
future (instances of "2026-04-07") to the actual PR/open date (e.g.,
"2026-04-04") so the file isn't future-dated; locate the occurrences in the
README under the "## Latest Update" header and the other matching line (both
line 7 and line 31 in the current diff) and replace the date strings
consistently.
| ,{ | ||
| "file": "rscg_examples/loMapper/src/mapperDemo/PersonDTO.cs", | ||
| "description": "File PersonDTO.cs ", | ||
| "pattern": "this is the code" | ||
| } | ||
|
|
||
| ,{ | ||
| "file": "rscg_examples/loMapper/src/mapperDemo/Person.cs", | ||
| "description": "File Person.cs ", | ||
| "pattern": "this is the code" | ||
| } | ||
|
|
||
| ,{ | ||
| "file": "rscg_examples/loMapper/src/mapperDemo/Program.cs", | ||
| "description": "File Program.cs \r\n>> dotnet run --project rscg_examples/loMapper/src/mapperDemo/mapperDemo.csproj ", | ||
| "pattern": "this is the code" | ||
| } |
There was a problem hiding this comment.
Tour step patterns "this is the code" will never match actual source files.
The pattern property in CodeTour is used to locate a specific line in the file. The string "this is the code" doesn't exist in PersonDTO.cs, Person.cs, or Program.cs, so the tour will fail to highlight the intended location.
Use "line": 1 instead, or provide an actual pattern that exists in each file.
🔧 Proposed fix
,{
"file": "rscg_examples/loMapper/src/mapperDemo/PersonDTO.cs",
"description": "File PersonDTO.cs ",
- "pattern": "this is the code"
+ "line": 1
}
,{
"file": "rscg_examples/loMapper/src/mapperDemo/Person.cs",
"description": "File Person.cs ",
- "pattern": "this is the code"
+ "line": 1
}
,{
"file": "rscg_examples/loMapper/src/mapperDemo/Program.cs",
"description": "File Program.cs \r\n>> dotnet run --project rscg_examples/loMapper/src/mapperDemo/mapperDemo.csproj ",
- "pattern": "this is the code"
+ "line": 1
}📝 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.
| ,{ | |
| "file": "rscg_examples/loMapper/src/mapperDemo/PersonDTO.cs", | |
| "description": "File PersonDTO.cs ", | |
| "pattern": "this is the code" | |
| } | |
| ,{ | |
| "file": "rscg_examples/loMapper/src/mapperDemo/Person.cs", | |
| "description": "File Person.cs ", | |
| "pattern": "this is the code" | |
| } | |
| ,{ | |
| "file": "rscg_examples/loMapper/src/mapperDemo/Program.cs", | |
| "description": "File Program.cs \r\n>> dotnet run --project rscg_examples/loMapper/src/mapperDemo/mapperDemo.csproj ", | |
| "pattern": "this is the code" | |
| } | |
| ,{ | |
| "file": "rscg_examples/loMapper/src/mapperDemo/PersonDTO.cs", | |
| "description": "File PersonDTO.cs ", | |
| "line": 1 | |
| } | |
| ,{ | |
| "file": "rscg_examples/loMapper/src/mapperDemo/Person.cs", | |
| "description": "File Person.cs ", | |
| "line": 1 | |
| } | |
| ,{ | |
| "file": "rscg_examples/loMapper/src/mapperDemo/Program.cs", | |
| "description": "File Program.cs \r\n>> dotnet run --project rscg_examples/loMapper/src/mapperDemo/mapperDemo.csproj ", | |
| "line": 1 | |
| } |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@v2/.tours/lomapper.tour` around lines 13 - 29, The tour steps use a
non-matching pattern ("this is the code") for the three entries referencing
PersonDTO.cs, Person.cs and Program.cs; update each step in the lomapper.tour to
either replace the "pattern": "this is the code" with a valid "line": 1 property
or set "pattern" to an actual string that exists in the target file (e.g., a
class or method name) so CodeTour can locate the intended lines for
PersonDTO.cs, Person.cs and Program.cs.
| { | ||
| "Name": "lomapper", | ||
| "Link": "https://ignatandrei.github.io/RSCG_Examples/v2/docs/loMapper", | ||
| "NuGet": "https://www.nuget.org/packages/lomapper/", | ||
| "Source": "https://github.com/jdtoon/lomapper", | ||
| "Category": "Serializer", |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Description: Verify the correct documentation path for lomapper
# Check for lomapper documentation directory - case variations
echo "Searching for lomapper doc directories..."
fd -t d -i 'lomapper' v2/rscg_examples_site/docs/ 2>/dev/null || echo "No directory found in docs/"
# Also check in the general rscg_examples directory
fd -t d -i 'lomapper' v2/rscg_examples/ 2>/dev/null | head -5
# Check what casing is used in other documentation references
echo -e "\nChecking documentation references for lomapper..."
rg -i 'lomapper' --type=md v2/rscg_examples_site/docs/ 2>/dev/null | head -10Repository: ignatandrei/RSCG_Examples
Length of output: 1292
Fix case and category inconsistencies in the lomapper entry.
The Link uses loMapper (camelCase) but the actual documentation path is lomapper (lowercase), and the entry is categorized as "Serializer" when it should be "Mapper"—all references in the codebase and documentation index use the "Mapper" category.
Fix
{
"Name": "lomapper",
- "Link": "https://ignatandrei.github.io/RSCG_Examples/v2/docs/loMapper",
+ "Link": "https://ignatandrei.github.io/RSCG_Examples/v2/docs/lomapper",
"NuGet": "https://www.nuget.org/packages/lomapper/",
"Source": "https://github.com/jdtoon/lomapper",
- "Category": "Serializer",
+ "Category": "Mapper",📝 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.
| { | |
| "Name": "lomapper", | |
| "Link": "https://ignatandrei.github.io/RSCG_Examples/v2/docs/loMapper", | |
| "NuGet": "https://www.nuget.org/packages/lomapper/", | |
| "Source": "https://github.com/jdtoon/lomapper", | |
| "Category": "Serializer", | |
| { | |
| "Name": "lomapper", | |
| "Link": "https://ignatandrei.github.io/RSCG_Examples/v2/docs/lomapper", | |
| "NuGet": "https://www.nuget.org/packages/lomapper/", | |
| "Source": "https://github.com/jdtoon/lomapper", | |
| "Category": "Mapper", |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@v2/rscg_examples_site/static/exports/RSCG.json` around lines 2117 - 2122, The
lomapper JSON entry has inconsistent casing and category: update the "Link"
value from ".../loMapper" to use the lowercase path ".../lomapper" to match the
actual documentation URL, and change the "Category" value from "Serializer" to
"Mapper"; leave the "Name", "NuGet", and "Source" fields unchanged.
| {"typeStep":"text","arg": "And now I will show you an example of using lomapper"}, | ||
|
|
||
| {"typeStep":"hide","arg": "now execute the tour in VSCode"}, | ||
| {"typeStep":"tour", "arg": "src/.tours/"}, |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Verify the tour file location and check if src/.tours/ exists
echo "=== Checking for .tours directories ==="
fd -t d '.tours' v2/
echo ""
echo "=== Checking lomapper tour file location ==="
fd -t f 'lomapper.tour' v2/
echo ""
echo "=== Checking if src/.tours exists under lomapper ==="
ls -la v2/rscg_examples/lomapper/src/.tours/ 2>/dev/null || echo "Directory does not exist"Repository: ignatandrei/RSCG_Examples
Length of output: 233
🏁 Script executed:
#!/bin/bash
# Search for tour-related files more broadly
echo "=== Searching for tour files anywhere in repository ==="
find v2 -type f -name "*.tour*" 2>/dev/null | head -20
echo ""
echo "=== Searching for .tours in any form ==="
find v2 -type d -name "*tour*" 2>/dev/null | head -20
echo ""
echo "=== Check what's actually in video.json ==="
cat -n v2/rscg_examples/lomapper/video.json | head -40
echo ""
echo "=== Check the directory structure of lomapper example ==="
ls -la v2/rscg_examples/lomapper/ 2>/dev/nullRepository: ignatandrei/RSCG_Examples
Length of output: 4602
🏁 Script executed:
#!/bin/bash
# Check if src/.tours exists in lomapper
echo "=== Listing src directory in lomapper ==="
ls -la v2/rscg_examples/lomapper/src/
echo ""
echo "=== Check if src/.tours exists in lomapper ==="
if [ -d "v2/rscg_examples/lomapper/src/.tours" ]; then
echo "Directory EXISTS"
ls -la v2/rscg_examples/lomapper/src/.tours/
else
echo "Directory does NOT exist"
fi
echo ""
echo "=== Compare with another example that has src/.tours (ActorSrcGen) ==="
ls -la v2/rscg_examples/ActorSrcGen/src/.tours/ 2>/dev/null | head -5Repository: ignatandrei/RSCG_Examples
Length of output: 664
🏁 Script executed:
#!/bin/bash
# Check how other examples reference tour files in their video.json
echo "=== Check ActorSrcGen's video.json for tour references ==="
if [ -f "v2/rscg_examples/ActorSrcGen/video.json" ]; then
grep -n "tour" v2/rscg_examples/ActorSrcGen/video.json
fi
echo ""
echo "=== Check a few more examples with src/.tours for tour references ==="
for example in Apparatus.AOT.Reflection Architect.DomainModeling; do
echo "--- $example ---"
if [ -f "v2/rscg_examples/$example/video.json" ]; then
grep -n "tour" "v2/rscg_examples/$example/video.json" 2>/dev/null || echo "No video.json or no tour references"
fi
doneRepository: ignatandrei/RSCG_Examples
Length of output: 594
Create missing src/.tours/ directory with tour file for lomapper.
The src/.tours/ path pattern in the tour step (line 29) is correct and matches other examples in the repository (ActorSrcGen, Apparatus.AOT.Reflection, Architect.DomainModeling). However, the src/.tours/ directory is missing from the lomapper example, unlike those other examples which all contain tour files in their respective src/.tours/ directories. Create the missing directory and add the appropriate tour file.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@v2/rscg_examples/lomapper/video.json` at line 29, The tour step in
v2/rscg_examples/lomapper/video.json references the string "src/.tours/" but
that directory and its tour file are missing for the lomapper example; create
the src/.tours/ directory for lomapper and add the appropriate tour file
(matching the pattern used in other examples) so the "typeStep":"tour" entry in
video.json resolves to an actual tour file; commit the new directory and tour
file alongside video.json to ensure the step runs.
| {"typeStep":"browser","arg":"https://ignatandrei.github.io/RSCG_Examples/v2/docs/lomapper#download-example-net--c-", | ||
| SpeakTest=" "}, | ||
| {"typeStep":"waitseconds","arg":"30"}, | ||
| ] |
There was a problem hiding this comment.
Invalid JSON syntax will cause parsing failure.
Line 36 has invalid syntax: SpeakTest=" " uses = instead of : and is placed outside the JSON object. Line 38 also has a trailing comma before the closing bracket.
🐛 Proposed fix
{"typeStep":"text","arg": "Remember, you can download the code from here"},
-{"typeStep":"browser","arg":"https://ignatandrei.github.io/RSCG_Examples/v2/docs/lomapper#download-example-net--c-",
-SpeakTest=" "},
-{"typeStep":"waitseconds","arg":"30"},
+{"typeStep":"browser","arg":"https://ignatandrei.github.io/RSCG_Examples/v2/docs/lomapper#download-example-net--c-"},
+{"typeStep":"waitseconds","arg":"30"}
]📝 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.
| {"typeStep":"browser","arg":"https://ignatandrei.github.io/RSCG_Examples/v2/docs/lomapper#download-example-net--c-", | |
| SpeakTest=" "}, | |
| {"typeStep":"waitseconds","arg":"30"}, | |
| ] | |
| {"typeStep":"browser","arg":"https://ignatandrei.github.io/RSCG_Examples/v2/docs/lomapper#download-example-net--c-"}, | |
| {"typeStep":"waitseconds","arg":"30"} | |
| ] |
🧰 Tools
🪛 Biome (2.4.10)
[error] 36-36: Property key must be double quoted
(parse)
[error] 36-36: unexpected character =
(parse)
[error] 36-36: expected , but instead found " "
(parse)
[error] 36-36: expected : but instead found }
(parse)
[error] 38-38: Expected an array, an object, or a literal but instead found ']'.
(parse)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@v2/rscg_examples/lomapper/video.json` around lines 35 - 38, The JSON contains
invalid syntax: the token SpeakTest=" " is using = and is placed outside an
object, and there is a trailing comma before the closing array bracket; fix by
converting SpeakTest to a proper key-value pair inside the preceding object
using colon (e.g., "SpeakTest": " "), ensure it is comma-separated from other
properties within the same object (referencing the object with
"typeStep":"browser"), and remove the trailing comma after the
{"typeStep":"waitseconds","arg":"30"} entry so the array ends validly.
| } | ||
| }, | ||
| { | ||
| "ID":"loMapper", |
There was a problem hiding this comment.
Normalize ID to match the canonical slug/name.
Line 1605 uses loMapper, while related metadata/docs use lomapper. Keep one canonical ID to prevent case-sensitive lookup/link mismatches.
🛠️ Suggested fix
- "ID":"loMapper",
+ "ID":"lomapper",📝 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.
| "ID":"loMapper", | |
| "ID":"lomapper", |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@v2/RSCGExamplesData/GeneratorDataRec.json` at line 1605, The ID value
"loMapper" in the JSON should be normalized to the canonical slug "lomapper" to
avoid case-sensitive lookup/link mismatches; locate the JSON entry with
"ID":"loMapper" (in GeneratorDataRec.json) and change it to "lomapper", then
search the codebase/metadata for any references to "loMapper" and update them to
"lomapper" so all lookups, links, and docs use the same canonical identifier.
There was a problem hiding this comment.
Actionable comments posted: 4
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@v2/rscg_examples_site/docs/indexRSCG.md`:
- Line 23: The markdown link text "[lomapper by Junaid Desai ](/docs/lomapper)"
contains a trailing space; edit that link so the visible text has no trailing
whitespace (change "[lomapper by Junaid Desai ]" to "[lomapper by Junaid
Desai]") to satisfy MD039 and ensure the entry (the lomapper link) has no extra
space in its link text.
In `@v2/rscg_examples_site/docs/RSCG-Examples/lomapper.md`:
- Line 1001: Remove the trailing space inside the markdown link text so it reads
"[Download Example project lomapper](/sources/lomapper.zip)" instead of
"[Download Example project lomapper ](/sources/lomapper.zip)"; update the link
string in the lomapper.md content where that exact link appears to eliminate the
space before the closing bracket.
- Around line 411-473: The TabItem value attributes in the markdown use
"loMapper" (capital M) but the actual folder is "lomapper" (all lowercase);
update the three TabItem value attributes that point to Program.cs, Person.cs,
and PersonDTO.cs so their value strings use "lomapper" (lowercase m) instead of
"loMapper" to match the repository directory casing.
- Around line 50-362: The README markdown has inconsistent heading levels,
missing spaces after '#' in some headings, indented code blocks instead of
fenced blocks, and some fenced blocks missing language tags; fix the lomapper.md
by (1) changing the h6 at "Quick Start" to an h5 to keep heading progression
consistent (locate the "Quick Start" / "Installation" headings), (2) ensure all
headings like those near the Benchmarks and Comparison sections include a space
after '#' (search for headings around "Benchmarks" and "Comparison"), (3)
replace indented code examples (e.g., the Basic Usage C# examples and any other
indented blocks such as nested code examples) with fenced code blocks using
```csharp, and (4) add language tags to bash snippets (e.g., the benchmarks run
and project XML emit examples) using ```bash or ```xml as appropriate so
markdownlint stops flagging them; update all affected blocks consistently across
the file.
🪄 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: defaults
Review profile: CHILL
Plan: Pro
Run ID: 6bea2dde-b63f-4c45-9792-fc188e087ed8
⛔ Files ignored due to path filters (2)
v2/Generator/all.csvis excluded by!**/*.csvv2/rscg_examples_site/static/exports/RSCG.xlsxis excluded by!**/*.xlsx
📒 Files selected for processing (8)
README.mdv2/RSCGExamplesData/GeneratorDataRec.jsonv2/rscg_examples_site/docs/Categories/Mapper.mdv2/rscg_examples_site/docs/Categories/_PrimitiveMapper.mdxv2/rscg_examples_site/docs/RSCG-Examples/index.mdv2/rscg_examples_site/docs/RSCG-Examples/lomapper.mdv2/rscg_examples_site/docs/indexRSCG.mdv2/rscg_examples_site/static/exports/RSCG.json
✅ Files skipped from review due to trivial changes (2)
- v2/rscg_examples_site/docs/Categories/Mapper.md
- README.md
🚧 Files skipped from review as they are similar to previous changes (3)
- v2/rscg_examples_site/docs/RSCG-Examples/index.md
- v2/rscg_examples_site/static/exports/RSCG.json
- v2/RSCGExamplesData/GeneratorDataRec.json
|
|
||
| | No | Name | Date | Category | | ||
| | --------- | ----- | ---- | -------- | | ||
| |265| [lomapper by Junaid Desai ](/docs/lomapper)|2026-04-07 => 07 April 2026 | [Mapper](/docs/Categories/Mapper) | |
There was a problem hiding this comment.
Remove trailing space in link text.
The lomapper entry has a trailing space in the link text, which violates markdown best practices (MD039).
🔗 Proposed fix
-|265| [lomapper by Junaid Desai ](/docs/lomapper)|2026-04-07 => 07 April 2026 | [Mapper](/docs/Categories/Mapper) |
+|265| [lomapper by Junaid Desai](/docs/lomapper)|2026-04-07 => 07 April 2026 | [Mapper](/docs/Categories/Mapper) |📝 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.
| |265| [lomapper by Junaid Desai ](/docs/lomapper)|2026-04-07 => 07 April 2026 | [Mapper](/docs/Categories/Mapper) | | |
| |265| [lomapper by Junaid Desai](/docs/lomapper)|2026-04-07 => 07 April 2026 | [Mapper](/docs/Categories/Mapper) | |
🧰 Tools
🪛 markdownlint-cli2 (0.22.0)
[warning] 23-23: Spaces inside link text
(MD039, no-space-in-links)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@v2/rscg_examples_site/docs/indexRSCG.md` at line 23, The markdown link text
"[lomapper by Junaid Desai ](/docs/lomapper)" contains a trailing space; edit
that link so the visible text has no trailing whitespace (change "[lomapper by
Junaid Desai ]" to "[lomapper by Junaid Desai]") to satisfy MD039 and ensure the
entry (the lomapper link) has no extra space in its link text.
| :::note | ||
|
|
||
| ### LoMapper | ||
|
|
||
| **A tiny, focused object mapper** — Generate mapping code at compile time using Roslyn Source Generators. | ||
|
|
||
| [](https://www.nuget.org/packages/LoMapper/) | ||
| [](https://www.nuget.org/packages/LoMapper/) | ||
| [](https://github.com/jdtoon/lomapper/actions/workflows/ci.yml) | ||
| [](https://opensource.org/licenses/MIT) | ||
| [](https://dotnet.microsoft.com/) | ||
| [](https://github.com/jdtoon/lomapper) | ||
|
|
||
| ###### What is LoMapper? | ||
|
|
||
| LoMapper is a small library that generates mapping code at compile time, saving you from writing repetitive property-by-property assignments by hand. | ||
|
|
||
| **Benefits:** | ||
| - ✅ **Less boilerplate** — Stop writing manual property assignments | ||
| - ✅ **Compile-time safety** — Catch mapping issues during build, not at runtime | ||
| - ✅ **Zero runtime overhead** — No reflection, no scanning, just generated code | ||
| - ✅ **Debuggable** — F12 into generated code like it's your own | ||
| - ✅ **Simple** — Just add attributes to partial classes | ||
|
|
||
| ###### Quick Start | ||
|
|
||
| ######### Installation | ||
|
|
||
| ```bash | ||
| dotnet add package LoMapper | ||
| ``` | ||
|
|
||
| ######### Basic Usage | ||
|
|
||
| ```csharp | ||
| using LoMapper; | ||
|
|
||
| // 1. Define your types | ||
| public class UserEntity | ||
| { | ||
| public int Id \{ get; set; } | ||
| public string Name \{ get; set; } | ||
| public string Email \{ get; set; } | ||
| } | ||
|
|
||
| public class UserDto | ||
| { | ||
| public int Id \{ get; set; } | ||
| public string Name \{ get; set; } | ||
| public string Email \{ get; set; } | ||
| } | ||
|
|
||
| // 2. Create a mapper | ||
| [Mapper] | ||
| public partial class UserMapper | ||
| { | ||
| public partial UserDto Map(UserEntity entity); | ||
| } | ||
|
|
||
| // 3. Use it | ||
| var mapper = new UserMapper(); | ||
| var dto = mapper.Map(entity); | ||
| ``` | ||
|
|
||
| That's it! The `Map` method is generated at compile time with property-by-property assignment. | ||
|
|
||
| ###### Features | ||
|
|
||
| ######### Property Mapping | ||
| Properties are matched by name (case-insensitive): | ||
|
|
||
| ```csharp | ||
| public class Source \{ public int ID \{ get; set; \} } | ||
| public class Target \{ public int Id \{ get; set; \} } // ✅ Matched | ||
| ``` | ||
|
|
||
| ######### Custom Property Mapping | ||
| Rename properties or apply transforms: | ||
|
|
||
| ```csharp | ||
| [Mapper] | ||
| public partial class UserMapper | ||
| { | ||
| [MapProperty("FirstName", "FullName")] | ||
| [MapProperty("BirthDate", "Age", Transform = nameof(CalculateAge))] | ||
| public partial UserDto Map(UserEntity entity); | ||
|
|
||
| private int CalculateAge(DateTime birthDate) | ||
| => DateTime.Today.Year - birthDate.Year; | ||
| } | ||
| ``` | ||
|
|
||
| ######### Ignore Properties | ||
| Skip properties you don't want mapped: | ||
|
|
||
| ```csharp | ||
| [Mapper] | ||
| public partial class UserMapper | ||
| { | ||
| [MapIgnore("InternalId")] | ||
| [MapIgnore("CacheKey")] | ||
| public partial UserDto Map(UserEntity entity); | ||
| } | ||
| ``` | ||
|
|
||
| ######### Flatten Properties | ||
| Map nested object properties to flat target properties: | ||
|
|
||
| ```csharp | ||
| [Mapper] | ||
| public partial class UserMapper | ||
| { | ||
| [FlattenProperty("Address.City", nameof(UserDto.AddressCity))] | ||
| [FlattenProperty("Address.ZipCode", nameof(UserDto.AddressZipCode))] | ||
| public partial UserDto Map(UserEntity entity); | ||
| } | ||
| ``` | ||
|
|
||
| Features: | ||
| - ✅ Deep nesting support (e.g., `Order.Customer.Address.City`) | ||
| - ✅ Null-safe navigation (`?.`) automatically generated | ||
| - ✅ Type-safe with compile-time validation | ||
| - ✅ Works with both reference and value types | ||
| - ✅ Combine with `[MapProperty]` and `[MapIgnore]` | ||
|
|
||
| ######### Lifecycle Hooks (BeforeMap / AfterMap) | ||
| Run code before or after mapping to validate inputs, set defaults, or audit results: | ||
|
|
||
| ```csharp | ||
| [Mapper] | ||
| public partial class UserMapper | ||
| { | ||
| [BeforeMap(nameof(ValidateUser))] | ||
| [AfterMap(nameof(AuditUser))] | ||
| public partial UserDto Map(UserEntity entity); | ||
|
|
||
| private void ValidateUser(UserEntity entity) | ||
| { | ||
| if (string.IsNullOrWhiteSpace(entity.Email)) throw new InvalidOperationException("Email required"); | ||
| } | ||
|
|
||
| private void AuditUser(UserDto dto) => dto.Tags = dto.Tags.Append("mapped").ToArray(); | ||
| } | ||
| ``` | ||
|
|
||
| Hooks execute in order: `BeforeMap` runs before object creation and property assignments; `AfterMap` runs after the target is fully constructed (including constructor-based mappings). | ||
|
|
||
| ######### Nested Objects | ||
| For nested objects, declare explicit mapper methods: | ||
|
|
||
| ```csharp | ||
| [Mapper] | ||
| public partial class OrderMapper | ||
| { | ||
| public partial OrderDto Map(OrderEntity entity); | ||
| public partial CustomerDto Map(CustomerEntity entity); // Used for nested Customer | ||
| public partial AddressDto Map(AddressEntity entity); // Used for nested Address | ||
| } | ||
| ``` | ||
|
|
||
| ######### Collections | ||
| Full support for collections — `List<T>`, `IEnumerable<T>`, `Dictionary<K,V>`, `HashSet<T>`, and arrays: | ||
|
|
||
| ```csharp | ||
| public class Source \{ public List<ItemEntity> Items \{ get; set; \} } | ||
| public class Target \{ public List<ItemDto> Items \{ get; set; \} } // ✅ Auto-mapped | ||
| ``` | ||
|
|
||
| ######### Circular Reference Detection | ||
| LoMapper detects mapper graphs that contain cycles and stops the build with diagnostic `LOM010` so you can break the loop early. | ||
|
|
||
| ```csharp | ||
| [Mapper] | ||
| public partial class CircularMapper | ||
| { | ||
| public partial TargetA Map(SourceA source); | ||
| public partial TargetB Map(SourceB source); | ||
| } | ||
|
|
||
| public class SourceA \{ public SourceB? Child \{ get; set; \} } | ||
| public class SourceB \{ public SourceA? Parent \{ get; set; \} } | ||
|
|
||
| public class TargetA \{ public TargetB? Child \{ get; set; \} } | ||
| public class TargetB \{ public TargetA? Parent \{ get; set; \} } | ||
| ``` | ||
|
|
||
| Mapping these types produces LOM010 describing the cycle. Break one side (e.g., ignore a property or change the DTO shape) to proceed. | ||
|
|
||
| ###### Compile-Time Diagnostics | ||
|
|
||
| LoMapper catches mapping issues **before your code runs**: | ||
|
|
||
| | Code | Severity | Description | | ||
| |------|----------|-------------| | ||
| | LOM001 | ⚠️ Warning | Target property has no matching source property | | ||
| | LOM002 | ❌ Error | Property types are incompatible | | ||
| | LOM003 | ❌ Error | Nested object requires mapper method | | ||
| | LOM004 | ❌ Error | Invalid transform method signature | | ||
| | LOM005 | ❌ Error | Source property not found | | ||
| | LOM006 | ❌ Error | Target property not found | | ||
| | LOM007 | ❌ Error | Invalid flatten property path | | ||
| | LOM008 | ❌ Error | Flatten target property not found | | ||
| | LOM009 | ❌ Error | Flatten type mismatch | | ||
| | LOM010 | ❌ Error | Circular reference detected in mapper graph | | ||
|
|
||
| Example: | ||
| ```csharp | ||
| public class Source \{ public int Id \{ get; set; \} } | ||
| public class Target \{ public int Id \{ get; set; \} public string Extra \{ get; set; \} } | ||
|
|
||
| // ⚠️ LOM001: Target property 'Extra' has no matching source property | ||
| ``` | ||
|
|
||
| ###### Benchmarks | ||
|
|
||
| **Performance** | ||
|
|
||
| LoMapper generates efficient code that performs well. Benchmark results mapping 10,000 objects: | ||
|
|
||
| | Method | Mean | Memory | | ||
| |------------|------------|-----------| | ||
| | **LoMapper** | **174 μs** | 781 KB | | ||
| | Manual | 208 μs | 781 KB | | ||
|
|
||
| *LoMapper matches the performance and memory characteristics of hand-written mapping code.* | ||
|
|
||
| The generated code uses straightforward property assignments with no reflection or runtime overhead. For most applications, the performance is more than sufficient and comparable to writing the mappings yourself. | ||
|
|
||
| <details> | ||
| <summary>Full Benchmark Details (Click to expand)</summary> | ||
|
|
||
| Tested on Intel Core i7-10870H, .NET 8.0.23, Windows 11 using BenchmarkDotNet v0.14.0. | ||
|
|
||
| **100 items:** 1.67 μs | ||
| **1,000 items:** 15.5 μs | ||
| **10,000 items:** 174 μs | ||
|
|
||
| The generated code produces clean IL that the JIT compiler can optimize effectively. Zero allocations beyond the mapped objects themselves. | ||
|
|
||
| [Full Results](BenchmarkDotNet.Artifacts/results/) | ||
| </details> | ||
| ```bash | ||
| cd benchmarks/LoMapper.Benchmarks | ||
| dotnet run -c Release | ||
| ``` | ||
|
|
||
| ###### View Generated Code | ||
|
|
||
| Enable generated file output in your `.csproj`: | ||
|
|
||
| ```xml | ||
| <PropertyGroup> | ||
| <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles> | ||
| </PropertyGroup> | ||
| ``` | ||
|
|
||
| Find generated files in: `obj/GeneratedFiles/LoMapper.Generator/` | ||
|
|
||
| ###### Comparison | ||
|
|
||
| | Feature | LoMapper | Manual Code | | ||
| |---------|:--------:|:-----------:| | ||
| | **Performance (10K items)** | **174 μs** | 208 μs | | ||
| | Memory overhead | **0%** | - | | ||
| | Compile-time generation | ✅ | N/A | | ||
| | Zero runtime reflection | ✅ | ✅ | | ||
| | Compile-time error detection | ✅ | ✅ | | ||
| | IntelliSense support | ✅ | ✅ | | ||
| | Nested object mapping | ✅ | ✅ | | ||
| | Collection mapping | ✅ | ✅ | | ||
| | Custom transforms | ✅ | ✅ | | ||
| | Flattening/unflattening | ✅ v0.3 | Manual | | ||
| | Projection (IQueryable) | 🔜 v1.0 | Manual | | ||
|
|
||
| ###### Why Use LoMapper? | ||
|
|
||
| **vs Writing Mappings Manually:** | ||
| - Less repetitive code to write and maintain | ||
| - Compile-time validation catches errors early | ||
| - Automatic updates when models change | ||
| - Similar or better performance | ||
|
|
||
| **When LoMapper Might Help:** | ||
| - You have many DTOs to map | ||
| - You want compile-time safety without runtime cost | ||
| - You prefer code generation over reflection | ||
| - You like seeing exactly what code runs (F12 into generated code) | ||
|
|
||
| **Current Limitations:** | ||
| - Expression projection for IQueryable not yet supported (planned for v1.0) | ||
| - Some advanced mapping scenarios may need manual code | ||
|
|
||
| LoMapper is a focused tool that does one thing well: generate simple, efficient mapping code. It's meant to complement your toolkit, not replace everything else. | ||
|
|
||
| ###### Requirements | ||
|
|
||
| - .NET Standard 2.0+ (runs on .NET Core 3.1+, .NET 5+, .NET Framework 4.7.2+) | ||
| - C# 9.0+ (for partial methods) | ||
|
|
||
| ###### Contributing | ||
|
|
||
| Contributions are welcome! Please read our [Contributing Guide](https://github.com/jdtoon/lomapper/CONTRIBUTING.md) first. | ||
|
|
||
| ###### License | ||
|
|
||
| MIT License - see [LICENSE](https://github.com/jdtoon/lomapper/LICENSE) for details. | ||
|
|
||
| --- | ||
|
|
||
| **LoMapper** — A tiny tool to help you write less mapping code. | ||
|
|
||
|
|
||
| ::: |
There was a problem hiding this comment.
Fix markdown formatting issues in the embedded README.
The "Original Readme" section contains several markdown formatting issues that should be corrected for consistency:
- Line 63: Heading level jumps from h4 to h6 - should use h5 instead
- Lines 733, 804: Headings are missing space after
# - Lines 756, 884: Code blocks use indented style - should use fenced blocks
- Lines 513, 806, 966: Fenced code blocks should specify language (likely
bash)
These issues are flagged by markdownlint and affect documentation quality.
📝 Example fixes for heading and code block issues
For heading at line 63:
-###### What is LoMapper?
+##### What is LoMapper?For headings at lines 733, 804:
-#pragma warning disable IDE0161 // 转换为文件范围限定的 namespace
+# pragma warning disable IDE0161 // 转换为文件范围限定的 namespaceFor fenced blocks without language (e.g., line 513):
-```
+```bash
cd benchmarks/LoMapper.Benchmarks
dotnet run -c Release
</details>
<details>
<summary>🧰 Tools</summary>
<details>
<summary>🪛 markdownlint-cli2 (0.22.0)</summary>
[warning] 63-63: Heading levels should only increment by one level at a time
Expected: h4; Actual: h6
(MD001, heading-increment)
</details>
</details>
<details>
<summary>🤖 Prompt for AI Agents</summary>
Verify each finding against the current code and only fix it if needed.
In @v2/rscg_examples_site/docs/RSCG-Examples/lomapper.md around lines 50 - 362,
The README markdown has inconsistent heading levels, missing spaces after '#' in
some headings, indented code blocks instead of fenced blocks, and some fenced
blocks missing language tags; fix the lomapper.md by (1) changing the h6 at
"Quick Start" to an h5 to keep heading progression consistent (locate the "Quick
Start" / "Installation" headings), (2) ensure all headings like those near the
Benchmarks and Comparison sections include a space after '#' (search for
headings around "Benchmarks" and "Comparison"), (3) replace indented code
examples (e.g., the Basic Usage C# examples and any other indented blocks such
as nested code examples) with fenced code blocks using csharp, and (4) add language tags to bash snippets (e.g., the benchmarks run and project XML emit examples) using bash or ```xml as appropriate so markdownlint stops flagging
them; update all affected blocks consistently across the file.
</details>
<!-- fingerprinting:phantom:triton:puma:8eceffc3-2c64-4529-8093-0b3003898898 -->
<!-- This is an auto-generated comment by CodeRabbit -->
| <TabItem value="D:\gth\RSCG_Examples\v2\rscg_examples\loMapper\src\mapperDemo\Program.cs" label="Program.cs" > | ||
|
|
||
| This is the use of **lomapper** in *Program.cs* | ||
|
|
||
| ```csharp showLineNumbers | ||
| using mapperDemo; | ||
| var p=new Person(); | ||
| p.FirstName = "Andrei"; | ||
| p.LastName = "Ignat"; | ||
| PersonDTO dto= new UserMapper().Map(p); | ||
| Console.WriteLine(dto.FullName); | ||
|
|
||
| ``` | ||
| </TabItem> | ||
|
|
||
| <TabItem value="D:\gth\RSCG_Examples\v2\rscg_examples\loMapper\src\mapperDemo\Person.cs" label="Person.cs" > | ||
|
|
||
| This is the use of **lomapper** in *Person.cs* | ||
|
|
||
| ```csharp showLineNumbers | ||
|
|
||
| public partial class Person | ||
| { | ||
| public int ID \{ get; set; } | ||
| public string? FirstName \{ get; set; } | ||
| public string? LastName \{ get; set; } | ||
| } | ||
|
|
||
|
|
||
| ``` | ||
| </TabItem> | ||
|
|
||
| <TabItem value="D:\gth\RSCG_Examples\v2\rscg_examples\loMapper\src\mapperDemo\PersonDTO.cs" label="PersonDTO.cs" > | ||
|
|
||
| This is the use of **lomapper** in *PersonDTO.cs* | ||
|
|
||
| ```csharp showLineNumbers | ||
| using LoMapper; | ||
| using System.Xml.Serialization; | ||
|
|
||
| namespace mapperDemo; | ||
| public partial struct PersonDTO | ||
| { | ||
| public string? FirstName \{ get; set; } | ||
| public string? LastName \{ get; set; } | ||
|
|
||
| public string FullName \{ | ||
| get | ||
| { | ||
| return FirstName + " " + LastName; | ||
| } | ||
| } | ||
| } | ||
|
|
||
|
|
||
| [Mapper] | ||
| public partial class UserMapper | ||
| { | ||
| [MapIgnore(nameof(Person.ID))] | ||
| public partial PersonDTO Map(Person entity); | ||
| } | ||
| ``` | ||
| </TabItem> |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Check if lomapper directory exists and verify casing
fd -t d -i 'lomapper' v2/rscg_examples/ -x echo "Found: {}"
fd -t d -i 'loMapper' v2/rscg_examples/ -x echo "Found: {}"Repository: ignatandrei/RSCG_Examples
Length of output: 134
Fix path casing to match actual directory structure.
The TabItem paths show loMapper (capital M) but the actual directory in the repository is lomapper (all lowercase). Update the paths on lines 411, 426, and 443 to use lowercase lomapper:
D:\gth\RSCG_Examples\v2\rscg_examples\lomapper\src\mapperDemo\...
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@v2/rscg_examples_site/docs/RSCG-Examples/lomapper.md` around lines 411 - 473,
The TabItem value attributes in the markdown use "loMapper" (capital M) but the
actual folder is "lomapper" (all lowercase); update the three TabItem value
attributes that point to Program.cs, Person.cs, and PersonDTO.cs so their value
strings use "lomapper" (lowercase m) instead of "loMapper" to match the
repository directory casing.
|
|
||
| :::tip | ||
|
|
||
| [Download Example project lomapper ](/sources/lomapper.zip) |
There was a problem hiding this comment.
Remove trailing space in link text.
The download link has a trailing space before the closing bracket, which violates markdown best practices.
🔗 Proposed fix
-[Download Example project lomapper ](/sources/lomapper.zip)
+[Download Example project lomapper](/sources/lomapper.zip)🧰 Tools
🪛 markdownlint-cli2 (0.22.0)
[warning] 1001-1001: Spaces inside link text
(MD039, no-space-in-links)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@v2/rscg_examples_site/docs/RSCG-Examples/lomapper.md` at line 1001, Remove
the trailing space inside the markdown link text so it reads "[Download Example
project lomapper](/sources/lomapper.zip)" instead of "[Download Example project
lomapper ](/sources/lomapper.zip)"; update the link string in the lomapper.md
content where that exact link appears to eliminate the space before the closing
bracket.
Summary by CodeRabbit
New Features
Documentation