chore: upgrade deps

This commit is contained in:
lin onetwo 2024-11-24 16:59:21 +08:00
parent 0bef181d59
commit 50b0ba875b
11 changed files with 1975 additions and 1464 deletions

2
.nvmrc
View file

@ -1 +1 @@
v20 v22

View file

@ -1,8 +1,9 @@
/* eslint-disable @typescript-eslint/restrict-template-expressions */ /* eslint-disable @typescript-eslint/restrict-template-expressions */
const packageJson = require('./package.json'); const packageJson = require('./package.json');
const beforeAsar = require('./scripts/beforeAsar'); const beforeAsar = require('./scripts/beforeAsar').default;
const afterPack = require('./scripts/afterPack').default;
const { version, description } = packageJson; const { description } = packageJson;
const config = { const config = {
packagerConfig: { packagerConfig: {
@ -30,8 +31,8 @@ const config = {
electronLanguages: ['zh_CN', 'en', 'ja'], electronLanguages: ['zh_CN', 'en', 'ja'],
}, },
appBundleId: 'com.tidgi', appBundleId: 'com.tidgi',
afterPrune: ['scripts/afterPack.js'], afterPrune: [afterPack],
beforeAsar: [beforeAsar.default], beforeAsar: [beforeAsar],
}, },
makers: [ makers: [
{ {
@ -52,7 +53,6 @@ const config = {
config: (arch) => { config: (arch) => {
return { return {
artifactName: `Portable-TidGi-Windows-${arch}.exe`, artifactName: `Portable-TidGi-Windows-${arch}.exe`,
installerIcon: 'build-resources/icon-installer.ico',
}; };
}, },
}, },

View file

@ -41,80 +41,82 @@
"electron-dl": "^4.0.0", "electron-dl": "^4.0.0",
"electron-ipc-cat": "2.0.1", "electron-ipc-cat": "2.0.1",
"electron-settings": "5.0.0", "electron-settings": "5.0.0",
"electron-squirrel-startup": "1.0.1",
"electron-unhandled": "4.0.1", "electron-unhandled": "4.0.1",
"electron-window-state": "5.0.3", "electron-window-state": "5.0.3",
"espree": "^10.1.0", "espree": "^10.3.0",
"exponential-backoff": "^3.1.1", "exponential-backoff": "^3.1.1",
"fs-extra": "11.2.0", "fs-extra": "11.2.0",
"git-sync-js": "^2.0.5", "git-sync-js": "^2.0.5",
"i18next": "23.11.5", "i18next": "24.0.0",
"i18next-electron-fs-backend": "3.0.2", "i18next-electron-fs-backend": "3.0.2",
"i18next-fs-backend": "2.3.1", "i18next-fs-backend": "2.6.0",
"intercept-stdout": "0.1.2", "intercept-stdout": "0.1.2",
"inversify": "6.0.2", "inversify": "6.1.4",
"inversify-inject-decorators": "3.1.0", "inversify-inject-decorators": "3.1.0",
"ipaddr.js": "2.2.0", "ipaddr.js": "2.2.0",
"jimp": "0.22.12", "jimp": "1.6.0",
"lodash": "4.17.21", "lodash": "4.17.21",
"menubar": "9.5.0", "menubar": "9.5.1",
"nanoid": "^5.0.7", "nanoid": "^5.0.8",
"new-github-issue-url": "^1.0.0", "new-github-issue-url": "^1.0.0",
"node-fetch": "3.3.2", "node-fetch": "3.3.2",
"reflect-metadata": "0.2.2", "reflect-metadata": "0.2.2",
"registry-js": "1.16.0", "registry-js": "1.16.0",
"rotating-file-stream": "^3.2.3", "rotating-file-stream": "^3.2.5",
"rxjs": "7.8.1", "rxjs": "7.8.1",
"semver": "7.6.2", "semver": "7.6.3",
"source-map-support": "0.5.21", "source-map-support": "0.5.21",
"strip-ansi": "^7.1.0", "strip-ansi": "^7.1.0",
"threads": "1.7.0", "threads": "1.7.0",
"type-fest": "4.20.1", "type-fest": "4.27.1",
"typescript-styled-is": "^2.1.0", "typescript-styled-is": "^2.1.0",
"v8-compile-cache-lib": "^3.0.1", "v8-compile-cache-lib": "^3.0.1",
"winston": "3.13.0", "winston": "3.17.0",
"winston-daily-rotate-file": "5.0.0", "winston-daily-rotate-file": "5.0.0",
"winston-transport": "4.7.0", "winston-transport": "4.9.0",
"wouter": "^3.3.0", "wouter": "^3.3.5",
"zx": "8.1.3" "zx": "8.2.2"
}, },
"optionalDependencies": { "optionalDependencies": {
"@electron-forge/maker-deb": "7.4.0",
"@electron-forge/maker-flatpak": "7.4.0", "@electron-forge/maker-deb": "7.5.0",
"@electron-forge/maker-rpm": "7.4.0", "@electron-forge/maker-flatpak": "7.5.0",
"@electron-forge/maker-snap": "7.4.0", "@electron-forge/maker-rpm": "7.5.0",
"@electron-forge/maker-squirrel": "7.4.0", "@electron-forge/maker-snap": "7.5.0",
"@electron-forge/maker-zip": "7.4.0" "@electron-forge/maker-squirrel": "7.5.0",
"@electron-forge/maker-zip": "7.5.0",
"@rabbitholesyndrome/electron-forge-maker-portable": "^0.2.0",
"electron-squirrel-startup": "1.0.1"
}, },
"devDependencies": { "devDependencies": {
"@cucumber/cucumber": "10.8.0", "@cucumber/cucumber": "11.1.0",
"@dnd-kit/core": "6.1.0", "@dnd-kit/core": "6.2.0",
"@dnd-kit/modifiers": "7.0.0", "@dnd-kit/modifiers": "8.0.0",
"@dnd-kit/sortable": "8.0.0", "@dnd-kit/sortable": "9.0.0",
"@dnd-kit/utilities": "3.2.2", "@dnd-kit/utilities": "3.2.2",
"@electron-forge/cli": "7.4.0", "@electron-forge/cli": "7.5.0",
"@electron-forge/plugin-auto-unpack-natives": "7.4.0", "@electron-forge/plugin-auto-unpack-natives": "7.5.0",
"@electron-forge/plugin-webpack": "7.4.0", "@electron-forge/plugin-webpack": "7.5.0",
"@electron/rebuild": "^3.6.0", "@electron/rebuild": "^3.7.1",
"@fontsource/roboto": "^5.0.13", "@fontsource/roboto": "^5.1.0",
"@mui/icons-material": "^5.15.21", "@mui/icons-material": "^5.15.21",
"@mui/lab": "5.0.0-alpha.170", "@mui/lab": "5.0.0-alpha.170",
"@mui/material": "^5.15.21", "@mui/material": "^5.15.21",
"@mui/styled-engine-sc": "6.0.0-alpha.18", "@mui/styled-engine-sc": "6.0.0-alpha.18",
"@mui/styles": "^5.15.21", "@mui/styles": "^5.15.21",
"@mui/x-date-pickers": "^7.8.0", "@mui/x-date-pickers": "^7.8.0",
"@rabbitholesyndrome/electron-forge-maker-portable": "^0.2.0",
"@reforged/maker-appimage": "^4.0.2", "@reforged/maker-appimage": "^4.0.2",
"@types/bluebird": "3.5.42", "@types/bluebird": "3.5.42",
"@types/chai": "4.3.16", "@types/chai": "5.0.1",
"@types/circular-dependency-plugin": "5.0.8", "@types/circular-dependency-plugin": "5.0.8",
"@types/fs-extra": "11.0.4", "@types/fs-extra": "11.0.4",
"@types/i18next-fs-backend": "1.1.5", "@types/i18next-fs-backend": "1.1.5",
"@types/intercept-stdout": "0.1.3", "@types/intercept-stdout": "0.1.3",
"@types/lodash": "4.17.6", "@types/lodash": "4.17.13",
"@types/node": "20.14.9", "@types/node": "22.9.3",
"@types/react": "18.3.3", "@types/react": "18.3.12",
"@types/react-dom": "18.3.0", "@types/react-dom": "18.3.1",
"@types/react-helmet": "6.1.11", "@types/react-helmet": "6.1.11",
"@types/semver": "7.5.8", "@types/semver": "7.5.8",
"@types/source-map-support": "0.5.10", "@types/source-map-support": "0.5.10",
@ -123,42 +125,42 @@
"@types/webpack-node-externals": "3.0.4", "@types/webpack-node-externals": "3.0.4",
"@vercel/webpack-asset-relocator-loader": "1.7.3", "@vercel/webpack-asset-relocator-loader": "1.7.3",
"beautiful-react-hooks": "5.0.2", "beautiful-react-hooks": "5.0.2",
"chai": "5.1.1", "chai": "5.1.2",
"circular-dependency-plugin": "5.2.2", "circular-dependency-plugin": "5.2.2",
"copy-webpack-plugin": "12.0.2", "copy-webpack-plugin": "12.0.2",
"cross-env": "7.0.3", "cross-env": "7.0.3",
"css-loader": "6.10.0", "css-loader": "6.11.0",
"date-fns": "3.6.0", "date-fns": "3.6.0",
"dprint": "^0.46.3", "dprint": "^0.47.5",
"electron": "31.1.0", "electron": "33.2.0",
"esbuild": "^0.21.5", "esbuild": "^0.24.0",
"esbuild-loader": "^4.2.0", "esbuild-loader": "^4.2.2",
"eslint-config-tidgi": "1.2.3", "eslint-config-tidgi": "1.2.3",
"fork-ts-checker-webpack-plugin": "9.0.2", "fork-ts-checker-webpack-plugin": "9.0.2",
"graphql-hooks": "8.0.1", "graphql-hooks": "8.0.1",
"json5": "^2.2.3", "json5": "^2.2.3",
"node-loader": "2.0.0", "node-loader": "2.1.0",
"react": "18.3.1", "react": "18.3.1",
"react-dom": "18.3.1", "react-dom": "18.3.1",
"react-helmet": "6.1.0", "react-helmet": "6.1.0",
"react-i18next": "14.1.2", "react-i18next": "15.1.1",
"rimraf": "^5.0.7", "rimraf": "^6.0.1",
"simplebar": "6.2.7", "simplebar": "6.2.7",
"simplebar-react": "3.2.6", "simplebar-react": "3.2.6",
"style-loader": "4.0.0", "style-loader": "4.0.0",
"styled-components": "6.1.11", "styled-components": "6.1.13",
"threads-plugin": "1.4.0", "threads-plugin": "1.4.0",
"ts-import-plugin": "3.0.0", "ts-import-plugin": "3.0.0",
"ts-loader": "9.5.1", "ts-loader": "9.5.1",
"ts-node": "10.9.2", "ts-node": "10.9.2",
"tw5-typed": "^0.5.11", "tw5-typed": "^0.5.14",
"typescript": "5.5.2", "typescript": "5.7.2",
"typescript-plugin-styled-components": "3.0.0", "typescript-plugin-styled-components": "3.0.0",
"typesync": "0.12.1", "typesync": "0.13.4",
"webpack-bundle-analyzer": "4.10.2", "webpack-bundle-analyzer": "4.10.2",
"webpack-node-externals": "3.0.0", "webpack-node-externals": "3.0.0",
"webpack5-externals-plugin": "1.0.4", "webpack5-externals-plugin": "1.0.4",
"webpackbar": "6.0.1" "webpackbar": "7.0.0"
}, },
"pnpm": { "pnpm": {
"overrides": { "overrides": {

3283
pnpm-lock.yaml generated

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,5 @@
import { BaseWindow, BrowserWindow } from 'electron';
export function isBrowserWindow(win: BaseWindow | undefined): win is BrowserWindow {
return win !== undefined && 'webContents' in win;
}

View file

@ -20,6 +20,7 @@ import { lazyInject } from '@services/container';
import getFromRenderer from '@services/libs/getFromRenderer'; import getFromRenderer from '@services/libs/getFromRenderer';
import getViewBounds from '@services/libs/getViewBounds'; import getViewBounds from '@services/libs/getViewBounds';
import { i18n } from '@services/libs/i18n'; import { i18n } from '@services/libs/i18n';
import { isBrowserWindow } from '@services/libs/isBrowserWindow';
import { logger } from '@services/libs/log'; import { logger } from '@services/libs/log';
import { INativeService } from '@services/native/interface'; import { INativeService } from '@services/native/interface';
import { IBrowserViewMetaData, WindowNames } from '@services/windows/WindowProperties'; import { IBrowserViewMetaData, WindowNames } from '@services/windows/WindowProperties';
@ -111,7 +112,7 @@ export class View implements IViewService {
click: async (_menuItem, browserWindow) => { click: async (_menuItem, browserWindow) => {
// if back is called in popup window // if back is called in popup window
// open menu bar in the popup window instead // open menu bar in the popup window instead
if (browserWindow === undefined) return; if (!isBrowserWindow(browserWindow)) return;
const { isPopup } = await getFromRenderer<IBrowserViewMetaData>(MetaDataChannel.getViewMetaData, browserWindow); const { isPopup } = await getFromRenderer<IBrowserViewMetaData>(MetaDataChannel.getViewMetaData, browserWindow);
if (isPopup === true) { if (isPopup === true) {
browserWindow.setMenuBarVisibility(!browserWindow.isMenuBarVisible()); browserWindow.setMenuBarVisibility(!browserWindow.isMenuBarVisible());
@ -129,7 +130,7 @@ export class View implements IViewService {
click: async (_menuItem, browserWindow) => { click: async (_menuItem, browserWindow) => {
// if item is called in popup window // if item is called in popup window
// modify menu bar in the popup window instead // modify menu bar in the popup window instead
if (browserWindow === undefined) return; if (!isBrowserWindow(browserWindow)) return;
const { isPopup } = await getFromRenderer<IBrowserViewMetaData>(MetaDataChannel.getViewMetaData, browserWindow); const { isPopup } = await getFromRenderer<IBrowserViewMetaData>(MetaDataChannel.getViewMetaData, browserWindow);
if (isPopup === true) { if (isPopup === true) {
const contents = browserWindow.webContents; const contents = browserWindow.webContents;
@ -149,7 +150,7 @@ export class View implements IViewService {
click: async (_menuItem, browserWindow) => { click: async (_menuItem, browserWindow) => {
// if item is called in popup window // if item is called in popup window
// modify menu bar in the popup window instead // modify menu bar in the popup window instead
if (browserWindow === undefined) return; if (!isBrowserWindow(browserWindow)) return;
// TODO: on popup (secondary) window, browserWindow here seems can't get the correct webContent, so this never returns. And can't set zoom of popup. // TODO: on popup (secondary) window, browserWindow here seems can't get the correct webContent, so this never returns. And can't set zoom of popup.
const { isPopup } = await getFromRenderer<IBrowserViewMetaData>(MetaDataChannel.getViewMetaData, browserWindow); const { isPopup } = await getFromRenderer<IBrowserViewMetaData>(MetaDataChannel.getViewMetaData, browserWindow);
if (isPopup === true) { if (isPopup === true) {
@ -169,7 +170,7 @@ export class View implements IViewService {
click: async (_menuItem, browserWindow) => { click: async (_menuItem, browserWindow) => {
// if item is called in popup window // if item is called in popup window
// modify menu bar in the popup window instead // modify menu bar in the popup window instead
if (browserWindow === undefined) return; if (!isBrowserWindow(browserWindow)) return;
const { isPopup } = await getFromRenderer<IBrowserViewMetaData>(MetaDataChannel.getViewMetaData, browserWindow); const { isPopup } = await getFromRenderer<IBrowserViewMetaData>(MetaDataChannel.getViewMetaData, browserWindow);
if (isPopup === true) { if (isPopup === true) {
const contents = browserWindow.webContents; const contents = browserWindow.webContents;
@ -189,7 +190,7 @@ export class View implements IViewService {
click: async (_menuItem, browserWindow) => { click: async (_menuItem, browserWindow) => {
// if item is called in popup window // if item is called in popup window
// modify menu bar in the popup window instead // modify menu bar in the popup window instead
if (browserWindow === undefined) return; if (!isBrowserWindow(browserWindow)) return;
const { isPopup } = await getFromRenderer<IBrowserViewMetaData>(MetaDataChannel.getViewMetaData, browserWindow); const { isPopup } = await getFromRenderer<IBrowserViewMetaData>(MetaDataChannel.getViewMetaData, browserWindow);
if (isPopup === true) { if (isPopup === true) {
browserWindow.webContents.reload(); browserWindow.webContents.reload();

View file

@ -52,8 +52,7 @@ export class WikiGitWorkspace implements IWikiGitWorkspaceService {
private readonly syncService!: ISyncService; private readonly syncService!: ISyncService;
public registerSyncBeforeShutdown(): void { public registerSyncBeforeShutdown(): void {
const listener = async (event: Event): Promise<void> => { const listener = async (): Promise<void> => {
event.preventDefault();
try { try {
if (await this.contextService.isOnline()) { if (await this.contextService.isOnline()) {
const workspaces = await this.workspaceService.getWorkspacesAsList(); const workspaces = await this.workspaceService.getWorkspacesAsList();
@ -75,6 +74,7 @@ export class WikiGitWorkspace implements IWikiGitWorkspaceService {
app.quit(); app.quit();
} }
}; };
// only on linux,darwin, and can't prevent default
powerMonitor.addListener('shutdown', listener); powerMonitor.addListener('shutdown', listener);
} }

View file

@ -6,7 +6,7 @@ import { logger } from '@services/libs/log';
import { IMenuService } from '@services/menu/interface'; import { IMenuService } from '@services/menu/interface';
import serviceIdentifier from '@services/serviceIdentifier'; import serviceIdentifier from '@services/serviceIdentifier';
import { IViewService } from '@services/view/interface'; import { IViewService } from '@services/view/interface';
import { BrowserWindow, BrowserWindowConstructorOptions, Menu, nativeImage, Tray } from 'electron'; import { BrowserWindowConstructorOptions, Menu, nativeImage, Tray } from 'electron';
import windowStateKeeper from 'electron-window-state'; import windowStateKeeper from 'electron-window-state';
import { debounce, merge as mergeDeep } from 'lodash'; import { debounce, merge as mergeDeep } from 'lodash';
import { Menubar, menubar } from 'menubar'; import { Menubar, menubar } from 'menubar';
@ -88,8 +88,10 @@ export async function handleAttachToMenuBar(windowConfig: BrowserWindowConstruct
// manually save window state https://github.com/mawie81/electron-window-state/issues/64 // manually save window state https://github.com/mawie81/electron-window-state/issues/64
const debouncedSaveWindowState = debounce( const debouncedSaveWindowState = debounce(
(event: { sender: BrowserWindow }) => { () => {
windowWithBrowserViewState?.saveState(event.sender); if (menuBar.window !== undefined) {
windowWithBrowserViewState?.saveState(menuBar.window);
}
}, },
500, 500,
); );

View file

@ -5,7 +5,7 @@
import { app } from 'electron'; import { app } from 'electron';
import fsExtra from 'fs-extra'; import fsExtra from 'fs-extra';
import { injectable } from 'inversify'; import { injectable } from 'inversify';
import Jimp from 'jimp'; import { Jimp } from 'jimp';
import { mapValues, pickBy } from 'lodash'; import { mapValues, pickBy } from 'lodash';
import { nanoid } from 'nanoid'; import { nanoid } from 'nanoid';
import path from 'path'; import path from 'path';
@ -363,12 +363,10 @@ export class Workspace implements IWorkspaceService {
return; return;
} }
const destinationPicturePath = path.join(app.getPath('userData'), 'pictures', `${pictureID}.png`); const destinationPicturePath = path.join(app.getPath('userData'), 'pictures', `${pictureID}.png`) as `${string}.${string}`;
const newImage = await Jimp.read(sourcePicturePath); const newImage = await Jimp.read(sourcePicturePath);
await new Promise((resolve) => { await newImage.clone().resize({ w: 128, h: 128 }).write(destinationPicturePath);
newImage.clone().resize(128, 128).quality(100).write(destinationPicturePath, resolve);
});
const currentPicturePath = this.getSync(id)?.picturePath; const currentPicturePath = this.getSync(id)?.picturePath;
await this.update(id, { await this.update(id, {
picturePath: destinationPicturePath, picturePath: destinationPicturePath,

View file

@ -4,6 +4,7 @@ import { isHtmlWiki, wikiHtmlExtensions } from '@/constants/fileNames';
import { container } from '@services/container'; import { container } from '@services/container';
import getFromRenderer from '@services/libs/getFromRenderer'; import getFromRenderer from '@services/libs/getFromRenderer';
import { i18n } from '@services/libs/i18n'; import { i18n } from '@services/libs/i18n';
import { isBrowserWindow } from '@services/libs/isBrowserWindow';
import { logger } from '@services/libs/log'; import { logger } from '@services/libs/log';
import { IMenuService } from '@services/menu/interface'; import { IMenuService } from '@services/menu/interface';
import { INativeService } from '@services/native/interface'; import { INativeService } from '@services/native/interface';
@ -104,7 +105,7 @@ export async function registerMenu(): Promise<void> {
click: async (_menuItem, browserWindow) => { click: async (_menuItem, browserWindow) => {
// if back is called in popup window // if back is called in popup window
// copy the popup window URL instead // copy the popup window URL instead
if (browserWindow !== undefined) { if (isBrowserWindow(browserWindow)) {
const { isPopup } = await getFromRenderer<IBrowserViewMetaData>(MetaDataChannel.getViewMetaData, browserWindow); const { isPopup } = await getFromRenderer<IBrowserViewMetaData>(MetaDataChannel.getViewMetaData, browserWindow);
if (isPopup === true) { if (isPopup === true) {
const url = browserWindow.webContents.getURL(); const url = browserWindow.webContents.getURL();

View file

@ -57,7 +57,8 @@
// "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
// "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
// "typeRoots": [], /* List of folders to include type definitions from. */ // "typeRoots": [], /* List of folders to include type definitions from. */
"types": ["reflect-metadata", "tw5-typed", "webdriverio/async"] /* Type declaration files to be included in compilation. */, // , "webdriverio/async" for test
"types": ["reflect-metadata", "tw5-typed"] /* Type declaration files to be included in compilation. */,
"allowSyntheticDefaultImports": true /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */, "allowSyntheticDefaultImports": true /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */,
"resolveJsonModule": true, "resolveJsonModule": true,
"esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */,