diff --git a/.husky/pre-commit b/.husky/pre-commit index d1736bdae..3867a0feb 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1 +1 @@ -npx biome check --staged --write --no-errors-on-unmatched +npm run lint diff --git a/biome.jsonc b/biome.jsonc index f13cb4611..d5f55dd53 100644 --- a/biome.jsonc +++ b/biome.jsonc @@ -49,11 +49,26 @@ "pskl", "Events", "Constants", - "Q", "module", "require", "console", - "Promise" + "Promise", + "describe", + "xdescribe", + "fdescribe", + "it", + "xit", + "fit", + "beforeEach", + "afterEach", + "beforeAll", + "afterAll", + "expect", + "fail", + "pending", + "spyOn", + "spyOnProperty", + "jasmine" ] }, "css": { diff --git a/src/js/controller/dialogs/backups/steps/SelectSession.js b/src/js/controller/dialogs/backups/steps/SelectSession.js index 8db27224c..2bd813522 100644 --- a/src/js/controller/dialogs/backups/steps/SelectSession.js +++ b/src/js/controller/dialogs/backups/steps/SelectSession.js @@ -12,11 +12,9 @@ * @return {Promise} promise that resolves after time. */ var wait = function (time) { - var deferred = Q.defer(); - setTimeout(function () { - deferred.resolve(); - }, time); - return deferred.promise; + return new Promise(function (resolve) { + setTimeout(resolve, time); + }); }; ns.SelectSession = function (piskelController, backupsController, container) { @@ -96,7 +94,7 @@ } else if (action == "delete") { if (window.confirm("Are you sure you want to delete this session?")) { evt.target.closest(".session-item").classList.add("deleting"); - Q.all([ + Promise.all([ pskl.app.backupService.deleteSession(sessionId), // Wait for 500ms for the .hide opacity transition. wait(DELETE_TRANSITION_DURATION) diff --git a/src/js/controller/dialogs/importwizard/steps/ImageImport.js b/src/js/controller/dialogs/importwizard/steps/ImageImport.js index bc71b1d27..974ceaad2 100644 --- a/src/js/controller/dialogs/importwizard/steps/ImageImport.js +++ b/src/js/controller/dialogs/importwizard/steps/ImageImport.js @@ -93,27 +93,29 @@ // Remove extension from filename. name = name.replace(/\.[a-zA-Z]+$/, ""); - var deferred = Q.defer(); - pskl.app.importService.newPiskelFromImage( - this.importedImage_, - { - importType: this.getImportType_(), - frameSizeX: - this.getImportType_() === "single" - ? this.resizeWidth.value - : this.sanitizeInputValue_(this.frameSizeX, 1), - frameSizeY: - this.getImportType_() === "single" - ? this.resizeHeight.value - : this.sanitizeInputValue_(this.frameSizeY, 1), - frameOffsetX: this.sanitizeInputValue_(this.frameOffsetX, 0), - frameOffsetY: this.sanitizeInputValue_(this.frameOffsetY, 0), - smoothing: !!this.smoothResize.checked, - name: name - }, - deferred.resolve + return new Promise( + function (resolve) { + pskl.app.importService.newPiskelFromImage( + this.importedImage_, + { + importType: this.getImportType_(), + frameSizeX: + this.getImportType_() === "single" + ? this.resizeWidth.value + : this.sanitizeInputValue_(this.frameSizeX, 1), + frameSizeY: + this.getImportType_() === "single" + ? this.resizeHeight.value + : this.sanitizeInputValue_(this.frameSizeY, 1), + frameOffsetX: this.sanitizeInputValue_(this.frameOffsetX, 0), + frameOffsetY: this.sanitizeInputValue_(this.frameOffsetY, 0), + smoothing: !!this.smoothResize.checked, + name: name + }, + resolve + ); + }.bind(this) ); - return deferred.promise; }; ns.ImageImport.prototype.onImportTypeChange_ = function (evt) { diff --git a/src/js/database/BackupDatabase.js b/src/js/database/BackupDatabase.js index 69de47680..abf3463fc 100644 --- a/src/js/database/BackupDatabase.js +++ b/src/js/database/BackupDatabase.js @@ -6,10 +6,10 @@ // Simple wrapper to promisify a request. var _requestPromise = function (req) { - var deferred = Q.defer(); - req.onsuccess = deferred.resolve.bind(deferred); - req.onerror = deferred.reject.bind(deferred); - return deferred.promise; + return new Promise(function (resolve, reject) { + req.onsuccess = resolve; + req.onerror = reject; + }); }; /** @@ -122,9 +122,6 @@ * if the snapshot is valid. */ ns.BackupDatabase.prototype.findLastSnapshot = function (accept) { - // Create the backup promise. - var deferred = Q.defer(); - // Open a transaction to the snapshots object store. var objectStore = this.db .transaction(["snapshots"]) @@ -132,21 +129,22 @@ var index = objectStore.index("date"); var range = IDBKeyRange.upperBound(Infinity); - index.openCursor(range, "prev").onsuccess = function (event) { - var cursor = event.target.result; - var snapshot = cursor && cursor.value; - - // Resolve null if we couldn't find a matching snapshot. - if (!snapshot) { - deferred.resolve(null); - } else if (accept(snapshot)) { - deferred.resolve(snapshot); - } else { - cursor.continue(); - } - }; - return deferred.promise; + return new Promise(function (resolve) { + index.openCursor(range, "prev").onsuccess = function (event) { + var cursor = event.target.result; + var snapshot = cursor && cursor.value; + + // Resolve null if we couldn't find a matching snapshot. + if (!snapshot) { + resolve(null); + } else if (accept(snapshot)) { + resolve(snapshot); + } else { + cursor.continue(); + } + }; + }); }; /** @@ -157,9 +155,6 @@ * The session id */ ns.BackupDatabase.prototype.getSnapshotsBySessionId = function (sessionId) { - // Create the backup promise. - var deferred = Q.defer(); - // Open a transaction to the snapshots object store. var objectStore = this.db .transaction(["snapshots"]) @@ -170,25 +165,22 @@ var keyRange = IDBKeyRange.bound([sessionId, 0], [sessionId, Infinity]); var snapshots = []; - // Ordered by date in descending order. - index.openCursor(keyRange, "prev").onsuccess = function (event) { - var cursor = event.target.result; - if (cursor) { - snapshots.push(cursor.value); - cursor.continue(); - } else { - // Consumed all piskel snapshots - deferred.resolve(snapshots); - } - }; - - return deferred.promise; + return new Promise(function (resolve) { + // Ordered by date in descending order. + index.openCursor(keyRange, "prev").onsuccess = function (event) { + var cursor = event.target.result; + if (cursor) { + snapshots.push(cursor.value); + cursor.continue(); + } else { + // Consumed all piskel snapshots + resolve(snapshots); + } + }; + }); }; ns.BackupDatabase.prototype.getSessions = function () { - // Create the backup promise. - var deferred = Q.defer(); - // Open a transaction to the snapshots object store. var objectStore = this.db .transaction(["snapshots"]) @@ -223,22 +215,23 @@ var index = objectStore.index("date"); var range = IDBKeyRange.upperBound(Infinity); - index.openCursor(range, "prev").onsuccess = function (event) { - var cursor = event.target.result; - var snapshot = cursor && cursor.value; - if (!snapshot) { - deferred.resolve(sessions); - } else { - if (sessions[snapshot.session_id]) { - _updateSession(snapshot); + + return new Promise(function (resolve) { + index.openCursor(range, "prev").onsuccess = function (event) { + var cursor = event.target.result; + var snapshot = cursor && cursor.value; + if (!snapshot) { + resolve(sessions); } else { - _createSession(snapshot); + if (sessions[snapshot.session_id]) { + _updateSession(snapshot); + } else { + _createSession(snapshot); + } + cursor.continue(); } - cursor.continue(); - } - }; - - return deferred.promise.then(function (sessions) { + }; + }).then(function (sessions) { // Convert the sessions map to an array. return Object.keys(sessions).map(function (key) { return sessions[key]; @@ -247,9 +240,6 @@ }; ns.BackupDatabase.prototype.deleteSnapshotsForSession = function (sessionId) { - // Create the backup promise. - var deferred = Q.defer(); - // Open a transaction to the snapshots object store. var objectStore = this.openObjectStore_(); @@ -257,16 +247,16 @@ var index = objectStore.index("session_id"); var keyRange = IDBKeyRange.only(sessionId); - index.openCursor(keyRange).onsuccess = function (event) { - var cursor = event.target.result; - if (cursor) { - cursor.delete(); - cursor.continue(); - } else { - deferred.resolve(); - } - }; - - return deferred.promise; + return new Promise(function (resolve) { + index.openCursor(keyRange).onsuccess = function (event) { + var cursor = event.target.result; + if (cursor) { + cursor.delete(); + cursor.continue(); + } else { + resolve(); + } + }; + }); }; })(); diff --git a/src/js/database/PiskelDatabase.js b/src/js/database/PiskelDatabase.js index 2fa3df883..9f3a83231 100644 --- a/src/js/database/PiskelDatabase.js +++ b/src/js/database/PiskelDatabase.js @@ -6,10 +6,10 @@ // Simple wrapper to promisify a request. var _requestPromise = function (req) { - var deferred = Q.defer(); - req.onsuccess = deferred.resolve.bind(deferred); - req.onerror = deferred.reject.bind(deferred); - return deferred.promise; + return new Promise(function (resolve, reject) { + req.onsuccess = resolve; + req.onerror = reject; + }); }; /** @@ -71,31 +71,30 @@ * needs to be retrieved with a separate get. */ ns.PiskelDatabase.prototype.list = function () { - var deferred = Q.defer(); - var piskels = []; var objectStore = this.openObjectStore_(); var cursor = objectStore.openCursor(); - cursor.onsuccess = function (event) { - var cursor = event.target.result; - if (cursor) { - piskels.push({ - name: cursor.value.name, - date: cursor.value.date, - description: cursor.value.description - }); - cursor.continue(); - } else { - // Cursor consumed all availabled piskels - deferred.resolve(piskels); - } - }; - - cursor.onerror = function () { - deferred.reject(); - }; - - return deferred.promise; + + return new Promise(function (resolve, reject) { + cursor.onsuccess = function (event) { + var cursor = event.target.result; + if (cursor) { + piskels.push({ + name: cursor.value.name, + date: cursor.value.date, + description: cursor.value.description + }); + cursor.continue(); + } else { + // Cursor consumed all availabled piskels + resolve(piskels); + } + }; + + cursor.onerror = function () { + reject(); + }; + }); }; /** diff --git a/src/js/database/migrate/MigrateLocalStorageToIndexedDb.js b/src/js/database/migrate/MigrateLocalStorageToIndexedDb.js index 7b0d774a3..4d13c9268 100644 --- a/src/js/database/migrate/MigrateLocalStorageToIndexedDb.js +++ b/src/js/database/migrate/MigrateLocalStorageToIndexedDb.js @@ -5,8 +5,6 @@ ns.MigrateLocalStorageToIndexedDb = {}; ns.MigrateLocalStorageToIndexedDb.migrate = function (piskelDatabase) { - var deferred = Q.defer(); - var localStorageService = pskl.app.localStorageService; var localStorageKeys = localStorageService.getKeys(); @@ -19,41 +17,41 @@ }; }); - // Define the sequential migration process. - // Wait for each sprite to be saved before saving the next one. - var success = true; - var migrateSprite = function (index) { - var data = migrationData[index]; - if (!data) { - console.log( - "Data migration from local storage to indexed db finished." - ); - if (success) { + return new Promise(function (resolve) { + // Define the sequential migration process. + // Wait for each sprite to be saved before saving the next one. + var success = true; + var migrateSprite = function (index) { + var data = migrationData[index]; + if (!data) { console.log( - "Local storage piskels successfully migrated. Old copies will be deleted." + "Data migration from local storage to indexed db finished." ); - ns.MigrateLocalStorageToIndexedDb.deleteLocalStoragePiskels(); - } - - deferred.resolve(); - } else { - ns.MigrateLocalStorageToIndexedDb.save_(piskelDatabase, data) - .then(function () { - migrateSprite(index + 1); - }) - .catch(function (e) { - console.error( - "Failed to migrate local storage sprite for name: " + data.name + if (success) { + console.log( + "Local storage piskels successfully migrated. Old copies will be deleted." ); - migrateSprite(index + 1); - }); - } - }; + ns.MigrateLocalStorageToIndexedDb.deleteLocalStoragePiskels(); + } - // Start the migration. - migrateSprite(0); + resolve(); + } else { + ns.MigrateLocalStorageToIndexedDb.save_(piskelDatabase, data) + .then(function () { + migrateSprite(index + 1); + }) + .catch(function (e) { + console.error( + "Failed to migrate local storage sprite for name: " + data.name + ); + migrateSprite(index + 1); + }); + } + }; - return deferred.promise; + // Start the migration. + migrateSprite(0); + }); }; ns.MigrateLocalStorageToIndexedDb.save_ = function ( diff --git a/src/js/lib/q.js b/src/js/lib/q.js deleted file mode 100644 index 710fdf4bf..000000000 --- a/src/js/lib/q.js +++ /dev/null @@ -1,1986 +0,0 @@ -// vim:ts=4:sts=4:sw=4: -/*! - * - * Copyright 2009-2012 Kris Kowal under the terms of the MIT - * license found at http://github.com/kriskowal/q/raw/master/LICENSE - * - * With parts by Tyler Close - * Copyright 2007-2009 Tyler Close under the terms of the MIT X license found - * at http://www.opensource.org/licenses/mit-license.html - * Forked at ref_send.js version: 2009-05-11 - * - * With parts by Mark Miller - * Copyright (C) 2011 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -(function (definition) { - "use strict"; - - // This file will function properly as a