# Special Template Directories & Files

pg-generator templates contain several directories and files. Directories and files listed below are part of pg-generator templates. nunjucks (opens new window) templates located in those directories are executed once or more. They create files in same relative position as relative position to their parent directory.

For example:
Template directory: .../sequelize
Target directory: .../model
Database name: crm
Database schemas: public
Database tables: company, contact, product

Template File Created File
.../sequelize/db/{db.name}.js.nunj.html .../model/crm.js
.../sequelize/schema/{schema.name}.js.nunj.html .../model/public.js
.../sequelize/schema/sub/{schema.name}.js.nunj.html .../model/sub/public.js
.../sequelize/table/{table.name}.js.nunj.html .../model/company.js
.../sequelize/table/{table.schema.name}/{table.name}.js.nunj.html .../model/public/company.js

# "db" directory

Template files in db are executed once for the database. Variables listed below are available in those template files.

Varible Name Description Example
db pg-structure database object to access database details. DB API (opens new window)
custom Custom data provided by custom data file. See below
options Options provided by custom options file. See below
{...} Any variable provided by index.js file's allData export. See below
{...} Any variable provided by index.js file's dbData export. See below

# "schema" directory

Template files in schema are executed for each PostgreSQL schema. Variables listed below are available in those template files. Files in this directory are created relative to the root of target directory.

Varible Name Description Example
schema pg-structure schema object to access database details. Schema API (opens new window)
custom Custom data provided by custom data file. See below
options Options provided by custom options file. See below
{...} Any variable provided by index.js file's allData export. See below
{...} Any variable provided by index.js file's schemaData export. See below

# "table" directory

Template files in table are executed for each table. Variables listed below are available in those template files. Files in this directory are created relative to the root of target directory.

Varible Name Description Example
schema pg-structure table object to access database details. Table API (opens new window)
custom Custom data provided by custom data file. See below
options Options provided by custom options file. See below
{...} Any variable provided by index.js file's allData export. See below
{...} Any variable provided by index.js file's tableData export. See below

# "copy" directory

Files in this directory are not processed by template engine and directly copied to target. Files in this directory are copied relative to the root of target directory.

# "index.js" file

index.js file is a node.js module file which exports allData, dbData, schemaData and tableData functions. Those functions are used to provide additional variables to template files. It makes pg-generator templates very flexible. See Template Module API

"use strict";

// This file is used for providing additional data to templates during generation phase.

function allData(db) {
  return {
    extraAll: db.name,
  };
}

function dbData(db) {
  return {
    extra: db.name,
  };
}

function schemaData(schema) {
  return {
    extra: schema.name,
  };
}

function tableData(table) {
  return {
    extra: table.name,
  };
}

module.exports = {
  allData: allData,
  dbData: dbData,
  schemaData: schemaData,
  tableData: tableData,
};

# Other Directories & Files

Other directories and files do not have any meaning for pg-generator and they are not used. However you can create any directory to organize your partial templates.

# External Files

External files are not part of the template. These optional files are set during file generation phase dynamically by options provided to pgen command.

$ pgen sequelize --datafile custom-data.js --optionsFile customOptions

# Custom Data File

This optional file is a node.js module which should export a simple JavaScript object. Exported object can be accessed with variable named custom in template files. This data may be used very flexible ways for various reasons. For example builtin sequelize template uses this file for letting user to change some default behavior of template.

Example

"use strict";

module.exports = {
  Account: {
    schema: "super_schema",
    customTableAttribute: '"tableAtt"',
    attributes: {
      id: {
        attributeName: "ID",
        type: '"fake_type_id"',
        onUpdate: '"UPDATE ME"',
        customAttribute: 3,
      },
      ss: { type: '"fake_type_ss"', specialAttribute: '"ok"' },
      dd: {
        type: '"fake_type_dd"',
        onUpdate: '"UPDATE ME TOO"',
        specA: 3,
        specB: 4,
        specC: 6,
      },
    },
    hasMany: {
      HasContacts: {
        as: "CustomHasContacts",
      },
    },
    belongsTo: {
      Owner: {
        as: "CustomBelongsTo",
      },
    },
    belongsToMany: {
      ContactSecondCompanies: {
        as: "CustomBelongsToMany",
        foreignKey: "fake_id",
      },
    },
  },
};

# Options File

This optional file is a node.js module which should export a simple JavaScript object. Exported object can be accessed with variable named options in template files. Usage of this file is same as custom data file except variable name used for accessing data.