Skip to content

Commit 57f044c

Browse files
Merge pull request #181 from victorivens05/master
Add the hability to parse Glob and Folder path in modelPaths
2 parents 8973931 + 1c4e4f8 commit 57f044c

File tree

8 files changed

+130
-7
lines changed

8 files changed

+130
-7
lines changed

lib/services/models.ts

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import 'reflect-metadata';
2-
import * as fs from 'fs';
2+
import * as glob from 'glob';
33
import * as path from 'path';
44
import {DataTypeAbstract, DefineOptions} from 'sequelize';
55
import {Model} from "../models/Model";
@@ -182,14 +182,16 @@ export function getModels(arg: Array<typeof Model | string>): Array<typeof Model
182182

183183
return arg.reduce((models: any[], dir) => {
184184

185-
const _models = fs
186-
.readdirSync(dir as string)
185+
if (!glob.hasMagic(dir)) dir = path.join(dir, '/*');
186+
const _models = glob
187+
.sync(dir as string)
187188
.filter(isImportable)
188-
.map(getFilenameWithoutExtension)
189+
.map(getFullfilepathWithoutExtension)
189190
.filter(uniqueFilter)
190-
.map(fileName => {
191-
const fullPath = path.join(dir, fileName);
191+
.map(fullPath => {
192+
192193
const module = require(fullPath);
194+
const fileName = getFilenameWithoutExtension(fullPath);
193195

194196
if (!module[fileName] && !module.default) {
195197
throw new Error(`No default export defined for file "${fileName}" or ` +
@@ -313,3 +315,11 @@ function isImportable(file: string): boolean {
313315
function getFilenameWithoutExtension(file: string): string {
314316
return path.parse(file).name;
315317
}
318+
319+
/**
320+
* Return the value of the full path with filename, without extension
321+
*/
322+
function getFullfilepathWithoutExtension(file: string): string {
323+
const parsedFile = path.parse(file);
324+
return path.join(parsedFile.dir, parsedFile.name);
325+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import {Table, Model, Column,} from "../../../../index";
2+
3+
@Table
4+
export default class PlayerDir extends Model<PlayerDir> {
5+
@Column
6+
name: string;
7+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import {Table, Model, Column} from "../../../../index";
2+
3+
@Table
4+
export default class ShoeDir extends Model<ShoeDir> {
5+
6+
@Column
7+
brand: string;
8+
9+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import {Table, Model, Column} from "../../../../index";
2+
3+
@Table
4+
export default class TeamDir extends Model<TeamDir> {
5+
6+
@Column
7+
name: string;
8+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import {Table, Model, Column,} from "../../../../../index";
2+
3+
@Table
4+
export default class PlayerGlob extends Model<PlayerGlob> {
5+
@Column
6+
name: string;
7+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import {Table, Model, Column} from "../../../../../index";
2+
3+
@Table
4+
export default class ShoeGlob extends Model<ShoeGlob> {
5+
6+
@Column
7+
brand: string;
8+
9+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import {Table, Model, Column} from "../../../../../index";
2+
3+
@Table
4+
export default class TeamGlob extends Model<TeamGlob> {
5+
6+
@Column
7+
name: string;
8+
}

test/specs/models/sequelize.spec.ts

Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@ import Gamer from "../../models/exports/gamer.model";
77
import {Sequelize} from "../../../lib/models/Sequelize";
88
import {Model} from '../../../lib/models/Model';
99
import {Table} from '../../../lib/annotations/Table';
10+
import PlayerGlob from "../../models/globs/match-sub-dir-files/players/player.model";
11+
import ShoeGlob from "../../models/globs/match-sub-dir-files/shoes/shoe.model";
12+
import TeamGlob from "../../models/globs/match-sub-dir-files/teams/team.model";
13+
import PlayerDir from "../../models/globs/match-dir-only/PlayerDir";
14+
import TeamDir from "../../models/globs/match-dir-only/TeamDir";
15+
import ShoeDir from "../../models/globs/match-dir-only/ShoeDir";
1016

1117
describe('sequelize', () => {
1218

@@ -104,7 +110,7 @@ describe('sequelize', () => {
104110
.to.have.property('options')
105111
.that.has.property('define')
106112
.that.eqls(DEFINE_OPTIONS)
107-
;
113+
;
108114
});
109115

110116
it('should set define options for models', () => {
@@ -188,4 +194,63 @@ describe('sequelize', () => {
188194
});
189195

190196
});
197+
198+
describe('Add models as glob and dir', () => {
199+
it('should load classes from subfolders matching glob criteria', () => {
200+
const db = '__';
201+
const sequelizeGlob = new Sequelize({
202+
name: db,
203+
dialect: 'sqlite',
204+
username: 'root',
205+
password: '',
206+
storage: ':memory:',
207+
logging: !('SEQ_SILENT' in process.env),
208+
modelPaths: [__dirname + '/../../models/globs/match-sub-dir-files/**/*.model.ts']
209+
});
210+
211+
expect(sequelizeGlob._).to.have.property('PlayerGlob', PlayerGlob);
212+
expect(sequelizeGlob._).to.have.property('TeamGlob', TeamGlob);
213+
expect(sequelizeGlob._).to.have.property('ShoeGlob', ShoeGlob);
214+
215+
});
216+
217+
it('should load classes from folders', () => {
218+
const db = '__';
219+
const sequelizeFolder = new Sequelize({
220+
name: db,
221+
dialect: 'sqlite',
222+
username: 'root',
223+
password: '',
224+
storage: ':memory:',
225+
logging: !('SEQ_SILENT' in process.env),
226+
modelPaths: [__dirname + '/../../models/globs/match-dir-only']
227+
});
228+
229+
expect(sequelizeFolder._).to.have.property('PlayerDir', PlayerDir);
230+
expect(sequelizeFolder._).to.have.property('TeamDir', TeamDir);
231+
expect(sequelizeFolder._).to.have.property('ShoeDir', ShoeDir);
232+
233+
});
234+
235+
it('should load classes from folders and from glob', () => {
236+
const db = '__';
237+
const sequelizeGlobFolder = new Sequelize({
238+
name: db,
239+
dialect: 'sqlite',
240+
username: 'root',
241+
password: '',
242+
storage: ':memory:',
243+
logging: !('SEQ_SILENT' in process.env),
244+
modelPaths: [__dirname + '/../../models/globs/match-dir-only', __dirname + '/../../models/globs/match-sub-dir-files/**/*.model.ts']
245+
});
246+
247+
expect(sequelizeGlobFolder._).to.have.property('PlayerDir', PlayerDir);
248+
expect(sequelizeGlobFolder._).to.have.property('TeamDir', TeamDir);
249+
expect(sequelizeGlobFolder._).to.have.property('ShoeDir', ShoeDir);
250+
expect(sequelizeGlobFolder._).to.have.property('PlayerGlob', PlayerGlob);
251+
expect(sequelizeGlobFolder._).to.have.property('TeamGlob', TeamGlob);
252+
expect(sequelizeGlobFolder._).to.have.property('ShoeGlob', ShoeGlob);
253+
254+
});
255+
});
191256
});

0 commit comments

Comments
 (0)