Skip to content

Commit

Permalink
refactor(transform): split code according to best practice
Browse files Browse the repository at this point in the history
  • Loading branch information
Victor Korzunin committed Sep 13, 2021
1 parent 97c622a commit 4beb77c
Show file tree
Hide file tree
Showing 11 changed files with 76 additions and 65 deletions.
1 change: 0 additions & 1 deletion .eslintrc.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ plugins:
parserOptions:
ecmaVersion: 9
sourceType: module
project: ./tsconfig.json
extends:
- eslint:recommended
- plugin:@typescript-eslint/eslint-recommended
Expand Down
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "prisma-sequelize-generator",
"version": "1.0.0-beta.3",
"main": "dist/generator.js",
"main": "dist/cli.js",
"license": "MIT",
"files": [
"dist",
Expand Down Expand Up @@ -74,7 +74,7 @@
"prepare": "husky install"
},
"bin": {
"prisma-sequelize-generator": "dist/generator.js"
"prisma-sequelize-generator": "dist/cli.js"
},
"publishConfig": {
"access": "public"
Expand Down
6 changes: 3 additions & 3 deletions plop/models/Model.ts.hbs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Sequelize, Model, DataTypes, ModelCtor } from 'sequelize';

export class {{model.name}} extends Model {
export class {{name}} extends Model {
static initialize(sequelize: Sequelize) {
this.init(
{
Expand All @@ -17,8 +17,8 @@ export class {{model.name}} extends Model {
},
{
sequelize,
modelName: '{{model.name}}',
tableName: '{{#if model.dbName}}{{model.dbName}}{{else}}{{model.name}}{{/if}}',
modelName: '{{name}}',
tableName: '{{#if dbName}}{{dbName}}{{else}}{{name}}{{/if}}',
timestamps: {{or (or hasCreatedAt hasUpdatedAt) hasDeletedAt}},{{#if (or (or hasCreatedAt hasUpdatedAt) hasDeletedAt)}}{{#if (eq hasCreatedAt false)}}
createdAt: false,{{/if}}{{#if (eq hasUpdatedAt false)}}
updatedAt: false,{{/if}}{{!-- {{#if (eq hasDeletedAt false)}}
Expand Down
2 changes: 1 addition & 1 deletion plop/plopfile.js
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ module.exports = function (plop) {
actions: () => [
{
type: 'add',
path: 'models/{{model.name}}.ts',
path: 'models/{{name}}.ts',
templateFile: path.join(__dirname, './models/Model.ts.hbs'),
},
],
Expand Down
2 changes: 1 addition & 1 deletion prisma/schema.prisma
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
generator models {
provider = "node ./dist/generator.js"
provider = "node ./dist/cli.js"
}

datasource db {
Expand Down
2 changes: 1 addition & 1 deletion prisma/sequelize/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"name": "models",
"provider": {
"fromEnvVar": null,
"value": "node ./dist/generator.js"
"value": "node ./dist/cli.js"
},
"output": {
"value": "/Users/victor/Projects/_own/prisma-sequelize-generator/prisma/sequelize",
Expand Down
File renamed without changes.
File renamed without changes.
62 changes: 62 additions & 0 deletions src/generator/transformDMMF.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import { indexBy, prop } from 'ramda';

import { PrismaTypeToSequelizeType } from './properties';

import type { DMMF } from '@prisma/generator-helper';

export function transformDMMF(dmmf: DMMF.Document) {
const enumIndex = indexBy(prop('name'), dmmf.datamodel.enums ?? []);

return {
models: dmmf.datamodel.models.map((model) => {
const attributes = model.fields.map((field) => field.name);

return {
...model,
scalarFields: model.fields
.filter((field) => ['scalar', 'enum'].includes(field.kind))
.filter((field) => !['createdAt', 'updatedAt', 'deletedAt'].includes(field.name))
.map((field) => ({
...field,
name: field.name,
type:
field.kind === 'scalar'
? PrismaTypeToSequelizeType[field.type]
: `ENUM(${enumIndex[field.type].values
.map(prop('name'))
.map((n) => `'${n}'`)
.join(', ')})`,
allowNull: !field.isRequired,
isAutoincrement:
field.hasDefaultValue && typeof field.default === 'object' && field.default.name === 'autoincrement',
})),
belongsToFields: model.fields
.filter((field) => field.kind === 'object')
.filter((field) => !field.isList && field.relationToFields?.length)
.map((field) => ({
as: field.name,
name: field.type,
targetKey: field.relationToFields![0],
foreignKey: field.relationFromFields[0],
})),
hasOneFields: model.fields
.filter((field) => field.kind === 'object')
.filter((field) => !field.isList && !field.relationToFields?.length)
.map((field) => ({
as: field.name,
name: field.type,
})),
hasManyFields: model.fields
.filter((field) => field.kind === 'object')
.filter((field) => field.isList)
.map((field) => ({
as: field.name,
name: field.type,
})),
hasCreatedAt: attributes.includes('createdAt'),
hasUpdatedAt: attributes.includes('updatedAt'),
hasDeletedAt: attributes.includes('deletedAt'),
};
}),
};
}
59 changes: 5 additions & 54 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
import { indexBy, prop } from 'ramda';
import { generatorHandler } from '@prisma/generator-helper';
import { parseEnvValue, getEnvPaths } from '@prisma/sdk';
import { getEnvPaths, parseEnvValue } from '@prisma/sdk';
import nodePlop from 'node-plop';
import * as path from 'path';

import { PrismaTypeToSequelizeType } from './mappers';
import { transformDMMF } from './generator/transformDMMF';

// eslint-disable-next-line @typescript-eslint/no-var-requires
// const pkg = require('../package.json');
Expand Down Expand Up @@ -52,63 +51,15 @@ generatorHandler({
// const relativeOutputDir = path.relative(process.cwd(), outputDir);
// const slsRelativeOutputDir = path.relative(process.cwd(), outputDir).split(path.sep).slice(1).join(path.sep);

const enumIndex = indexBy(prop('name'), options.dmmf.datamodel.enums ?? []);
const { models } = transformDMMF(options.dmmf);

await Promise.all([
utilsGenerator.runActions({}),
indexGenerator.runActions({
models: options.dmmf.datamodel.models,
models,
config: JSON.stringify(config, null, 2),
}),
...options.dmmf.datamodel.models.map((model) => {
const attributes = model.fields.map((field) => field.name);
return modelGenerator.runActions({
model,
scalarFields: model.fields
.filter((field) => ['scalar', 'enum'].includes(field.kind))
.filter((field) => !['createdAt', 'updatedAt', 'deletedAt'].includes(field.name))
.map((field) => ({
...field,
name: field.name,
type:
field.kind === 'scalar'
? PrismaTypeToSequelizeType[field.type]
: `ENUM(${enumIndex[field.type].values
.map(prop('name'))
.map((n) => `'${n}'`)
.join(', ')})`,
allowNull: !field.isRequired,
isAutoincrement:
field.hasDefaultValue && typeof field.default === 'object' && field.default.name === 'autoincrement',
})),
belongsToFields: model.fields
.filter((field) => field.kind === 'object')
.filter((field) => !field.isList && field.relationToFields?.length)
.map((field) => ({
as: field.name,
name: field.type,
targetKey: field.relationToFields![0],
foreignKey: field.relationFromFields[0],
})),
hasOneFields: model.fields
.filter((field) => field.kind === 'object')
.filter((field) => !field.isList && !field.relationToFields?.length)
.map((field) => ({
as: field.name,
name: field.type,
})),
hasManyFields: model.fields
.filter((field) => field.kind === 'object')
.filter((field) => field.isList)
.map((field) => ({
as: field.name,
name: field.type,
})),
hasCreatedAt: attributes.includes('createdAt'),
hasUpdatedAt: attributes.includes('updatedAt'),
hasDeletedAt: attributes.includes('deletedAt'),
});
}),
...models.map((model) => modelGenerator.runActions(model)),
]);
} catch (e) {
console.error('Error: unable to write files for Prisma Sequelize Generator');
Expand Down
3 changes: 1 addition & 2 deletions tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,7 @@
"strictFunctionTypes": true
},
"include": [
"src/**/*.ts",
"tests/**/*.ts"
"src/**/*.ts"
],
"exclude": [
"node_modules"
Expand Down

0 comments on commit 4beb77c

Please sign in to comment.