cli icon indicating copy to clipboard operation
cli copied to clipboard

Intellisense for Models

Open sujeet-agrahari opened this issue 2 years ago • 3 comments

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,

enter image description here

I tried jsdoc to assigning the model type but it does not work.

/**
 * Enrollment
 * @typedef {import('sequelize').Model} Enrollment
 */

sujeet-agrahari avatar May 07 '22 14:05 sujeet-agrahari

Hey,

I am no maintainer here. Nonetheless, how do you export your model?

Falinor avatar Jun 12 '22 08:06 Falinor

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;
};

intellisense

harikrishna2208 avatar Oct 29 '22 13:10 harikrishna2208

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;
};

intellisense

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;

sujeet-agrahari avatar Nov 06 '22 05:11 sujeet-agrahari