Skip to content

Commit 8f6d91f

Browse files
committed
Add Rider support
1 parent 2a30025 commit 8f6d91f

53 files changed

Lines changed: 2847 additions & 1683 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
packages
22
sign
33

4+
**/.idea
5+
**/rider
6+
47
# User files
58
*.suo
69
*.user
@@ -24,3 +27,7 @@ x64/
2427
_NCrunch_WebCompiler
2528
*.generated.d.ts
2629
*.generated.ts
30+
31+
# Rider plugin build output
32+
output/
33+
rider/build/

README-RIDER.md

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
# TypeScript Definition Generator — использование в JetBrains Rider
2+
3+
Расширение для Visual Studio генерирует `.d.ts` файлы из C# DTO моделей. В Rider можно достичь того же результата следующими способами:
4+
5+
## Способ 1: External Tool (рекомендуется)
6+
7+
1. **Соберите и установите dotnet tool:**
8+
```bash
9+
cd src/TypeScriptDefinitionGenerator.Cli
10+
dotnet pack -c Release
11+
dotnet tool install -g --add-source ./bin/Release TypeScriptDefinitionGenerator.Cli
12+
```
13+
Или запускайте напрямую:
14+
```bash
15+
dotnet run --project src/TypeScriptDefinitionGenerator.Cli -- $FilePath$
16+
```
17+
18+
2. **Настройте External Tool в Rider:**
19+
- **Settings****Tools****External Tools****Add**
20+
- **Name:** Generate TypeScript Definition
21+
- **Program:** `dotnet`
22+
- **Arguments:** `run --project src/TypeScriptDefinitionGenerator.Cli -- $FilePath$`
23+
- **Working directory:** `$ContentRoot$`
24+
- Включите **Synchronize files after execution**
25+
26+
3. **Добавьте в контекстное меню:**
27+
- **Settings****Menus and Toolbars****Project View****Context Menu**
28+
- Добавьте созданный External Tool
29+
30+
## Способ 2: Запуск из терминала
31+
32+
```bash
33+
# Один файл (укажите путь к вашему .cs файлу)
34+
dotnet run --project src/TypeScriptDefinitionGenerator.Cli -- path/to/YourDto.cs
35+
36+
# Несколько файлов
37+
dotnet run --project src/TypeScriptDefinitionGenerator.Cli -- path/to/Dto1.cs path/to/Dto2.cs
38+
```
39+
40+
## Конфигурация (tsdefgen.json)
41+
42+
Поместите файл `tsdefgen.json` в корень проекта для переопределения настроек:
43+
44+
```json
45+
{
46+
"camelCasePropertyNames": true,
47+
"camelCaseTypeNames": false,
48+
"defaultModuleName": "Server.Dtos",
49+
"useNamespace": true,
50+
"declareModule": true,
51+
"classInsteadOfInterface": false,
52+
"eolType": "LF",
53+
"indentTab": true,
54+
"indentTabSize": 2
55+
}
56+
```
57+
58+
## Автогенерация при сборке (MSBuild)
59+
60+
При изменении .cs файла можно автоматически перегенерировать .d.ts при сборке. Добавьте в .csproj:
61+
62+
```xml
63+
<Import Project="path/to/build/TypeScriptDefinitionGenerator.targets" />
64+
65+
<ItemGroup>
66+
<TypeScriptDefinitionSource Include="base\ThirdClass.cs" />
67+
</ItemGroup>
68+
69+
<ItemGroup>
70+
<None Update="base\ThirdClass.generated.d.ts">
71+
<DependentUpon>base\ThirdClass.cs</DependentUpon>
72+
</None>
73+
</ItemGroup>
74+
```
75+
76+
Target использует Inputs/Outputs для инкрементальной сборки — генерация запускается только когда .cs новее .d.ts.
77+
78+
## Rider Plugin
79+
80+
Плагин добавляет пункт «Generate TypeScript Definition» в контекстное меню для .cs файлов (в меню Generate и в Project View). Плагин запускает `TypeScriptDefinitionGenerator.Cli` как subprocess — без конфликтов с ReSharper SDK.
81+
82+
### Сборка плагина
83+
84+
**Требования:** .NET SDK; для контекстного меню — Java 17+.
85+
86+
```bash
87+
# Полная сборка (с контекстным меню Solution View)
88+
./build-rider-plugin.sh [Debug|Release] [версия]
89+
# Пример: ./build-rider-plugin.sh Release 1.0.0
90+
```
91+
92+
**Без Java 17:** скрипт автоматически соберёт только .NET backend (без пункта в контекстном меню). Используйте **Find Action** (Ctrl+Shift+A / Cmd+Shift+A) → «Generate TypeScript Definition». Или явно: `./build-rider-plugin.sh --dotnet-only`.
93+
94+
**С Java 17:** скрипт автоматически ищет Java 17 (Homebrew). Или задайте явно:
95+
```bash
96+
export JAVA_HOME=$(/usr/libexec/java_home -v 17) # macOS
97+
./build-rider-plugin.sh Release 1.0.0
98+
```
99+
100+
Скрипт собирает .NET backend и при наличии Java 17 — Kotlin frontend (контекстное меню Solution View). Плагин совместим с Rider 2024.1+ (включая Rider 2025.3).
101+
102+
### Установка
103+
104+
1. Соберите плагин (см. выше)
105+
2. В Rider: **Settings****Plugins****Gear icon****Install Plugin from Disk**
106+
3. Выберите `output/TypeScriptDefinitionGenerator.Rider-<version>.zip`
107+
4. Перезапустите Rider
108+
109+
### Использование
110+
111+
1. Откройте решение TypeScriptDefinitionGenerator (или любое с CLI в `src/TypeScriptDefinitionGenerator.Cli`)
112+
2. ПКМ по .cs файлу → **Generate TypeScript Definition**
113+
3. Или в редакторе: Alt+Enter → **Generate****Generate TypeScript Definition**
114+
115+
Плагин запускает `dotnet run --project src/TypeScriptDefinitionGenerator.Cli -- <путь-к-файлу>` в каталоге решения.

README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,14 @@ Configure this extension from the **Tools -> Options -> Text Editor -> JavaScrip
101101

102102
![Settings](art/settings.png)
103103

104+
## JetBrains Rider
105+
106+
Для использования в Rider см. [README-RIDER.md](README-RIDER.md) — плагин с контекстным меню, External Tool или dotnet tool для генерации .d.ts файлов.
107+
108+
## Сборка расширения
109+
110+
Расширение использует SDK-style проект (PackageReference). Сборка возможна **только на Windows** с установленной Visual Studio 2022, т.к. VSSDK требует vsct.exe для компиляции меню.
111+
104112
## Contribute
105113
Check out the [contribution guidelines](.github/CONTRIBUTING.md)
106114
if you want to contribute to this project.

TypeScriptDefinitionGenerator.sln

Lines changed: 0 additions & 46 deletions
This file was deleted.

TypeScriptDefinitionGenerator.slnx

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<Solution>
2+
<Folder Name="/assets/">
3+
<File Path="appveyor.yml" />
4+
<File Path="build-rider-plugin.sh" />
5+
<File Path="CHANGELOG.md" />
6+
<File Path="LICENSE" />
7+
<File Path="README-RIDER.md" />
8+
<File Path="README.md" />
9+
</Folder>
10+
<Project Path="src/TypeScriptDefinitionGenerator.Cli/TypeScriptDefinitionGenerator.Cli.csproj" />
11+
<Project Path="src/TypeScriptDefinitionGenerator.Core/TypeScriptDefinitionGenerator.Core.csproj" />
12+
<Project Path="src/TypeScriptDefinitionGenerator.Rider/TypeScriptDefinitionGenerator.Rider.csproj" />
13+
<Project Path="src/TypeScriptDefinitionGenerator/TypeScriptDefinitionGenerator.csproj" />
14+
<Project Path="tests/ClassLibrary1/ClassLibrary1.csproj" />
15+
<Project Path="tests/TypeScriptDefinitionGenerator.Tests/TypeScriptDefinitionGenerator.Tests.csproj" />
16+
</Solution>

build-rider-plugin.sh

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
#!/bin/bash
2+
# Build TypeScript Definition Generator Rider plugin
3+
# Output: TypeScriptDefinitionGenerator.Rider-<version>.zip
4+
# Requires: dotnet; Java 17+ for full build (Kotlin context menu)
5+
6+
set -e
7+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
8+
cd "$SCRIPT_DIR"
9+
10+
CONFIGURATION="${1:-Release}"
11+
VERSION="${2:-1.0.0}"
12+
DOTNET_ONLY="${3:-}"
13+
PLUGIN_NAME="TypeScriptDefinitionGenerator.Rider"
14+
OUTPUT_DIR="output"
15+
ZIP_NAME="${PLUGIN_NAME}-${VERSION}.zip"
16+
17+
# --dotnet-only: skip Kotlin (no Solution View context menu), works without Java 17
18+
if [ "$CONFIGURATION" = "--dotnet-only" ]; then
19+
DOTNET_ONLY=1
20+
CONFIGURATION="Release"
21+
elif [ "$VERSION" = "--dotnet-only" ]; then
22+
DOTNET_ONLY=1
23+
VERSION="1.0.0"
24+
fi
25+
26+
echo "Building $PLUGIN_NAME ($CONFIGURATION)..."
27+
28+
# 1. Build .NET backend
29+
echo " Building .NET backend..."
30+
dotnet build "src/${PLUGIN_NAME}/${PLUGIN_NAME}.csproj" -c "$CONFIGURATION"
31+
32+
PLUGIN_DIR="$OUTPUT_DIR/${PLUGIN_NAME}"
33+
rm -rf "$PLUGIN_DIR"
34+
mkdir -p "$PLUGIN_DIR"
35+
mkdir -p "$PLUGIN_DIR/dotnet"
36+
mkdir -p "$PLUGIN_DIR/META-INF"
37+
38+
# 2. Build Kotlin frontend (Solution View context menu) — requires Java 17+
39+
KOTLIN_BUILT=0
40+
if [ -z "$DOTNET_ONLY" ]; then
41+
echo " Building Kotlin frontend..."
42+
JAVA_CMD="java"
43+
[ -n "$JAVA_HOME" ] && [ -x "$JAVA_HOME/bin/java" ] && JAVA_CMD="$JAVA_HOME/bin/java"
44+
# Fallback: find Java 17 (macOS Homebrew)
45+
if ! $JAVA_CMD -version 2>&1 | grep -qE 'version "1[7-9]|version "2[0-9]'; then
46+
for j in /opt/homebrew/opt/openjdk@17/libexec/openjdk.jdk/Contents/Home /usr/local/opt/openjdk@17/libexec/openjdk.jdk/Contents/Home; do
47+
[ -x "$j/bin/java" ] && export JAVA_HOME="$j" && JAVA_CMD="$j/bin/java" && break
48+
done
49+
fi
50+
if $JAVA_CMD -version 2>&1 | grep -qE 'version "1[7-9]|version "2[0-9]'; then
51+
if [ -f "rider/gradlew" ]; then
52+
if (cd rider && export JAVA_HOME="$JAVA_HOME" && ./gradlew buildPlugin -q); then
53+
KOTLIN_BUILT=1
54+
else
55+
echo " Kotlin build failed. Run: cd rider && ./gradlew buildPlugin"
56+
fi
57+
fi
58+
else
59+
echo " Skipping Kotlin (Java 17+ required). Set JAVA_HOME or use --dotnet-only."
60+
fi
61+
fi
62+
63+
# 3. Assemble plugin
64+
if [ "$KOTLIN_BUILT" = "1" ]; then
65+
RIDER_ZIP=""
66+
for candidate in "rider/build/distributions/${PLUGIN_NAME}-${VERSION}.zip" "rider/build/distributions/${PLUGIN_NAME}-1.0.0.zip"; do
67+
if [ -f "$candidate" ]; then
68+
RIDER_ZIP="$candidate"
69+
break
70+
fi
71+
done
72+
[ -z "$RIDER_ZIP" ] && RIDER_ZIP=$(ls rider/build/distributions/*.zip 2>/dev/null | head -1)
73+
if [ -f "$RIDER_ZIP" ]; then
74+
TMP_EXTRACT="$OUTPUT_DIR/.tmp_extract"
75+
rm -rf "$TMP_EXTRACT"
76+
unzip -q -o "$RIDER_ZIP" -d "$TMP_EXTRACT"
77+
EXTRACTED=$(find "$TMP_EXTRACT" -maxdepth 1 -type d -name "${PLUGIN_NAME}*" | head -1)
78+
if [ -n "$EXTRACTED" ] && [ -d "$EXTRACTED" ]; then
79+
cp -R "$EXTRACTED"/* "$PLUGIN_DIR/"
80+
elif [ -d "$TMP_EXTRACT/META-INF" ]; then
81+
cp -R "$TMP_EXTRACT"/META-INF/* "$PLUGIN_DIR/META-INF/"
82+
[ -d "$TMP_EXTRACT/lib" ] && cp -R "$TMP_EXTRACT"/lib "$PLUGIN_DIR/"
83+
fi
84+
rm -rf "$TMP_EXTRACT"
85+
fi
86+
fi
87+
88+
# Use plugin.xml: Kotlin version (with actions) or minimal .NET-only version
89+
if [ "$KOTLIN_BUILT" = "1" ]; then
90+
cp "rider/src/main/resources/META-INF/plugin.xml" "$PLUGIN_DIR/META-INF/"
91+
else
92+
cp "src/${PLUGIN_NAME}/META-INF/plugin.xml" "$PLUGIN_DIR/META-INF/"
93+
echo " Note: Kotlin frontend not included — use Find Action (Ctrl+Shift+A) or External Tool."
94+
fi
95+
96+
# Add dotnet backend
97+
cp "src/${PLUGIN_NAME}/bin/${CONFIGURATION}/netstandard2.0/${PLUGIN_NAME}.dll" "$PLUGIN_DIR/dotnet/"
98+
cp "src/${PLUGIN_NAME}/bin/${CONFIGURATION}/netstandard2.0/${PLUGIN_NAME}.pdb" "$PLUGIN_DIR/dotnet/" 2>/dev/null || true
99+
100+
# Create zip
101+
cd "$OUTPUT_DIR"
102+
zip -r -q "$ZIP_NAME" "$PLUGIN_NAME"
103+
cd ..
104+
rm -rf "$PLUGIN_DIR"
105+
106+
echo "Plugin built: $OUTPUT_DIR/$ZIP_NAME"
107+
echo "Install: Settings -> Plugins -> Gear icon -> Install Plugin from Disk"
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3+
<!--
4+
TypeScript Definition Generator — MSBuild integration.
5+
Generates .d.ts from .cs when the source file changes (incremental build).
6+
7+
Usage: add to your .csproj:
8+
<Import Project="path/to/TypeScriptDefinitionGenerator.targets" />
9+
10+
Set TypeScriptDefinitionGeneratorCliProject to path to TypeScriptDefinitionGenerator.Cli.csproj
11+
if not using the default (relative to this targets file).
12+
Or install tsdefgen as dotnet tool and leave TypeScriptDefinitionGeneratorCliProject empty.
13+
-->
14+
<PropertyGroup>
15+
<TypeScriptDefinitionGeneratorCliProject Condition="'$(TypeScriptDefinitionGeneratorCliProject)' == ''">$(MSBuildThisFileDirectory)../src/TypeScriptDefinitionGenerator.Cli/TypeScriptDefinitionGenerator.Cli.csproj</TypeScriptDefinitionGeneratorCliProject>
16+
<_TsDefGenUseTool Condition="'$(TypeScriptDefinitionGeneratorUseTool)' == 'true'">true</_TsDefGenUseTool>
17+
</PropertyGroup>
18+
19+
<!-- Add TypeScriptDefinitionSource items for .cs files that should generate .d.ts, e.g.:
20+
<ItemGroup>
21+
<TypeScriptDefinitionSource Include="base\ThirdClass.cs" />
22+
</ItemGroup>
23+
-->
24+
25+
<Target Name="GenerateTypeScriptDefinitions"
26+
BeforeTargets="BeforeBuild"
27+
Inputs="@(TypeScriptDefinitionSource)"
28+
Outputs="@(TypeScriptDefinitionSource->'%(RelativeDir)%(Filename).generated.d.ts')"
29+
Condition="'@(TypeScriptDefinitionSource)' != ''">
30+
<PropertyGroup>
31+
<_TsDefGenCommand Condition="'$(_TsDefGenUseTool)' == 'true'">dotnet tsdefgen</_TsDefGenCommand>
32+
<_TsDefGenCommand Condition="'$(_TsDefGenUseTool)' != 'true'">dotnet run --project &quot;$(TypeScriptDefinitionGeneratorCliProject)&quot; --</_TsDefGenCommand>
33+
</PropertyGroup>
34+
<Exec Command="$(_TsDefGenCommand) &quot;%(TypeScriptDefinitionSource.FullPath)&quot;"
35+
WorkingDirectory="$(MSBuildProjectDirectory)"
36+
IgnoreExitCode="false" />
37+
</Target>
38+
</Project>

0 commit comments

Comments
 (0)