feathers-knex-modeler
Advanced tools
Comparing version 1.4.6 to 1.5.0
{ | ||
"name": "feathers-knex-modeler", | ||
"version": "1.4.6", | ||
"version": "1.5.0", | ||
"description": "This package allows you to easily extend a table while you are developing it without requiring you to drop tables.", | ||
@@ -5,0 +5,0 @@ "main": "src/index.js", |
@@ -22,5 +22,7 @@ # Feathers Knex modeler | ||
name: tableName, | ||
depends: [], | ||
depends: ['organizations'], | ||
columns: [ | ||
{ name: 'id', type: 'increments' }, | ||
{ name:'organization_id',type:'integer',options:[{ type: 'references', argument: 'organizations.id' }]} , | ||
{ name: 'value', type: 'integer', options: [{ type: 'notNullable' }] }, | ||
{ name: 'name', type: 'text', options: [{ type: 'notNullable' }] }, | ||
@@ -27,0 +29,0 @@ { name: 'schema_type', type: 'text', options: [{ type: 'notNullable' }] }, |
111
src/index.js
@@ -11,15 +11,32 @@ /* eslint-disable no-console */ | ||
constructor (options) { | ||
_.defaultsDeep(options, { name: '', depends: [], columns: [], db: {}, retries: MAX_RETRIES }) | ||
_.defaults(options, { name: '', depends: [], columns: [], db: {}, retries: MAX_RETRIES }) | ||
super(options) | ||
const self = this | ||
Object.defineProperty(self, '_', { enumerable: false, value: {} }) | ||
Object.defineProperty(self._, 'depends', { enumerable: false, value: options.depends }) | ||
Object.defineProperty(self._, 'columns', { enumerable: false, value: options.columns }) | ||
Object.defineProperty(self._, 'name', { enumerable: false, value: options.name }) | ||
Object.defineProperty(self._, 'db', { enumerable: false, value: options.db }) | ||
Object.defineProperty(self._, 'default', { enumerable: false, value: options.default }) | ||
Object.defineProperty(self._, 'retries', { enumerable: false, value: options.retries }) | ||
const tableName = _.get(self, '_.name') | ||
self.debug = debug(`feathers-knex-modeler:${tableName}`) | ||
self.debug(`Finished construction of model for table: ${tableName}`) | ||
_.set(self, '_.depends', _.defaultTo(_.get(options, 'depends'), [])) | ||
_.set(self, '_.columns', _.defaultTo(_.get(options, 'columns'), [])) | ||
_.set(self, '_.name', _.defaultTo(_.get(options, 'name'), '')) | ||
_.set(self, '_.db', _.defaultTo(_.get(options, 'db'), false)) | ||
_.set(self, '_.default', _.defaultTo(_.get(options, 'default'), '')) | ||
_.set(self, '_.retries', _.defaultTo(_.get(options, 'retries'), 5)) | ||
if (self._.name === '') { | ||
throw new Error('No table name was provided.') | ||
} | ||
if (self._.columns.length === 0) { | ||
throw new Error('No table columns present') | ||
} | ||
if (_.isArray(self._.columns) === false) { | ||
throw new Error(`Expected columns to be an array. ${self._.columns}`) | ||
} | ||
_.forEach(self._.columns, (column) => { | ||
column.type = _.toLower(column.type) | ||
if (column.type === 'int') { | ||
column.type = 'integer' | ||
} | ||
return column | ||
}) | ||
self.debug = debug(`feathers-knex-modeler:${self._.name}`) | ||
self.debug(`Finished construction of model for table: ${self._.name}`) | ||
} | ||
@@ -51,8 +68,7 @@ | ||
const tableName = self.name | ||
const errors = [] | ||
try { | ||
self.debug(`Starting initialization of model for table: ${tableName}`) | ||
let encounteredErrors = false | ||
let errors | ||
try { | ||
self.emit({ source: 'initialization', type: 'database', value: { message: `Initializing database: ${self.name}. Waiting on dbs: ${self.depends.join(', ')}` } }) | ||
self.emit('init', { source: 'initialization', type: 'database', value: { message: `Initializing database: ${self.name}. Waiting on dbs: ${self.depends.join(', ')}` } }) | ||
self.debug(`Waiting for dependent tables for table: ${tableName}`) | ||
@@ -65,9 +81,8 @@ await self.waitForTables() | ||
} catch (err) { | ||
errors = err | ||
encounteredErrors = true | ||
self.emit({ source: 'initialization', type: 'error', value: err }) | ||
errors.push(err) | ||
self.emit('initialization', { source: 'initialization', message: `Encountered error during the initalization process. Table: ${tableName}. ${err || ''}`, error: err }) | ||
} | ||
if (encounteredErrors === true) { | ||
self.debug(`Failed initialization of model for table: ${tableName}`) | ||
throw new Error(errors) | ||
if (errors.length > 0) { | ||
self.debug(`Failed initialization of model for table: ${tableName}. ${errors || ''}`) | ||
throw new Error(`Failed initialization of model for table: ${tableName}. ${errors || ''}`) | ||
} else { | ||
@@ -77,3 +92,3 @@ self.debug(`Finished initialization of model for table: ${tableName}`) | ||
} catch (err) { | ||
self.debug(err) | ||
self.debug(`Failed during the initialization process retry: ${retries}. ${err || ''}`) | ||
retries++ | ||
@@ -83,3 +98,3 @@ if (retries < self._.retries) { | ||
} else { | ||
throw err | ||
throw new Error(`Failed to finish initialization after: ${retries} of ${self._.retries}. ${err || ''}`) | ||
} | ||
@@ -90,10 +105,2 @@ } | ||
emit (...args) { | ||
if (args.length === 1) { | ||
super.emit('message', args[0]) | ||
} else { | ||
super.emit(...args) | ||
} | ||
} | ||
async hasColumn (tableName, columnName, retries = 0) { | ||
@@ -167,27 +174,27 @@ const self = this | ||
case 'references' : { | ||
const referenceArray = argument.split('.') | ||
const referenceTable =referenceArray[0] | ||
const referenceColumn =referenceArray[1] | ||
const referenceArray = argument.split('.') | ||
const referenceTable = referenceArray[0] | ||
const referenceColumn = referenceArray[1] | ||
const constraintName = `${self.name}_${referenceTable}_${referenceColumn}_fkey` | ||
try{ | ||
debug(`Table: ${self.name} `) | ||
let alterTableRaw = `alter table "${self.name}" add constraint ${constraintName} foreign key ("${column.name}") references "${referenceTable}" ("${referenceColumn}")` | ||
if(hasOnDelete !==false){ | ||
alterTableRaw += ` ON DELETE ${hasOnDelete.argument}` | ||
try { | ||
debug(`Table: ${self.name} `) | ||
let alterTableRaw = `alter table "${self.name}" add constraint ${constraintName} foreign key ("${column.name}") references "${referenceTable}" ("${referenceColumn}")` | ||
if (hasOnDelete !== false) { | ||
alterTableRaw += ` ON DELETE ${hasOnDelete.argument}` | ||
} | ||
if (hasOnUpdate !== false) { | ||
alterTableRaw += ` ON UPDATE ${hasOnUpdate.argument}` | ||
} | ||
debug(`Table: ${self.name} constraint creation: ${alterTableRaw}`) | ||
await db.raw(alterTableRaw) | ||
await columnToAlter.references(referenceColumn).on(referenceTable) | ||
} catch (err) { | ||
const errorMessage = _.defaultTo(_.get(err, 'message'), '') | ||
if (errorMessage.indexOf('already exists') !== -1) { | ||
debug(`Failed to create constraint because it already exists. ${err || ''}`) | ||
} else { | ||
throw new Error(`Failed to create constraint. ${err || ''}`) | ||
} | ||
} | ||
if(hasOnUpdate !==false){ | ||
alterTableRaw += ` ON UPDATE ${hasOnUpdate.argument}` | ||
} | ||
debug(`Table: ${self.name} constraint creation: ${alterTableRaw}`) | ||
await db.raw(alterTableRaw) | ||
await columnToAlter.references(referenceColumn).on(referenceTable) | ||
}catch(err){ | ||
const errorMessage = _.defaultTo(_.get(err,'message'),'') | ||
if(errorMessage.indexOf('already exists')!==-1){ | ||
debug(`Failed to create constraint because it already exists. ${err || ''}`) | ||
}else{ | ||
throw new Error(`Failed to create constraint. ${err||''}`) | ||
} | ||
} | ||
break | ||
@@ -194,0 +201,0 @@ } |
@@ -21,4 +21,4 @@ /* eslint-disable no-undef */ | ||
describe('Feathers-Knex-Modeller', () => { | ||
let testOne = fixtures.testOne | ||
let testTwo = fixtures.testTwo | ||
const testOne = fixtures.testOne | ||
const testTwo = fixtures.testTwo | ||
testOne.db = db | ||
@@ -33,9 +33,9 @@ testTwo.db = db | ||
await Promise.all([modelTwo.init(), modelOne.init()]) | ||
let tableOne = await modelOne.hasTable('test') | ||
let hasTable = tableOne | ||
const tableOne = await modelOne.hasTable('test') | ||
const hasTable = tableOne | ||
expect(hasTable).to.equal(true) | ||
}) | ||
it('Has the table(s) after init', async function () { | ||
let hasTableOne = await db.schema.hasTable(fixtures.testOne.name) | ||
let hasTableTwo = await db.schema.hasTable(fixtures.testTwo.name) | ||
const hasTableOne = await db.schema.hasTable(fixtures.testOne.name) | ||
const hasTableTwo = await db.schema.hasTable(fixtures.testTwo.name) | ||
expect(hasTableOne).to.equal(true) | ||
@@ -45,4 +45,4 @@ expect(hasTableTwo).to.equal(true) | ||
it('Has the columns(s) after init', async function () { | ||
let hasTableOneColumnOne = await db.schema.hasColumn(fixtures.testOne.name, fixtures.testOne.columns[0].name) | ||
let hasTableTwoDependentColumn = await db.schema.hasColumn(fixtures.testTwo.name, 'test_id') | ||
const hasTableOneColumnOne = await db.schema.hasColumn(fixtures.testOne.name, fixtures.testOne.columns[0].name) | ||
const hasTableTwoDependentColumn = await db.schema.hasColumn(fixtures.testTwo.name, 'test_id') | ||
expect(hasTableOneColumnOne).to.equal(true) | ||
@@ -52,15 +52,15 @@ expect(hasTableTwoDependentColumn).to.equal(true) | ||
it('Specific type should create a column of the requested type', async function () { | ||
let tableName = fixtures.data.specificType.textArray.table | ||
let columnName = fixtures.data.specificType.textArray.name | ||
let columnData = fixtures.data.specificType.textArray.data | ||
const tableName = fixtures.data.specificType.textArray.table | ||
const columnName = fixtures.data.specificType.textArray.name | ||
const columnData = fixtures.data.specificType.textArray.data | ||
await db(tableName).delete() | ||
let dataToInsert = { | ||
'name': 'name', | ||
'schema_type': 'specificTypeTest', | ||
'status': 'TBD', | ||
'shared': true | ||
const dataToInsert = { | ||
name: 'name', | ||
schema_type: 'specificTypeTest', | ||
status: 'TBD', | ||
shared: true | ||
} | ||
dataToInsert[columnName] = columnData | ||
await db.insert(dataToInsert).into(tableName) | ||
let returnedData = (await db.select().from(tableName))[0] | ||
const returnedData = (await db.select().from(tableName))[0] | ||
expect(returnedData[columnName]).to.be.an('array') | ||
@@ -67,0 +67,0 @@ expect(returnedData[columnName][0]).to.be.an('string') |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
22336
551
97