# Templates
pg-generator processes template files located in the templates
folder in a generator and passes the corresponding database object and custom data provided by the user to the template file.
Template files are executed for each corresponding database object. For example; [db] index.js
file is processed once and passed the db object (opens new window), and [table] {name}.js.njk
file is processed for each table in the database and passed table object (opens new window).
See pg-structure API (opens new window) for all available objects.
# Template Name
The schema of a template name is as below:
dist/app/templates/DESTINATION-DIR/[DB-OBJECT] { VARIABLE # FILTER } { VARIABLE # FILTER }
Part | Description |
---|---|
DESTINATION-DIR | The irectory path of the file to be created in the destination. |
[DB-OBJECT] | The type of objects the template is related to (e.g. db , schema , table , view , function etc. See pg-structure API (opens new window)) |
{ VARIABLE } | The variable to substitute in destination file's name using database object. |
# FILTER | The filter to apply variable name. May be chained to use multiple filters (e.g. { name # dash-case # singular } ). Filters may be written using dash-case or camel-case (e.g class-case or classCase ). See built-in filters. |
# Examples
Template Path | Destination Path |
---|---|
models/[table] { name }.js.njk | models/customer.js |
models/[table] { name # dash-case }.js.njk | models/line-item.js |
models/[table]{name#class-case#plural}.js.njk | models/LineItems.js |
models/{ schema.name }/[table] { name }.js.njk | models/public/line_items.js |
# Context Data
Each template file is passed a context object. This context object contains the corresponding database object (e.g. table
, schema
etc.). Templates can access the database object either using object class name in camel case (e.g. table
, materailzedView
etc.) or using o
.
Also, a generator may add additional context data needed in templates too. For example, pg-generator-example
sub-generatorsequelize6adds sequelize types to be used in templates. Additionally, a generator may define default values in the context it adds, and provide the end-user the opportunity to change them using a custom context file or context module.
sequelize6adds
addSchemaNamekey with the default value
true` to decide whether to use PostgreSQL schema names in class names in generated files.
A generator may add context data using context()
method.
export default class App extends PgGenerator {
context() {
return {
addSchemaName: true,
};
}
}
# Special Keys
There are some special keys in context.
Data under the global
key is sent to all templates all the time.
Using the database object name in plural with the name of the target object, it is possible to send data to the template when that template is processed with the particular database object.
For example, using the context below it is possible to send skip: true
value only to table templates when they are processed with public.product
table and message: "Hello!"
to only schema templates when they are processed with public
schema.
{
"tables": {
"public.product": {
"skip": true
}
},
"schemas": {
"public": {
"message": "Hello!"
}
}
}
# Example
Below example is a nunjucks template that creates a markdown file for each table.
templates/[table] {name}.js.njk
# {{ table | dboClassName(addSchemaName) | quote }}
| Column | Type |
| ------ | ---- |
{%- for column in table.columns %}
|{{ column.name }}|{{ column.type.name }}{{ column | dboColumnTypeModifier }}|
{%- endfor %}
The template first creates the title with the table's name. It uses the builtin dboClassName filter. dboClassName
returns a class name using filtered database object. It takes a boolean parameter to decide whether to add PostgreSQL schema name to the class name. addSchemaName
variable is taken from context. It's a good choice to provide a default value in the generator. The end-user may override it using a custom context file or context module.
Then, the template creates a markdown table by looping through all columns of the table from context added by pg-generator automatically. dboColumnTypeModifier is also another built-in filter, which returns PostgreSQL data type modifiers of precision and scale such as (1,2)
.
The returned content is written to disk.
# Tip
See pg-generator-example (opens new window) plugin for an example, how to develop your generators. It provides examples of:
- Sub-generators for popular ORMs, markdown with mermaid support, and a report.
- Custom filters
- Custom context
- Shared partial usage