Skip to content

acrontum/boats-utils

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

27 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Boats utils

Collection of useful boats template helpers to be used with j-d-carmichael/boats.

Table of Contents generated with DocToc

Usage

npm install @acrontum/boats-utils

In your openapi boats project, simply include this module as a helper in your build command:

{
  "name": "service-openapi-spec",
  "version": "1.0.0",
  "description": "Some boats openapi builder",
  "scripts": {
    "prebuild": "rm -rf build",
    "build": "NODE_ENV=test boats --yes -f node_modules/@acrontum/boats-utils/dist -i ./src/index.yml -o ./build/api.yml",
    "postbuild": "cp build/api*.yml ./release/$npm_package_name.yml"
  },
  "keywords": [],
  "author": "p-mcgowan",
  "devDependencies": {
    "boats": "^2.25.0",
    "@acrontum/boats-utils": "^1.0.0"
  }
}

Modules

Extend a base model with additional, omitted, required, and / or optional fields.

# model.yml

type: object
properties:
  id:
    type: string
    format: uuid
  name:
    type: string
  email:
    type: string
    format: email
  profilePicture:
    type: string
    format: uri
  # ...
# postModel.yml

{{
  extend('./model.yml', {
    omit: [
      'properties.id'
    ],
    require: [
      'properties.name',
      'properties.email'
    ],
    include: [
      ['properties.username', { type: 'string', 'x-unique': true }]
    ],
    optional: [
      'properties.dateOfBirth'
    ]
  })
}}

Examples


Removing fields from the model:

# model.yml

type: object
required:
  - id
properties:
  id:
    type: string
    format: uuid
  createdAt:
    type: string
    format: date-time
  updatedAt:
    type: string
    format: date-time
  name:
    type: string
  email:
    type: string
    format: email
  profilePicture:
    type: string
    format: uri
# postModel.yml

{{
  extend('./model.yml', {
    omit: [
      'properties.id',
      'properties.createdAt',
      'properties.updatedAt'
    ]
  })
}}

Would output:

type: object
properties:
  name:
    type: string
  email:
    type: string
    format: email
  profilePicture:
    type: string
    format: uri

Adding fields to the model:

# model.yml

type: object
properties:
  name:
    type: string
  email:
    type: string
    format: email
  profilePicture:
    type: string
    format: uri
# postModel.yml
{{
  extend('./model.yml', {
    include: [
      ['properties.password', { type: 'string', minLength: 32 }]
    ]
  })
}}

Would output:

type: object
properties:
  name:
    type: string
  email:
    type: string
    format: email
  profilePicture:
    type: string
    format: uri
  password:
    type: string
    minLength: 32

Marking fields as required:

# model.yml

type: object
properties:
  name:
    type: string
  email:
    type: string
    format: email
  profilePicture:
    type: string
    format: uri
# postModel.yml

{{
  extend('./model.yml', {
    require: [
      'properties.email',
      'properties.name'
    ]
  })
}}

Would output:

type: object
required:
  - name
  - email
properties:
  name:
    type: string
  email:
    type: string
    format: email
  profilePicture:
    type: string
    format: uri

Marking fields as optional:

# model.yml

type: object
require:
  - name
  - email
  - profilePicture
properties:
  name:
    type: string
  email:
    type: string
    format: email
  profilePicture:
    type: string
    format: uri
# postModel.yml

{{
  extend('./model.yml', {
    optional: [
      'properties.profilePicture'
    ]
  })
}}

Would output:

type: object
required:
  - name
  - email
properties:
  name:
    type: string
  email:
    type: string
    format: email
  profilePicture:
    type: string
    format: uri

Adds common DB fields to a model.

type: object
properties:
  {{ databaseentry(<options>) }}
  otherProps:
    type: string
  # ...

Examples


With no params:

# model.yml

type: object
properties:
  {{ databaseentry() }}
  name:
    type: string
  profilePicture:
    type: string
    format: uri

Would output:

type: object
properties:
  id:
    type: string
    format: uuid
  createdAt:
    type: string
    format: date-time
  updatedAt:
    type: string
    format: date-time
  name:
    type: string
  profilePicture:
    type: string

To specifiy the id type:

# model.yml

type: object
properties:
  {{ databaseentry({ id: 'string' }) }}
# {{ databaseentry({ id: 'number' }) }}
  name:
    type: string
  profilePicture:
    type: string
    format: uri

Would output:

type: object
properties:
  id:
    type: string
#   type: number
  createdAt:
    type: string
    format: date-time
  updatedAt:
    type: string
    format: date-time
  name:
    type: string
  profilePicture:
    type: string

With softDeletion:

# model.yml

type: object
properties:
  {{ databaseentry({ softDeletion: true }) }}
  name:
    type: string
  profilePicture:
    type: string
    format: uri

Would output:

type: object
properties:
  id:
    type: string
    format: uuid
  createdAt:
    type: string
    format: date-time
  updatedAt:
    type: string
    format: date-time
  deletedAt:
    type: string
    format: date-time
  name:
    type: string
  profilePicture:
    type: string

Adds a collection-type pagination model.

{{ pagination(<path_or_options>) }}

Examples


With no params:

# components/schemas/user/model.yml

type: object
properties:
  name:
    type: string
  numberOfDogs:
    type: number
# components/schemas/user/models.yml

{{ pagination() }}

Would output:

type: object
required:
  - meta
  - data
properties:
  meta:
    $ref: "#/components/schemas/Meta"
  data:
    type: array
    items: 
      $ref: "./model.yml"

To specify another model name:

# components/schemas/user/singleUserResponse.yml

type: object
properties:
  name:
    type: string
  numberOfDogs:
    type: number
# components/schemas/user/models.yml

{{ pagination({ path: "./singleUserResponse.yml" }) }}

or simply

{{ pagination("./singleUserResponse.yml") }}

Would output:

type: object
required:
  - meta
  - data
properties:
  meta:
    $ref: "#/components/schemas/Meta"
  data:
    type: array
    items: 
      $ref: "./singleUserResponse.yml"

To specify another pagination model:

# components/schemas/user/singleUserResponse.yml

type: object
properties:
  name:
    type: string
  numberOfDogs:
    type: number
# components/schemas/user/models.yml

{{ pagination({ paginationModel: "#/components/schemas/Pagination" }) }}

Would output:

type: object
required:
  - meta
  - data
properties:
  meta:
    $ref: "#/components/schemas/Pagination"
  data:
    type: array
    items: 
      $ref: "./model.yml"

To alter or remove required fields:

# components/schemas/user/singleUserResponse.yml

type: object
properties:
  name:
    type: string
  numberOfDogs:
    type: number
# components/schemas/user/models.yml

{{ pagination({ required: ['meta'] }) }}

Would output:

type: object
required:
  - meta
properties:
  meta:
    $ref: "#/components/schemas/Pagination"
  data:
    type: array
    items: 
      $ref: "./model.yml"
# components/schemas/user/models.yml

{{ pagination({ required: [] }) }}

Would output:

type: object
properties:
  meta:
    $ref: "#/components/schemas/Pagination"
  data:
    type: array
    items: 
      $ref: "./model.yml"