Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
<GlobalPackageReference Include="Nerdbank.GitVersioning" Version="3.8.118" />
</ItemGroup>
<ItemGroup>
<PackageVersion Include="BlazorMonaco" Version="3.3.0" />
<PackageVersion Include="ColorCode.HTML" Version="2.0.15" />
<PackageVersion Include="coverlet.collector" Version="6.0.4">
<PrivateAssets>all</PrivateAssets>
Expand Down Expand Up @@ -41,7 +40,7 @@
<PackageVersion Include="Shouldly" Version="4.3.0" />
<PackageVersion Include="System.CodeDom" Version="10.0.11" />
<PackageVersion Include="System.CommandLine" Version="2.0.0-beta4.22272.1" />
<PackageVersion Include="TabBlazor" Version="0.8.1.1-alpha" />
<PackageVersion Include="TabBlazor" Version="1.6.7-beta" />
<PackageVersion Include="Websocket.Client" Version="5.3.0" />
<PackageVersion Include="xunit" Version="2.9.3" />
<PackageVersion Include="xunit.runner.visualstudio" Version="3.1.5">
Expand Down
159 changes: 84 additions & 75 deletions docs/Linq2GraphQL.Docs/Components/GenerateClient.razor
Original file line number Diff line number Diff line change
Expand Up @@ -2,78 +2,87 @@

<h3>Generate Client</h3>

<Dimmer Active=isLoading>

<ItemSelect Items="demoOptions" @bind-SelectedValue="options" SelectedTextExpression="e=>e.ClientName">
<ListTemplate>
@context.ClientName
</ListTemplate>
</ItemSelect>

<Card class="mt-3">
<CardBody>
<DataGrid>
<DataGridItem Title="Name">
<InputText class="form-control" @bind-Value="options.ClientName"/>
</DataGridItem>
<DataGridItem Title="Namespace">
<InputText class="form-control" @bind-Value="options.Namespace"/>
</DataGridItem>

<DataGridItem Title="Enum Strategy">
<ItemSelect Items="EnumHelper.GetList<EnumGeneratorStrategy>()"
@bind-SelectedValue="options.EnumGeneratorStrategy"/>
</DataGridItem>

<DataGridItem Title="Include subscriptions">
<Checkbox Switch @bind-Value="options.IncludeSubscriptions"/>
</DataGridItem>

<DataGridItem Title="Nullable client">
<Checkbox Switch @bind-Value="options.Nullable"/>
</DataGridItem>

<DataGridItem Title="Include Deprecated">
<Checkbox Switch @bind-Value="options.IncludeDeprecated"/>
</DataGridItem>

</DataGrid>

<div class="mt-3"/>
<Tabs>
<Tab Title="Url">
<DataGrid>
<DataGridItem Title="Url">
<InputText class="form-control" @bind-Value="options.Url"/>
</DataGridItem>
<DataGridItem Title="Token">
<InputText class="form-control" @bind-Value="options.Token"/>
</DataGridItem>
</DataGrid>


<Button class="mt-3" BackgroundColor="TablerColor.Primary" OnClick="GenerateClientAsync">Generate
</Button>

</Tab>

<Tab Title="Schema">

<div class="mb-2">Run this
<Icon class="icon" IconType="Icons.Copy" OnClick="CopyIntrospection"/>
query and paste the result below.
</div>

<InputTextArea class="form-control" @bind-Value="options.Schema" rows="20"/>

<Button class="mt-3" BackgroundColor="TablerColor.Primary" OnClick="GenerateClientJson">Generate
</Button>
</Tab>

</Tabs>


</CardBody>
</Card>

</Dimmer>
<div class="dimmer @(isLoading ? "active" : "")">
<div class="loader"></div>
<div class="dimmer-content">

<ItemSelect Items="demoOptions" @bind-SelectedValue="options" SelectedTextExpression="e=>e.ClientName">
<ListTemplate>
@context.ClientName
</ListTemplate>
</ItemSelect>

<Card class="mt-3">
<CardBody>
<DataGrid>
<DataGridItem Title="Name">
<InputText class="form-control" @bind-Value="options.ClientName"/>
</DataGridItem>
<DataGridItem Title="Namespace">
<InputText class="form-control" @bind-Value="options.Namespace"/>
</DataGridItem>

<DataGridItem Title="Enum Strategy">
<ItemSelect Items="EnumHelper.GetList<EnumGeneratorStrategy>()"
@bind-SelectedValue="options.EnumGeneratorStrategy"/>
</DataGridItem>

<DataGridItem Title="Include subscriptions">
<Checkbox Switch @bind-Value="options.IncludeSubscriptions"/>
</DataGridItem>

<DataGridItem Title="Nullable client">
<Checkbox Switch @bind-Value="options.Nullable"/>
</DataGridItem>

<DataGridItem Title="Include Deprecated">
<Checkbox Switch @bind-Value="options.IncludeDeprecated"/>
</DataGridItem>

</DataGrid>

<div class="mt-3"/>
<Tabs>
<Tab Title="Url">
<DataGrid>
<DataGridItem Title="Url">
<InputText class="form-control" @bind-Value="options.Url"/>
</DataGridItem>
<DataGridItem Title="Token">
<InputText class="form-control" @bind-Value="options.Token"/>
</DataGridItem>
</DataGrid>


<Button class="mt-3" BackgroundColor="TablerColor.Primary" OnClick="GenerateClientAsync">Generate
</Button>

</Tab>

<Tab Title="Schema (SDL / JSON)">

<div class="mb-2">
Upload or paste the schema as SDL (<code>schema.graphql</code>), or as the result of this
<Icon class="icon" IconType="Icons.Copy" OnClick="CopyIntrospection"/>
introspection query. The format is detected from the content.
</div>

<InputFile class="form-control mb-2" OnChange="LoadSchemaFileAsync"
accept=".graphql,.graphqls,.gql,.sdl,.json,.txt"/>

<InputTextArea class="form-control font-monospace" @bind-Value="options.Schema" rows="20"
placeholder="type Query { ... }"/>

<Button class="mt-3" BackgroundColor="TablerColor.Primary" OnClick="GenerateClientFromSchema">
Generate @(IsIntrospectionJson(options.Schema) ? "from introspection JSON" : "from SDL")
</Button>
</Tab>

</Tabs>


</CardBody>
</Card>

</div>
</div>
42 changes: 39 additions & 3 deletions docs/Linq2GraphQL.Docs/Components/GenerateClient.razor.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
using System.IO.Compression;
using Linq2GraphQL.Generator;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Forms;
using TabBlazor;
using TabBlazor.Services;

namespace Linq2GraphQL.Docs.Components;

public partial class GenerateClient
{
// Introspection results of large public schemas (GitHub) run to several MB.
private const long MaxSchemaFileSize = 50 * 1024 * 1024;

private readonly List<GenerateOptions> demoOptions = new();
private bool isLoading;

Expand Down Expand Up @@ -94,14 +98,46 @@ await toastService.AddToastAsync(new()
});
}

private async Task GenerateClientJson()
private async Task LoadSchemaFileAsync(InputFileChangeEventArgs e)
{
try
{
isLoading = true;
await using var stream = e.File.OpenReadStream(MaxSchemaFileSize);
using var reader = new StreamReader(stream);
options.Schema = await reader.ReadToEndAsync();
}
catch (Exception ex)
{
var component = new RenderComponent<ExceptionModal>().Set(c => c.Exception, ex);
await modalService.ShowAsync("Error", component, new() { Size = ModalSize.Large });
}
finally
{
isLoading = false;
}
}

/// <summary>
/// An introspection result is a JSON object; SDL can never start with '{'.
/// </summary>
private static bool IsIntrospectionJson(string schema) => schema?.TrimStart().StartsWith('{') == true;

private async Task GenerateClientFromSchema()
{
try
{
if (string.IsNullOrWhiteSpace(options.Schema))
{
throw new InvalidOperationException("Upload or paste a schema first.");
}

isLoading = true;
var generator = new ClientGenerator(options.Namespace, options.ClientName, options.IncludeSubscriptions,
EnumGeneratorStrategy.FailIfMissing, options.Nullable, options.IncludeDeprecated);
var entries = generator.Generate(options.Schema);
options.EnumGeneratorStrategy, options.Nullable, options.IncludeDeprecated);
var entries = IsIntrospectionJson(options.Schema)
? generator.Generate(options.Schema)
: generator.GenerateFromSdl(options.Schema);
await SaveEntriesAsync(entries);
}
catch (Exception ex)
Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

11 changes: 0 additions & 11 deletions docs/Linq2GraphQL.Docs/Components/Samples/Queries/BasicQuery.razor

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

11 changes: 0 additions & 11 deletions docs/Linq2GraphQL.Docs/Components/Samples/Queries/SelectMany.razor

This file was deleted.

Loading
Loading