From c76b4d70b0ddd47e84f98ca243ee2ae8eb6b6162 Mon Sep 17 00:00:00 2001 From: forehalo Date: Fri, 13 Sep 2024 07:27:07 +0000 Subject: [PATCH] refactor: setup files (#8201) --- .../modules/workspace/entities/workspace.ts | 4 ++-- .../src/modules/workspace/global-schema.ts | 12 ++++++++--- .../infra/src/modules/workspace/index.ts | 2 +- .../workspace/testing/testing-provider.ts | 6 +++--- packages/frontend/apps/electron/package.json | 1 - .../frontend/apps/electron/renderer/index.tsx | 3 +-- .../electron/renderer/polyfill/dispose.ts | 2 -- .../frontend/apps/electron/renderer/setup.ts | 4 ++++ .../apps/electron/renderer/shell/index.tsx | 2 +- .../apps/electron/renderer/shell/setup.ts | 3 +++ packages/frontend/apps/mobile/package.json | 2 -- packages/frontend/apps/mobile/src/index.tsx | 6 +----- .../apps/mobile/src/polyfill/dispose.ts | 2 -- .../mobile/src/polyfill/intl-segmenter.ts | 11 ---------- .../src/polyfill/promise-with-resolvers.ts | 1 - .../src/polyfill/request-idle-callback.ts | 19 ----------------- packages/frontend/apps/mobile/src/setup.ts | 4 ++++ packages/frontend/apps/web/package.json | 2 -- packages/frontend/apps/web/src/index.tsx | 6 +----- .../frontend/apps/web/src/polyfill/dispose.ts | 2 -- .../apps/web/src/polyfill/intl-segmenter.ts | 11 ---------- .../src/polyfill/promise-with-resolvers.ts | 1 - .../web/src/polyfill/request-idle-callback.ts | 19 ----------------- packages/frontend/apps/web/src/setup.ts | 4 ++++ packages/frontend/core/package.json | 5 ++++- packages/frontend/core/src/bootstrap/app.ts | 4 ++++ .../{edgeless-template.ts => blocksuite.ts} | 14 +++++++------ packages/frontend/core/src/bootstrap/index.ts | 16 ++++++++++++++ .../core/src/bootstrap/polyfill/dispose.ts | 8 +++++++ .../core/src/bootstrap/polyfill/index.ts | 17 +++++++++++++++ .../src/bootstrap/polyfill/intl-segmenter.ts | 11 ++++++++++ .../polyfill/promise-with-resolvers.ts | 6 ++++++ .../polyfill/request-idle-callback.ts | 21 +++++++++++++++++++ .../src/bootstrap/polyfill/resize-observer.ts | 5 +++++ .../frontend/core/src/bootstrap/preload.ts | 11 ---------- .../affine/page-history-modal/data.ts | 4 ++-- .../journal/date-picker.tsx | 3 +-- .../journal/today-button.tsx | 2 +- .../block-suite-page-list/utils.tsx | 3 +-- .../root-app-sidebar/import-page.tsx | 2 +- .../root-app-sidebar/journal-button.tsx | 2 +- .../hooks/affine/use-reference-link-helper.ts | 3 +-- .../frontend/core/src/hooks/use-journal.ts | 2 +- .../modules/workspace-engine/impls/cloud.ts | 6 +++--- .../modules/workspace-engine/impls/local.ts | 10 ++++++--- packages/frontend/core/src/shared/index.ts | 3 --- yarn.lock | 7 ++----- 47 files changed, 155 insertions(+), 139 deletions(-) delete mode 100644 packages/frontend/apps/electron/renderer/polyfill/dispose.ts create mode 100644 packages/frontend/apps/electron/renderer/setup.ts create mode 100644 packages/frontend/apps/electron/renderer/shell/setup.ts delete mode 100644 packages/frontend/apps/mobile/src/polyfill/dispose.ts delete mode 100644 packages/frontend/apps/mobile/src/polyfill/intl-segmenter.ts delete mode 100644 packages/frontend/apps/mobile/src/polyfill/promise-with-resolvers.ts delete mode 100644 packages/frontend/apps/mobile/src/polyfill/request-idle-callback.ts create mode 100644 packages/frontend/apps/mobile/src/setup.ts delete mode 100644 packages/frontend/apps/web/src/polyfill/dispose.ts delete mode 100644 packages/frontend/apps/web/src/polyfill/intl-segmenter.ts delete mode 100644 packages/frontend/apps/web/src/polyfill/promise-with-resolvers.ts delete mode 100644 packages/frontend/apps/web/src/polyfill/request-idle-callback.ts create mode 100644 packages/frontend/apps/web/src/setup.ts create mode 100644 packages/frontend/core/src/bootstrap/app.ts rename packages/frontend/core/src/bootstrap/{edgeless-template.ts => blocksuite.ts} (56%) create mode 100644 packages/frontend/core/src/bootstrap/index.ts create mode 100644 packages/frontend/core/src/bootstrap/polyfill/dispose.ts create mode 100644 packages/frontend/core/src/bootstrap/polyfill/index.ts create mode 100644 packages/frontend/core/src/bootstrap/polyfill/intl-segmenter.ts create mode 100644 packages/frontend/core/src/bootstrap/polyfill/promise-with-resolvers.ts create mode 100644 packages/frontend/core/src/bootstrap/polyfill/request-idle-callback.ts create mode 100644 packages/frontend/core/src/bootstrap/polyfill/resize-observer.ts delete mode 100644 packages/frontend/core/src/bootstrap/preload.ts diff --git a/packages/common/infra/src/modules/workspace/entities/workspace.ts b/packages/common/infra/src/modules/workspace/entities/workspace.ts index a2ebfa7884..d32148b441 100644 --- a/packages/common/infra/src/modules/workspace/entities/workspace.ts +++ b/packages/common/infra/src/modules/workspace/entities/workspace.ts @@ -5,7 +5,7 @@ import type { Awareness } from 'y-protocols/awareness.js'; import { Entity } from '../../../framework'; import { LiveData } from '../../../livedata'; -import { globalBlockSuiteSchema } from '../global-schema'; +import { getAFFiNEWorkspaceSchema } from '../global-schema'; import type { WorkspaceScope } from '../scopes/workspace'; import { WorkspaceEngineService } from '../services/engine'; import { WorkspaceUpgradeService } from '../services/upgrade'; @@ -33,7 +33,7 @@ export class Workspace extends Entity { main: this.engine.blob, }, idGenerator: () => nanoid(), - schema: globalBlockSuiteSchema, + schema: getAFFiNEWorkspaceSchema(), }); this._docCollection.slots.docCreated.on(id => { this.engine.doc.markAsReady(id); diff --git a/packages/common/infra/src/modules/workspace/global-schema.ts b/packages/common/infra/src/modules/workspace/global-schema.ts index 49efef45c5..9be14d4286 100644 --- a/packages/common/infra/src/modules/workspace/global-schema.ts +++ b/packages/common/infra/src/modules/workspace/global-schema.ts @@ -2,7 +2,13 @@ import { AffineSchemas } from '@blocksuite/blocks/schemas'; import { AIChatBlockSchema } from '@blocksuite/presets'; import { Schema } from '@blocksuite/store'; -export const globalBlockSuiteSchema = new Schema(); +let _schema: Schema | null = null; +export function getAFFiNEWorkspaceSchema() { + if (!_schema) { + _schema = new Schema(); -const schemas = [...AffineSchemas, AIChatBlockSchema]; -globalBlockSuiteSchema.register(schemas); + _schema.register([...AffineSchemas, AIChatBlockSchema]); + } + + return _schema; +} diff --git a/packages/common/infra/src/modules/workspace/index.ts b/packages/common/infra/src/modules/workspace/index.ts index d6f59a682e..ee707e8a0e 100644 --- a/packages/common/infra/src/modules/workspace/index.ts +++ b/packages/common/infra/src/modules/workspace/index.ts @@ -1,7 +1,7 @@ export type { WorkspaceProfileInfo } from './entities/profile'; export { Workspace } from './entities/workspace'; export { WorkspaceEngineBeforeStart, WorkspaceInitialized } from './events'; -export { globalBlockSuiteSchema } from './global-schema'; +export { getAFFiNEWorkspaceSchema } from './global-schema'; export type { WorkspaceMetadata } from './metadata'; export type { WorkspaceOpenOptions } from './open-options'; export type { WorkspaceEngineProvider } from './providers/flavour'; diff --git a/packages/common/infra/src/modules/workspace/testing/testing-provider.ts b/packages/common/infra/src/modules/workspace/testing/testing-provider.ts index 1f525d549d..9e8707be5e 100644 --- a/packages/common/infra/src/modules/workspace/testing/testing-provider.ts +++ b/packages/common/infra/src/modules/workspace/testing/testing-provider.ts @@ -14,7 +14,7 @@ import { import { MemoryBlobStorage } from '../../../sync/blob/blob'; import type { GlobalState } from '../../storage'; import type { WorkspaceProfileInfo } from '../entities/profile'; -import { globalBlockSuiteSchema } from '../global-schema'; +import { getAFFiNEWorkspaceSchema } from '../global-schema'; import type { WorkspaceMetadata } from '../metadata'; import type { WorkspaceEngineProvider, @@ -57,7 +57,7 @@ export class TestingWorkspaceLocalProvider const docCollection = new DocCollection({ id: id, idGenerator: () => nanoid(), - schema: globalBlockSuiteSchema, + schema: getAFFiNEWorkspaceSchema(), blobSources: { main: blobStorage, }, @@ -94,7 +94,7 @@ export class TestingWorkspaceLocalProvider const bs = new DocCollection({ id, - schema: globalBlockSuiteSchema, + schema: getAFFiNEWorkspaceSchema(), }); applyUpdate(bs.doc, data); diff --git a/packages/frontend/apps/electron/package.json b/packages/frontend/apps/electron/package.json index 910d28b46c..af53f9548f 100644 --- a/packages/frontend/apps/electron/package.json +++ b/packages/frontend/apps/electron/package.json @@ -51,7 +51,6 @@ "@types/uuid": "^10.0.0", "@vitejs/plugin-react-swc": "^3.6.0", "builder-util-runtime": "^9.2.5-alpha.2", - "core-js": "^3.36.1", "cross-env": "^7.0.3", "electron": "^32.0.0", "electron-log": "^5.1.2", diff --git a/packages/frontend/apps/electron/renderer/index.tsx b/packages/frontend/apps/electron/renderer/index.tsx index 61e4ea1ce2..83225c2488 100644 --- a/packages/frontend/apps/electron/renderer/index.tsx +++ b/packages/frontend/apps/electron/renderer/index.tsx @@ -1,5 +1,4 @@ -import './polyfill/dispose'; -import '@affine/core/bootstrap/preload'; +import './setup'; import './global.css'; import { appConfigProxy } from '@affine/core/hooks/use-app-config-storage'; diff --git a/packages/frontend/apps/electron/renderer/polyfill/dispose.ts b/packages/frontend/apps/electron/renderer/polyfill/dispose.ts deleted file mode 100644 index 615ed233c7..0000000000 --- a/packages/frontend/apps/electron/renderer/polyfill/dispose.ts +++ /dev/null @@ -1,2 +0,0 @@ -import 'core-js/modules/esnext.symbol.async-dispose'; -import 'core-js/modules/esnext.symbol.dispose'; diff --git a/packages/frontend/apps/electron/renderer/setup.ts b/packages/frontend/apps/electron/renderer/setup.ts new file mode 100644 index 0000000000..7fc0a00560 --- /dev/null +++ b/packages/frontend/apps/electron/renderer/setup.ts @@ -0,0 +1,4 @@ +import { setupBlocksuite, setupElectron } from '@affine/core/bootstrap'; + +setupElectron(); +setupBlocksuite(); diff --git a/packages/frontend/apps/electron/renderer/shell/index.tsx b/packages/frontend/apps/electron/renderer/shell/index.tsx index d9ee8332e1..32bd99232d 100644 --- a/packages/frontend/apps/electron/renderer/shell/index.tsx +++ b/packages/frontend/apps/electron/renderer/shell/index.tsx @@ -1,7 +1,7 @@ import '@affine/component/theme/global.css'; import '@affine/component/theme/theme.css'; -import '@affine/core/bootstrap/preload'; import '../global.css'; +import './setup'; import { ThemeProvider } from '@affine/component/theme-provider'; import { configureAppTabsHeaderModule } from '@affine/core/modules/app-tabs-header'; diff --git a/packages/frontend/apps/electron/renderer/shell/setup.ts b/packages/frontend/apps/electron/renderer/shell/setup.ts new file mode 100644 index 0000000000..91daffab1f --- /dev/null +++ b/packages/frontend/apps/electron/renderer/shell/setup.ts @@ -0,0 +1,3 @@ +import { setupElectron } from '@affine/core/bootstrap'; + +setupElectron(); diff --git a/packages/frontend/apps/mobile/package.json b/packages/frontend/apps/mobile/package.json index 1890ac42c2..0fb139af1a 100644 --- a/packages/frontend/apps/mobile/package.json +++ b/packages/frontend/apps/mobile/package.json @@ -21,9 +21,7 @@ "@sentry/react": "^8.0.0", "@toeverything/theme": "^1.0.9", "clsx": "^2.1.1", - "core-js": "^3.36.1", "figma-squircle": "^1.0.0", - "intl-segmenter-polyfill-rs": "^0.1.7", "jotai": "^2.9.3", "jotai-effect": "^1.0.2", "jotai-scope": "^0.7.2", diff --git a/packages/frontend/apps/mobile/src/index.tsx b/packages/frontend/apps/mobile/src/index.tsx index 5235ae8c13..f8106ecc2d 100644 --- a/packages/frontend/apps/mobile/src/index.tsx +++ b/packages/frontend/apps/mobile/src/index.tsx @@ -1,8 +1,4 @@ -import './polyfill/dispose'; -import './polyfill/intl-segmenter'; -import './polyfill/promise-with-resolvers'; -import './polyfill/request-idle-callback'; -import '@affine/core/bootstrap/preload'; +import './setup'; import { performanceLogger } from '@affine/core/shared'; import { diff --git a/packages/frontend/apps/mobile/src/polyfill/dispose.ts b/packages/frontend/apps/mobile/src/polyfill/dispose.ts deleted file mode 100644 index 615ed233c7..0000000000 --- a/packages/frontend/apps/mobile/src/polyfill/dispose.ts +++ /dev/null @@ -1,2 +0,0 @@ -import 'core-js/modules/esnext.symbol.async-dispose'; -import 'core-js/modules/esnext.symbol.dispose'; diff --git a/packages/frontend/apps/mobile/src/polyfill/intl-segmenter.ts b/packages/frontend/apps/mobile/src/polyfill/intl-segmenter.ts deleted file mode 100644 index f493cd793e..0000000000 --- a/packages/frontend/apps/mobile/src/polyfill/intl-segmenter.ts +++ /dev/null @@ -1,11 +0,0 @@ -if (Intl.Segmenter === undefined) { - await import('intl-segmenter-polyfill-rs').then(({ Segmenter }) => { - Object.defineProperty(Intl, 'Segmenter', { - value: Segmenter, - configurable: true, - writable: true, - }); - }); -} - -export {}; diff --git a/packages/frontend/apps/mobile/src/polyfill/promise-with-resolvers.ts b/packages/frontend/apps/mobile/src/polyfill/promise-with-resolvers.ts deleted file mode 100644 index 6d806c3a08..0000000000 --- a/packages/frontend/apps/mobile/src/polyfill/promise-with-resolvers.ts +++ /dev/null @@ -1 +0,0 @@ -import 'core-js/features/promise/with-resolvers'; diff --git a/packages/frontend/apps/mobile/src/polyfill/request-idle-callback.ts b/packages/frontend/apps/mobile/src/polyfill/request-idle-callback.ts deleted file mode 100644 index e3156d20df..0000000000 --- a/packages/frontend/apps/mobile/src/polyfill/request-idle-callback.ts +++ /dev/null @@ -1,19 +0,0 @@ -window.requestIdleCallback = - window.requestIdleCallback || - function (cb) { - const start = Date.now(); - return setTimeout(function () { - cb({ - didTimeout: false, - timeRemaining: function () { - return Math.max(0, 50 - (Date.now() - start)); - }, - }); - }, 1); - }; - -window.cancelIdleCallback = - window.cancelIdleCallback || - function (id) { - clearTimeout(id); - }; diff --git a/packages/frontend/apps/mobile/src/setup.ts b/packages/frontend/apps/mobile/src/setup.ts new file mode 100644 index 0000000000..ccdc886822 --- /dev/null +++ b/packages/frontend/apps/mobile/src/setup.ts @@ -0,0 +1,4 @@ +import { setupBlocksuite, setupBrowser } from '@affine/core/bootstrap'; + +await setupBrowser(); +setupBlocksuite(); diff --git a/packages/frontend/apps/web/package.json b/packages/frontend/apps/web/package.json index e1449e942d..cef7845207 100644 --- a/packages/frontend/apps/web/package.json +++ b/packages/frontend/apps/web/package.json @@ -17,8 +17,6 @@ "@affine/i18n": "workspace:*", "@emotion/react": "^11.11.4", "@sentry/react": "^8.0.0", - "core-js": "^3.36.1", - "intl-segmenter-polyfill-rs": "^0.1.7", "jotai": "^2.8.0", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/packages/frontend/apps/web/src/index.tsx b/packages/frontend/apps/web/src/index.tsx index e0c1690bf2..44d86cb6ac 100644 --- a/packages/frontend/apps/web/src/index.tsx +++ b/packages/frontend/apps/web/src/index.tsx @@ -1,8 +1,4 @@ -import './polyfill/dispose'; -import './polyfill/intl-segmenter'; -import './polyfill/promise-with-resolvers'; -import './polyfill/request-idle-callback'; -import '@affine/core/bootstrap/preload'; +import './setup'; import { performanceLogger } from '@affine/core/shared'; import { appInfo } from '@affine/electron-api'; diff --git a/packages/frontend/apps/web/src/polyfill/dispose.ts b/packages/frontend/apps/web/src/polyfill/dispose.ts deleted file mode 100644 index 615ed233c7..0000000000 --- a/packages/frontend/apps/web/src/polyfill/dispose.ts +++ /dev/null @@ -1,2 +0,0 @@ -import 'core-js/modules/esnext.symbol.async-dispose'; -import 'core-js/modules/esnext.symbol.dispose'; diff --git a/packages/frontend/apps/web/src/polyfill/intl-segmenter.ts b/packages/frontend/apps/web/src/polyfill/intl-segmenter.ts deleted file mode 100644 index f493cd793e..0000000000 --- a/packages/frontend/apps/web/src/polyfill/intl-segmenter.ts +++ /dev/null @@ -1,11 +0,0 @@ -if (Intl.Segmenter === undefined) { - await import('intl-segmenter-polyfill-rs').then(({ Segmenter }) => { - Object.defineProperty(Intl, 'Segmenter', { - value: Segmenter, - configurable: true, - writable: true, - }); - }); -} - -export {}; diff --git a/packages/frontend/apps/web/src/polyfill/promise-with-resolvers.ts b/packages/frontend/apps/web/src/polyfill/promise-with-resolvers.ts deleted file mode 100644 index 6d806c3a08..0000000000 --- a/packages/frontend/apps/web/src/polyfill/promise-with-resolvers.ts +++ /dev/null @@ -1 +0,0 @@ -import 'core-js/features/promise/with-resolvers'; diff --git a/packages/frontend/apps/web/src/polyfill/request-idle-callback.ts b/packages/frontend/apps/web/src/polyfill/request-idle-callback.ts deleted file mode 100644 index e3156d20df..0000000000 --- a/packages/frontend/apps/web/src/polyfill/request-idle-callback.ts +++ /dev/null @@ -1,19 +0,0 @@ -window.requestIdleCallback = - window.requestIdleCallback || - function (cb) { - const start = Date.now(); - return setTimeout(function () { - cb({ - didTimeout: false, - timeRemaining: function () { - return Math.max(0, 50 - (Date.now() - start)); - }, - }); - }, 1); - }; - -window.cancelIdleCallback = - window.cancelIdleCallback || - function (id) { - clearTimeout(id); - }; diff --git a/packages/frontend/apps/web/src/setup.ts b/packages/frontend/apps/web/src/setup.ts new file mode 100644 index 0000000000..ccdc886822 --- /dev/null +++ b/packages/frontend/apps/web/src/setup.ts @@ -0,0 +1,4 @@ +import { setupBlocksuite, setupBrowser } from '@affine/core/bootstrap'; + +await setupBrowser(); +setupBlocksuite(); diff --git a/packages/frontend/core/package.json b/packages/frontend/core/package.json index 491cfcf55b..88f2360fa2 100644 --- a/packages/frontend/core/package.json +++ b/packages/frontend/core/package.json @@ -4,7 +4,8 @@ "private": true, "version": "0.16.0", "exports": { - "./*": "./src/*" + "./*": "./src/*", + "./bootstrap": "./src/bootstrap/index.ts" }, "dependencies": { "@affine-test/fixtures": "workspace:*", @@ -52,6 +53,7 @@ "bytes": "^3.1.2", "clsx": "^2.1.0", "cmdk": "^1.0.0", + "core-js": "^3.36.1", "css-spring": "^4.1.0", "dayjs": "^1.11.10", "file-type": "^19.1.0", @@ -65,6 +67,7 @@ "idb": "^8.0.0", "idb-keyval": "^6.2.1", "image-blob-reduce": "^4.1.0", + "intl-segmenter-polyfill-rs": "^0.1.7", "is-svg": "^5.0.0", "jotai": "^2.8.0", "jotai-devtools": "^0.10.0", diff --git a/packages/frontend/core/src/bootstrap/app.ts b/packages/frontend/core/src/bootstrap/app.ts new file mode 100644 index 0000000000..2a1ead92b4 --- /dev/null +++ b/packages/frontend/core/src/bootstrap/app.ts @@ -0,0 +1,4 @@ +import '@affine/env/constant'; +import '../types/types.d.ts'; + +export { setupGlobal as setupEnvironment } from '@affine/env/global'; diff --git a/packages/frontend/core/src/bootstrap/edgeless-template.ts b/packages/frontend/core/src/bootstrap/blocksuite.ts similarity index 56% rename from packages/frontend/core/src/bootstrap/edgeless-template.ts rename to packages/frontend/core/src/bootstrap/blocksuite.ts index 9a19ddc7b5..2ee114d1c9 100644 --- a/packages/frontend/core/src/bootstrap/edgeless-template.ts +++ b/packages/frontend/core/src/bootstrap/blocksuite.ts @@ -3,9 +3,11 @@ import { builtInTemplates as builtInStickersTemplates } from '@affine/templates/ import type { TemplateManager } from '@blocksuite/blocks'; import { EdgelessTemplatePanel } from '@blocksuite/blocks'; -EdgelessTemplatePanel.templates.extend( - builtInStickersTemplates as TemplateManager -); -EdgelessTemplatePanel.templates.extend( - builtInEdgelessTemplates as TemplateManager -); +export function setupBlocksuite() { + EdgelessTemplatePanel.templates.extend( + builtInStickersTemplates as TemplateManager + ); + EdgelessTemplatePanel.templates.extend( + builtInEdgelessTemplates as TemplateManager + ); +} diff --git a/packages/frontend/core/src/bootstrap/index.ts b/packages/frontend/core/src/bootstrap/index.ts new file mode 100644 index 0000000000..d70f4baa94 --- /dev/null +++ b/packages/frontend/core/src/bootstrap/index.ts @@ -0,0 +1,16 @@ +import '../types/types.d.ts'; + +import { setupEnvironment } from './app'; +import { polyfillBrowser, polyfillElectron } from './polyfill'; + +export function setupElectron() { + polyfillElectron(); + setupEnvironment(); +} + +export async function setupBrowser() { + await polyfillBrowser(); + setupEnvironment(); +} + +export { setupBlocksuite } from './blocksuite'; diff --git a/packages/frontend/core/src/bootstrap/polyfill/dispose.ts b/packages/frontend/core/src/bootstrap/polyfill/dispose.ts new file mode 100644 index 0000000000..8a6f636592 --- /dev/null +++ b/packages/frontend/core/src/bootstrap/polyfill/dispose.ts @@ -0,0 +1,8 @@ +export async function polyfillDispose() { + if (typeof Symbol.dispose !== 'symbol') { + // @ts-expect-error ignore + await import('core-js/modules/esnext.symbol.async-dispose'); + // @ts-expect-error ignore + await import('core-js/modules/esnext.symbol.dispose'); + } +} diff --git a/packages/frontend/core/src/bootstrap/polyfill/index.ts b/packages/frontend/core/src/bootstrap/polyfill/index.ts new file mode 100644 index 0000000000..722804d38c --- /dev/null +++ b/packages/frontend/core/src/bootstrap/polyfill/index.ts @@ -0,0 +1,17 @@ +import { polyfillDispose } from './dispose'; +import { polyfillI18n } from './intl-segmenter'; +import { polyfillPromise } from './promise-with-resolvers'; +import { polyfillEventLoop } from './request-idle-callback'; +import { polyfillResizeObserver } from './resize-observer'; + +export function polyfillElectron() { + polyfillResizeObserver(); +} + +export async function polyfillBrowser() { + polyfillResizeObserver(); + polyfillEventLoop(); + await polyfillI18n(); + await polyfillPromise(); + await polyfillDispose(); +} diff --git a/packages/frontend/core/src/bootstrap/polyfill/intl-segmenter.ts b/packages/frontend/core/src/bootstrap/polyfill/intl-segmenter.ts new file mode 100644 index 0000000000..2ba5f5fe22 --- /dev/null +++ b/packages/frontend/core/src/bootstrap/polyfill/intl-segmenter.ts @@ -0,0 +1,11 @@ +export async function polyfillI18n() { + if (Intl.Segmenter === undefined) { + await import('intl-segmenter-polyfill-rs').then(({ Segmenter }) => { + Object.defineProperty(Intl, 'Segmenter', { + value: Segmenter, + configurable: true, + writable: true, + }); + }); + } +} diff --git a/packages/frontend/core/src/bootstrap/polyfill/promise-with-resolvers.ts b/packages/frontend/core/src/bootstrap/polyfill/promise-with-resolvers.ts new file mode 100644 index 0000000000..d9c2cef52f --- /dev/null +++ b/packages/frontend/core/src/bootstrap/polyfill/promise-with-resolvers.ts @@ -0,0 +1,6 @@ +export async function polyfillPromise() { + if (typeof Promise.withResolvers !== 'function') { + // @ts-expect-error ignore + await import('core-js/features/promise/with-resolvers'); + } +} diff --git a/packages/frontend/core/src/bootstrap/polyfill/request-idle-callback.ts b/packages/frontend/core/src/bootstrap/polyfill/request-idle-callback.ts new file mode 100644 index 0000000000..98b99e828c --- /dev/null +++ b/packages/frontend/core/src/bootstrap/polyfill/request-idle-callback.ts @@ -0,0 +1,21 @@ +export function polyfillEventLoop() { + window.requestIdleCallback = + window.requestIdleCallback || + function (cb) { + const start = Date.now(); + return setTimeout(function () { + cb({ + didTimeout: false, + timeRemaining: function () { + return Math.max(0, 50 - (Date.now() - start)); + }, + }); + }, 1); + }; + + window.cancelIdleCallback = + window.cancelIdleCallback || + function (id) { + clearTimeout(id); + }; +} diff --git a/packages/frontend/core/src/bootstrap/polyfill/resize-observer.ts b/packages/frontend/core/src/bootstrap/polyfill/resize-observer.ts new file mode 100644 index 0000000000..6f878419f6 --- /dev/null +++ b/packages/frontend/core/src/bootstrap/polyfill/resize-observer.ts @@ -0,0 +1,5 @@ +import { ResizeObserver } from '@juggle/resize-observer'; + +export function polyfillResizeObserver() { + window.ResizeObserver = ResizeObserver; +} diff --git a/packages/frontend/core/src/bootstrap/preload.ts b/packages/frontend/core/src/bootstrap/preload.ts deleted file mode 100644 index 0a2a5f19c4..0000000000 --- a/packages/frontend/core/src/bootstrap/preload.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { ResizeObserver } from '@juggle/resize-observer'; -window.ResizeObserver = ResizeObserver; - -import '@affine/env/constant'; -import './edgeless-template'; - -import { setupGlobal } from '@affine/env/global'; - -setupGlobal(); - -import '../types/types.d.ts'; diff --git a/packages/frontend/core/src/components/affine/page-history-modal/data.ts b/packages/frontend/core/src/components/affine/page-history-modal/data.ts index feb6e40beb..e50d7e06de 100644 --- a/packages/frontend/core/src/components/affine/page-history-modal/data.ts +++ b/packages/frontend/core/src/components/affine/page-history-modal/data.ts @@ -6,7 +6,7 @@ import { listHistoryQuery, recoverDocMutation } from '@affine/graphql'; import { i18nTime } from '@affine/i18n'; import { assertEquals } from '@blocksuite/global/utils'; import { DocCollection } from '@blocksuite/store'; -import { globalBlockSuiteSchema } from '@toeverything/infra'; +import { getAFFiNEWorkspaceSchema } from '@toeverything/infra'; import { useEffect, useMemo } from 'react'; import useSWRImmutable from 'swr/immutable'; import { @@ -108,7 +108,7 @@ const getOrCreateShellWorkspace = (workspaceId: string) => { blobSources: { main: blobStorage, }, - schema: globalBlockSuiteSchema, + schema: getAFFiNEWorkspaceSchema(), }); docCollectionMap.set(workspaceId, docCollection); docCollection.doc.emit('sync', [true, docCollection.doc]); diff --git a/packages/frontend/core/src/components/blocksuite/block-suite-header/journal/date-picker.tsx b/packages/frontend/core/src/components/blocksuite/block-suite-header/journal/date-picker.tsx index 708f39b01c..22c23a58e5 100644 --- a/packages/frontend/core/src/components/blocksuite/block-suite-header/journal/date-picker.tsx +++ b/packages/frontend/core/src/components/blocksuite/block-suite-header/journal/date-picker.tsx @@ -4,8 +4,7 @@ import { useJournalInfoHelper, useJournalRouteHelper, } from '@affine/core/hooks/use-journal'; -import type { DocCollection } from '@affine/core/shared'; -import type { Doc } from '@blocksuite/store'; +import type { Doc, DocCollection } from '@blocksuite/store'; import dayjs from 'dayjs'; import { useEffect, useRef, useState } from 'react'; diff --git a/packages/frontend/core/src/components/blocksuite/block-suite-header/journal/today-button.tsx b/packages/frontend/core/src/components/blocksuite/block-suite-header/journal/today-button.tsx index 6ea614161d..628988fddf 100644 --- a/packages/frontend/core/src/components/blocksuite/block-suite-header/journal/today-button.tsx +++ b/packages/frontend/core/src/components/blocksuite/block-suite-header/journal/today-button.tsx @@ -1,7 +1,7 @@ import { Button } from '@affine/component'; import { useJournalRouteHelper } from '@affine/core/hooks/use-journal'; -import type { DocCollection } from '@affine/core/shared'; import { useI18n } from '@affine/i18n'; +import type { DocCollection } from '@blocksuite/store'; import { useCallback } from 'react'; export interface JournalTodayButtonProps { diff --git a/packages/frontend/core/src/components/blocksuite/block-suite-page-list/utils.tsx b/packages/frontend/core/src/components/blocksuite/block-suite-page-list/utils.tsx index 941d7942cd..0ffa280e02 100644 --- a/packages/frontend/core/src/components/blocksuite/block-suite-page-list/utils.tsx +++ b/packages/frontend/core/src/components/blocksuite/block-suite-page-list/utils.tsx @@ -1,11 +1,10 @@ import { toast } from '@affine/component'; import { WorkbenchService } from '@affine/core/modules/workbench'; import type { DocMode } from '@blocksuite/blocks'; +import type { DocCollection } from '@blocksuite/store'; import { DocsService, useServices } from '@toeverything/infra'; import { useCallback, useMemo } from 'react'; -import type { DocCollection } from '../../../shared'; - export const usePageHelper = (docCollection: DocCollection) => { const { docsService, workbenchService } = useServices({ DocsService, diff --git a/packages/frontend/core/src/components/root-app-sidebar/import-page.tsx b/packages/frontend/core/src/components/root-app-sidebar/import-page.tsx index 95a3f1e3ca..987a132e89 100644 --- a/packages/frontend/core/src/components/root-app-sidebar/import-page.tsx +++ b/packages/frontend/core/src/components/root-app-sidebar/import-page.tsx @@ -2,8 +2,8 @@ import { useAsyncCallback } from '@affine/core/hooks/affine-async-hooks'; import { track } from '@affine/core/mixpanel'; import { useI18n } from '@affine/i18n'; import { ImportIcon } from '@blocksuite/icons/rc'; +import type { DocCollection } from '@blocksuite/store'; -import type { DocCollection } from '../../shared'; import { MenuItem } from '../app-sidebar'; import { usePageHelper } from '../blocksuite/block-suite-page-list/utils'; diff --git a/packages/frontend/core/src/components/root-app-sidebar/journal-button.tsx b/packages/frontend/core/src/components/root-app-sidebar/journal-button.tsx index 37f3fc5346..235a3871fc 100644 --- a/packages/frontend/core/src/components/root-app-sidebar/journal-button.tsx +++ b/packages/frontend/core/src/components/root-app-sidebar/journal-button.tsx @@ -4,10 +4,10 @@ import { useJournalRouteHelper, } from '@affine/core/hooks/use-journal'; import { WorkbenchService } from '@affine/core/modules/workbench'; -import type { DocCollection } from '@affine/core/shared'; import { isNewTabTrigger } from '@affine/core/utils'; import { useI18n } from '@affine/i18n'; import { TodayIcon, TomorrowIcon, YesterdayIcon } from '@blocksuite/icons/rc'; +import type { DocCollection } from '@blocksuite/store'; import { useLiveData, useService } from '@toeverything/infra'; import { type MouseEvent } from 'react'; diff --git a/packages/frontend/core/src/hooks/affine/use-reference-link-helper.ts b/packages/frontend/core/src/hooks/affine/use-reference-link-helper.ts index e90d18b7c7..6f2a9150b6 100644 --- a/packages/frontend/core/src/hooks/affine/use-reference-link-helper.ts +++ b/packages/frontend/core/src/hooks/affine/use-reference-link-helper.ts @@ -1,7 +1,6 @@ +import type { DocCollection } from '@blocksuite/store'; import { useCallback } from 'react'; -import type { DocCollection } from '../../shared'; - export function useReferenceLinkHelper(docCollection: DocCollection) { const addReferenceLink = useCallback( (pageId: string, referenceId: string) => { diff --git a/packages/frontend/core/src/hooks/use-journal.ts b/packages/frontend/core/src/hooks/use-journal.ts index 9125e6a082..4e41fde1ff 100644 --- a/packages/frontend/core/src/hooks/use-journal.ts +++ b/packages/frontend/core/src/hooks/use-journal.ts @@ -1,11 +1,11 @@ import { i18nTime } from '@affine/i18n'; +import type { DocCollection } from '@blocksuite/store'; import { DocsService, initEmptyPage, useService } from '@toeverything/infra'; import dayjs from 'dayjs'; import { useCallback, useMemo } from 'react'; import { track } from '../mixpanel'; import { WorkbenchService } from '../modules/workbench'; -import type { DocCollection } from '../shared'; import { useCurrentWorkspacePropertiesAdapter } from './use-affine-adapter'; import { useDocCollectionHelper } from './use-block-suite-workspace-helper'; diff --git a/packages/frontend/core/src/modules/workspace-engine/impls/cloud.ts b/packages/frontend/core/src/modules/workspace-engine/impls/cloud.ts index e66672aad8..30610c30f8 100644 --- a/packages/frontend/core/src/modules/workspace-engine/impls/cloud.ts +++ b/packages/frontend/core/src/modules/workspace-engine/impls/cloud.ts @@ -24,7 +24,7 @@ import { type WorkspaceMetadata, type WorkspaceProfileInfo, } from '@toeverything/infra'; -import { effect, globalBlockSuiteSchema, Service } from '@toeverything/infra'; +import { effect, getAFFiNEWorkspaceSchema, Service } from '@toeverything/infra'; import { isEqual } from 'lodash-es'; import { nanoid } from 'nanoid'; import { EMPTY, map, mergeMap } from 'rxjs'; @@ -96,7 +96,7 @@ export class CloudWorkspaceFlavourProviderService const docCollection = new DocCollection({ id: workspaceId, idGenerator: () => nanoid(), - schema: globalBlockSuiteSchema, + schema: getAFFiNEWorkspaceSchema(), blobSources: { main: blobStorage, }, @@ -216,7 +216,7 @@ export class CloudWorkspaceFlavourProviderService const bs = new DocCollection({ id, - schema: globalBlockSuiteSchema, + schema: getAFFiNEWorkspaceSchema(), }); if (localData) applyUpdate(bs.doc, localData); diff --git a/packages/frontend/core/src/modules/workspace-engine/impls/local.ts b/packages/frontend/core/src/modules/workspace-engine/impls/local.ts index 208fefc4f7..f48e867c21 100644 --- a/packages/frontend/core/src/modules/workspace-engine/impls/local.ts +++ b/packages/frontend/core/src/modules/workspace-engine/impls/local.ts @@ -9,7 +9,11 @@ import type { WorkspaceMetadata, WorkspaceProfileInfo, } from '@toeverything/infra'; -import { globalBlockSuiteSchema, LiveData, Service } from '@toeverything/infra'; +import { + getAFFiNEWorkspaceSchema, + LiveData, + Service, +} from '@toeverything/infra'; import { isEqual } from 'lodash-es'; import { nanoid } from 'nanoid'; import { Observable } from 'rxjs'; @@ -70,7 +74,7 @@ export class LocalWorkspaceFlavourProvider const docCollection = new DocCollection({ id: id, idGenerator: () => nanoid(), - schema: globalBlockSuiteSchema, + schema: getAFFiNEWorkspaceSchema(), blobSources: { main: blobStorage }, }); @@ -143,7 +147,7 @@ export class LocalWorkspaceFlavourProvider const bs = new DocCollection({ id, - schema: globalBlockSuiteSchema, + schema: getAFFiNEWorkspaceSchema(), }); if (localData) applyUpdate(bs.doc, localData); diff --git a/packages/frontend/core/src/shared/index.ts b/packages/frontend/core/src/shared/index.ts index aff2ee6263..2b1e3af440 100644 --- a/packages/frontend/core/src/shared/index.ts +++ b/packages/frontend/core/src/shared/index.ts @@ -1,7 +1,4 @@ import { DebugLogger } from '@affine/debug'; -import { DocCollection } from '@blocksuite/store'; - -export { DocCollection }; export enum WorkspaceSubPath { ALL = 'all', diff --git a/yarn.lock b/yarn.lock index 49d07c2ec3..92044da738 100644 --- a/yarn.lock +++ b/yarn.lock @@ -462,6 +462,7 @@ __metadata: bytes: "npm:^3.1.2" clsx: "npm:^2.1.0" cmdk: "npm:^1.0.0" + core-js: "npm:^3.36.1" css-spring: "npm:^4.1.0" dayjs: "npm:^1.11.10" express: "npm:^4.19.2" @@ -477,6 +478,7 @@ __metadata: idb: "npm:^8.0.0" idb-keyval: "npm:^6.2.1" image-blob-reduce: "npm:^4.1.0" + intl-segmenter-polyfill-rs: "npm:^0.1.7" is-svg: "npm:^5.0.0" jotai: "npm:^2.8.0" jotai-devtools: "npm:^0.10.0" @@ -576,7 +578,6 @@ __metadata: "@vitejs/plugin-react-swc": "npm:^3.6.0" async-call-rpc: "npm:^6.4.2" builder-util-runtime: "npm:^9.2.5-alpha.2" - core-js: "npm:^3.36.1" cross-env: "npm:^7.0.3" electron: "npm:^32.0.0" electron-log: "npm:^5.1.2" @@ -683,10 +684,8 @@ __metadata: "@vanilla-extract/css": "npm:^1.15.5" "@vanilla-extract/dynamic": "npm:^2.1.2" clsx: "npm:^2.1.1" - core-js: "npm:^3.36.1" cross-env: "npm:^7.0.3" figma-squircle: "npm:^1.0.0" - intl-segmenter-polyfill-rs: "npm:^0.1.7" jotai: "npm:^2.9.3" jotai-effect: "npm:^1.0.2" jotai-scope: "npm:^0.7.2" @@ -929,9 +928,7 @@ __metadata: "@sentry/react": "npm:^8.0.0" "@types/react": "npm:^18.2.75" "@types/react-dom": "npm:^18.2.24" - core-js: "npm:^3.36.1" cross-env: "npm:^7.0.3" - intl-segmenter-polyfill-rs: "npm:^0.1.7" jotai: "npm:^2.8.0" react: "npm:^18.2.0" react-dom: "npm:^18.2.0"