diff --git a/lib/compiler.js b/lib/compiler.js index 30ad2d0..e2dea15 100644 --- a/lib/compiler.js +++ b/lib/compiler.js @@ -7,6 +7,7 @@ var ConfigLoader = require('./config-loader'); var debug = require('debug')('loopback:boot:compiler'); var Module = require('module'); var _ = require('lodash'); +var _s = require('underscore.string'); var FILE_EXTENSION_JSON = '.json'; @@ -382,6 +383,8 @@ function tryResolveAppPath(rootDir, relativePath, resolveOptions) { function loadModelDefinition(rootDir, jsonFile, allFiles) { var definition = require(jsonFile); + var basename = path.basename(jsonFile, path.extname(jsonFile)); + definition.name = definition.name || _s.capitalize(_s.camelize(basename)); // find a matching file with a supported extension like `.js` or `.coffee` var sourceFile = fixFileExtension(jsonFile, allFiles, true); diff --git a/package.json b/package.json index b198c18..c2df7b5 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,8 @@ "debug": "^2.0.0", "lodash": "^2.4.1", "semver": "^4.1.0", - "toposort": "^0.2.10" + "toposort": "^0.2.10", + "underscore.string": "^3.0.3" }, "devDependencies": { "browserify": "^4.1.8", diff --git a/test/compiler.test.js b/test/compiler.test.js index cc3a5c2..6df170f 100644 --- a/test/compiler.test.js +++ b/test/compiler.test.js @@ -867,6 +867,144 @@ describe('compiler', function() { .to.throw(/cyclic dependency/i); }); + it('uses file name as default value for model name', function() { + appdir.createConfigFilesSync({}, {}, { + Car: { dataSource: 'db' } + }); + appdir.writeConfigFileSync('models/car.json', {}); + + var instructions = boot.compile(appdir.PATH); + + var modelNames = instructions.models.map(getNameProperty); + expect(modelNames).to.eql(['Car']); + }); + + it('uses `OrderItem` as default model name for file with name `order-item`', + function() { + appdir.createConfigFilesSync({}, {}, { + OrderItem: { dataSource: 'db' } + }); + appdir.writeConfigFileSync('models/order-item.json', {}); + + var instructions = boot.compile(appdir.PATH); + + var modelNames = instructions.models.map(getNameProperty); + expect(modelNames).to.eql(['OrderItem']); + }); + + it('uses `OrderItem` as default model name for file with name `order_item`', + function() { + appdir.createConfigFilesSync({}, {}, { + OrderItem: { dataSource: 'db' } + }); + appdir.writeConfigFileSync('models/order_item.json', {}); + + var instructions = boot.compile(appdir.PATH); + + var modelNames = instructions.models.map(getNameProperty); + expect(modelNames).to.eql(['OrderItem']); + }); + + it('uses `OrderItem` as default model name for file with name `order item`', + function() { + appdir.createConfigFilesSync({}, {}, { + OrderItem: { dataSource: 'db' } + }); + appdir.writeConfigFileSync('models/order item.json', {}); + + var instructions = boot.compile(appdir.PATH); + + var modelNames = instructions.models.map(getNameProperty); + expect(modelNames).to.eql(['OrderItem']); + }); + + it('overrides `default model name` by `name` in model definition', + function() { + appdir.createConfigFilesSync({}, {}, { + overrideCar: { dataSource: 'db' } + }); + appdir.writeConfigFileSync('models/car.json', { name: 'overrideCar'}); + + var instructions = boot.compile(appdir.PATH); + + var modelNames = instructions.models.map(getNameProperty); + expect(modelNames).to.eql(['overrideCar']); + }); + + it('overwrites model with same default name', function() { + appdir.createConfigFilesSync({}, {}, { + 'OrderItem': { dataSource: 'db' } + }); + + appdir.writeConfigFileSync('models/order-item.json', { + properties: { + price: { type: 'number' } + } + }); + appdir.writeFileSync('models/order-item.js', ''); + + appdir.writeConfigFileSync('models/orderItem.json', { + properties: { + quantity: { type: 'number' } + } + }); + var appJS = appdir.writeFileSync('models/orderItem.js', ''); + + var instructions = boot.compile(appdir.PATH); + + expect(instructions.models).to.eql([{ + name: 'OrderItem', + config: { + dataSource: 'db' + }, + definition: { + name: 'OrderItem', + properties: { + quantity: {type: 'number'} + } + }, + sourceFile: appJS + }]); + }); + + it('overwrites model with same name in model definition', function() { + appdir.createConfigFilesSync({}, {}, { + 'customOrder': { dataSource: 'db' } + }); + + appdir.writeConfigFileSync('models/order1.json', { + name : 'customOrder', + properties: { + price: { type: 'number' } + } + }); + appdir.writeFileSync('models/order1.js', ''); + + appdir.writeConfigFileSync('models/order2.json', { + name : 'customOrder', + properties: { + quantity: { type: 'number' } + } + }); + var appJS = appdir.writeFileSync('models/order2.js', ''); + + var instructions = boot.compile(appdir.PATH); + + expect(instructions.models).to.eql([{ + name: 'customOrder', + config: { + dataSource: 'db' + }, + definition: { + name: 'customOrder', + properties: { + quantity: {type: 'number'} + } + }, + sourceFile: appJS + }]); + }); + it('returns a new copy of JSON data', function() { appdir.createConfigFilesSync();