diff --git a/UPGRADING.md b/UPGRADING.md index 27be76e1e3..291740ceb6 100644 --- a/UPGRADING.md +++ b/UPGRADING.md @@ -1,5 +1,12 @@ ## Upgrading to new knex.js versions +### Upgrading to version 0.18.0+ + +* Node.js older than 8 is no longer supported, make sure to update your environment; +* Knex returns native promises instead of bluebird ones now. You will need to update your code not to rely on bluebird-specific functionality; +* Knex.Promise was removed, use native promises; +* Promise is no longer passed to migrations and seeds, use native one. + ### Upgrading to version 0.16.0+ * MSSQL: DB versions older than 2008 are no longer supported, make sure to update your DB; diff --git a/package.json b/package.json index ff9c3cda15..0cd43555c7 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,6 @@ "node": ">=8" }, "dependencies": { - "@types/bluebird": "^3.5.27", "bluebird": "^3.5.5", "colorette": "1.0.8", "commander": "^2.20.0", diff --git a/src/dialects/mysql/schema/tablecompiler.js b/src/dialects/mysql/schema/tablecompiler.js index fc846fa568..0410eece49 100644 --- a/src/dialects/mysql/schema/tablecompiler.js +++ b/src/dialects/mysql/schema/tablecompiler.js @@ -96,7 +96,9 @@ assign(TableCompiler_MySQL.prototype, { } }) .then(function() { - let sql = `alter table ${table} change ${wrapped} ${column.Type}`; + let sql = `alter table ${table} change ${wrapped} ${ + column.Type + }`; if (String(column.Null).toUpperCase() !== 'YES') { sql += ` NOT NULL`; diff --git a/src/knex.js b/src/knex.js index 4a66f1b71a..a67a3ebbd6 100644 --- a/src/knex.js +++ b/src/knex.js @@ -59,17 +59,6 @@ Knex.Client = Client; /* eslint no-console:0 */ -Object.defineProperties(Knex, { - Promise: { - get() { - console.warn( - `Knex.Promise is deprecated, either require bluebird or use the global Promise` - ); - return require('bluebird'); - }, - }, -}); - // Run a "raw" query, though we can't do anything with it other than put // it in a query statement. Knex.raw = (sql, bindings) => { diff --git a/src/migrate/Migrator.js b/src/migrate/Migrator.js index 3773c0c0b3..88abc87b3c 100644 --- a/src/migrate/Migrator.js +++ b/src/migrate/Migrator.js @@ -438,7 +438,7 @@ class Migrator { trxOrKnex.enableProcessing(); return checkPromise( this.knex.client.logger, - migrationContent[direction](trxOrKnex, Promise), + migrationContent[direction](trxOrKnex), name ); }) @@ -469,7 +469,7 @@ class Migrator { return knex.transaction((trx) => { return checkPromise( knex.client.logger, - migrationContent[direction](trx, Promise), + migrationContent[direction](trx), name, () => { trx.commit(); diff --git a/src/migrate/stub/coffee.stub b/src/migrate/stub/coffee.stub index 734502ffc1..7eff32fe93 100644 --- a/src/migrate/stub/coffee.stub +++ b/src/migrate/stub/coffee.stub @@ -1,5 +1,5 @@ -exports.up = (knex, Promise) -> +exports.up = (knex) -> <% if (d.tableName) { %> knex.schema.createTable "<%= d.tableName %>", (t) -> t.increments() @@ -7,7 +7,7 @@ exports.up = (knex, Promise) -> <% } %> -exports.down = (knex, Promise) -> +exports.down = (knex) -> <% if (d.tableName) { %> knex.schema.dropTable "<%= d.tableName %>" <% } %> diff --git a/src/migrate/stub/eg.stub b/src/migrate/stub/eg.stub index 3c287fb6e3..cbf60a3893 100644 --- a/src/migrate/stub/eg.stub +++ b/src/migrate/stub/eg.stub @@ -1,6 +1,6 @@ provide: up, down -up = (knex, Promise) -> +up = (knex) -> <% if (d.tableName) { %> knex.schema.createTable "<%= d.tableName %>": t -> t.increments() @@ -8,7 +8,7 @@ up = (knex, Promise) -> <% } %> -down = (knex, Promise) -> +down = (knex) -> <% if (d.tableName) { %> knex.schema.dropTable("<%= d.tableName %>") <% } %> diff --git a/src/migrate/stub/js.stub b/src/migrate/stub/js.stub index 3986d4d65f..dfae79b956 100644 --- a/src/migrate/stub/js.stub +++ b/src/migrate/stub/js.stub @@ -1,5 +1,5 @@ -exports.up = function(knex, Promise) { +exports.up = function(knex) { <% if (d.tableName) { %> return knex.schema.createTable("<%= d.tableName %>", function(t) { t.increments(); @@ -8,7 +8,7 @@ exports.up = function(knex, Promise) { <% } %> }; -exports.down = function(knex, Promise) { +exports.down = function(knex) { <% if (d.tableName) { %> return knex.schema.dropTable("<%= d.tableName %>"); <% } %> diff --git a/src/seed/Seeder.js b/src/seed/Seeder.js index 6984fd46f9..d5b2ebd6c4 100644 --- a/src/seed/Seeder.js +++ b/src/seed/Seeder.js @@ -135,7 +135,7 @@ Seeder.prototype._waterfallBatch = function(seeds) { current = current.then(() => // Nesting promise to prevent bubbling up of error on catch Promise.resolve() - .then(() => seed.seed(knex, Promise)) + .then(() => seed.seed(knex)) .then(() => log.push(name)) .catch((originalError) => { const error = new Error( diff --git a/src/seed/stub/coffee.stub b/src/seed/stub/coffee.stub index 8b98b0d0ca..a8fd364d64 100644 --- a/src/seed/stub/coffee.stub +++ b/src/seed/stub/coffee.stub @@ -1,4 +1,4 @@ -exports.seed = (knex, Promise) -> +exports.seed = (knex) -> knex('table_name').del() .then () -> # Inserts seed entries diff --git a/src/seed/stub/eg.stub b/src/seed/stub/eg.stub index a18661d59f..b645846609 100644 --- a/src/seed/stub/eg.stub +++ b/src/seed/stub/eg.stub @@ -1,5 +1,5 @@ provide: seed -seed = (knex, Promise) -> +seed = (knex) -> ;; Deletes ALL existing entries knex(.table_name).del() .then(() -> diff --git a/src/seed/stub/js.stub b/src/seed/stub/js.stub index bb47cc406a..333db5adb0 100644 --- a/src/seed/stub/js.stub +++ b/src/seed/stub/js.stub @@ -1,5 +1,5 @@ -exports.seed = function(knex, Promise) { +exports.seed = function(knex) { // Deletes ALL existing entries return knex('table_name').del() .then(function () { diff --git a/src/seed/stub/ls.stub b/src/seed/stub/ls.stub index 31e50853f4..8dbf8acf30 100644 --- a/src/seed/stub/ls.stub +++ b/src/seed/stub/ls.stub @@ -1,4 +1,4 @@ -exports.seed = (knex, Promise) -> +exports.seed = (knex) -> # Deletes ALL existing entries knex('table_name').del() .then(() -> diff --git a/src/util/make-knex.js b/src/util/make-knex.js index b6e4dd7380..c93f78e900 100644 --- a/src/util/make-knex.js +++ b/src/util/make-knex.js @@ -6,7 +6,6 @@ const FunctionHelper = require('../functionhelper'); const QueryInterface = require('../query/methods'); const { assign, merge } = require('lodash'); const batchInsert = require('./batchInsert'); -const bluebird = require('bluebird'); function makeKnex(client) { // The object we're potentially using to kick off an initial chain. @@ -212,7 +211,6 @@ function redefineProperties(knex, client) { }); initContext(knex); - knex.Promise = bluebird; knex.client = client; knex.client.makeKnex = makeKnex; knex.userParams = {}; diff --git a/types/index.d.ts b/types/index.d.ts index 7b2ce3428a..e0af3477ad 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -10,7 +10,6 @@ import events = require('events'); import stream = require('stream'); -import Bluebird = require('bluebird'); import ResultTypes = require('./result'); // # Generic type-level utilities @@ -330,12 +329,12 @@ interface Knex config?: any ): Promise; transaction( - transactionScope: (trx: Knex.Transaction) => Promise | Bluebird | void, + transactionScope: (trx: Knex.Transaction) => Promise | Promise | void, config?: any - ): Bluebird; + ): Promise; initialize(config?: Knex.Config): void; destroy(callback: Function): void; - destroy(): Bluebird; + destroy(): Promise; batchInsert( tableName: Knex.TableDescriptor, data: any[], @@ -1347,7 +1346,7 @@ declare namespace Knex { and: QueryBuilder; // TODO: Promise? - columnInfo(column?: keyof TRecord): Bluebird; + columnInfo(column?: keyof TRecord): Promise; forUpdate(...tableNames: string[]): QueryBuilder; forUpdate(tableNames: string[]): QueryBuilder; @@ -1379,17 +1378,17 @@ declare namespace Knex { // Chainable interface // - interface ChainableInterface extends Bluebird { + interface ChainableInterface extends Promise { toQuery(): string; options(options: { [key: string]: any }): this; connection(connection: any): this; debug(enabled: boolean): this; transacting(trx: Transaction): this; - stream(handler: (readable: stream.PassThrough) => any): Bluebird; + stream(handler: (readable: stream.PassThrough) => any): Promise; stream( options: { [key: string]: any }, handler: (readable: stream.PassThrough) => any - ): Bluebird; + ): Promise; stream(options?: { [key: string]: any }): stream.PassThrough; pipe( writable: T, @@ -1408,7 +1407,7 @@ declare namespace Knex { ): QueryBuilder; savepoint( transactionScope: (trx: Transaction) => any - ): Bluebird; + ): Promise; commit(value?: any): QueryBuilder; rollback(error?: any): QueryBuilder; } @@ -1430,14 +1429,14 @@ declare namespace Knex { tableName: string, callback: (tableBuilder: CreateTableBuilder) => any ): SchemaBuilder; - renameTable(oldTableName: string, newTableName: string): Bluebird; + renameTable(oldTableName: string, newTableName: string): Promise; dropTable(tableName: string): SchemaBuilder; - hasTable(tableName: string): Bluebird; - hasColumn(tableName: string, columnName: string): Bluebird; + hasTable(tableName: string): Promise; + hasColumn(tableName: string, columnName: string): Promise; table( tableName: string, callback: (tableBuilder: AlterTableBuilder) => any - ): Bluebird; + ): Promise; dropTableIfExists(tableName: string): SchemaBuilder; raw(statement: string): SchemaBuilder; withSchema(schemaName: string): SchemaBuilder; @@ -1759,13 +1758,13 @@ declare namespace Knex { } interface Migrator { - make(name: string, config?: MigratorConfig): Bluebird; - latest(config?: MigratorConfig): Bluebird; - rollback(config?: MigratorConfig, all?: boolean): Bluebird; - status(config?: MigratorConfig): Bluebird; - currentVersion(config?: MigratorConfig): Bluebird; - up(config?: MigratorConfig): Bluebird; - down(config?: MigratorConfig): Bluebird; + make(name: string, config?: MigratorConfig): Promise; + latest(config?: MigratorConfig): Promise; + rollback(config?: MigratorConfig, all?: boolean): Promise; + status(config?: MigratorConfig): Promise; + currentVersion(config?: MigratorConfig): Promise; + up(config?: MigratorConfig): Promise; + down(config?: MigratorConfig): Promise; } interface SeederConfig { @@ -1777,8 +1776,8 @@ declare namespace Knex { class Seeder { constructor(knex: Knex); setConfig(config: SeederConfig): SeederConfig; - run(config?: SeederConfig): Bluebird; - make(name: string, config?: SeederConfig): Bluebird; + run(config?: SeederConfig): Promise; + make(name: string, config?: SeederConfig): Promise; } interface FunctionHelper { diff --git a/types/test.ts b/types/test.ts index 4906311f9c..397cfdddf7 100644 --- a/types/test.ts +++ b/types/test.ts @@ -219,32 +219,32 @@ const main = async () => { await knex('users').select(knex.ref('id'), {age: 'users.age'}).first(); // $ExpectType { identifier: number; username: string; }[] - await knex('users') - .select('id', 'name') + (await knex('users') + .select('id', 'name')) .map((u) => ({ identifier: u.id, username: u.name })); // $ExpectType { identifier: number; username: string; }[] - await knex + (await knex .select('id', 'name') - .from('users') + .from('users')) .map((u) => ({ identifier: u.id, username: u.name })); // $ExpectType { identifier: any; username: any; }[] - await knex + (await knex .select('id', 'name') - .from('users') + .from('users')) .map((u) => ({ identifier: u.id, username: u.name })); // $ExpectType number - await knex + (await knex .select('id', 'name', 'age') - .from('users') - .reduce((maxAge: number, user) => (user.age > maxAge ? user.age : maxAge)); + .from('users')) + .reduce((maxAge: number, user) => (user.age > maxAge ? user.age : maxAge), 0); // $ExpectType any - await knex('table') + (await knex('table') .select('key', 'value') - .where({ namespace: 'foo' }) + .where({ namespace: 'foo' })) .reduce( (aggr, { value, key }) => ({ ...aggr, @@ -721,8 +721,8 @@ const main = async () => { ); // $ExpectType { username: any; }[] - await knex('users') - .innerJoin('departments', 'users.departmentid', 'departments.id') + (await knex('users') + .innerJoin('departments', 'users.departmentid', 'departments.id')) .map(function(joined) { return { username: joined.name, @@ -730,12 +730,12 @@ const main = async () => { }); // $ExpectType { username: string; }[] - await knex('users') + (await knex('users') .innerJoin( 'departments', 'users.departmentid', 'departments.id' - ) + )) .map(function(joined) { return { username: joined.name, @@ -743,13 +743,13 @@ const main = async () => { }); // $ExpectType { username: string; }[] - await knex('users') + (await knex('users') .innerJoin( 'departments', 'users.departmentid', 'departments.id' ) - .select('*') + .select('*')) .map(function(joined) { return { username: joined.name, @@ -757,13 +757,13 @@ const main = async () => { }); // $ExpectType { username: string; }[] - await knex('users') + (await knex('users') .innerJoin( 'departments', 'users.departmentid', 'departments.id' ) - .select() + .select()) .map(function(joined) { return { username: joined.name, @@ -771,13 +771,13 @@ const main = async () => { }); // $ExpectType { username: string; }[] - await knex('users') + (await knex('users') .innerJoin( 'departments', 'users.departmentid', 'departments.id' ) - .select('name', 'age') + .select('name', 'age')) .map(function(joined) { return { username: joined.name, @@ -785,13 +785,13 @@ const main = async () => { }); // $ExpectType { username: any; }[] - await knex('users') + (await knex('users') .innerJoin( 'departments', 'users.departmentid', 'departments.id' ) - .select('users.name', 'age') + .select('users.name', 'age')) .map(function(joined) { return { username: joined.name,