cli
cli copied to clipboard
Intellisense for Models
I setup sequelize using sequelize-cli
which generated below file,
const fs = require('fs');
const path = require('path');
const { Sequelize } = require('sequelize');
const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development';
const config = require(`${__dirname}/../../config/config.json`)[env];
const db = {};
let sequelize;
if (config.use_env_variable) {
sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
sequelize = new Sequelize(config.database, config.username, config.password, config);
}
fs.readdirSync(__dirname)
.filter((file) => {
return file.indexOf('.') !== 0 && file !== basename && file.slice(-3) === '.js';
})
.forEach((file) => {
const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes);
db[model.name] = model;
});
Object.keys(db).forEach((modelName) => {
if (db[modelName].associate) {
db[modelName].associate(db);
}
});
db.sequelize = sequelize;
db.Sequelize = Sequelize;
module.exports = db;
Now when I import models, I don't get intellisense for methods on model,
I tried jsdoc
to assigning the model type but it does not work.
/**
* Enrollment
* @typedef {import('sequelize').Model} Enrollment
*/
Hey,
I am no maintainer here. Nonetheless, how do you export your model?
Try this method you might need to manually add all models to model's index.js
// db.config.js (file)
const { Sequelize } = require('sequelize');
const {
db: { databaseDialect, databaseName, databaseHost, databasePassword, databasePort, databaseUserName },
} = require('./config');
const sequelize = new Sequelize(databaseName, databaseUserName, databasePassword, {
host: databaseHost, // host name
port: databasePort, // port
dialect: databaseDialect,
logging: false
});
module.exports = sequelize;
// models/index.js (file)
const { Sequelize } = require('sequelize');
const sequelize = require('../../config/db.config');
const db = {};
db.sequelize = sequelize;
db.Sequelize = Sequelize;
// we are not passing sequelize as parameter here
db.users = require('./movies/user')();
// manually add all the models requires here (same like above line)
// example => db.movies=require(........)
module.exports = db;
// user.js (file)
Here we are using sequelize from db.config instead of passing it has parameter in db.users require statement in models/index.js
const { DataTypes } = require('sequelize');
const sequelize = require('../../../config/db.config');
module.exports = () => {
const Users = sequelize.define(
'users',
{
id: {
defaultValue: DataTypes.UUIDV4,
type: DataTypes.UUID,
primaryKey: true,
allowNull: false,
},
full_name: {
type: DataTypes.STRING,
},
email_id: {
type: DataTypes.STRING,
unique: true,
},
password: {
type: DataTypes.STRING,
},
},
{ freezeTableName: true, timestamps: false },
);
return Users;
};
Try this method you might need to manually add all models to model's index.js
// db.config.js (file)
const { Sequelize } = require('sequelize'); const { db: { databaseDialect, databaseName, databaseHost, databasePassword, databasePort, databaseUserName }, } = require('./config'); const sequelize = new Sequelize(databaseName, databaseUserName, databasePassword, { host: databaseHost, // host name port: databasePort, // port dialect: databaseDialect, logging: false }); module.exports = sequelize;
// models/index.js (file)
const { Sequelize } = require('sequelize'); const sequelize = require('../../config/db.config'); const db = {}; db.sequelize = sequelize; db.Sequelize = Sequelize; // we are not passing sequelize as parameter here db.users = require('./movies/user')(); // manually add all the models requires here (same like above line) // example => db.movies=require(........) module.exports = db;
// user.js (file)
Here we are using sequelize from db.config instead of passing it has parameter in db.users require statement in models/index.js
const { DataTypes } = require('sequelize'); const sequelize = require('../../../config/db.config'); module.exports = () => { const Users = sequelize.define( 'users', { id: { defaultValue: DataTypes.UUIDV4, type: DataTypes.UUID, primaryKey: true, allowNull: false, }, full_name: { type: DataTypes.STRING, }, email_id: { type: DataTypes.STRING, unique: true, }, password: { type: DataTypes.STRING, }, }, { freezeTableName: true, timestamps: false }, ); return Users; };
Yeah, it seems this is the only workaround, but this way we lose automation. We have to manually add models each time. I was doing the same as you suggested.
/* eslint-disable import/no-dynamic-require */
const { Sequelize } = require('sequelize');
const env = process.env.NODE_ENV || 'development';
const config = require(`${__dirname}/../../config/config.json`)[env];
const db = {};
let sequelize;
if (config.use_env_variable) {
sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
sequelize = new Sequelize(config.database, config.username, config.password, config);
}
db.Fees = require('./fees')(sequelize, Sequelize.DataTypes);
db.Course = require('./course')(sequelize, Sequelize.DataTypes);
db.Enrollment = require('./enrollment')(sequelize, Sequelize.DataTypes);
db.User = require('./user')(sequelize, Sequelize.DataTypes);
db.Student = require('./student')(sequelize, Sequelize.DataTypes);
Object.keys(db).forEach((modelName) => {
if (db[modelName].associate) {
db[modelName].associate(db);
}
});
db.sequelize = sequelize;
db.Sequelize = Sequelize;
module.exports = db;