OpenAPI codegen tool built for the OrderCloud API
npm install @ordercloud/oc-codegenshell
npm install @ordercloud/oc-codegen
`
or
`shell
yarn add @ordercloud/oc-codegen
`
Usage
$3
`shell
oc-codegen --help
Usage: oc-codegen [options]
A codegen tool for the OrderCloud API
Options:
-v, --version output the version number
-t, --templates (required) where to locate handlebars templates
-i, --input-spec path to valid openapi spec v3.0.0+ (defaults to https://api.ordercloud.io/v1/openapi/v3)
-o, --output where to write the generated files (defaults to current directory)
-k, --hooks path to your hooks file
-b, --handlebars-extensions path to your handlebars extensions file
-d, --debug prints the template data that is passed to handlebars
-c, --clean cleans output directory before writing files to it (default: false)
-h, --help output usage information
`
#### Examples
The shortest possible syntax
`shell
oc-codegen -t './path/to/templates-folder';
`
This will feed the formatted swagger spec to your handlebars templates and output the content to the current directory
$3
#### Using imports
`javascript
import path from 'path';
import codegen from '@ordercloud/oc-codegen';
codegen
.generate({
templates: 'path/to/templates-folder',
inputSpec: null, // default: https://api.ordercloud.io/v1/openapi/v3
output: null, // default: current directory
hooks: null,
handlebarsExtensions: null,
clean: null, // default: false
debug: null, // default: false
})
.then(function() {
console.log('Done!');
})
.catch(function(err) {
console.error('Something went wrong: ' + err.message);
});
`
#### Using requires
`javascript
const codegen = require('@ordercloud/oc-codegen');
const path = require('path');
codegen.default
.generate({
inputSpec: '/path/to/oc-spec.json',
templates: '/path/to/templates-folder',
output: null, // default: current directory
hooks: null,
handlebarsExtensions: null,
clean: false,
debug: false,
})
.then(function() {
console.log('Done!');
})
.catch(function(err) {
console.error('Something went wrong: ' + err.message);
});
`
π§ Creating your own templates
Templates define the skeleton for how your code will be generated. We use handlebars for the templating engine. There are three different types of files that can exist in your templates directory:
1. Static - copied over as-is with no dynamic content
2. Static Template - copied over once and processed by handlebars
3. Contextual Template - generates multiple files with one handlebars template where each file is a different context (resource, model, or operation)
$3
Each template has access to the formatted ordercloud spec. Additionally, contextual templates get injected with data for each context (operation, resource, or model).
The debug option will print the templatedata to stdout which you can then pipe into a file. For example:
`shell
oc-codegen -d > templateData.json
`
$3
Consider the following directory
`shell
templates
β README.md.hbs
β
ββββmodels
β _MODEL_.js.hbs
β ExtraModel.js
`
README.md.hbs is a static template and as such will generate one README.md file but will have context from the api spec to add dynamic data. For example we might want to set API version in the readme.
_MODEL_.js.hbs is a contextual template. The _MODEL_ piece will be replaced by the current model being generated and have context injected for that model. To generate a contextual resource template include _RESOURCE_ in the file name and similarly for contextual operation templates include _OPERATION_ in the file name.
ExtraModel.js is a static file that will simply get copied over as-is during code generation
$3
Hook into oc-codegen's processing pipeline with hooks!
Implement hooks by exporting them from a javascript file. If your hook performs async work you'll need to make sure it returns a promise, otherwise you can just return directly.
There are three types of hooks for each data type (operation, model, resource)
- filter{dataType} - filter the result set
- format{dataType} - replace oc-codegens formatting with your own
- postFormat{dataType} - run custom formatting after oc-codegen has done initial formatting
There is also one hook at the end of all data type hooks called postFormatTemplateData
`javascript
module.exports.postProcess = function(templateData, rawSpec) {
// return your modified template data
return templateData;
};
`
$3
In addition to the standard handlebars helpers you can define your own custom helpers.
First create a javascript file in your project
`javascript
function handlebarsExt(Handlebars) {
/**
* Function to append 'bar' to the end of a word
*/
Handlebars.registerHelper('appendBar', word => {
return word + 'bar';
});
}
module.exports = handlebarsExt;
`
Now simply use the helper in your handlebars template and then when you call the cli pass it the path to the extensions file so that the cli can register the helpers prior to compilation.
`shell
oc-codegen -t './path/to/templates-folder' -b './path/to/handlebars-extensions';
``