Compare commits

..

11 Commits

Author SHA1 Message Date
DarkSky
06912c6885 fix: websocket prefix (#5372) 2023-12-21 15:52:05 +00:00
Joooye_34
ec7f73f168 chore: catch and ignore page upgrade error (#5373) 2023-12-21 14:27:07 +00:00
Joooye_34
cfb77e8243 chore: fix about version in client (#5371) 2023-12-21 14:15:22 +00:00
DarkSky
aa4d42b36c feat: use baseurl from server config (#5369) 2023-12-21 12:52:38 +00:00
Joooye_34
9fbd9b39d6 ci: set version correctly and remove nightly build workflow (#5367) 2023-12-21 10:00:12 +00:00
Cats Juice
aeec68b0d7 fix(core): onboading tooltip next button always shows (#5363) 2023-12-21 08:09:37 +00:00
Joooye_34
fb1ed90ecc ci: use setup version action to init version (#5365)
1. Create  setup version action to unify version initialization
2. Split tag event from release desktop
3. Add schedule to daily deploy and desktop release
2023-12-21 07:58:16 +00:00
LongYinan
cc73124259 chore: bump up @react-hookz/web version to v24 (#5359)
[![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [@react-hookz/web](https://togithub.com/react-hookz/web) | [`^23.1.0` -> `^24.0.0`](https://renovatebot.com/diffs/npm/@react-hookz%2fweb/23.1.0/24.0.1) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@react-hookz%2fweb/24.0.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@react-hookz%2fweb/24.0.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@react-hookz%2fweb/23.1.0/24.0.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@react-hookz%2fweb/23.1.0/24.0.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) |

---

### Release Notes

<details>
<summary>react-hookz/web (@&#8203;react-hookz/web)</summary>

### [`v24.0.1`](https://togithub.com/react-hookz/web/blob/HEAD/CHANGELOG.md#2401-2023-12-20)

[Compare Source](https://togithub.com/react-hookz/web/compare/v24.0.0...v24.0.1)

##### Bug Fixes

-   change build so development and distributed imports match ([6383cdd](6383cdd558))

### [`v24.0.0`](https://togithub.com/react-hookz/web/blob/HEAD/CHANGELOG.md#2400-2023-12-20)

[Compare Source](https://togithub.com/react-hookz/web/compare/v23.1.0...v24.0.0)

##### Features

-   switch package to module type ([#&#8203;1472](https://togithub.com/react-hookz/web/issues/1472)) ([50921ef](50921efda5))

##### BREAKING CHANGES

-   Hooks are now distrubutes as JS built form TS with target ESNext and ESM module resolution. There is no more sense to distribute CJS version as package is ESM-only.

Consequent of above - no more esm and cjs subfolders - hooks are importable from index.js or its own directory which don't have a prefix anymore, thanks to exports directive. All of below examples will lead to same result, choose any on your taste:

import { useFirstMountState } from '[@&#8203;react-hookz/web](https://togithub.com/react-hookz/web)';
import { useFirstMountState } from '@&#8203;react-hookz/web/';
import { useFirstMountState } from '@&#8203;react-hookz/web/useFirstMountState/';
import { useFirstMountState } from '@&#8203;react-hookz/web/useFirstMountState/index.js';
Thought is seems not to have subfolder, it is only due to exports directive, in real it is
@&#8203;react-hookz/web/dist/useFirstMountState/index.js.

Pakage uses imports directive to define path alias #root - it stays so even in distributed code, thus, some may be affected in case their bundler configured to somehow handle such alias. Those developer shoud configure import rewriter not to handle node_modules or [@&#8203;react-hookz/web](https://togithub.com/react-hookz/web) package exclusively.

Side-effect for current PR - documentation is broken, as storybook 6 is not working within ESM packages and I'm planning to switch to another domenting engine anyway.

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://developer.mend.io/github/toeverything/AFFiNE).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4xMDMuMSIsInVwZGF0ZWRJblZlciI6IjM3LjEwMy4xIiwidGFyZ2V0QnJhbmNoIjoiY2FuYXJ5In0=-->
2023-12-21 07:45:32 +00:00
Cats Juice
c2db8b356c feat(electron): handle onboarding-window moved between screens (#5345) 2023-12-21 15:44:21 +08:00
LongYinan
eaa62df2dd chore: bump up eslint-plugin-unicorn version to v50 (#5362)
[![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [eslint-plugin-unicorn](https://togithub.com/sindresorhus/eslint-plugin-unicorn) | [`^49.0.0` -> `^50.0.0`](https://renovatebot.com/diffs/npm/eslint-plugin-unicorn/49.0.0/50.0.0) | [![age](https://developer.mend.io/api/mc/badges/age/npm/eslint-plugin-unicorn/50.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/eslint-plugin-unicorn/50.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/eslint-plugin-unicorn/49.0.0/50.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/eslint-plugin-unicorn/49.0.0/50.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) |

---

### Release Notes

<details>
<summary>sindresorhus/eslint-plugin-unicorn (eslint-plugin-unicorn)</summary>

### [`v50.0.0`](https://togithub.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v50.0.0)

[Compare Source](https://togithub.com/sindresorhus/eslint-plugin-unicorn/compare/v49.0.0...v50.0.0)

##### New rules

-   [`no-unnecessary-polyfills`](https://togithub.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-unnecessary-polyfills.md) ([#&#8203;1717](https://togithub.com/sindresorhus/eslint-plugin-unicorn/issues/1717))  [`6788d86`](https://togithub.com/sindresorhus/eslint-plugin-unicorn/commit/6788d86)

##### Improvements

-   Support ESLint's new config system ([#&#8203;1886](https://togithub.com/sindresorhus/eslint-plugin-unicorn/issues/1886))  [`65711f9`](https://togithub.com/sindresorhus/eslint-plugin-unicorn/commit/65711f9)
-   `no-useless-undefined`: Add `checkArrowFunctionBody` option ([#&#8203;2232](https://togithub.com/sindresorhus/eslint-plugin-unicorn/issues/2232))  [`9d7048c`](https://togithub.com/sindresorhus/eslint-plugin-unicorn/commit/9d7048c)
-   `prefer-negative-index`: Check `TypedArray#subarray()` ([#&#8203;2237](https://togithub.com/sindresorhus/eslint-plugin-unicorn/issues/2237))  [`6708a30`](https://togithub.com/sindresorhus/eslint-plugin-unicorn/commit/6708a30)
-   `no-useless-undefined`: Ignore React state setters ([#&#8203;2223](https://togithub.com/sindresorhus/eslint-plugin-unicorn/issues/2223))  [`42881ba`](https://togithub.com/sindresorhus/eslint-plugin-unicorn/commit/42881ba)
-   `prefer-module`: Allow `module` as TSTypeParameter name ([#&#8203;2213](https://togithub.com/sindresorhus/eslint-plugin-unicorn/issues/2213))  [`8f61f7c`](https://togithub.com/sindresorhus/eslint-plugin-unicorn/commit/8f61f7c)

##### Fixes

-   `string-content`: Fix JSX autofix for newlines, etc. ([#&#8203;2222](https://togithub.com/sindresorhus/eslint-plugin-unicorn/issues/2222))  [`b95e75e`](https://togithub.com/sindresorhus/eslint-plugin-unicorn/commit/b95e75e)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://developer.mend.io/github/toeverything/AFFiNE).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4xMDMuMSIsInVwZGF0ZWRJblZlciI6IjM3LjEwMy4xIiwidGFyZ2V0QnJhbmNoIjoiY2FuYXJ5In0=-->
2023-12-21 07:23:11 +00:00
JimmFly
332a5c6685 chore(core): temporarily hide export png and pdf in edgeless (#5364) 2023-12-21 07:13:05 +00:00
35 changed files with 283 additions and 367 deletions

View File

@@ -1,5 +1,9 @@
name: Setup Version
description: 'Setup Version'
outputs:
APP_VERSION:
description: 'App Version'
value: ${{ steps.version.outputs.APP_VERSION }}
runs:
using: 'composite'
steps:

View File

@@ -1,11 +1,11 @@
name: Deploy by tag or schedule
name: Deploy Automatically
on:
push:
tags:
- 'v[0-9]+.[0-9]+.[0-9]+-canary.[0-9]+'
schedule:
- cron: '0 7 * * *'
- cron: '0 9 * * *'
jobs:
dispatch-deploy:

View File

@@ -23,6 +23,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Setup Version
id: version
uses: ./.github/actions/setup-version
- name: Setup Node.js
uses: ./.github/actions/setup-node
@@ -43,6 +44,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Setup Version
id: version
uses: ./.github/actions/setup-version
- name: Setup Node.js
uses: ./.github/actions/setup-node
@@ -76,6 +78,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Setup Version
id: version
uses: ./.github/actions/setup-version
- name: Setup Node.js
uses: ./.github/actions/setup-node
@@ -99,6 +102,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Setup Version
id: version
uses: ./.github/actions/setup-version
- name: Setup Node.js
uses: ./.github/actions/setup-node
@@ -220,6 +224,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Setup Version
id: version
uses: ./.github/actions/setup-version
- name: Deploy to ${{ github.event.inputs.flavor }}
uses: ./.github/actions/deploy

View File

@@ -1,258 +0,0 @@
name: Build Canary Desktop App on Staging Branch
on:
workflow_dispatch:
inputs:
channel_override:
description: 'channel type (canary, beta, or stable)'
type: choice
default: beta
options:
- canary
- beta
- stable
push:
branches:
# 0.6.x-staging
- v[0-9]+.[0-9]+.x-staging
# 0.6.1-staging
- v[0-9]+.[0-9]+.[0-9]+-staging
paths-ignore:
- README.md
- .github/**
- '!.github/workflows/nightly-build.yml'
- '!.github/actions/build-rust/action.yml'
- '!.github/actions/setup-node/action.yml'
permissions:
actions: write
contents: write
security-events: write
concurrency:
# The concurrency group contains the workflow name and the branch name for
# pull requests or the commit hash for any other events.
group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.head_ref || github.sha }}
cancel-in-progress: true
env:
# BUILD_TYPE => app icon, app name, etc
BUILD_TYPE: internal
# BUILD_TYPE_OVERRIDE => channel type (canary, beta, or stable) - get the channel type (the api configs)
BUILD_TYPE_OVERRIDE: ${{ github.event.inputs.channel_override || 'beta' }}
jobs:
set-build-version:
runs-on: ubuntu-latest
outputs:
version: 0.0.0-internal.${{ steps.version.outputs.version }}
steps:
- uses: actions/checkout@v4
- uses: toeverything/set-build-version@latest
- id: version
run: echo ::set-output name=version::${{ env.BUILD_VERSION }}
before-make:
runs-on: ubuntu-latest
needs:
- set-build-version
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: ./.github/actions/setup-node
- name: Setup @sentry/cli
uses: ./.github/actions/setup-sentry
- name: Replace Version
run: ./scripts/set-version.sh ${{ needs.set-build-version.outputs.version }}
- name: generate-assets
run: yarn workspace @affine/electron generate-assets
env:
SENTRY_ORG: ${{ secrets.SENTRY_ORG }}
SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }}
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
RELEASE_VERSION: ${{ needs.set-build-version.outputs.version }}
SKIP_PLUGIN_BUILD: 'true'
SKIP_NX_CACHE: 'true'
- name: Upload core artifact
uses: actions/upload-artifact@v3
with:
name: core
path: packages/frontend/electron/resources/web-static
make-distribution:
strategy:
# all combinations: macos-latest x64, macos-latest arm64, ubuntu-latest x64
# For windows, we need a separate approach
matrix:
spec:
- runner: macos-latest
platform: darwin
arch: x64
target: x86_64-apple-darwin
- runner: macos-latest
platform: darwin
arch: arm64
target: aarch64-apple-darwin
- runner: ubuntu-latest
platform: linux
arch: x64
target: x86_64-unknown-linux-gnu
- runner: windows-latest
platform: win32
arch: x64
target: x86_64-pc-windows-msvc
runs-on: ${{ matrix.spec.runner }}
needs:
- before-make
- set-build-version
env:
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
SKIP_GENERATE_ASSETS: 1
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
timeout-minutes: 10
if: ${{ matrix.spec.platform == 'darwin' }}
uses: ./.github/actions/setup-node
with:
extra-flags: workspaces focus @affine/electron @affine/monorepo
hard-link-nm: false
build-plugins: false
nmHoistingLimits: workspaces
enableScripts: false
- name: Setup Node.js
timeout-minutes: 10
if: ${{ matrix.spec.platform != 'darwin' }}
uses: ./.github/actions/setup-node
with:
extra-flags: workspaces focus @affine/electron @affine/monorepo
hard-link-nm: false
build-plugins: false
nmHoistingLimits: workspaces
- name: Build AFFiNE native
uses: ./.github/actions/build-rust
with:
target: ${{ matrix.spec.target }}
package: '@affine/native'
nx_token: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }}
- name: Replace Version
run: ./scripts/set-version.sh ${{ needs.set-build-version.outputs.version }}
- uses: actions/download-artifact@v3
with:
name: core
path: packages/frontend/electron/resources/web-static
- name: Build Plugins
run: yarn run build:plugins
- name: Build Desktop Layers
run: yarn workspace @affine/electron build
- name: Signing By Apple Developer ID
if: ${{ matrix.spec.platform == 'darwin' }}
uses: apple-actions/import-codesign-certs@v2
with:
p12-file-base64: ${{ secrets.CERTIFICATES_P12 }}
p12-password: ${{ secrets.CERTIFICATES_P12_PASSWORD }}
- name: make
run: yarn workspace @affine/electron make --platform=${{ matrix.spec.platform }} --arch=${{ matrix.spec.arch }}
env:
SKIP_PLUGIN_BUILD: 1
SKIP_WEB_BUILD: 1
HOIST_NODE_MODULES: 1
- name: Save artifacts (mac)
if: ${{ matrix.spec.platform == 'darwin' }}
run: |
mkdir -p builds
mv packages/frontend/electron/out/*/make/*.dmg ./builds/affine-${{ env.BUILD_TYPE }}-macos-${{ matrix.spec.arch }}.dmg
mv packages/frontend/electron/out/*/make/zip/darwin/${{ matrix.spec.arch }}/*.zip ./builds/affine-${{ env.BUILD_TYPE }}-macos-${{ matrix.spec.arch }}.zip
- name: Save artifacts (windows)
if: ${{ matrix.spec.platform == 'win32' }}
run: |
mkdir -p builds
mv packages/frontend/electron/out/*/make/zip/win32/x64/AFFiNE*-win32-x64-*.zip ./builds/affine-${{ env.BUILD_TYPE }}-windows-x64.zip
mv packages/frontend/electron/out/*/make/squirrel.windows/x64/*.exe ./builds/affine-${{ env.BUILD_TYPE }}-windows-x64.exe
mv packages/frontend/electron/out/*/make/squirrel.windows/x64/*.msi ./builds/affine-${{ env.BUILD_TYPE }}-windows-x64.msi
mv packages/frontend/electron/out/*/make/squirrel.windows/x64/*.nupkg ./builds/affine-${{ env.BUILD_TYPE }}-windows-x64.nupkg
- name: Save artifacts (linux)
if: ${{ matrix.spec.platform == 'linux' }}
run: |
mkdir -p builds
mv packages/frontend/electron/out/*/make/zip/linux/x64/*.zip ./builds/affine-${{ env.BUILD_TYPE }}-linux-x64.zip
mv packages/frontend/electron/out/*/make/AppImage/x64/*.AppImage ./builds/affine-${{ env.BUILD_TYPE }}-linux-x64.AppImage
- name: Upload Artifact
uses: actions/upload-artifact@v3
with:
name: affine-${{ matrix.spec.platform }}-${{ matrix.spec.arch }}-builds
path: builds
release:
needs:
- make-distribution
- set-build-version
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Download Artifacts (macos-x64)
uses: actions/download-artifact@v3
with:
name: affine-darwin-x64-builds
path: ./
- name: Download Artifacts (macos-arm64)
uses: actions/download-artifact@v3
with:
name: affine-darwin-arm64-builds
path: ./
- name: Download Artifacts (windows-x64)
uses: actions/download-artifact@v3
with:
name: affine-win32-x64-builds
path: ./
- name: Download Artifacts (linux-x64)
uses: actions/download-artifact@v3
with:
name: affine-linux-x64-builds
path: ./
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 18
- name: Generate Release yml
run: |
node ./packages/frontend/electron/scripts/generate-yml.js
env:
RELEASE_VERSION: ${{ needs.set-build-version.outputs.version }}
- name: Generate SHA512 checksums
run: |
sha512sum *-linux-* > SHA512SUMS.txt
sha512sum *-macos-* >> SHA512SUMS.txt
sha512sum *-windows-* >> SHA512SUMS.txt
- name: Create Release Draft
uses: softprops/action-gh-release@v1
env:
GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }}
with:
repository: 'toeverything/AFFiNE-Releases'
name: ${{ needs.set-build-version.outputs.version }}
tag_name: ${{ needs.set-build-version.outputs.version }}
prerelease: true
files: |
./SHA512SUMS.txt
./VERSION
./*.zip
./*.dmg
./*.exe
./*.nupkg
./RELEASES
./*.AppImage
./*.apk
./*.yml

View File

@@ -1,11 +1,11 @@
name: Release Desktop by tag or schedule
name: Release Desktop Automatically
on:
push:
tags:
- 'v[0-9]+.[0-9]+.[0-9]+-canary.[0-9]+'
schedule:
- cron: '0 7 * * *'
- cron: '0 9 * * *'
jobs:
dispatch-release-desktop:
@@ -17,11 +17,11 @@ jobs:
uses: benc-uk/workflow-dispatch@v1
with:
workflow: release-desktop.yml
inputs: '{ "build-type": "canary", "is-draft": true, "is-pre-release": true }'
inputs: '{ "build-type": "canary", "is-draft": false, "is-pre-release": true }'
- name: dispatch desktop release by schedule
if: ${{ github.event_name == 'schedule' }}
uses: benc-uk/workflow-dispatch@v1
with:
workflow: release-desktop.yml
inputs: '{ "build-type": "canary", "is-draft": true, "is-pre-release": true }'
inputs: '{ "build-type": "canary", "is-draft": false, "is-pre-release": true }'
ref: canary

View File

@@ -43,6 +43,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Setup Version
id: version
uses: ./.github/actions/setup-version
- name: Setup Node.js
uses: ./.github/actions/setup-node
@@ -92,6 +93,9 @@ jobs:
SKIP_GENERATE_ASSETS: 1
steps:
- uses: actions/checkout@v4
- name: Setup Version
id: version
uses: ./.github/actions/setup-version
- name: Setup Node.js
timeout-minutes: 10
uses: ./.github/actions/setup-node
@@ -166,6 +170,9 @@ jobs:
SKIP_GENERATE_ASSETS: 1
steps:
- uses: actions/checkout@v4
- name: Setup Version
id: version
uses: ./.github/actions/setup-version
- name: Setup Node.js
timeout-minutes: 10
uses: ./.github/actions/setup-node
@@ -355,8 +362,8 @@ jobs:
with:
name: ${{ needs.before-make.outputs.RELEASE_VERSION }}
body: ''
draft: ${{ github.event.inputs.is-draft || true }}
prerelease: ${{ github.event.inputs.is-pre-release || true }}
draft: ${{ github.event.inputs.is-draft }}
prerelease: ${{ github.event.inputs.is-pre-release }}
files: |
./VERSION
./*.zip

View File

@@ -88,7 +88,7 @@
"eslint-plugin-react-hooks": "^4.6.0",
"eslint-plugin-simple-import-sort": "^10.0.0",
"eslint-plugin-sonarjs": "^0.23.0",
"eslint-plugin-unicorn": "^49.0.0",
"eslint-plugin-unicorn": "^50.0.0",
"eslint-plugin-unused-imports": "^3.0.0",
"eslint-plugin-vue": "^9.18.1",
"fake-indexeddb": "5.0.1",

View File

@@ -10,6 +10,9 @@ export class ServerConfigType {
@Field({ description: 'server flavor' })
flavor!: string;
@Field({ description: 'server base url' })
baseUrl!: string;
}
export class ServerConfigResolver {
@@ -20,6 +23,7 @@ export class ServerConfigResolver {
return {
version: AFFiNE.version,
flavor: SERVER_FLAVOR,
baseUrl: AFFiNE.baseUrl,
};
}
}

View File

@@ -8,6 +8,9 @@ type ServerConfigType {
"""server flavor"""
flavor: String!
"""server base url"""
baseUrl: String!
}
type UserQuotaHumanReadable {

View File

@@ -28,7 +28,12 @@ export async function migratePages(
const oldVersions = versions?.toJSON() ?? {};
spaces.forEach((space: YDoc) => {
schema.upgradePage(0, oldVersions, space);
try {
// Catch page upgrade error to avoid blocking the whole workspace migration.
schema.upgradePage(0, oldVersions, space);
} catch (e) {
console.error(e);
}
});
schema.upgradeWorkspace(rootDoc);

View File

@@ -21,6 +21,7 @@ interface ExportMenuItemProps<T> {
interface ExportProps {
exportHandler: (type: 'pdf' | 'html' | 'png' | 'markdown') => Promise<void>;
pageMode?: 'page' | 'edgeless';
className?: string;
}
@@ -47,6 +48,7 @@ export function ExportMenuItem<T>({
export const ExportMenuItems = ({
exportHandler,
className = transitionStyle,
pageMode = 'page',
}: ExportProps) => {
const t = useAFFiNEI18N();
const itemMap = useMemo(
@@ -94,16 +96,23 @@ export const ExportMenuItems = ({
],
[className, exportHandler, t]
);
const items = itemMap.map(({ component: Component, props }) => (
<Component key={props.label} {...props} />
));
const items = itemMap.map(({ component: Component, props }) =>
pageMode === 'edgeless' &&
(props.type === 'pdf' || props.type === 'png') ? null : (
<Component key={props.label} {...props} />
)
);
return items;
};
export const Export = ({ exportHandler, className }: ExportProps) => {
export const Export = ({ exportHandler, className, pageMode }: ExportProps) => {
const t = useAFFiNEI18N();
const items = (
<ExportMenuItems exportHandler={exportHandler} className={className} />
<ExportMenuItems
exportHandler={exportHandler}
className={className}
pageMode={pageMode}
/>
);
return (
<MenuSub

View File

@@ -391,7 +391,6 @@ export const createConfiguration: (
proxy: {
'/api/worker/': {
target: 'https://affine-worker.toeverything.workers.dev',
pathRewrite: { '^/api/worker/': '/api/' },
changeOrigin: true,
secure: false,
},

View File

@@ -33,7 +33,7 @@ export function getRuntimeConfig(buildFlags: BuildFlags): RuntimeConfig {
enablePayment: true,
enablePageHistory: false,
enableCopilot: false,
serverUrlPrefix: 'https://insider.affine.pro', // Let insider be stable environment temporarily.
serverUrlPrefix: 'https://app.affine.pro',
editorFlags,
appVersion: packageJson.version,
editorVersion: packageJson.dependencies['@blocksuite/presets'],

View File

@@ -44,7 +44,7 @@
"@radix-ui/react-dialog": "^1.0.4",
"@radix-ui/react-scroll-area": "^1.0.5",
"@radix-ui/react-select": "^2.0.0",
"@react-hookz/web": "^23.1.0",
"@react-hookz/web": "^24.0.0",
"@sentry/integrations": "^7.83.0",
"@sentry/react": "^7.83.0",
"@toeverything/theme": "^0.7.20",

View File

@@ -8,7 +8,7 @@ import { useAFFiNEI18N } from '@affine/i18n/hooks';
import { useWorkspace } from '@toeverything/hooks/use-workspace';
import { useWorkspaceInfo } from '@toeverything/hooks/use-workspace-info';
import { useSelfHosted } from '../../../hooks/affine/use-server-flavor';
import { useSelfHosted } from '../../../hooks/affine/use-server-config';
import { DeleteLeaveWorkspace } from './delete-leave-workspace';
import { EnableCloudPanel } from './enable-cloud';
import { ExportPanel } from './export';

View File

@@ -2,7 +2,15 @@ import { Button } from '@affine/component';
import * as styles from './animate-in-tooltip.css';
export const AnimateInTooltip = ({ onNext }: { onNext: () => void }) => {
interface AnimateInTooltipProps {
onNext: () => void;
visible?: boolean;
}
export const AnimateInTooltip = ({
onNext,
visible,
}: AnimateInTooltipProps) => {
return (
<>
<div className={styles.tooltip}>
@@ -10,9 +18,11 @@ export const AnimateInTooltip = ({ onNext }: { onNext: () => void }) => {
whiteboards and databases
</div>
<div className={styles.next}>
<Button type="primary" size="extraLarge" onClick={onNext}>
Next
</Button>
{visible ? (
<Button type="primary" size="extraLarge" onClick={onNext}>
Next
</Button>
) : null}
</div>
</>
);

View File

@@ -34,6 +34,11 @@ export const Onboarding = ({ onOpenApp }: OnboardingProps) => {
});
}, []);
const onTooltipNext = useCallback(() => {
if (status.activeId) return;
setStatus({ activeId: null, unfoldingId: '4' });
}, [status.activeId]);
return (
<div
className={styles.onboarding}
@@ -80,9 +85,7 @@ export const Onboarding = ({ onOpenApp }: OnboardingProps) => {
)}
<div className={styles.tipsWrapper} data-visible={!status.activeId}>
<AnimateInTooltip
onNext={() => setStatus({ activeId: null, unfoldingId: '4' })}
/>
<AnimateInTooltip onNext={onTooltipNext} visible={!status.activeId} />
</div>
</div>
</div>

View File

@@ -100,8 +100,7 @@ export const onboarding = style([
animation: `${fadeIn} 0.8s linear`,
// content: 'unset',
background:
// 'linear-gradient(180deg, rgba(0,0,0,0.8) 0%, rgba(0,0,0,0) 99.58%)',
'linear-gradient(180deg, rgba(0,0,0,0.9) 0%, rgba(0,0,0,0) 80%)',
'linear-gradient(180deg, rgba(0,0,0,0.8) 0%, rgba(0,0,0,0) 99.58%)',
},
'&[data-is-window="true"][data-is-desktop="true"]::after': {
opacity: 0,

View File

@@ -34,7 +34,7 @@ import {
openSignOutModalAtom,
} from '../../../../atoms';
import { useCurrentUser } from '../../../../hooks/affine/use-current-user';
import { useSelfHosted } from '../../../../hooks/affine/use-server-flavor';
import { useSelfHosted } from '../../../../hooks/affine/use-server-config';
import { useUserSubscription } from '../../../../hooks/use-subscription';
import { validateAndReduceImage } from '../../../../utils/reduce-image';
import { Upload } from '../../../pure/file-upload';

View File

@@ -8,7 +8,7 @@ import {
import type { ReactElement, SVGProps } from 'react';
import { useCurrentLoginStatus } from '../../../../hooks/affine/use-current-login-status';
import { useSelfHosted } from '../../../../hooks/affine/use-server-flavor';
import { useSelfHosted } from '../../../../hooks/affine/use-server-config';
import { AboutAffine } from './about';
import { AppearanceSettings } from './appearance';
import { BillingSettings } from './billing';

View File

@@ -4,7 +4,9 @@ import { Divider } from '@affine/component/ui/divider';
import { WorkspaceFlavour } from '@affine/env/workspace';
import { useAFFiNEI18N } from '@affine/i18n/hooks';
import { LinkIcon } from '@blocksuite/icons';
import { useAtomValue } from 'jotai';
import { currentModeAtom } from '../../../../atoms/mode';
import { useExportPage } from '../../../../hooks/affine/use-export-page';
import * as styles from './index.css';
import type { ShareMenuProps } from './share-menu';
@@ -17,12 +19,13 @@ export const ShareExport = ({
const t = useAFFiNEI18N();
const workspaceId = workspace.id;
const pageId = currentPage.id;
const { onClickCopyLink } = useSharingUrl({
const { sharingUrl, onClickCopyLink } = useSharingUrl({
workspaceId,
pageId,
urlType: 'workspace',
});
const exportHandler = useExportPage(currentPage);
const currentMode = useAtomValue(currentModeAtom);
return (
<>
@@ -36,6 +39,7 @@ export const ShareExport = ({
<ExportMenuItems
exportHandler={exportHandler}
className={styles.menuItemStyle}
pageMode={currentMode}
/>
</div>
{workspace.flavour !== WorkspaceFlavour.LOCAL ? (
@@ -53,6 +57,7 @@ export const ShareExport = ({
onClick={onClickCopyLink}
icon={<LinkIcon />}
type="plain"
disabled={!sharingUrl}
>
{t['com.affine.share-menu.copy-private-link']()}
</Button>

View File

@@ -18,6 +18,7 @@ import { useCallback } from 'react';
import type { PageMode } from '../../../../atoms';
import { currentModeAtom } from '../../../../atoms/mode';
import { useIsSharedPage } from '../../../../hooks/affine/use-is-shared-page';
import { useServerBaseUrl } from '../../../../hooks/affine/use-server-config';
import * as styles from './index.css';
import type { ShareMenuProps } from './share-menu';
import { useSharingUrl } from './use-share-url';
@@ -98,6 +99,7 @@ export const AffineSharePage = (props: ShareMenuProps) => {
pageId,
urlType: 'share',
});
const baseUrl = useServerBaseUrl();
const t = useAFFiNEI18N();
const onClickCreateLink = useCallback(() => {
@@ -140,9 +142,13 @@ export const AffineSharePage = (props: ShareMenuProps) => {
lineHeight: '20px',
}}
value={
isSharedPage
? sharingUrl
: `${location.protocol}//${location.hostname}/...`
(isSharedPage && sharingUrl) ||
`${
baseUrl ||
`${location.protocol}${
location.port ? `:${location.port}` : ''
}//${location.hostname}`
}/...`
}
readOnly
/>
@@ -151,6 +157,7 @@ export const AffineSharePage = (props: ShareMenuProps) => {
onClick={onClickCopyLink}
data-testid="share-menu-copy-link-button"
style={{ padding: '4px 12px', whiteSpace: 'nowrap' }}
disabled={!sharingUrl}
>
{t.Copy()}
</Button>

View File

@@ -1,4 +1,5 @@
import { toast } from '@affine/component';
import { useServerBaseUrl } from '@affine/core/hooks/affine/use-server-config';
import { useAFFiNEI18N } from '@affine/i18n/hooks';
import { useCallback, useMemo } from 'react';
@@ -10,22 +11,27 @@ type UseSharingUrl = {
urlType: UrlType;
};
export const generateUrl = ({
workspaceId,
pageId,
urlType,
}: UseSharingUrl) => {
// to generate a private url like https://affine.app/workspace/123/456
// to generate a public url like https://affine.app/share/123/456
// or https://affine.app/share/123/456?mode=edgeless
const useGenerateUrl = ({ workspaceId, pageId, urlType }: UseSharingUrl) => {
// to generate a private url like https://app.affine.app/workspace/123/456
// to generate a public url like https://app.affine.app/share/123/456
// or https://app.affine.app/share/123/456?mode=edgeless
const { protocol, hostname, port } = window.location;
const url = new URL(
`${protocol}//${hostname}${
port ? `:${port}` : ''
}/${urlType}/${workspaceId}/${pageId}`
);
return url.toString();
const baseUrl = useServerBaseUrl();
const url = useMemo(() => {
// baseUrl is null when running in electron and without network
if (!baseUrl) return null;
try {
return new URL(
`${baseUrl}/${urlType}/${workspaceId}/${pageId}`
).toString();
} catch (e) {
return null;
}
}, [baseUrl, pageId, urlType, workspaceId]);
return url;
};
export const useSharingUrl = ({
@@ -34,20 +40,21 @@ export const useSharingUrl = ({
urlType,
}: UseSharingUrl) => {
const t = useAFFiNEI18N();
const sharingUrl = useMemo(
() => generateUrl({ workspaceId, pageId, urlType }),
[workspaceId, pageId, urlType]
);
const sharingUrl = useGenerateUrl({ workspaceId, pageId, urlType });
const onClickCopyLink = useCallback(() => {
navigator.clipboard
.writeText(sharingUrl)
.then(() => {
toast(t['Copied link to clipboard']());
})
.catch(err => {
console.error(err);
});
if (sharingUrl) {
navigator.clipboard
.writeText(sharingUrl)
.then(() => {
toast(t['Copied link to clipboard']());
})
.catch(err => {
console.error(err);
});
} else {
toast('Network not available');
}
}, [sharingUrl, t]);
return {

View File

@@ -182,7 +182,7 @@ export const PageHeaderMenuButton = ({ rename, pageId }: PageMenuProps) => {
>
{t['Import']()}
</MenuItem>
<Export exportHandler={exportHandler} />
<Export exportHandler={exportHandler} pageMode={currentMode} />
{workspace.flavour === WorkspaceFlavour.AFFINE_CLOUD &&
runtimeConfig.enablePageHistory ? (

View File

@@ -141,7 +141,7 @@ export function useRegisterBlocksuiteEditorCommands(
unsubs.push(
registerAffineCommand({
id: `editor:${mode}-export-to-pdf`,
preconditionStrategy,
preconditionStrategy: () => mode === 'page' && !trash,
category: `editor:${mode}`,
icon: mode === 'page' ? <PageIcon /> : <EdgelessIcon />,
label: t['Export to PDF'](),
@@ -167,7 +167,7 @@ export function useRegisterBlocksuiteEditorCommands(
unsubs.push(
registerAffineCommand({
id: `editor:${mode}-export-to-png`,
preconditionStrategy,
preconditionStrategy: () => mode === 'page' && !trash,
category: `editor:${mode}`,
icon: mode === 'page' ? <PageIcon /> : <EdgelessIcon />,
label: t['Export to PNG'](),

View File

@@ -9,7 +9,7 @@ const errorHandler: Middleware = useSWRNext => (key, fetcher, config) => {
return useSWRNext(key, wrappedFetcher.bind(null, fetcher), config);
};
export const useServerFlavor = () => {
const useServerConfig = () => {
const { data: config, error } = useQueryImmutable(
{ query: serverConfigQuery },
{
@@ -18,10 +18,20 @@ export const useServerFlavor = () => {
);
if (error || !config) {
return null;
}
return config.serverConfig;
};
export const useServerFlavor = () => {
const config = useServerConfig();
if (!config) {
return 'local';
}
return config.serverConfig.flavor;
return config.flavor;
};
export const useSelfHosted = () => {
@@ -29,3 +39,18 @@ export const useSelfHosted = () => {
return ['local', 'selfhosted'].includes(serverFlavor);
};
export const useServerBaseUrl = () => {
const config = useServerConfig();
if (!config) {
if (environment.isDesktop) {
// don't use window.location in electron
return null;
}
const { protocol, hostname, port } = window.location;
return `${protocol}//${hostname}${port ? `:${port}` : ''}`;
}
return config.baseUrl;
};

View File

@@ -1,15 +0,0 @@
'use client';
import { useMemo } from 'react';
export function useShareLink(workspaceId: string): string {
return useMemo(() => {
if (environment.isServer) {
throw new Error('useShareLink is not available on server side');
}
if (environment.isDesktop) {
return '???';
} else {
return origin + '/share/' + workspaceId;
}
}, [workspaceId]);
}

View File

@@ -2,7 +2,7 @@ import { type SubscriptionQuery, subscriptionQuery } from '@affine/graphql';
import { useQuery } from '@affine/workspace/affine/gql';
import { useAsyncCallback } from '@toeverything/hooks/affine-async-hooks';
import { useSelfHosted } from './affine/use-server-flavor';
import { useSelfHosted } from './affine/use-server-config';
export type Subscription = NonNullable<
NonNullable<SubscriptionQuery['currentUser']>['subscription']

View File

@@ -17,13 +17,14 @@ const affineCoreOutDir = path.join(affineCoreDir, 'dist');
const publicAffineOutDir = path.join(publicDistDir, `web-static`);
const releaseVersionEnv = process.env.RELEASE_VERSION || '';
console.log('build with following dir', {
console.log('build with following variables', {
repoRootDir,
electronRootDir,
publicDistDir,
affineSrcDir: affineCoreDir,
affineSrcOutDir: affineCoreOutDir,
publicAffineOutDir,
releaseVersionEnv,
});
// step 0: check version match

View File

@@ -1,10 +1,16 @@
import { BrowserWindow, screen } from 'electron';
import { BrowserWindow, type Display, screen } from 'electron';
import { join } from 'path';
import { isMacOS } from '../shared/utils';
import { mainWindowOrigin } from './constants';
// import { getExposedMeta } from './exposed';
import { logger } from './logger';
const getScreenSize = (display: Display) => {
const { width, height } = isMacOS() ? display.bounds : display.workArea;
return { width, height };
};
// todo: not all window need all of the exposed meta
const getWindowAdditionalArguments = async () => {
const { getExposedMeta } = await import('./exposed');
@@ -15,11 +21,24 @@ const getWindowAdditionalArguments = async () => {
];
};
function fullscreenAndCenter(browserWindow: BrowserWindow) {
const position = browserWindow.getPosition();
const size = browserWindow.getSize();
const currentDisplay = screen.getDisplayNearestPoint({
x: position[0] + size[0] / 2,
y: position[1] + size[1] / 2,
});
if (!currentDisplay) return;
const { width, height } = getScreenSize(currentDisplay);
browserWindow.setSize(width, height);
browserWindow.center();
}
async function createOnboardingWindow(additionalArguments: string[]) {
logger.info('creating onboarding window');
// get user's screen size
const { width, height } = screen.getPrimaryDisplay().workAreaSize;
const { width, height } = getScreenSize(screen.getPrimaryDisplay());
const browserWindow = new BrowserWindow({
width,
@@ -36,6 +55,7 @@ async function createOnboardingWindow(additionalArguments: string[]) {
// skipTaskbar: true,
transparent: true,
hasShadow: false,
roundedCorners: false,
webPreferences: {
webgl: true,
preload: join(__dirname, './preload.js'),
@@ -56,12 +76,18 @@ async function createOnboardingWindow(additionalArguments: string[]) {
browserWindow.on('ready-to-show', () => {
// forcing zoom factor to 1 to avoid onboarding display issues
browserWindow.webContents.setZoomFactor(1);
fullscreenAndCenter(browserWindow);
// TODO: add a timeout to avoid flickering, window is ready, but dom is not ready
setTimeout(() => {
browserWindow.show();
}, 300);
});
// When moved to another screen, resize to fit the screen
browserWindow.on('moved', () => {
fullscreenAndCenter(browserWindow);
});
await browserWindow.loadURL(
`${mainWindowOrigin}${mainWindowOrigin.endsWith('/') ? '' : '/'}onboarding`
);

View File

@@ -655,6 +655,7 @@ query serverConfig {
serverConfig {
version
flavor
baseUrl
}
}`,
};

View File

@@ -2,5 +2,6 @@ query serverConfig {
serverConfig {
version
flavor
baseUrl
}
}

View File

@@ -632,6 +632,7 @@ export type ServerConfigQuery = {
__typename?: 'ServerConfigType';
version: string;
flavor: string;
baseUrl: string;
};
};

View File

@@ -2,21 +2,25 @@ import { Manager } from 'socket.io-client';
let ioManager: Manager | null = null;
function getBaseUrl(): string {
if (environment.isDesktop) {
return runtimeConfig.serverUrlPrefix;
}
const { protocol, hostname, port } = window.location;
return `${protocol === 'https:' ? 'wss' : 'ws'}://${hostname}${
port ? `:${port}` : ''
}`;
}
// use lazy initialization socket.io io manager
export function getIoManager(): Manager {
if (ioManager) {
return ioManager;
}
const { protocol, hostname, port } = window.location;
ioManager = new Manager(
`${protocol === 'https:' ? 'wss' : 'ws'}://${hostname}${
port ? `:${port}` : ''
}/`,
{
autoConnect: false,
transports: ['websocket'],
secure: location.protocol === 'https:',
}
);
ioManager = new Manager(`${getBaseUrl()}/`, {
autoConnect: false,
transports: ['websocket'],
secure: location.protocol === 'https:',
});
return ioManager;
}

View File

@@ -372,7 +372,7 @@ __metadata:
"@radix-ui/react-dialog": "npm:^1.0.4"
"@radix-ui/react-scroll-area": "npm:^1.0.5"
"@radix-ui/react-select": "npm:^2.0.0"
"@react-hookz/web": "npm:^23.1.0"
"@react-hookz/web": "npm:^24.0.0"
"@sentry/integrations": "npm:^7.83.0"
"@sentry/react": "npm:^7.83.0"
"@sentry/webpack-plugin": "npm:^2.8.0"
@@ -628,7 +628,7 @@ __metadata:
eslint-plugin-react-hooks: "npm:^4.6.0"
eslint-plugin-simple-import-sort: "npm:^10.0.0"
eslint-plugin-sonarjs: "npm:^0.23.0"
eslint-plugin-unicorn: "npm:^49.0.0"
eslint-plugin-unicorn: "npm:^50.0.0"
eslint-plugin-unused-imports: "npm:^3.0.0"
eslint-plugin-vue: "npm:^9.18.1"
fake-indexeddb: "npm:5.0.1"
@@ -5863,6 +5863,23 @@ __metadata:
languageName: node
linkType: hard
"@eslint/eslintrc@npm:^2.1.4":
version: 2.1.4
resolution: "@eslint/eslintrc@npm:2.1.4"
dependencies:
ajv: "npm:^6.12.4"
debug: "npm:^4.3.2"
espree: "npm:^9.6.0"
globals: "npm:^13.19.0"
ignore: "npm:^5.2.0"
import-fresh: "npm:^3.2.1"
js-yaml: "npm:^4.1.0"
minimatch: "npm:^3.1.2"
strip-json-comments: "npm:^3.1.1"
checksum: 7a3b14f4b40fc1a22624c3f84d9f467a3d9ea1ca6e9a372116cb92507e485260359465b58e25bcb6c9981b155416b98c9973ad9b796053fd7b3f776a6946bce8
languageName: node
linkType: hard
"@eslint/js@npm:8.54.0":
version: 8.54.0
resolution: "@eslint/js@npm:8.54.0"
@@ -11221,9 +11238,9 @@ __metadata:
languageName: node
linkType: hard
"@react-hookz/web@npm:^23.1.0":
version: 23.1.0
resolution: "@react-hookz/web@npm:23.1.0"
"@react-hookz/web@npm:^24.0.0":
version: 24.0.0
resolution: "@react-hookz/web@npm:24.0.0"
dependencies:
"@react-hookz/deep-equal": "npm:^1.0.4"
peerDependencies:
@@ -11233,7 +11250,7 @@ __metadata:
peerDependenciesMeta:
js-cookie:
optional: true
checksum: 7f345fc286ee3bae74b76b909898213a589250856783805d0356d8ef9ca0e3d1638e7499d8b77ae1dff6350dec230fda468e0e4c8fc05a9997902569d3d81b49
checksum: 85ec7ebecf3a69f098fecb89c1515ffd8c119f29a74521277df34af637059320669cf8ff6273063cec6a4c86cee4849e24fa8772191d08f81b2b88de69749670
languageName: node
linkType: hard
@@ -17329,6 +17346,20 @@ __metadata:
languageName: node
linkType: hard
"browserslist@npm:^4.22.2":
version: 4.22.2
resolution: "browserslist@npm:4.22.2"
dependencies:
caniuse-lite: "npm:^1.0.30001565"
electron-to-chromium: "npm:^1.4.601"
node-releases: "npm:^2.0.14"
update-browserslist-db: "npm:^1.0.13"
bin:
browserslist: cli.js
checksum: e3590793db7f66ad3a50817e7b7f195ce61e029bd7187200244db664bfbe0ac832f784e4f6b9c958aef8ea4abe001ae7880b7522682df521f4bc0a5b67660b5e
languageName: node
linkType: hard
"bser@npm:2.1.1":
version: 2.1.1
resolution: "bser@npm:2.1.1"
@@ -17646,6 +17677,13 @@ __metadata:
languageName: node
linkType: hard
"caniuse-lite@npm:^1.0.30001565":
version: 1.0.30001570
resolution: "caniuse-lite@npm:1.0.30001570"
checksum: a9b939e003dd70580cc18bce54627af84f298af7c774415c8d6c99871e7cee13bd8278b67955a979cd338369c73e8821a10b37e607d1fff2fbc8ff92fc489653
languageName: node
linkType: hard
"capital-case@npm:^1.0.4":
version: 1.0.4
resolution: "capital-case@npm:1.0.4"
@@ -17971,7 +18009,7 @@ __metadata:
languageName: node
linkType: hard
"ci-info@npm:^3.2.0, ci-info@npm:^3.8.0":
"ci-info@npm:^3.2.0":
version: 3.9.0
resolution: "ci-info@npm:3.9.0"
checksum: 75bc67902b4d1c7b435497adeb91598f6d52a3389398e44294f6601b20cfef32cf2176f7be0eb961d9e085bb333a8a5cae121cb22f81cf238ae7f58eb80e9397
@@ -18787,6 +18825,15 @@ __metadata:
languageName: node
linkType: hard
"core-js-compat@npm:^3.34.0":
version: 3.34.0
resolution: "core-js-compat@npm:3.34.0"
dependencies:
browserslist: "npm:^4.22.2"
checksum: e29571cc524b4966e331b5876567f13c2b82ed48ac9b02784f3156b29ee1cd82fe3e60052d78b017c429eb61969fd238c22684bb29180908d335266179a29155
languageName: node
linkType: hard
"core-js-pure@npm:^3.23.3":
version: 3.33.3
resolution: "core-js-pure@npm:3.33.3"
@@ -20095,6 +20142,13 @@ __metadata:
languageName: node
linkType: hard
"electron-to-chromium@npm:^1.4.601":
version: 1.4.615
resolution: "electron-to-chromium@npm:1.4.615"
checksum: dbf9deb234cbd381a91f41f6c6729cc8b4bed9b1580d6aea589d689d5f2a8aadf88837ef6887e761c143a1e1015f5eb3ae1bd2728a3068fa6a235c16c0fd76ae
languageName: node
linkType: hard
"electron-updater@npm:^6.1.5":
version: 6.1.7
resolution: "electron-updater@npm:6.1.7"
@@ -20916,14 +20970,16 @@ __metadata:
languageName: node
linkType: hard
"eslint-plugin-unicorn@npm:^49.0.0":
version: 49.0.0
resolution: "eslint-plugin-unicorn@npm:49.0.0"
"eslint-plugin-unicorn@npm:^50.0.0":
version: 50.0.0
resolution: "eslint-plugin-unicorn@npm:50.0.0"
dependencies:
"@babel/helper-validator-identifier": "npm:^7.22.20"
"@eslint-community/eslint-utils": "npm:^4.4.0"
ci-info: "npm:^3.8.0"
"@eslint/eslintrc": "npm:^2.1.4"
ci-info: "npm:^4.0.0"
clean-regexp: "npm:^1.0.0"
core-js-compat: "npm:^3.34.0"
esquery: "npm:^1.5.0"
indent-string: "npm:^4.0.0"
is-builtin-module: "npm:^3.2.1"
@@ -20935,8 +20991,8 @@ __metadata:
semver: "npm:^7.5.4"
strip-indent: "npm:^3.0.0"
peerDependencies:
eslint: ">=8.52.0"
checksum: 7f73f41356cdf720675998c558ab13872d76302dde3a49661df0b5219fd328627e3d7e418aaa3e94cf8764d1ef8b606f7ea01f019eccc0bf0522def8e6769caa
eslint: ">=8.56.0"
checksum: 09d069bac3d4c7d3d3d4ddf8a9992718cd1acc6bbba99cfcb0fb581d9dd0d64378c55d6cc5579aadf23d199c53b539a4351446e0855b363c95e8926be15c95e6
languageName: node
linkType: hard
@@ -29033,6 +29089,13 @@ __metadata:
languageName: node
linkType: hard
"node-releases@npm:^2.0.14":
version: 2.0.14
resolution: "node-releases@npm:2.0.14"
checksum: 0f7607ec7db5ef1dc616899a5f24ae90c869b6a54c2d4f36ff6d84a282ab9343c7ff3ca3670fe4669171bb1e8a9b3e286e1ef1c131f09a83d70554f855d54f24
languageName: node
linkType: hard
"nodemailer@npm:^6.9.7":
version: 6.9.7
resolution: "nodemailer@npm:6.9.7"