Generators
Generators scaffold new files in a Sails project. They create boilerplate files with the correct structure and naming conventions.
Built-in Generators
Generate an Action
sails generate action auth/loginCreates api/controllers/auth/login.js:
module.exports = {
friendlyName: 'Login',
description: 'Login auth.',
inputs: {},
exits: {},
fn: async function (inputs) {
// All done.
return
}
}Generate a Helper
sails generate helper format-currencyCreates api/helpers/format-currency.js:
module.exports = {
friendlyName: 'Format currency',
description: '',
inputs: {},
exits: {
success: {
description: 'All done.'
}
},
fn: async function (inputs) {
// ...
}
}Generate a Model
sails generate model userCreates api/models/User.js:
module.exports = {
attributes: {
// ...
}
}Generate a Policy
sails generate policy is-adminCreates api/policies/is-admin.js.
Generate a Response
sails generate response notAuthorizedCreates api/responses/notAuthorized.js.
Generate a Hook
sails generate hook rate-limiterCreates api/hooks/rate-limiter/index.js.
Generate a Script
sails generate script seed-databaseCreates scripts/seed-database.js.
The Page Generator (Boring Stack)
The Boring Stack includes a custom page generator that creates both a Sails action and an Inertia page component:
sails generate page dashboardThis creates:
- Action:
api/controllers/dashboard/view-dashboard.js - Page component:
assets/js/pages/dashboard/index.jsx(or.vue/.svelte) - Route entry: Added to
config/routes.js
Configured in .sailsrc
{
"generators": {
"modules": {
"page": "create-sails-generator/generators/page"
}
}
}Page Generator Options
# Generate a nested page
sails generate page settings/profile
# Creates:
# api/controllers/setting/view-profile.js
# assets/js/pages/setting/profile.jsx
# Route: 'GET /settings/profile': 'setting/view-profile'Custom Generators
Custom generators are defined in the create-sails-generator package in the Boring Stack monorepo. They follow a specific structure:
generators/
└── page/
├── index.js # Generator logic
└── templates/
├── action.template # Action file template
└── page.template # Page component templateGenerator Structure
// generators/page/index.js
module.exports = {
before: function (scope, exits) {
// Validate inputs, set defaults
if (!scope.args[0]) {
return exits.error('Please provide a page name.')
}
scope.pageName = scope.args[0]
return exits.success()
},
targets: {
'./api/controllers/:pageName/view-:pageName.js': {
template: 'action.template'
},
'./assets/js/pages/:pageName/index.jsx': {
template: 'page.template'
}
},
after: function (scope, exits) {
console.log('New page created!')
return exits.success()
}
}Generator Tips
- Use generators for consistency -- Generated files follow the project's conventions
- The page generator is the most commonly used in Boring Stack development
- Action names follow the pattern:
feature/verb-noun(e.g.,auth/login,setting/update-profile) - View actions are prefixed with
view-(e.g.,view-dashboard,view-profile) - Generate then customize -- Generators create the skeleton, you add the business logic
Available Generator Commands
| Command | Creates | Location |
|---|---|---|
sails generate action <name> |
Action (controller) | api/controllers/<name>.js |
sails generate helper <name> |
Helper function | api/helpers/<name>.js |
sails generate model <name> |
Waterline model | api/models/<Name>.js |
sails generate policy <name> |
Policy middleware | api/policies/<name>.js |
sails generate response <name> |
Response handler | api/responses/<name>.js |
sails generate hook <name> |
App-level hook | api/hooks/<name>/index.js |
sails generate script <name> |
Shell script | scripts/<name>.js |
sails generate page <name> |
Action + page + route | Multiple files (Boring Stack) |