A global tool to execute handlebars templates in order to generate code (think about swagger/openapi/graphql ...)
Installation is very easy. Just run this command and the tool will be installed.
dotnet tool install --global CodegenUP
codegenup -h
Usage: [options]
Options:
-?|-h|--help Show help information
-l|--loader Enter a schema loader type between those values [RawJson | Swagger | OpenApi | GraphQl | RawXml]
-d|--duplicates Enter a template duplication handling strategy between those values [Throw | KeepLast | KeepFirst]
-s|--source Enter a path (relative or absolute) to an source document.
-a|--auth Enter an authorization token to access source documents
-o|--output Enter the path (relative or absolute) to the output path (content will be overritten)
-t|--template Enter a path (relative or absolute / file or folder) to a template.
-i|--intermediate Enter a path (relative or absolute) to a file for intermediate 'all refs merged' output of the json document
-c|--customhelpers Enter a path (relative or absolute) to a folder with a custom helpers project (.csproj)
--artifacts Enter a path (relative or absolute) where the custom helpers builds process can output artifacts (default ./temp)
-g|--globalparameter Enter a global parameter value on the form key=value, it'll be available throught the global_parameterhelper
codegenup -s <Open_Api_File_Uri1> -o <Output_Folder> -t <Template_Folder1> [-s <Open_Api_File_Uri2>] [-t Template_Folder2] [-t Template_Folder3] [...]
example :
codegenup -s "https://raw.githubusercontent.com/OAI/OpenAPI-Specification/master/examples/v2.0/json/petstore-minimal.json" -o "output/folder" -t "my_template_folder"
You can find additional custom helper in this folder : https://github.com/BeezUP/dotnet-codegen/tree/master/src/CodegenUP.Engine/CustomHandlebars/Helpers
Use cases are documented (and tested) thought HandlebarsHelperSpecification
attributes
Input document | Handlebars template | Result |
---|---|---|
[{t: 'c'}, {t: 'a'}, {t: 'b'}] |
{{#each .}}{{t}}{{/each}} |
cab |
[{t: 'c'}, {t: 'a'}, {t: 'b'}] |
{{#each_with_sort . 't'}}{{#each .}}{{t}}{{/each}}{{/each_with_sort}} |
abc |
[] |
{{#each_with_sort . .}}{{/each_with_sort}} |
`` |
{ a : {}, b : {} } |
{{#each_with_sort .}}{{#each .}}{{@key}}{{/each}}{{/each_with_sort}} |
ab |
{ b : {}, a : {} } |
{{#each_with_sort .}}{{#each .}}{{@key}}{{/each}}{{/each_with_sort}} |
ab |
\r\n{\r\n "swagger": "2.0",\r\n "info": {\r\n "title": "Marketplace Gateway API - Feeds",\r\n ... |
{{#each_with_sort parameters}}{{#each .}}{{@key}},{{/each}}{{/each_with_sort}} |
accountIdParameter,credentialParameter,feedTypeParameter,marketplaceBusinessCodeParameter,publicationIdParameter, |
Input document | Handlebars template | Result |
---|---|---|
[{t: 'c'}, {t: 'a'}, {t: 'b'}] |
{{#each .}}{{t}}{{/each}} |
cab |
[{t: 'c'}, {t: 'a'}, {t: 'b'}] |
{{#each_with_sort_inv . 't'}}{{#each .}}{{t}}{{/each}}{{/each_with_sort_inv}} |
cba |
[] |
{{#each_with_sort_inv . .}}{{/each_with_sort_inv}} |
`` |
{ a : {}, b : {} } |
{{#each_with_sort_inv .}}{{#each .}}{{@key}}{{/each}}{{/each_with_sort_inv}} |
ba |
{ b : {}, a : {} } |
{{#each_with_sort_inv .}}{{#each .}}{{@key}}{{/each}}{{/each_with_sort_inv}} |
ba |
\r\n{\r\n "swagger": "2.0",\r\n "info": {\r\n "title": "Marketplace Gateway API - Feeds",\r\n ... |
{{#each_with_sort_inv parameters}}{{#each .}}{{@key}},{{/each}}{{/each_with_sort_inv}} |
publicationIdParameter,marketplaceBusinessCodeParameter,feedTypeParameter,credentialParameter,accountIdParameter, |
Input document | Handlebars template | Result |
---|---|---|
{} |
{{set 'key', 'value'}}{{get 'key'}} |
value |
{ key: 'value' } |
{{set 'k', . }}{{#with_get 'k'}}{{key}}{{/with_get}} |
value |
{ key: 'value' } |
{{#with_set 'key', .key }}{{get 'key'}}{{/with_set}}{{get 'key'}} |
value |
{} |
{{set 'key', '42' }}{{get 'key'}}{{clear 'key'}}{{get 'key'}} |
42 |
Input document | Handlebars template | Result |
---|---|---|
\r\n {\r\n 'type' : 'object',\r\n 'required' : [ 'errorMeSSage', 'test' ],\r\n ... |
{{#if_array_contains required 'errorMessage'}}OK{{else}}NOK{{/if_array_contains}} |
OK |
\r\n {\r\n 'type' : 'object',\r\n 'required' : [ 'errorMeSSage', 'test' ],\r\n ... |
{{#if_array_contains required 'test'}}OK{{else}}NOK{{/if_array_contains}} |
OK |
\r\n {\r\n 'type' : 'object',\r\n 'required' : [ 'errorMeSSage', 'test' ],\r\n ... |
{{#if_array_contains required 'notFound'}}OK{{else}}NOK{{/if_array_contains}} |
NOK |
\r\n {\r\n 'type' : 'object',\r\n 'required' : [ 'errorMeSSage', 'test' ],\r\n ... |
{{#each properties}}{{#if_array_contains ../required @key}}{{type}}{{else}}{{/if_array_contains}}{{/each}} |
string |
Input document | Handlebars template | Result |
---|---|---|
{} |
{{#if_empty ''}}OK{{else}}{{/if_empty}} |
OK |
{} |
{{#if_empty 'test'}}OK{{else}}NOK{{/if_empty}} |
NOK |
Input document | Handlebars template | Result |
---|---|---|
{} |
{{#if_equals 'test' 'teSt'}}OK{{else}}{{/if_equals}} |
OK |
{ a: '42', b: 42 } |
{{#if_equals a ./b }}OK{{else}}{{/if_equals}} |
OK |
{} |
{{#if_equals 'test' 'NO'}}OK{{else}}NOK{{/if_equals}} |
NOK |
Input document | Handlebars template | Result |
---|---|---|
{} |
{{#if_not_empty ''}}{{else}}OK{{/if_not_empty}} |
OK |
{} |
{{#if_not_empty 'test'}}NOK{{else}}OK{{/if_not_empty}} |
NOK |
Input document | Handlebars template | Result |
---|---|---|
{} |
{{#if_not_equals 'test' 'teSt'}}{{else}}NOK{{/if_not_equals}} |
NOK |
{ a: '42', b: 42 } |
{{#if_not_equals a ./b }}{{else}}NOK{{/if_not_equals}} |
NOK |
{} |
{{#if_not_equals 'test' 'NO'}}OK{{else}}NOK{{/if_not_equals}} |
OK |
Input document | Handlebars template | Result |
---|---|---|
{} |
{{#one_line 5}}test{{/one_line}} |
test |
Input document | Handlebars template | Result |
---|---|---|
\r\n{\r\n "swagger": "2.0",\r\n "info": {\r\n "title": "Marketplace Gateway API - Feeds",\r\n ... |
{{#each paths}}{{#each this}}{{#each parameters}}{{#ref_resolve}}{{ name }},{{/ref_resolve}}{{/each}}{{/each}}{{/each}} |
marketplaceBusinessCode,marketplaceBusinessCode,marketplaceBusinessCode,accountId,publicationId,x-BeezUP-Credential,request,marketplaceBusinessCode,accountId,publicationId,x-BeezUP-Credential,request,marketplaceBusinessCode,accountId,publicationId,x-BeezUP-Credential,request,marketplaceBusinessCode,accountId,publicationId,x-BeezUP-Credential,marketplaceBusinessCode,accountId,publicationId,x-BeezUP-Credential, |
Input document | Handlebars template | Result |
---|---|---|
{ '$ref' : '/myDataType/parameters/'} |
{{split_get_first ./$ref '/' }} |
myDataType |
Input document | Handlebars template | Result |
---|---|---|
{ '$ref' : '#/parameters/myDataType'} |
{{split_get_last ./$ref '/' }} |
myDataType |
Input document | Handlebars template | Result |
---|---|---|
{} |
{{#start_with 'test' 'test-one'}}OK{{else}}{{/start_with}} |
OK |
{} |
{{#start_with 'test' 'one-test'}}OK{{else}}NOK{{/start_with}} |
NOK |
{one: 'test-one', two: 'one-test'} |
{{#start_with 'test' one}}OK{{else}}{{/start_with}} |
OK |
{one: 'test-one', two: 'one-test'} |
{{#start_with 'test' two}}OK{{else}}NOK{{/start_with}} |
NOK |
Input document | Handlebars template | Result |
---|---|---|
{ test: 42 } |
{{trim test}} |
42 |
{ test: ' 42 ' } |
{{trim test}} |
42 |
{ test: '- aa -' } |
{{trim test '-'}} |
aa |
{ test: 'AA' } |
{{trim test 'A'}} |
`` |
{ test: ' test ' } |
{{trim test ' t'}} |
es |
Input document | Handlebars template | Result |
---|---|---|
{} |
{{#trim_block ' '}} 1,2,3,4 {{/trim_block}} |
1,2,3,4 |
{} |
{{#trim_block ','}}1,2,3,4{{/trim_block}} |
1,2,3,4 |
{} |
{{#trim_block ','}}1,2,3,4,{{/trim_block}} |
1,2,3,4 |
{} |
{{#trim_block ','}},1,2,3,4,{{/trim_block}} |
1,2,3,4 |
{} |
{{#trim_block ','}},,1,2,3,4,,{{/trim_block}} |
1,2,3,4 |
{ a: '42', b: 42, c: 42 } |
{{#trim_block ','}}{{#each this}}{{@key}},{{/each}}{{/trim_block}} |
a,b,c |
Input document | Handlebars template | Result |
---|---|---|
{} |
{{#trim_block_end}} 1,2,3,4 {{/trim_block_end}} |
1,2,3,4 |
{} |
{{#trim_block_end ','}}1,2,3,4{{/trim_block_end}} |
1,2,3,4 |
{} |
{{#trim_block_end ','}}1,2,3,4,{{/trim_block_end}} |
1,2,3,4 |
{} |
{{#trim_block_end ','}},1,2,3,4,{{/trim_block_end}} |
,1,2,3,4 |
{} |
{{#trim_block_end ','}},,1,2,3,4,,{{/trim_block_end}} |
,,1,2,3,4 |
{ a: '42', b: 42, c: 42 } |
{{#trim_block_end ','}}{{#each this}}{{@key}},{{/each}}{{/trim_block_end}} |
a,b,c |
Input document | Handlebars template | Result |
---|---|---|
{} |
{{#trim_block_start}} 1,2,3,4 {{/trim_block_start}} |
1,2,3,4 |
{} |
{{#trim_block_start ','}}1,2,3,4{{/trim_block_start}} |
1,2,3,4 |
{} |
{{#trim_block_start ','}}1,2,3,4,{{/trim_block_start}} |
1,2,3,4, |
{} |
{{#trim_block_start ','}},1,2,3,4,{{/trim_block_start}} |
1,2,3,4, |
{} |
{{#trim_block_start ','}},,1,2,3,4,,{{/trim_block_start}} |
1,2,3,4,, |
{ a: '42', b: 42, c: 42 } |
{{#trim_block_start ','}}{{#each this}}{{@key}},{{/each}}{{/trim_block_start}} |
a,b,c, |
Input document | Handlebars template | Result |
---|---|---|
{ test: 42 } |
{{trim_end test}} |
42 |
{ test: '42 ' } |
{{trim_end test}} |
42 |
{ test: 'aa -' } |
{{trim_end test '-'}} |
aa |
{ test: 'AA' } |
{{trim_end test 'A'}} |
`` |
{ test: ' test ' } |
{{trim_end test ' t'}} |
tes |
Input document | Handlebars template | Result |
---|---|---|
{ test: 42 } |
{{trim_start test}} |
42 |
{ test: ' 42' } |
{{trim_start test}} |
42 |
{ test: '- aa' } |
{{trim_start test '-'}} |
aa |
{ test: 'AA' } |
{{trim_start test 'A'}} |
`` |
{ test: ' test ' } |
{{trim_start test ' t'}} |
est |
Input document | Handlebars template | Result |
---|---|---|
{} |
{{uppercase_first_letter .}} |
{} |
{ test: 42 } |
{{uppercase_first_letter test}} |
42 |
{ test: '42' } |
{{uppercase_first_letter test}} |
42 |
{ test: 'aa' } |
{{uppercase_first_letter test}} |
Aa |
{ test: 'AA' } |
{{uppercase_first_letter test}} |
AA |
{ test: 'AA' } |
test{{uppercase_first_letter test}} |
testAA |
Input document | Handlebars template | Result |
---|---|---|
{} |
{{#with_matching 'test' '1' '1', '2', '2'}}{{else}}NOT FOUND{{/with_matching}} |
NOT FOUND |
{} |
{{#with_matching 'value1' 'value1' 'context1', '2', '2'}}{{.}}{{else}}NOT FOUND{{/with_matching}} |
context1 |
{ value: '42' } |
{{#with_matching value '42' . }}{{value}}{{else}}NOT FOUND{{/with_matching}} |
42 |
To create custom local dotnet handlebars helpers, copy the CustomHelpers project in any folder you'd like.
Then use the -c
command line option to enable the dynamic compiling & loading of the helpers you created.
The project is, in itself, a unit test project with what you need to simply create unit test case by attributes placed on your custom helpers.
Through a special helper named global_parameter
, it's possible to pass global available parameters to your template. From the command line add a as many -g key=value
global values and use them in your templates.
{{global_parameter key}}
will output
value
dotnet tool update -g CodegenUP
dotnet tool uninstall -g CodegenUP