From a6a28e52c6bb3665bc2b2443911023cb0ade62d7 Mon Sep 17 00:00:00 2001 From: AkiraFukushima Date: Sat, 11 Mar 2023 01:30:35 +0900 Subject: [PATCH 1/2] refs #4191 Use better-sqlite3 instead of node-sqlite3 --- README.md | 4 + package.json | 4 +- src/main/database.ts | 61 +++---- src/main/db/account.ts | 389 +++++++++++++++++----------------------- src/main/db/hashtags.ts | 100 +++++------ src/main/db/server.ts | 52 +++--- src/main/db/setting.ts | 79 ++++---- yarn.lock | 257 +++++++++++++++----------- 8 files changed, 454 insertions(+), 492 deletions(-) diff --git a/README.md b/README.md index bcf484d1..f5337d64 100644 --- a/README.md +++ b/README.md @@ -119,6 +119,10 @@ $ sudo apt-get install libfontconfig-dev # install dependencies $ yarn install +# You need to rebuild because of better-sqlite3 +# Refs: https://github.com/WiseLibs/better-sqlite3/issues/919 +$ ./node_modules/.bin/electron-rebuild + # serve with hot reload at localhost:9080 $ yarn run dev ``` diff --git a/package.json b/package.json index 7f1aeb9b..1faeddef 100644 --- a/package.json +++ b/package.json @@ -82,6 +82,7 @@ "animate.css": "^4.1.0", "auto-launch": "^5.0.5", "axios": "1.3.4", + "better-sqlite3": "^8.2.0", "blueimp-load-image": "^5.16.0", "electron-context-menu": "^3.6.1", "electron-json-storage": "^4.6.0", @@ -99,7 +100,6 @@ "parse-link-header": "^2.0.0", "sanitize-html": "^2.10.0", "simplayer": "0.0.8", - "sqlite3": "^5.1.4", "system-font-families": "^0.6.0", "unicode-emoji-json": "^0.4.0", "vue": "^3.2.47", @@ -120,7 +120,9 @@ "@babel/preset-env": "^7.20.2", "@babel/register": "^7.21.0", "@babel/runtime": "7.21.0", + "@electron/rebuild": "^3.2.10", "@types/auto-launch": "^5.0.2", + "@types/better-sqlite3": "^7.6.3", "@types/electron-json-storage": "^4.5.0", "@types/jest": "27.4.1", "@types/jsdom": "^21.1.0", diff --git a/src/main/database.ts b/src/main/database.ts index 83f26329..5d25e8c8 100644 --- a/src/main/database.ts +++ b/src/main/database.ts @@ -1,12 +1,11 @@ -import sqlite3 from 'sqlite3' +import sqlite, { Database } from 'better-sqlite3' -const newDB = (file: string): sqlite3.Database => { - const db = new sqlite3.Database(file, sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE) +const newDB = (file: string): Database => { + const db = new sqlite(file) // migration - db.serialize(() => { - db.run( - 'CREATE TABLE IF NOT EXISTS accounts(\ + db.prepare( + 'CREATE TABLE IF NOT EXISTS accounts(\ id INTEGER PRIMARY KEY, \ username TEXT NOT NULL, \ account_id TEXT NOT NULL, \ @@ -15,53 +14,33 @@ client_id TEXT DEFAULT NULL, \ client_secret TEXT NOT NULL, \ access_token TEXT NOT NULL, \ refresh_token TEXT DEFAULT NULL, \ -sort INTEGER UNIQUE NOT NULL)', - err => { - if (err) { - console.error('failed to create accounts: ', err) - } - } - ) - db.run( - 'CREATE TABLE IF NOT EXISTS servers(\ +sort INTEGER UNIQUE NOT NULL)' + ).run() + + db.prepare( + 'CREATE TABLE IF NOT EXISTS servers(\ id INTEGER PRIMARY KEY, \ domain TEXT NOT NULL, \ base_url TEXT NOT NULL, \ sns TEXT NOT NULL, \ account_id INTEGER UNIQUE DEFAULT NULL, \ -FOREIGN KEY (account_id) REFERENCES accounts(id) ON DELETE CASCADE)', - err => { - if (err) { - console.error('failed to create servers: ', err) - } - } - ) - db.run( - 'CREATE TABLE IF NOT EXISTS hashtags(\ +FOREIGN KEY (account_id) REFERENCES accounts(id) ON DELETE CASCADE)' + ).run() + db.prepare( + 'CREATE TABLE IF NOT EXISTS hashtags(\ id INTEGER PRIMARY KEY, \ tag TEXT NOT NULL, \ account_id INTEGER UNIQUE NOT NULL, \ -FOREIGN KEY (account_id) REFERENCES accounts(id) ON DELETE CASCADE)', - err => { - if (err) { - console.error('failed to create hashtags: ', err) - } - } - ) - db.run( - 'CREATE TABLE IF NOT EXISTS settings(\ +FOREIGN KEY (account_id) REFERENCES accounts(id) ON DELETE CASCADE)' + ).run + db.prepare( + 'CREATE TABLE IF NOT EXISTS settings(\ id INTEGER PRIMARY KEY, \ account_id INTEGER UNIQUE NOT NULL, \ marker_home BOOLEAN NOT NULL DEFAULT false, \ marker_notifications BOOLEAN NOT NULL DEFAULT true, \ -FOREIGN KEY (account_id) REFERENCES accounts(id) ON DELETE CASCADE)', - err => { - if (err) { - console.error('failed to create settings: ', err) - } - } - ) - }) +FOREIGN KEY (account_id) REFERENCES accounts(id) ON DELETE CASCADE)' + ).run() return db } diff --git a/src/main/db/account.ts b/src/main/db/account.ts index 61932144..4e30489d 100644 --- a/src/main/db/account.ts +++ b/src/main/db/account.ts @@ -1,9 +1,9 @@ -import sqlite3 from 'sqlite3' +import { Database } from 'better-sqlite3' import { LocalAccount } from '~/src/types/localAccount' import { LocalServer } from '~src/types/localServer' export const insertAccount = ( - db: sqlite3.Database, + db: Database, username: string, accountId: string, avatar: string, @@ -14,58 +14,47 @@ export const insertAccount = ( serverId: number ): Promise => { return new Promise((resolve, reject) => { - db.serialize(() => { - db.run('BEGIN TRANSACTION') - - db.get('SELECT * FROM accounts ORDER BY sort DESC', (err, row) => { - if (err) { - reject(err) - } - let order = 1 - if (row) { - order = row.sort + 1 - } - db.run( - 'INSERT INTO accounts(username, account_id, avatar, client_id, client_secret, access_token, refresh_token, sort) VALUES (?, ?, ?, ?, ?, ?, ?, ?)', - [username, accountId, avatar, clientId, clientSecret, accessToken, refreshToken, order], - function (err) { - if (err) { - reject(err) - } - const id = this.lastID - - db.run('UPDATE servers SET account_id = ? WHERE id = ?', [id, serverId], err => { - if (err) { - reject(err) - } - - db.run('COMMIT') - resolve({ - id, - username, - accountId, - avatar, - clientId, - clientSecret, - accessToken, - refreshToken, - order - }) - }) - } - ) - }) + const f = db.transaction(() => { + const row = db.prepare('SELECT * FROM accounts ORDER BY sort DESC').get() + let order = 1 + if (row) { + order = row.sort + 1 + } + try { + const res = db + .prepare( + 'INSERT INTO accounts(username, account_id, avatar, client_id, client_secret, access_token, refresh_token, sort) VALUES (?, ?, ?, ?, ?, ?, ?, ?)' + ) + .run(username, accountId, avatar, clientId, clientSecret, accessToken, refreshToken, order) + const id = res.lastInsertRowid as number + db.prepare('UPDATE servers SET account_id = ? WHERE id = ?').run(id, serverId) + return resolve({ + id, + username, + accountId, + avatar, + clientId, + clientSecret, + accessToken, + refreshToken, + order + }) + } catch (err) { + reject(err) + } }) + f() }) } /** * List up authenticated accounts. */ -export const listAccounts = (db: sqlite3.Database): Promise> => { - return new Promise((resolve, reject) => { - db.all( - 'SELECT \ +export const listAccounts = (db: Database): Promise> => { + return new Promise(resolve => { + const rows = db + .prepare( + 'SELECT \ accounts.id as id, \ accounts.username as username, \ accounts.account_id as remote_account_id, \ @@ -80,42 +69,40 @@ servers.base_url as base_url, \ servers.domain as domain, \ servers.sns as sns, \ servers.account_id as account_id \ -FROM accounts INNER JOIN servers ON servers.account_id = accounts.id ORDER BY accounts.sort', - (err, rows) => { - if (err) { - reject(err) - } - resolve( - rows.map(r => [ - { - id: r.id, - username: r.username, - accountId: r.remote_account_id, - avatar: r.avatar, - clientId: r.client_id, - clientSecret: r.client_secret, - accessToken: r.access_token, - refreshToken: r.refresh_token, - order: r.sort - } as LocalAccount, - { - id: r.server_id, - baseURL: r.base_url, - domain: r.domain, - sns: r.sns, - accountId: r.account_id - } as LocalServer - ]) - ) - } +FROM accounts INNER JOIN servers ON servers.account_id = accounts.id ORDER BY accounts.sort' + ) + .all() + + resolve( + rows.map(r => [ + { + id: r.id, + username: r.username, + accountId: r.remote_account_id, + avatar: r.avatar, + clientId: r.client_id, + clientSecret: r.client_secret, + accessToken: r.access_token, + refreshToken: r.refresh_token, + order: r.sort + } as LocalAccount, + { + id: r.server_id, + baseURL: r.base_url, + domain: r.domain, + sns: r.sns, + accountId: r.account_id + } as LocalServer + ]) ) }) } -export const getAccount = (db: sqlite3.Database, id: number): Promise<[LocalAccount, LocalServer]> => { +export const getAccount = (db: Database, id: number): Promise<[LocalAccount, LocalServer]> => { return new Promise((resolve, reject) => { - db.get( - 'SELECT \ + const row = db + .prepare( + 'SELECT \ accounts.id as id, \ accounts.username as username, \ accounts.account_id as remote_account_id, \ @@ -130,163 +117,111 @@ servers.base_url as base_url, \ servers.domain as domain, \ servers.sns as sns, \ servers.account_id as account_id \ -FROM accounts INNER JOIN servers ON servers.account_id = accounts.id WHERE accounts.id = ?', - id, - (err, r) => { - if (err) { - reject(err) - } - resolve([ - { - id: r.id, - username: r.username, - accountId: r.remote_account_id, - avatar: r.avatar, - clientId: r.client_id, - clientSecret: r.client_secret, - accessToken: r.access_token, - refreshToken: r.refresh_token, - order: r.sort - } as LocalAccount, - { - id: r.server_id, - baseURL: r.base_url, - domain: r.domain, - sns: r.sns, - accountId: r.account_id - } as LocalServer - ]) +FROM accounts INNER JOIN servers ON servers.account_id = accounts.id WHERE accounts.id = ?' + ) + .get(id) + if (row) { + resolve([ + { + id: row.id, + username: row.username, + accountId: row.remote_account_id, + avatar: row.avatar, + clientId: row.client_id, + clientSecret: row.client_secret, + accessToken: row.access_token, + refreshToken: row.refresh_token, + order: row.sort + } as LocalAccount, + { + id: row.server_id, + baseURL: row.base_url, + domain: row.domain, + sns: row.sns, + accountId: row.account_id + } as LocalServer + ]) + } else { + reject() + } + }) +} + +export const removeAccount = (db: Database, id: number): Promise => { + return new Promise((resolve, reject) => { + db.prepare('PRAGMA foreign_keys = ON').run() + + try { + db.prepare('DELETE FROM accounts WHERE id = ?').run(id), resolve(null) + } catch (err) { + reject(err) + } + }) +} + +export const removeAllAccounts = (db: Database): Promise => { + return new Promise((resolve, reject) => { + db.prepare('PRAGMA foreign_keys = ON').run() + + try { + db.prepare('DELETE FROM accounts').run() + resolve(null) + } catch (err) { + reject(err) + } + }) +} + +export const forwardAccount = (db: Database, id: number): Promise => { + return new Promise((resolve, reject) => { + const f = db.transaction(() => { + const rows = db.prepare('SELECT * FROM accounts ORDER BY sort').all() + + const index = rows.findIndex(r => r.id === id) + if (index < 0 || index >= rows.length - 1) { + db.prepare('ROLLBACK TRANSACTION').run() + return resolve(null) } - ) - }) -} + const target = rows[index + 1] + const base = rows[index] -export const removeAccount = (db: sqlite3.Database, id: number): Promise => { - return new Promise((resolve, reject) => { - db.serialize(() => { - db.run('PRAGMA foreign_keys = ON') - - db.run('DELETE FROM accounts WHERE id = ?', id, err => { - if (err) { - reject(err) - } - resolve(null) - }) + try { + db.prepare('UPDATE accounts SET sort = ? WHERE id = ?').run(-100, base.id) + db.prepare('UPDATE accounts SET sort = ? WHERE id = ?').run(base.sort, target.id) + db.prepare('UPDATE accounts SET sort = ? WHERE id = ?').run(target.sort, base.id) + return resolve(null) + } catch (err) { + console.error(err) + reject(err) + } }) + f() }) } -export const removeAllAccounts = (db: sqlite3.Database): Promise => { +export const backwardAccount = (db: Database, id: number): Promise => { return new Promise((resolve, reject) => { - db.serialize(() => { - db.run('PRAGMA foreign_keys = ON') + const f = db.transaction(() => { + const rows = db.prepare('SELECT * FROM accounts ORDER BY sort').all() - db.run('DELETE FROM accounts', err => { - if (err) { - reject(err) - } - resolve(null) - }) - }) - }) -} - -export const forwardAccount = (db: sqlite3.Database, id: number): Promise => { - return new Promise((resolve, reject) => { - db.serialize(() => { - db.run('BEGIN TRANSACTION') - - db.all('SELECT * FROM accounts ORDER BY sort', (err, rows) => { - if (err) { - console.error(err) - db.run('ROLLBACK TRANSACTION') - return reject(err) - } - - const index = rows.findIndex(r => r.id === id) - if (index < 0 || index >= rows.length - 1) { - db.run('ROLLBACK TRANSACTION') - return resolve(null) - } - const target = rows[index + 1] - const base = rows[index] - - db.serialize(() => { - db.run('UPDATE accounts SET sort = ? WHERE id = ?', [-100, base.id], err => { - if (err) { - console.error(err) - db.run('ROLLBACK TRANSACTION') - return reject(err) - } - }) - db.run('UPDATE accounts SET sort = ? WHERE id = ?', [base.sort, target.id], err => { - if (err) { - console.error(err) - db.run('ROLLBACK TRANSACTION') - return reject(err) - } - }) - db.run('UPDATE accounts SET sort = ? WHERE id = ?', [target.sort, base.id], err => { - if (err) { - console.error(err) - db.run('ROLLBACK TRANSACTION') - return reject(err) - } - db.run('COMMIT') - return resolve(null) - }) - }) - }) - }) - }) -} - -export const backwardAccount = (db: sqlite3.Database, id: number): Promise => { - return new Promise((resolve, reject) => { - db.serialize(() => { - db.run('BEGIN TRANSACTION') - - db.all('SELECT * FROM accounts ORDER BY sort', (err, rows) => { - if (err) { - console.error(err) - db.run('ROLLBACK TRANSACTION') - return reject(err) - } - - const index = rows.findIndex(r => r.id === id) - if (index < 1) { - db.run('ROLLBACK TRANSACTION') - return resolve(null) - } - const target = rows[index - 1] - const base = rows[index] - - db.serialize(() => { - db.run('UPDATE accounts SET sort = ? WHERE id = ?', [-100, base.id], err => { - if (err) { - console.error(err) - db.run('ROLLBACK TRANSACTION') - return reject(err) - } - }) - db.run('UPDATE accounts SET sort = ? WHERE id = ?', [base.sort, target.id], err => { - if (err) { - console.error(err) - db.run('ROLLBACK TRANSACTION') - return reject(err) - } - }) - db.run('UPDATE accounts SET sort = ? WHERE id = ?', [target.sort, base.id], err => { - if (err) { - console.error(err) - db.run('ROLLBACK TRANSACTION') - return reject(err) - } - db.run('COMMIT') - return resolve(null) - }) - }) - }) + const index = rows.findIndex(r => r.id === id) + if (index < 1) { + db.prepare('ROLLBACK TRANSACTION').run() + return resolve(null) + } + const target = rows[index - 1] + const base = rows[index] + + try { + db.prepare('UPDATE accounts SET sort = ? WHERE id = ?').run(-100, base.id) + db.prepare('UPDATE accounts SET sort = ? WHERE id = ?').run(base.sort, target.id) + db.prepare('UPDATE accounts SET sort = ? WHERE id = ?').run(target.sort, base.id) + return resolve(null) + } catch (err) { + console.error(err) + return reject(err) + } }) + f() }) } diff --git a/src/main/db/hashtags.ts b/src/main/db/hashtags.ts index 2e7727d8..4994b97e 100644 --- a/src/main/db/hashtags.ts +++ b/src/main/db/hashtags.ts @@ -1,67 +1,59 @@ -import sqlite3 from 'sqlite3' +import { Database } from 'better-sqlite3' import { LocalTag } from '~/src/types/localTag' -export const listTags = (db: sqlite3.Database, accountId: number): Promise> => { +export const listTags = (db: Database, accountId: number): Promise> => { + return new Promise(resolve => { + const rows = db.prepare('SELECT * FROM hashtags WHERE account_id = ?').all(accountId) + + resolve( + rows.map(r => ({ + id: r.id, + tagName: r.tag, + accountId: r.account_id + })) + ) + }) +} + +export const insertTag = (db: Database, accountId: number, tag: string): Promise => { return new Promise((resolve, reject) => { - db.all('SELECT * FROM hashtags WHERE account_id = ?', accountId, (err, rows) => { - if (err) { + const f = db.transaction(() => { + const row = db.prepare('SELECT * FROM hashtags WHERE id = ? AND tag = ?').get(accountId, tag) + + if (row) { + resolve({ + id: row.id, + tagName: row.tag, + accountId: row.account_id + }) + } + + try { + const res = db.prepare('INSERT INTO hashtags(tag, account_id) VALUES (?, ?)').run(accountId, tag) + return resolve({ + id: res.lastInsertRowid as number, + tagName: tag, + accountId: accountId + }) + } catch (err) { + console.error(err) reject(err) } - resolve( - rows.map(r => ({ - id: r.id, - tagName: r.tag, - accountId: r.account_id - })) - ) }) + f() }) } -export const insertTag = (db: sqlite3.Database, accountId: number, tag: string): Promise => { +export const removeTag = (db: Database, tag: LocalTag): Promise => { return new Promise((resolve, reject) => { - db.serialize(() => { - db.run('BEGIN TRANSACTION') + db.prepare('PRAGMA foreign_keys = ON').run() - db.get('SELECT * FROM hashtags WHERE id = ? AND tag = ?', [accountId, tag], (err, row) => { - if (err) { - reject(err) - } - if (row) { - resolve({ - id: row.id, - tagName: row.tag, - accountId: row.account_id - }) - } - - db.run('INSERT INTO hashtags(tag, account_id) VALUES (?, ?)', [accountId, tag], function (err) { - if (err) { - reject(err) - } - db.run('COMMIT') - resolve({ - id: this.lastID, - tagName: tag, - accountId: accountId - }) - }) - }) - }) - }) -} - -export const removeTag = (db: sqlite3.Database, tag: LocalTag): Promise => { - return new Promise((resolve, reject) => { - db.serialize(() => { - db.run('PRAGMA foreign_keys = ON') - - db.run('DELETE FROM hashtags WHERE id = ?', tag.id, err => { - if (err) { - reject(err) - } - resolve(null) - }) - }) + try { + db.prepare('DELETE FROM hashtags WHERE id = ?').run(tag.id) + resolve(null) + } catch (err) { + console.error(err) + reject(err) + } }) } diff --git a/src/main/db/server.ts b/src/main/db/server.ts index 6abf7ca0..a3eed952 100644 --- a/src/main/db/server.ts +++ b/src/main/db/server.ts @@ -1,44 +1,44 @@ -import sqlite3 from 'sqlite3' +import { Database } from 'better-sqlite3' import { LocalServer } from '~/src/types/localServer' export const insertServer = ( - db: sqlite3.Database, + db: Database, baseURL: string, domain: string, sns: 'mastodon' | 'pleroma' | 'misskey', accountId: number | null ): Promise => { return new Promise((resolve, reject) => { - db.serialize(() => { - db.run('INSERT INTO servers(domain, base_url, sns, account_id) values (?, ?, ?, ?)', [domain, baseURL, sns, accountId], function ( - err - ) { - if (err) { - reject(err) - } - resolve({ - id: this.lastID, - baseURL, - domain, - sns, - accountId - }) + try { + const res = db + .prepare('INSERT INTO servers(domain, base_url, sns, account_id) values (?, ?, ?, ?)') + .run(domain, baseURL, sns, accountId) + resolve({ + id: res.lastInsertRowid as number, + baseURL, + domain, + sns, + accountId }) - }) + } catch (err) { + reject(err) + } }) } -export const getServer = (db: sqlite3.Database, id: number): Promise => { +export const getServer = (db: Database, id: number): Promise => { return new Promise((resolve, reject) => { - db.get('SELECT id, base_url, domain, sns, account_id FROM servers WHERE id = ?', id, (err, r) => { - if (err) reject(err) + const row = db.prepare('SELECT id, base_url, domain, sns, account_id FROM servers WHERE id = ?').get(id) + if (row) { resolve({ - id: r.id, - baseURL: r.base_url, - domain: r.domain, - sns: r.sns, - accountId: r.account_id + id: row.id, + baseURL: row.base_url, + domain: row.domain, + sns: row.sns, + accountId: row.account_id } as LocalServer) - }) + } else { + reject() + } }) } diff --git a/src/main/db/setting.ts b/src/main/db/setting.ts index 38bd0f4d..92405133 100644 --- a/src/main/db/setting.ts +++ b/src/main/db/setting.ts @@ -1,55 +1,48 @@ -import sqlite3 from 'sqlite3' +import { Database } from 'better-sqlite3' import { Setting } from '~/src/types/setting' import { DefaultSetting } from '~/src/constants/initializer/setting' -export const getSetting = (db: sqlite3.Database, accountId: number): Promise => { - return new Promise((resolve, reject) => { - db.get('SELECT * FROM settings WHERE account_id = ?', accountId, (err, row) => { - if (err) { - reject(err) - } - if (row) { - resolve({ - accountId: row.account_id, - markerHome: Boolean(row.marker_home), - markerNotifications: Boolean(row.marker_notifications) - }) - } - resolve(DefaultSetting) - }) +export const getSetting = (db: Database, accountId: number): Promise => { + return new Promise(resolve => { + const row = db.prepare('SELECT * FROM settings WHERE account_id = ?').get(accountId) + if (row) { + return resolve({ + accountId: row.account_id, + markerHome: Boolean(row.marker_home), + markerNotifications: Boolean(row.marker_notifications) + }) + } + resolve(DefaultSetting) }) } -export const createOrUpdateSetting = (db: sqlite3.Database, setting: Setting): Promise => { +export const createOrUpdateSetting = (db: Database, setting: Setting): Promise => { return new Promise((resolve, reject) => { - db.get('SELECT * FROM settings WHERE account_id = ?', setting.accountId, (err, row) => { - if (err) { - reject(err) - } - if (row) { - db.run( - 'UPDATE settings SET marker_home = ?, marker_notifications = ? WHERE account_id = ?', - [setting.markerHome, setting.markerNotifications, setting.accountId], - err => { - if (err) { - reject(err) - } - resolve(setting) - } + const row = db.prepare('SELECT * FROM settings WHERE account_id = ?').get(setting.accountId) + if (row) { + try { + db.prepare('UPDATE settings SET marker_home = ?, marker_notifications = ? WHERE account_id = ?').run( + setting.markerHome, + setting.markerNotifications, + setting.accountId ) resolve(setting) - } else { - db.run( - 'INSERT INTO settings(account_id, marker_home, marker_notifications) VALUES (?, ?, ?)', - [setting.accountId, setting.markerHome, setting.markerNotifications], - function (err) { - if (err) { - reject(err) - } - resolve(setting) - } - ) + } catch (err) { + console.error(err) + reject(err) } - }) + } else { + try { + db.prepare('INSERT INTO settings(account_id, marker_home, marker_notifications) VALUES (?, ?, ?)').run( + setting.accountId, + setting.markerHome, + setting.markerNotifications + ) + resolve(setting) + } catch (err) { + console.error(err) + reject(err) + } + } }) } diff --git a/yarn.lock b/yarn.lock index cd32548e..0a943859 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1482,21 +1482,6 @@ lodash "^4.17.15" tmp-promise "^3.0.2" -"@mapbox/node-pre-gyp@^1.0.0": - version "1.0.10" - resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz#8e6735ccebbb1581e5a7e652244cadc8a844d03c" - integrity sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA== - dependencies: - detect-libc "^2.0.0" - https-proxy-agent "^5.0.0" - make-dir "^3.1.0" - node-fetch "^2.6.7" - nopt "^5.0.0" - npmlog "^5.0.1" - rimraf "^3.0.2" - semver "^7.3.5" - tar "^6.1.11" - "@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": version "5.1.1-v1" resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129" @@ -1665,6 +1650,13 @@ dependencies: "@babel/types" "^7.3.0" +"@types/better-sqlite3@^7.6.3": + version "7.6.3" + resolved "https://registry.yarnpkg.com/@types/better-sqlite3/-/better-sqlite3-7.6.3.tgz#117c3c182e300799b84d1b7e1781c27d8d536505" + integrity sha512-YS64N9SNDT/NAvou3QNdzAu3E2om/W/0dhORimtPGLef+zSK5l1vDzfsWb4xgXOgfhtOI5ZDTRxnvRPb22AIVQ== + dependencies: + "@types/node" "*" + "@types/body-parser@*": version "1.19.2" resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" @@ -2728,14 +2720,6 @@ applescript@^1.0.0: resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== -are-we-there-yet@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c" - integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== - dependencies: - delegates "^1.0.0" - readable-stream "^3.6.0" - are-we-there-yet@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd" @@ -3091,6 +3075,14 @@ batch@0.6.1: resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== +better-sqlite3@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/better-sqlite3/-/better-sqlite3-8.2.0.tgz#4ef6185b88992723de7e00cfa67585ac59f320bd" + integrity sha512-8eTzxGk9535SB3oSNu0tQ6I4ZffjVCBUjKHN9QeeIFtphBX0sEd0NxAuglBNR9TO5ThnxBB7GqzfcYo9kjadJQ== + dependencies: + bindings "^1.5.0" + prebuild-install "^7.1.0" + big.js@^5.2.2: version "5.2.2" resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" @@ -3101,7 +3093,14 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -bl@^4.1.0: +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bl@^4.0.3, bl@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== @@ -3649,6 +3648,11 @@ chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + chownr@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" @@ -3863,7 +3867,7 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-support@^1.1.2, color-support@^1.1.3: +color-support@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== @@ -3980,7 +3984,7 @@ connect-history-api-fallback@^2.0.0: resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== -console-control-strings@^1.0.0, console-control-strings@^1.1.0: +console-control-strings@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== @@ -4316,6 +4320,11 @@ decompress-response@^6.0.0: dependencies: mimic-response "^3.1.0" +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -4880,7 +4889,7 @@ encoding@^0.1.12, encoding@^0.1.13: dependencies: iconv-lite "^0.6.2" -end-of-stream@^1.1.0: +end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== @@ -5282,6 +5291,11 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== + expect@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/expect/-/expect-26.6.2.tgz#c6b996bf26bf3fe18b67b2d0f51fc981ba934417" @@ -5511,6 +5525,11 @@ file-type@^10.11.0: resolved "https://registry.yarnpkg.com/file-type/-/file-type-10.11.0.tgz#2961d09e4675b9fb9a3ee6b69e9cd23f43fd1890" integrity sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw== +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + filelist@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" @@ -5654,6 +5673,11 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + fs-extra@^10.0.0, fs-extra@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" @@ -5718,21 +5742,6 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -gauge@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395" - integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== - dependencies: - aproba "^1.0.3 || ^2.0.0" - color-support "^1.1.2" - console-control-strings "^1.0.0" - has-unicode "^2.0.1" - object-assign "^4.1.1" - signal-exit "^3.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - wide-align "^1.1.2" - gauge@^4.0.3: version "4.0.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" @@ -5807,6 +5816,11 @@ get-value@^2.0.3, get-value@^2.0.6: resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== + glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -6497,7 +6511,7 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== -ini@^1.3.4, ini@^1.3.5: +ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== @@ -7912,7 +7926,7 @@ make-dir@^2.0.0, make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" -make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: +make-dir@^3.0.0, make-dir@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== @@ -8235,7 +8249,7 @@ minimist-options@4.1.0: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.6, minimist@^1.2.8: +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.6, minimist@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -8328,6 +8342,11 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" +mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + mkdirp@1.x, mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" @@ -8417,6 +8436,11 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" +napi-build-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" + integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== + natural-compare-lite@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" @@ -8469,7 +8493,7 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" -node-abi@^3.0.0: +node-abi@^3.0.0, node-abi@^3.3.0: version "3.33.0" resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.33.0.tgz#8b23a0cec84e1c5f5411836de6a9b84bccf26e7f" integrity sha512-7GGVawqyHF4pfd0YFybhv/eM9JwTtPqx0mAanQ146O3FlSh3pA24zf9IRQTOsfTSqXTNzPSP5iagAJ94jjuVog== @@ -8486,11 +8510,6 @@ node-addon-api@^3.1.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== -node-addon-api@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.3.0.tgz#52a1a0b475193e0928e98e0426a0d1254782b77f" - integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ== - node-api-version@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/node-api-version/-/node-api-version-0.1.4.tgz#1ed46a485e462d55d66b5aa1fe2821720dedf080" @@ -8498,13 +8517,6 @@ node-api-version@^0.1.4: dependencies: semver "^7.3.5" -node-fetch@^2.6.7: - version "2.6.9" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6" - integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== - dependencies: - whatwg-url "^5.0.0" - node-forge@^1: version "1.3.1" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" @@ -8515,7 +8527,7 @@ node-gyp-build@^4.2.1, node-gyp-build@^4.3.0: resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.0.tgz#0c52e4cbf54bbd28b709820ef7b6a3c2d6209055" integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== -node-gyp@8.x, node-gyp@^8.4.1: +node-gyp@^8.4.1: version "8.4.1" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-8.4.1.tgz#3d49308fc31f768180957d6b5746845fbd429937" integrity sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w== @@ -8679,16 +8691,6 @@ npm-run-path@^4.0.0, npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" -npmlog@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" - integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== - dependencies: - are-we-there-yet "^2.0.0" - console-control-strings "^1.1.0" - gauge "^3.0.0" - set-blocking "^2.0.0" - npmlog@^6.0.0: version "6.0.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" @@ -8726,7 +8728,7 @@ object-assign-deep@^0.4.0: resolved "https://registry.yarnpkg.com/object-assign-deep/-/object-assign-deep-0.4.0.tgz#43505d3679abb9686ab359b97ac14cc837a9d143" integrity sha512-54Uvn3s+4A/cMWx9tlRez1qtc7pN7pbQ+Yi7mjLjcBpWLlP+XbSHiHbQW6CElDiV4OvuzqnMrBdkgxI1mT8V/Q== -object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== @@ -9256,6 +9258,24 @@ postcss@^8.1.10, postcss@^8.3.11, postcss@^8.4.0, postcss@^8.4.19, postcss@^8.4. picocolors "^1.0.0" source-map-js "^1.0.2" +prebuild-install@^7.1.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45" + integrity sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw== + dependencies: + detect-libc "^2.0.0" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp-classic "^0.5.3" + napi-build-utils "^1.0.1" + node-abi "^3.3.0" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^4.0.0" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -9473,6 +9493,16 @@ raw-body@2.5.1: iconv-lite "0.4.24" unpipe "1.0.0" +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + react-is@^17.0.1: version "17.0.2" resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" @@ -9539,6 +9569,15 @@ readable-stream@^3.0.6, readable-stream@^3.5.0, readable-stream@^3.6.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" +readable-stream@^3.1.1: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readable-stream@^3.4.0: version "3.6.1" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.1.tgz#f9f9b5f536920253b3d26e7660e7da4ccff9bb62" @@ -10164,6 +10203,20 @@ simplayer@0.0.8: resolved "https://registry.yarnpkg.com/simplayer/-/simplayer-0.0.8.tgz#f20ceb233166ac7f382745666d23f3c48792c3c8" integrity sha512-QiJXJho7PZ0MQ4ZBr6GEclTDn91U0s07rb+jUcv8LQ5MGNXZ4Jt2V+hiPC6wVBIQNe7+jjjWMq6nqkzms7okHA== +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" + integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== + dependencies: + decompress-response "^6.0.0" + once "^1.3.1" + simple-concat "^1.0.0" + simple-update-notifier@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz#67694c121de354af592b347cdba798463ed49c82" @@ -10422,17 +10475,6 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -sqlite3@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-5.1.4.tgz#35f83d368963168b324ad2f0fffce09f3b8723a7" - integrity sha512-i0UlWAzPlzX3B5XP2cYuhWQJsTtlMD6obOa1PgeEQ4DHEXUuyJkgv50I3isqZAP5oFc2T8OFvakmDh2W6I+YpA== - dependencies: - "@mapbox/node-pre-gyp" "^1.0.0" - node-addon-api "^4.2.0" - tar "^6.1.11" - optionalDependencies: - node-gyp "8.x" - ssri@^8.0.0, ssri@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" @@ -10610,6 +10652,11 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + style-loader@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.1.tgz#057dfa6b3d4d7c7064462830f9113ed417d38575" @@ -10792,6 +10839,27 @@ tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== +tar-fs@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + tar@^6.0.2, tar@^6.0.5, tar@^6.1.11, tar@^6.1.12, tar@^6.1.2: version "6.1.13" resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.13.tgz#46e22529000f612180601a6fe0680e7da508847b" @@ -10990,11 +11058,6 @@ tr46@^3.0.0: dependencies: punycode "^2.1.1" -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - trim-newlines@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" @@ -11064,6 +11127,13 @@ ttfinfo@^0.2.0, "ttfinfo@https://github.com/rBurgett/ttfinfo.git": version "0.2.0" resolved "https://github.com/rBurgett/ttfinfo.git#f00e43e2a6d4c8a12a677df20b7804492d50863c" +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + tunnel@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" @@ -11590,11 +11660,6 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - webidl-conversions@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" @@ -11773,14 +11838,6 @@ whatwg-url@^11.0.0: tr46 "^3.0.0" webidl-conversions "^7.0.0" -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - whatwg-url@^8.0.0, whatwg-url@^8.5.0: version "8.7.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" @@ -11821,7 +11878,7 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" -wide-align@^1.1.2, wide-align@^1.1.5: +wide-align@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== From 66e71c332ab361d798569fc3e744aa40c3542656 Mon Sep 17 00:00:00 2001 From: AkiraFukushima Date: Sat, 11 Mar 2023 01:55:20 +0900 Subject: [PATCH 2/2] refs #4191 Use electron-builder to rebuild after install --- README.md | 4 ---- package.json | 4 ++-- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index f5337d64..bcf484d1 100644 --- a/README.md +++ b/README.md @@ -119,10 +119,6 @@ $ sudo apt-get install libfontconfig-dev # install dependencies $ yarn install -# You need to rebuild because of better-sqlite3 -# Refs: https://github.com/WiseLibs/better-sqlite3/issues/919 -$ ./node_modules/.bin/electron-rebuild - # serve with hot reload at localhost:9080 $ yarn run dev ``` diff --git a/package.json b/package.json index 1faeddef..2ce554ea 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,8 @@ "pack:main": "webpack --node-env=production --mode production --progress --config .electron-vue/webpack.main.config.js", "pack:renderer": "webpack --node-env=production --mode production --progress --config .electron-vue/webpack.renderer.config.js", "typecheck": "tsc -p . --noEmit", - "spec": "NODE_ENV=test jest -u --maxWorkers=3" + "spec": "NODE_ENV=test jest -u --maxWorkers=3", + "postinstall": "electron-builder install-app-deps" }, "jest": { "moduleFileExtensions": [ @@ -120,7 +121,6 @@ "@babel/preset-env": "^7.20.2", "@babel/register": "^7.21.0", "@babel/runtime": "7.21.0", - "@electron/rebuild": "^3.2.10", "@types/auto-launch": "^5.0.2", "@types/better-sqlite3": "^7.6.3", "@types/electron-json-storage": "^4.5.0",