Repository files navigation

ApiClientGenerator

A .NET 6.0 Strongly typed HttpApi Client Generator, mainly being used on a Blazor WebAssembly project. With this project, you can easily and quickly generate a strongly typed HttpClient, with some trimmings, and have it placed in your Blazor WebAssembly project.

How to use

Firstly, add the project from Nuget - GoLive.Generator.ApiClientGenerator, then add an AdditionalFile in your .csproj named "ApiClientGenerator.json", like so:

<ItemGroup>
<AdditionalFiles Include="ApiClientGenerator.json" />
</ItemGroup>

There are a large number of options that are in the settings file:

{
"OutputFiles":[
"GeneratedApiClient.cs"
],
"JSONAPIRepresentationFile":[
"GeneratedApiClient.json"
],
"Namespace": "GoLive.Generator.ApiClientGenerator.Tests.WebApi.Generated",
"CustomDiscriminator": "",
"Includes": [
"GoLive.Generator.ApiClientGenerator"
],
"PreAppendLines": [
"// ReSharper disable All"
],
"PostAppendLines": [
"// ReSharper disable All"
] ,
"HideUrlsRegex": [
"^/_]*",
"^/WeatherForecast/_]*",
"^_]*"
],
"RouteTemplate":"/api/{area:exists}/{controller=Home}/{action=Index}/{id?}",
"ResponseWrapper" :{
"Enabled": true,
"ExtractHeaders":{
"CorrelationId": "X-Correlation-Id"
}
},
"OutputUrls": true,
"OutputUrlsPostfix": "_Url",
"OutputJSONSourceGenerator": true,
"JSONSourceGeneratorSettings":{
"Converters": [
]
},
"Properties":{
"IgnoreGenericTypes" : [
"System.Collections.Generic.List<T>"
],
"IgnoreTypes":[
"System.DateTime"
],
"IgnoreThatHasAttribute":[
"GoLive.Generator.ApiClientGenerator.Tests.WebApi.CustomAttributeModelBinderAttribute"
],
"TransformType":[
{
"SourceType": "*",
"DestinationType" : "System.String",
"ContainsAttribute": "GoLive.Generator.ApiClientGenerator.Tests.WebApi.CustomAttributeModelBinder2Attribute"
},
{
"SourceType": "*",
"DestinationType" : "System.String",
"ContainsAttribute": "GoLive.Generator.ApiClientGenerator.Tests.WebApi.CustomAttributeModelBinder3Attribute"
}
]
}
}

Explanation of options:

  • OutputFiles - this is the file (or files) that will be Generated
  • JSONAPIRepresentationFile (optional) - this will output a .json file that represents the API, if you want to use for an external process etc
  • Namespace - Namespace of the generated classes
  • CustomDiscriminator (optional) - If you want to use custom JSOn Dicriminators
  • Includes (optional) - Any additional Include statements to be added at the top
  • PreAppendLines / PostAppendLines (optional) - Any additional lines such as comments (to disable Resharper's processing)
  • HideUrlsRegex (optional) - Regex patterns, if you want to hide any URLs from being outputted, such as secret admin APIs
  • RouteTemplate - This is the route template that gets used to figure out the URLs
  • ResponseWrapper (optional) - If you want responses to be wrapped with a Response object, and a few options for it (such as pulling out headers etc)
  • OutputUrls / OutputUrlsPostfix (optional)- If you want to output pure methods that return URLs only
  • OutputJSONSourceGenerator (optional) - If you want to output a JSON Source Generator
  • Properties (optional) - processing properties (ignoring properties, changing their type, ignoring of methods that have attributes etc)

XML Comments on API

To get the XML comments pulling through on the API, you need to have:

<PropertyGroup>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup>

On your project's csproj to make the comments visible to the source code generator.

If you don't want XML comments enabled, set the config variable of "DisableXMLComments" to true in the json file.

Changelog

  • Version 3.0 - changed the way the API generation works (uses a central route template as opposed to hard coded), changed json settings file (not backwards compatible but not that different)
  • 3.0.46 - Small issue where _Url's were getting erroneous querystring parameters that were part of URL.
  • 3.0.47 - Remove trailing / from URLs as it will break optional parameters, might need to think about a better way to do this.
  • 3.0.49 - Expose AllAttributes property on Classes / Methods for external processing
  • 3.0.50 - Added a bit of logic to AllAttributes and added missing class processing
  • 3.1.51 - Fixed a bug where transform to a Primitive Type wasn't being removed from body, added HTTP Verb functionality, added ability to generate Idempotency keys, and added ability of AllowedStringValue to be a strongly typed struct (to help enforce)

About

.net 6.0 Web Api Strongly Typed Client Generator

Resources

Stars

24 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

ApiClientGenerator

A .NET 6.0 Strongly typed HttpApi Client Generator, mainly being used on a Blazor WebAssembly project. With this project, you can easily and quickly generate a strongly typed HttpClient, with some trimmings, and have it placed in your Blazor WebAssembly project.

How to use

Firstly, add the project from Nuget - GoLive.Generator.ApiClientGenerator, then add an AdditionalFile in your .csproj named "ApiClientGenerator.json", like so:

<ItemGroup>
<AdditionalFiles Include="ApiClientGenerator.json" />
</ItemGroup>

There are a large number of options that are in the settings file:

{
"OutputFiles":[
"GeneratedApiClient.cs"
],
"JSONAPIRepresentationFile":[
"GeneratedApiClient.json"
],
"Namespace": "GoLive.Generator.ApiClientGenerator.Tests.WebApi.Generated",
"CustomDiscriminator": "",
"Includes": [
"GoLive.Generator.ApiClientGenerator"
],
"PreAppendLines": [
"// ReSharper disable All"
],
"PostAppendLines": [
"// ReSharper disable All"
] ,
"HideUrlsRegex": [
"^/_]*",
"^/WeatherForecast/_]*",
"^_]*"
],
"RouteTemplate":"/api/{area:exists}/{controller=Home}/{action=Index}/{id?}",
"ResponseWrapper" :{
"Enabled": true,
"ExtractHeaders":{
"CorrelationId": "X-Correlation-Id"
}
},
"OutputUrls": true,
"OutputUrlsPostfix": "_Url",
"OutputJSONSourceGenerator": true,
"JSONSourceGeneratorSettings":{
"Converters": [
]
},
"Properties":{
"IgnoreGenericTypes" : [
"System.Collections.Generic.List<T>"
],
"IgnoreTypes":[
"System.DateTime"
],
"IgnoreThatHasAttribute":[
"GoLive.Generator.ApiClientGenerator.Tests.WebApi.CustomAttributeModelBinderAttribute"
],
"TransformType":[
{
"SourceType": "*",
"DestinationType" : "System.String",
"ContainsAttribute": "GoLive.Generator.ApiClientGenerator.Tests.WebApi.CustomAttributeModelBinder2Attribute"
},
{
"SourceType": "*",
"DestinationType" : "System.String",
"ContainsAttribute": "GoLive.Generator.ApiClientGenerator.Tests.WebApi.CustomAttributeModelBinder3Attribute"
}
]
}
}

Explanation of options:

  • OutputFiles - this is the file (or files) that will be Generated
  • JSONAPIRepresentationFile (optional) - this will output a .json file that represents the API, if you want to use for an external process etc
  • Namespace - Namespace of the generated classes
  • CustomDiscriminator (optional) - If you want to use custom JSOn Dicriminators
  • Includes (optional) - Any additional Include statements to be added at the top
  • PreAppendLines / PostAppendLines (optional) - Any additional lines such as comments (to disable Resharper's processing)
  • HideUrlsRegex (optional) - Regex patterns, if you want to hide any URLs from being outputted, such as secret admin APIs
  • RouteTemplate - This is the route template that gets used to figure out the URLs
  • ResponseWrapper (optional) - If you want responses to be wrapped with a Response object, and a few options for it (such as pulling out headers etc)
  • OutputUrls / OutputUrlsPostfix (optional)- If you want to output pure methods that return URLs only
  • OutputJSONSourceGenerator (optional) - If you want to output a JSON Source Generator
  • Properties (optional) - processing properties (ignoring properties, changing their type, ignoring of methods that have attributes etc)

XML Comments on API

To get the XML comments pulling through on the API, you need to have:

<PropertyGroup>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup>

On your project's csproj to make the comments visible to the source code generator.

If you don't want XML comments enabled, set the config variable of "DisableXMLComments" to true in the json file.

Changelog

  • Version 3.0 - changed the way the API generation works (uses a central route template as opposed to hard coded), changed json settings file (not backwards compatible but not that different)
  • 3.0.46 - Small issue where _Url's were getting erroneous querystring parameters that were part of URL.
  • 3.0.47 - Remove trailing / from URLs as it will break optional parameters, might need to think about a better way to do this.
  • 3.0.49 - Expose AllAttributes property on Classes / Methods for external processing
  • 3.0.50 - Added a bit of logic to AllAttributes and added missing class processing
  • 3.1.51 - Fixed a bug where transform to a Primitive Type wasn't being removed from body, added HTTP Verb functionality, added ability to generate Idempotency keys, and added ability of AllowedStringValue to be a strongly typed struct (to help enforce)

About

.net 6.0 Web Api Strongly Typed Client Generator

Resources

Stars

24 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ApiClientGenerator

A .NET 6.0 Strongly typed HttpApi Client Generator, mainly being used on a Blazor WebAssembly project. With this project, you can easily and quickly generate a strongly typed HttpClient, with some trimmings, and have it placed in your Blazor WebAssembly project.

How to use

Firstly, add the project from Nuget - GoLive.Generator.ApiClientGenerator, then add an AdditionalFile in your .csproj named "ApiClientGenerator.json", like so:

<ItemGroup>
<AdditionalFiles Include="ApiClientGenerator.json" />
</ItemGroup>

There are a large number of options that are in the settings file:

{
"OutputFiles":[
"GeneratedApiClient.cs"
],
"JSONAPIRepresentationFile":[
"GeneratedApiClient.json"
],
"Namespace": "GoLive.Generator.ApiClientGenerator.Tests.WebApi.Generated",
"CustomDiscriminator": "",
"Includes": [
"GoLive.Generator.ApiClientGenerator"
],
"PreAppendLines": [
"// ReSharper disable All"
],
"PostAppendLines": [
"// ReSharper disable All"
] ,
"HideUrlsRegex": [
"^/_]*",
"^/WeatherForecast/_]*",
"^_]*"
],
"RouteTemplate":"/api/{area:exists}/{controller=Home}/{action=Index}/{id?}",
"ResponseWrapper" :{
"Enabled": true,
"ExtractHeaders":{
"CorrelationId": "X-Correlation-Id"
}
},
"OutputUrls": true,
"OutputUrlsPostfix": "_Url",
"OutputJSONSourceGenerator": true,
"JSONSourceGeneratorSettings":{
"Converters": [
]
},
"Properties":{
"IgnoreGenericTypes" : [
"System.Collections.Generic.List<T>"
],
"IgnoreTypes":[
"System.DateTime"
],
"IgnoreThatHasAttribute":[
"GoLive.Generator.ApiClientGenerator.Tests.WebApi.CustomAttributeModelBinderAttribute"
],
"TransformType":[
{
"SourceType": "*",
"DestinationType" : "System.String",
"ContainsAttribute": "GoLive.Generator.ApiClientGenerator.Tests.WebApi.CustomAttributeModelBinder2Attribute"
},
{
"SourceType": "*",
"DestinationType" : "System.String",
"ContainsAttribute": "GoLive.Generator.ApiClientGenerator.Tests.WebApi.CustomAttributeModelBinder3Attribute"
}
]
}
}

Explanation of options:

  • OutputFiles - this is the file (or files) that will be Generated
  • JSONAPIRepresentationFile (optional) - this will output a .json file that represents the API, if you want to use for an external process etc
  • Namespace - Namespace of the generated classes
  • CustomDiscriminator (optional) - If you want to use custom JSOn Dicriminators
  • Includes (optional) - Any additional Include statements to be added at the top
  • PreAppendLines / PostAppendLines (optional) - Any additional lines such as comments (to disable Resharper's processing)
  • HideUrlsRegex (optional) - Regex patterns, if you want to hide any URLs from being outputted, such as secret admin APIs
  • RouteTemplate - This is the route template that gets used to figure out the URLs
  • ResponseWrapper (optional) - If you want responses to be wrapped with a Response object, and a few options for it (such as pulling out headers etc)
  • OutputUrls / OutputUrlsPostfix (optional)- If you want to output pure methods that return URLs only
  • OutputJSONSourceGenerator (optional) - If you want to output a JSON Source Generator
  • Properties (optional) - processing properties (ignoring properties, changing their type, ignoring of methods that have attributes etc)

XML Comments on API

To get the XML comments pulling through on the API, you need to have:

<PropertyGroup>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup>

On your project's csproj to make the comments visible to the source code generator.

If you don't want XML comments enabled, set the config variable of "DisableXMLComments" to true in the json file.

Changelog

  • Version 3.0 - changed the way the API generation works (uses a central route template as opposed to hard coded), changed json settings file (not backwards compatible but not that different)
  • 3.0.46 - Small issue where _Url's were getting erroneous querystring parameters that were part of URL.
  • 3.0.47 - Remove trailing / from URLs as it will break optional parameters, might need to think about a better way to do this.
  • 3.0.49 - Expose AllAttributes property on Classes / Methods for external processing
  • 3.0.50 - Added a bit of logic to AllAttributes and added missing class processing
  • 3.1.51 - Fixed a bug where transform to a Primitive Type wasn't being removed from body, added HTTP Verb functionality, added ability to generate Idempotency keys, and added ability of AllowedStringValue to be a strongly typed struct (to help enforce)

About

.net 6.0 Web Api Strongly Typed Client Generator

Resources

Stars

24 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ApiClientGenerator

A .NET 6.0 Strongly typed HttpApi Client Generator, mainly being used on a Blazor WebAssembly project. With this project, you can easily and quickly generate a strongly typed HttpClient, with some trimmings, and have it placed in your Blazor WebAssembly project.

How to use

Firstly, add the project from Nuget - GoLive.Generator.ApiClientGenerator, then add an AdditionalFile in your .csproj named "ApiClientGenerator.json", like so:

<ItemGroup>
<AdditionalFiles Include="ApiClientGenerator.json" />
</ItemGroup>

There are a large number of options that are in the settings file:

{
"OutputFiles":[
"GeneratedApiClient.cs"
],
"JSONAPIRepresentationFile":[
"GeneratedApiClient.json"
],
"Namespace": "GoLive.Generator.ApiClientGenerator.Tests.WebApi.Generated",
"CustomDiscriminator": "",
"Includes": [
"GoLive.Generator.ApiClientGenerator"
],
"PreAppendLines": [
"// ReSharper disable All"
],
"PostAppendLines": [
"// ReSharper disable All"
] ,
"HideUrlsRegex": [
"^/_]*",
"^/WeatherForecast/_]*",
"^_]*"
],
"RouteTemplate":"/api/{area:exists}/{controller=Home}/{action=Index}/{id?}",
"ResponseWrapper" :{
"Enabled": true,
"ExtractHeaders":{
"CorrelationId": "X-Correlation-Id"
}
},
"OutputUrls": true,
"OutputUrlsPostfix": "_Url",
"OutputJSONSourceGenerator": true,
"JSONSourceGeneratorSettings":{
"Converters": [
]
},
"Properties":{
"IgnoreGenericTypes" : [
"System.Collections.Generic.List<T>"
],
"IgnoreTypes":[
"System.DateTime"
],
"IgnoreThatHasAttribute":[
"GoLive.Generator.ApiClientGenerator.Tests.WebApi.CustomAttributeModelBinderAttribute"
],
"TransformType":[
{
"SourceType": "*",
"DestinationType" : "System.String",
"ContainsAttribute": "GoLive.Generator.ApiClientGenerator.Tests.WebApi.CustomAttributeModelBinder2Attribute"
},
{
"SourceType": "*",
"DestinationType" : "System.String",
"ContainsAttribute": "GoLive.Generator.ApiClientGenerator.Tests.WebApi.CustomAttributeModelBinder3Attribute"
}
]
}
}

Explanation of options:

  • OutputFiles - this is the file (or files) that will be Generated
  • JSONAPIRepresentationFile (optional) - this will output a .json file that represents the API, if you want to use for an external process etc
  • Namespace - Namespace of the generated classes
  • CustomDiscriminator (optional) - If you want to use custom JSOn Dicriminators
  • Includes (optional) - Any additional Include statements to be added at the top
  • PreAppendLines / PostAppendLines (optional) - Any additional lines such as comments (to disable Resharper's processing)
  • HideUrlsRegex (optional) - Regex patterns, if you want to hide any URLs from being outputted, such as secret admin APIs
  • RouteTemplate - This is the route template that gets used to figure out the URLs
  • ResponseWrapper (optional) - If you want responses to be wrapped with a Response object, and a few options for it (such as pulling out headers etc)
  • OutputUrls / OutputUrlsPostfix (optional)- If you want to output pure methods that return URLs only
  • OutputJSONSourceGenerator (optional) - If you want to output a JSON Source Generator
  • Properties (optional) - processing properties (ignoring properties, changing their type, ignoring of methods that have attributes etc)

XML Comments on API

To get the XML comments pulling through on the API, you need to have:

<PropertyGroup>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup>

On your project's csproj to make the comments visible to the source code generator.

If you don't want XML comments enabled, set the config variable of "DisableXMLComments" to true in the json file.

Changelog

  • Version 3.0 - changed the way the API generation works (uses a central route template as opposed to hard coded), changed json settings file (not backwards compatible but not that different)
  • 3.0.46 - Small issue where _Url's were getting erroneous querystring parameters that were part of URL.
  • 3.0.47 - Remove trailing / from URLs as it will break optional parameters, might need to think about a better way to do this.
  • 3.0.49 - Expose AllAttributes property on Classes / Methods for external processing
  • 3.0.50 - Added a bit of logic to AllAttributes and added missing class processing
  • 3.1.51 - Fixed a bug where transform to a Primitive Type wasn't being removed from body, added HTTP Verb functionality, added ability to generate Idempotency keys, and added ability of AllowedStringValue to be a strongly typed struct (to help enforce)

About

.net 6.0 Web Api Strongly Typed Client Generator

Resources

Stars

24 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

ApiClientGenerator

A .NET 6.0 Strongly typed HttpApi Client Generator, mainly being used on a Blazor WebAssembly project. With this project, you can easily and quickly generate a strongly typed HttpClient, with some trimmings, and have it placed in your Blazor WebAssembly project.

How to use

Firstly, add the project from Nuget - GoLive.Generator.ApiClientGenerator, then add an AdditionalFile in your .csproj named "ApiClientGenerator.json", like so:

<ItemGroup>
<AdditionalFiles Include="ApiClientGenerator.json" />
</ItemGroup>

There are a large number of options that are in the settings file:

{
"OutputFiles":[
"GeneratedApiClient.cs"
],
"JSONAPIRepresentationFile":[
"GeneratedApiClient.json"
],
"Namespace": "GoLive.Generator.ApiClientGenerator.Tests.WebApi.Generated",
"CustomDiscriminator": "",
"Includes": [
"GoLive.Generator.ApiClientGenerator"
],
"PreAppendLines": [
"// ReSharper disable All"
],
"PostAppendLines": [
"// ReSharper disable All"
] ,
"HideUrlsRegex": [
"^/_]*",
"^/WeatherForecast/_]*",
"^_]*"
],
"RouteTemplate":"/api/{area:exists}/{controller=Home}/{action=Index}/{id?}",
"ResponseWrapper" :{
"Enabled": true,
"ExtractHeaders":{
"CorrelationId": "X-Correlation-Id"
}
},
"OutputUrls": true,
"OutputUrlsPostfix": "_Url",
"OutputJSONSourceGenerator": true,
"JSONSourceGeneratorSettings":{
"Converters": [
]
},
"Properties":{
"IgnoreGenericTypes" : [
"System.Collections.Generic.List<T>"
],
"IgnoreTypes":[
"System.DateTime"
],
"IgnoreThatHasAttribute":[
"GoLive.Generator.ApiClientGenerator.Tests.WebApi.CustomAttributeModelBinderAttribute"
],
"TransformType":[
{
"SourceType": "*",
"DestinationType" : "System.String",
"ContainsAttribute": "GoLive.Generator.ApiClientGenerator.Tests.WebApi.CustomAttributeModelBinder2Attribute"
},
{
"SourceType": "*",
"DestinationType" : "System.String",
"ContainsAttribute": "GoLive.Generator.ApiClientGenerator.Tests.WebApi.CustomAttributeModelBinder3Attribute"
}
]
}
}

Explanation of options:

  • OutputFiles - this is the file (or files) that will be Generated
  • JSONAPIRepresentationFile (optional) - this will output a .json file that represents the API, if you want to use for an external process etc
  • Namespace - Namespace of the generated classes
  • CustomDiscriminator (optional) - If you want to use custom JSOn Dicriminators
  • Includes (optional) - Any additional Include statements to be added at the top
  • PreAppendLines / PostAppendLines (optional) - Any additional lines such as comments (to disable Resharper's processing)
  • HideUrlsRegex (optional) - Regex patterns, if you want to hide any URLs from being outputted, such as secret admin APIs
  • RouteTemplate - This is the route template that gets used to figure out the URLs
  • ResponseWrapper (optional) - If you want responses to be wrapped with a Response object, and a few options for it (such as pulling out headers etc)
  • OutputUrls / OutputUrlsPostfix (optional)- If you want to output pure methods that return URLs only
  • OutputJSONSourceGenerator (optional) - If you want to output a JSON Source Generator
  • Properties (optional) - processing properties (ignoring properties, changing their type, ignoring of methods that have attributes etc)

XML Comments on API

To get the XML comments pulling through on the API, you need to have:

<PropertyGroup>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup>

On your project's csproj to make the comments visible to the source code generator.

If you don't want XML comments enabled, set the config variable of "DisableXMLComments" to true in the json file.

Changelog

  • Version 3.0 - changed the way the API generation works (uses a central route template as opposed to hard coded), changed json settings file (not backwards compatible but not that different)
  • 3.0.46 - Small issue where _Url's were getting erroneous querystring parameters that were part of URL.
  • 3.0.47 - Remove trailing / from URLs as it will break optional parameters, might need to think about a better way to do this.
  • 3.0.49 - Expose AllAttributes property on Classes / Methods for external processing
  • 3.0.50 - Added a bit of logic to AllAttributes and added missing class processing
  • 3.1.51 - Fixed a bug where transform to a Primitive Type wasn't being removed from body, added HTTP Verb functionality, added ability to generate Idempotency keys, and added ability of AllowedStringValue to be a strongly typed struct (to help enforce)

About

.net 6.0 Web Api Strongly Typed Client Generator

Resources

Stars

24 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ApiClientGenerator

A .NET 6.0 Strongly typed HttpApi Client Generator, mainly being used on a Blazor WebAssembly project. With this project, you can easily and quickly generate a strongly typed HttpClient, with some trimmings, and have it placed in your Blazor WebAssembly project.

How to use

Firstly, add the project from Nuget - GoLive.Generator.ApiClientGenerator, then add an AdditionalFile in your .csproj named "ApiClientGenerator.json", like so:

<ItemGroup>
<AdditionalFiles Include="ApiClientGenerator.json" />
</ItemGroup>

There are a large number of options that are in the settings file:

{
"OutputFiles":[
"GeneratedApiClient.cs"
],
"JSONAPIRepresentationFile":[
"GeneratedApiClient.json"
],
"Namespace": "GoLive.Generator.ApiClientGenerator.Tests.WebApi.Generated",
"CustomDiscriminator": "",
"Includes": [
"GoLive.Generator.ApiClientGenerator"
],
"PreAppendLines": [
"// ReSharper disable All"
],
"PostAppendLines": [
"// ReSharper disable All"
] ,
"HideUrlsRegex": [
"^/_]*",
"^/WeatherForecast/_]*",
"^_]*"
],
"RouteTemplate":"/api/{area:exists}/{controller=Home}/{action=Index}/{id?}",
"ResponseWrapper" :{
"Enabled": true,
"ExtractHeaders":{
"CorrelationId": "X-Correlation-Id"
}
},
"OutputUrls": true,
"OutputUrlsPostfix": "_Url",
"OutputJSONSourceGenerator": true,
"JSONSourceGeneratorSettings":{
"Converters": [
]
},
"Properties":{
"IgnoreGenericTypes" : [
"System.Collections.Generic.List<T>"
],
"IgnoreTypes":[
"System.DateTime"
],
"IgnoreThatHasAttribute":[
"GoLive.Generator.ApiClientGenerator.Tests.WebApi.CustomAttributeModelBinderAttribute"
],
"TransformType":[
{
"SourceType": "*",
"DestinationType" : "System.String",
"ContainsAttribute": "GoLive.Generator.ApiClientGenerator.Tests.WebApi.CustomAttributeModelBinder2Attribute"
},
{
"SourceType": "*",
"DestinationType" : "System.String",
"ContainsAttribute": "GoLive.Generator.ApiClientGenerator.Tests.WebApi.CustomAttributeModelBinder3Attribute"
}
]
}
}

Explanation of options:

  • OutputFiles - this is the file (or files) that will be Generated
  • JSONAPIRepresentationFile (optional) - this will output a .json file that represents the API, if you want to use for an external process etc
  • Namespace - Namespace of the generated classes
  • CustomDiscriminator (optional) - If you want to use custom JSOn Dicriminators
  • Includes (optional) - Any additional Include statements to be added at the top
  • PreAppendLines / PostAppendLines (optional) - Any additional lines such as comments (to disable Resharper's processing)
  • HideUrlsRegex (optional) - Regex patterns, if you want to hide any URLs from being outputted, such as secret admin APIs
  • RouteTemplate - This is the route template that gets used to figure out the URLs
  • ResponseWrapper (optional) - If you want responses to be wrapped with a Response object, and a few options for it (such as pulling out headers etc)
  • OutputUrls / OutputUrlsPostfix (optional)- If you want to output pure methods that return URLs only
  • OutputJSONSourceGenerator (optional) - If you want to output a JSON Source Generator
  • Properties (optional) - processing properties (ignoring properties, changing their type, ignoring of methods that have attributes etc)

XML Comments on API

To get the XML comments pulling through on the API, you need to have:

<PropertyGroup>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup>

On your project's csproj to make the comments visible to the source code generator.

If you don't want XML comments enabled, set the config variable of "DisableXMLComments" to true in the json file.

Changelog

  • Version 3.0 - changed the way the API generation works (uses a central route template as opposed to hard coded), changed json settings file (not backwards compatible but not that different)
  • 3.0.46 - Small issue where _Url's were getting erroneous querystring parameters that were part of URL.
  • 3.0.47 - Remove trailing / from URLs as it will break optional parameters, might need to think about a better way to do this.
  • 3.0.49 - Expose AllAttributes property on Classes / Methods for external processing
  • 3.0.50 - Added a bit of logic to AllAttributes and added missing class processing
  • 3.1.51 - Fixed a bug where transform to a Primitive Type wasn't being removed from body, added HTTP Verb functionality, added ability to generate Idempotency keys, and added ability of AllowedStringValue to be a strongly typed struct (to help enforce)

About

.net 6.0 Web Api Strongly Typed Client Generator

Resources

Stars

24 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ApiClientGenerator

A .NET 6.0 Strongly typed HttpApi Client Generator, mainly being used on a Blazor WebAssembly project. With this project, you can easily and quickly generate a strongly typed HttpClient, with some trimmings, and have it placed in your Blazor WebAssembly project.

How to use

Firstly, add the project from Nuget - GoLive.Generator.ApiClientGenerator, then add an AdditionalFile in your .csproj named "ApiClientGenerator.json", like so:

<ItemGroup>
<AdditionalFiles Include="ApiClientGenerator.json" />
</ItemGroup>

There are a large number of options that are in the settings file:

{
"OutputFiles":[
"GeneratedApiClient.cs"
],
"JSONAPIRepresentationFile":[
"GeneratedApiClient.json"
],
"Namespace": "GoLive.Generator.ApiClientGenerator.Tests.WebApi.Generated",
"CustomDiscriminator": "",
"Includes": [
"GoLive.Generator.ApiClientGenerator"
],
"PreAppendLines": [
"// ReSharper disable All"
],
"PostAppendLines": [
"// ReSharper disable All"
] ,
"HideUrlsRegex": [
"^/_]*",
"^/WeatherForecast/_]*",
"^_]*"
],
"RouteTemplate":"/api/{area:exists}/{controller=Home}/{action=Index}/{id?}",
"ResponseWrapper" :{
"Enabled": true,
"ExtractHeaders":{
"CorrelationId": "X-Correlation-Id"
}
},
"OutputUrls": true,
"OutputUrlsPostfix": "_Url",
"OutputJSONSourceGenerator": true,
"JSONSourceGeneratorSettings":{
"Converters": [
]
},
"Properties":{
"IgnoreGenericTypes" : [
"System.Collections.Generic.List<T>"
],
"IgnoreTypes":[
"System.DateTime"
],
"IgnoreThatHasAttribute":[
"GoLive.Generator.ApiClientGenerator.Tests.WebApi.CustomAttributeModelBinderAttribute"
],
"TransformType":[
{
"SourceType": "*",
"DestinationType" : "System.String",
"ContainsAttribute": "GoLive.Generator.ApiClientGenerator.Tests.WebApi.CustomAttributeModelBinder2Attribute"
},
{
"SourceType": "*",
"DestinationType" : "System.String",
"ContainsAttribute": "GoLive.Generator.ApiClientGenerator.Tests.WebApi.CustomAttributeModelBinder3Attribute"
}
]
}
}

Explanation of options:

  • OutputFiles - this is the file (or files) that will be Generated
  • JSONAPIRepresentationFile (optional) - this will output a .json file that represents the API, if you want to use for an external process etc
  • Namespace - Namespace of the generated classes
  • CustomDiscriminator (optional) - If you want to use custom JSOn Dicriminators
  • Includes (optional) - Any additional Include statements to be added at the top
  • PreAppendLines / PostAppendLines (optional) - Any additional lines such as comments (to disable Resharper's processing)
  • HideUrlsRegex (optional) - Regex patterns, if you want to hide any URLs from being outputted, such as secret admin APIs
  • RouteTemplate - This is the route template that gets used to figure out the URLs
  • ResponseWrapper (optional) - If you want responses to be wrapped with a Response object, and a few options for it (such as pulling out headers etc)
  • OutputUrls / OutputUrlsPostfix (optional)- If you want to output pure methods that return URLs only
  • OutputJSONSourceGenerator (optional) - If you want to output a JSON Source Generator
  • Properties (optional) - processing properties (ignoring properties, changing their type, ignoring of methods that have attributes etc)

XML Comments on API

To get the XML comments pulling through on the API, you need to have:

<PropertyGroup>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup>

On your project's csproj to make the comments visible to the source code generator.

If you don't want XML comments enabled, set the config variable of "DisableXMLComments" to true in the json file.

Changelog

  • Version 3.0 - changed the way the API generation works (uses a central route template as opposed to hard coded), changed json settings file (not backwards compatible but not that different)
  • 3.0.46 - Small issue where _Url's were getting erroneous querystring parameters that were part of URL.
  • 3.0.47 - Remove trailing / from URLs as it will break optional parameters, might need to think about a better way to do this.
  • 3.0.49 - Expose AllAttributes property on Classes / Methods for external processing
  • 3.0.50 - Added a bit of logic to AllAttributes and added missing class processing
  • 3.1.51 - Fixed a bug where transform to a Primitive Type wasn't being removed from body, added HTTP Verb functionality, added ability to generate Idempotency keys, and added ability of AllowedStringValue to be a strongly typed struct (to help enforce)

About

.net 6.0 Web Api Strongly Typed Client Generator

Resources

Stars

24 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

ApiClientGenerator

A .NET 6.0 Strongly typed HttpApi Client Generator, mainly being used on a Blazor WebAssembly project. With this project, you can easily and quickly generate a strongly typed HttpClient, with some trimmings, and have it placed in your Blazor WebAssembly project.

How to use

Firstly, add the project from Nuget - GoLive.Generator.ApiClientGenerator, then add an AdditionalFile in your .csproj named "ApiClientGenerator.json", like so:

<ItemGroup>
<AdditionalFiles Include="ApiClientGenerator.json" />
</ItemGroup>

There are a large number of options that are in the settings file:

{
"OutputFiles":[
"GeneratedApiClient.cs"
],
"JSONAPIRepresentationFile":[
"GeneratedApiClient.json"
],
"Namespace": "GoLive.Generator.ApiClientGenerator.Tests.WebApi.Generated",
"CustomDiscriminator": "",
"Includes": [
"GoLive.Generator.ApiClientGenerator"
],
"PreAppendLines": [
"// ReSharper disable All"
],
"PostAppendLines": [
"// ReSharper disable All"
] ,
"HideUrlsRegex": [
"^/_]*",
"^/WeatherForecast/_]*",
"^_]*"
],
"RouteTemplate":"/api/{area:exists}/{controller=Home}/{action=Index}/{id?}",
"ResponseWrapper" :{
"Enabled": true,
"ExtractHeaders":{
"CorrelationId": "X-Correlation-Id"
}
},
"OutputUrls": true,
"OutputUrlsPostfix": "_Url",
"OutputJSONSourceGenerator": true,
"JSONSourceGeneratorSettings":{
"Converters": [
]
},
"Properties":{
"IgnoreGenericTypes" : [
"System.Collections.Generic.List<T>"
],
"IgnoreTypes":[
"System.DateTime"
],
"IgnoreThatHasAttribute":[
"GoLive.Generator.ApiClientGenerator.Tests.WebApi.CustomAttributeModelBinderAttribute"
],
"TransformType":[
{
"SourceType": "*",
"DestinationType" : "System.String",
"ContainsAttribute": "GoLive.Generator.ApiClientGenerator.Tests.WebApi.CustomAttributeModelBinder2Attribute"
},
{
"SourceType": "*",
"DestinationType" : "System.String",
"ContainsAttribute": "GoLive.Generator.ApiClientGenerator.Tests.WebApi.CustomAttributeModelBinder3Attribute"
}
]
}
}

Explanation of options:

  • OutputFiles - this is the file (or files) that will be Generated
  • JSONAPIRepresentationFile (optional) - this will output a .json file that represents the API, if you want to use for an external process etc
  • Namespace - Namespace of the generated classes
  • CustomDiscriminator (optional) - If you want to use custom JSOn Dicriminators
  • Includes (optional) - Any additional Include statements to be added at the top
  • PreAppendLines / PostAppendLines (optional) - Any additional lines such as comments (to disable Resharper's processing)
  • HideUrlsRegex (optional) - Regex patterns, if you want to hide any URLs from being outputted, such as secret admin APIs
  • RouteTemplate - This is the route template that gets used to figure out the URLs
  • ResponseWrapper (optional) - If you want responses to be wrapped with a Response object, and a few options for it (such as pulling out headers etc)
  • OutputUrls / OutputUrlsPostfix (optional)- If you want to output pure methods that return URLs only
  • OutputJSONSourceGenerator (optional) - If you want to output a JSON Source Generator
  • Properties (optional) - processing properties (ignoring properties, changing their type, ignoring of methods that have attributes etc)

XML Comments on API

To get the XML comments pulling through on the API, you need to have:

<PropertyGroup>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup>

On your project's csproj to make the comments visible to the source code generator.

If you don't want XML comments enabled, set the config variable of "DisableXMLComments" to true in the json file.

Changelog

  • Version 3.0 - changed the way the API generation works (uses a central route template as opposed to hard coded), changed json settings file (not backwards compatible but not that different)
  • 3.0.46 - Small issue where _Url's were getting erroneous querystring parameters that were part of URL.
  • 3.0.47 - Remove trailing / from URLs as it will break optional parameters, might need to think about a better way to do this.
  • 3.0.49 - Expose AllAttributes property on Classes / Methods for external processing
  • 3.0.50 - Added a bit of logic to AllAttributes and added missing class processing
  • 3.1.51 - Fixed a bug where transform to a Primitive Type wasn't being removed from body, added HTTP Verb functionality, added ability to generate Idempotency keys, and added ability of AllowedStringValue to be a strongly typed struct (to help enforce)

About

.net 6.0 Web Api Strongly Typed Client Generator

Resources

Stars

24 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages