From 1abab690af75214ae7a053eddac1cd18f5ef6f56 Mon Sep 17 00:00:00 2001 From: Himself65 Date: Wed, 1 Mar 2023 19:26:55 -0600 Subject: [PATCH] feat: init `@affine/env` (#1243) --- apps/web/next.config.mjs | 1 + apps/web/package.json | 1 + apps/web/src/blocksuite/index.ts | 3 +- .../blocksuite/block-suite-editor/index.tsx | 3 +- .../components/blocksuite/header/utils.tsx | 35 ++-- .../pure/quick-search-modal/index.tsx | 5 +- .../components/pure/shortcuts-modal/index.tsx | 5 +- apps/web/src/hooks/use-workspaces.ts | 2 +- apps/web/src/pages/_app.tsx | 4 +- apps/web/src/plugins/local/index.tsx | 2 +- apps/web/src/shared/apis.ts | 3 +- apps/web/src/shared/env.ts | 44 ----- apps/web/src/types/index.ts | 17 -- apps/web/src/utils/get-is-mobile.ts | 18 --- packages/env/package.json | 12 ++ packages/env/src/index.ts | 146 +++++++++++++++++ .../env/src/ua-helper.ts | 18 ++- pnpm-lock.yaml | 150 +++++++++++++++--- tsconfig.json | 6 +- 19 files changed, 338 insertions(+), 137 deletions(-) delete mode 100644 apps/web/src/shared/env.ts delete mode 100644 apps/web/src/types/index.ts delete mode 100644 apps/web/src/utils/get-is-mobile.ts create mode 100644 packages/env/package.json create mode 100644 packages/env/src/index.ts rename apps/web/src/utils/useragent.ts => packages/env/src/ua-helper.ts (80%) diff --git a/apps/web/next.config.mjs b/apps/web/next.config.mjs index cd3411f244..29e6e52669 100644 --- a/apps/web/next.config.mjs +++ b/apps/web/next.config.mjs @@ -61,6 +61,7 @@ const nextConfig = { '@affine/component', '@affine/datacenter', '@affine/i18n', + '@affine/env', ], publicRuntimeConfig: { PROJECT_NAME: process.env.npm_package_name, diff --git a/apps/web/package.json b/apps/web/package.json index ec109a2ef7..f0053712dc 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -11,6 +11,7 @@ "dependencies": { "@affine/component": "workspace:*", "@affine/datacenter": "workspace:*", + "@affine/env": "workspace:*", "@affine/i18n": "workspace:*", "@blocksuite/blocks": "0.4.1-20230220214107-0a354de", "@blocksuite/editor": "0.4.1-20230220214107-0a354de", diff --git a/apps/web/src/blocksuite/index.ts b/apps/web/src/blocksuite/index.ts index 7c35dd8d95..51ad3c6446 100644 --- a/apps/web/src/blocksuite/index.ts +++ b/apps/web/src/blocksuite/index.ts @@ -1,5 +1,6 @@ +import { config } from '@affine/env'; + import { BlockSuiteWorkspace, Provider } from '../shared'; -import { config } from '../shared/env'; import { createBroadCastChannelProvider, createIndexedDBProvider, diff --git a/apps/web/src/components/blocksuite/block-suite-editor/index.tsx b/apps/web/src/components/blocksuite/block-suite-editor/index.tsx index 5ba4d7dd0d..522cdd754e 100644 --- a/apps/web/src/components/blocksuite/block-suite-editor/index.tsx +++ b/apps/web/src/components/blocksuite/block-suite-editor/index.tsx @@ -1,3 +1,4 @@ +import { config } from '@affine/env'; import { BlockHub } from '@blocksuite/blocks'; import { EditorContainer } from '@blocksuite/editor'; import type { Page } from '@blocksuite/store'; @@ -5,7 +6,6 @@ import { assertExists } from '@blocksuite/store'; import { useEffect, useRef } from 'react'; import { BlockSuiteWorkspace } from '../../../shared'; -import { config } from '../../../shared/env'; export type EditorProps = { blockSuiteWorkspace: BlockSuiteWorkspace; @@ -81,7 +81,6 @@ export const BlockSuiteEditor = (props: EditorProps) => { page.resetHistory(); } } - if (config.exposeInternal) { globalThis.currentBlockSuiteWorkspace = props.blockSuiteWorkspace; globalThis.currentPage = page; diff --git a/apps/web/src/components/blocksuite/header/utils.tsx b/apps/web/src/components/blocksuite/header/utils.tsx index 97b98f068f..d5b1f82f7f 100644 --- a/apps/web/src/components/blocksuite/header/utils.tsx +++ b/apps/web/src/components/blocksuite/header/utils.tsx @@ -1,26 +1,20 @@ +import { getEnvironment } from '@affine/env'; import { Trans, useTranslation } from '@affine/i18n'; import React, { useEffect, useState } from 'react'; -import { getIsMobile } from '../../../utils/get-is-mobile'; - -// Inspire by https://stackoverflow.com/a/4900484/8415727 -const getChromeVersion = () => { - const raw = navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./); - return raw ? parseInt(raw[2], 10) : false; -}; -const getIsChrome = () => { - return ( - /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor) - ); -}; const minimumChromeVersion = 102; export const shouldShowWarning = () => { - return ( - !window.CLIENT_APP && - !getIsMobile() && - (!getIsChrome() || getChromeVersion() < minimumChromeVersion) - ); + const env = getEnvironment(); + if (!env.isBrowser) { + // disable in SSR + return false; + } + if (env.isChrome) { + return env.chromeVersion < minimumChromeVersion; + } else { + return !env.isMobile; + } }; export const OSWarningMessage: React.FC = () => { @@ -28,8 +22,11 @@ export const OSWarningMessage: React.FC = () => { const [notChrome, setNotChrome] = useState(false); const [notGoodVersion, setNotGoodVersion] = useState(false); useEffect(() => { - setNotChrome(getIsChrome()); - setNotGoodVersion(getChromeVersion() < minimumChromeVersion); + const env = getEnvironment(); + setNotChrome(env.isBrowser && !env.isChrome); + setNotGoodVersion( + env.isBrowser && env.isChrome && env.chromeVersion < minimumChromeVersion + ); }, []); if (notChrome) { return ( diff --git a/apps/web/src/components/pure/quick-search-modal/index.tsx b/apps/web/src/components/pure/quick-search-modal/index.tsx index 1d40bf8548..270614bf25 100644 --- a/apps/web/src/components/pure/quick-search-modal/index.tsx +++ b/apps/web/src/components/pure/quick-search-modal/index.tsx @@ -1,4 +1,5 @@ import { Modal, ModalWrapper } from '@affine/component'; +import { getEnvironment } from '@affine/env'; import { Command } from 'cmdk'; import { NextRouter } from 'next/router'; import React, { @@ -10,7 +11,6 @@ import React, { } from 'react'; import { BlockSuiteWorkspace } from '../../../shared'; -import { getUaHelper } from '../../../utils/useragent'; import { Footer } from './Footer'; import { Input } from './Input'; import { PublishedResults } from './PublishedResults'; @@ -24,7 +24,8 @@ import { } from './style'; const isMac = () => { - return getUaHelper().isMacOs; + const env = getEnvironment(); + return env.isBrowser && env.isMacOs; }; export type QuickSearchModalProps = { diff --git a/apps/web/src/components/pure/shortcuts-modal/index.tsx b/apps/web/src/components/pure/shortcuts-modal/index.tsx index 8d89ba0eec..d21992db44 100644 --- a/apps/web/src/components/pure/shortcuts-modal/index.tsx +++ b/apps/web/src/components/pure/shortcuts-modal/index.tsx @@ -3,10 +3,10 @@ import { MuiClickAwayListener, MuiSlide, } from '@affine/component'; +import { getEnvironment } from '@affine/env'; import { useTranslation } from '@affine/i18n'; import { useEffect, useState } from 'react'; -import { getUaHelper } from '../../../utils/useragent'; import { useMacKeyboardShortcuts, useMacMarkdownShortcuts, @@ -27,7 +27,8 @@ type ModalProps = { }; const checkIsMac = () => { - return getUaHelper().isMacOs; + const env = getEnvironment(); + return env.isBrowser && env.isMacOs; }; export const ShortcutsModal = ({ open, onClose }: ModalProps) => { diff --git a/apps/web/src/hooks/use-workspaces.ts b/apps/web/src/hooks/use-workspaces.ts index e839897855..ad27aaacab 100644 --- a/apps/web/src/hooks/use-workspaces.ts +++ b/apps/web/src/hooks/use-workspaces.ts @@ -1,4 +1,5 @@ import { Workspace } from '@affine/datacenter'; +import { config } from '@affine/env'; import { nanoid } from '@blocksuite/store'; import { useCallback, useMemo, useSyncExternalStore } from 'react'; import useSWR from 'swr'; @@ -10,7 +11,6 @@ import { WorkspacePlugins } from '../plugins'; import { QueryKey } from '../plugins/affine/fetcher'; import { kStoreKey } from '../plugins/local'; import { LocalWorkspace, RemWorkspace, RemWorkspaceFlavour } from '../shared'; -import { config } from '../shared/env'; import { createEmptyBlockSuiteWorkspace } from '../utils'; // fixme(himself65): refactor with jotai atom using async diff --git a/apps/web/src/pages/_app.tsx b/apps/web/src/pages/_app.tsx index 2539dc4add..5ea86813fa 100644 --- a/apps/web/src/pages/_app.tsx +++ b/apps/web/src/pages/_app.tsx @@ -1,6 +1,7 @@ import '@blocksuite/editor/themes/affine.css'; import '../styles/globals.css'; +import { config, setupGlobal } from '@affine/env'; import { createI18n, I18nextProvider } from '@affine/i18n'; import createCache from '@emotion/cache'; import { CacheProvider } from '@emotion/react'; @@ -20,7 +21,8 @@ import { AffineSWRConfigProvider } from '../providers/AffineSWRConfigProvider'; import { ModalProvider } from '../providers/ModalProvider'; import { ThemeProvider } from '../providers/ThemeProvider'; import { NextPageWithLayout } from '../shared'; -import { config } from '../shared/env'; + +setupGlobal(); type AppPropsWithLayout = AppProps & { Component: NextPageWithLayout; diff --git a/apps/web/src/plugins/local/index.tsx b/apps/web/src/plugins/local/index.tsx index 4c790b84ca..80cfbc5375 100644 --- a/apps/web/src/plugins/local/index.tsx +++ b/apps/web/src/plugins/local/index.tsx @@ -1,3 +1,4 @@ +import { config } from '@affine/env'; import { assertEquals, nanoid } from '@blocksuite/store'; import React from 'react'; import { IndexeddbPersistence } from 'y-indexeddb'; @@ -12,7 +13,6 @@ import { LocalWorkspace, RemWorkspaceFlavour, } from '../../shared'; -import { config } from '../../shared/env'; import { createEmptyBlockSuiteWorkspace } from '../../utils'; import { WorkspacePlugin } from '..'; diff --git a/apps/web/src/shared/apis.ts b/apps/web/src/shared/apis.ts index 692f6bdfea..bd30f5f159 100644 --- a/apps/web/src/shared/apis.ts +++ b/apps/web/src/shared/apis.ts @@ -4,8 +4,7 @@ import { getApis, GoogleAuth, } from '@affine/datacenter'; - -import { config } from './env'; +import { config } from '@affine/env'; let prefixUrl = '/'; if (typeof window === 'undefined') { diff --git a/apps/web/src/shared/env.ts b/apps/web/src/shared/env.ts deleted file mode 100644 index c06c8483f7..0000000000 --- a/apps/web/src/shared/env.ts +++ /dev/null @@ -1,44 +0,0 @@ -import getConfig from 'next/config'; - -import { PublicRuntimeConfig, publicRuntimeConfigSchema } from '../types'; - -const { publicRuntimeConfig: config } = getConfig() as { - publicRuntimeConfig: PublicRuntimeConfig; -}; - -publicRuntimeConfigSchema.parse(config); - -const printBuildInfo = () => { - console.group('Build info'); - console.log('Project:', config.PROJECT_NAME); - console.log( - 'Build date:', - config.BUILD_DATE ? new Date(config.BUILD_DATE).toLocaleString() : 'Unknown' - ); - console.log('Editor Version:', config.editorVersion); - - console.log('Version:', config.gitVersion); - console.log( - 'AFFiNE is an open source project, you can view its source code on GitHub!' - ); - console.log(`https://github.com/toeverything/AFFiNE/tree/${config.hash}`); - console.groupEnd(); -}; - -function setWindowEditorVersion() { - // @ts-ignore - globalThis.__editoVersion = config.editorVersion; -} - -declare global { - // eslint-disable-next-line no-var - var __affineSetupEnv: boolean | undefined; -} - -if (typeof window !== 'undefined' && !globalThis.__affineSetupEnv) { - printBuildInfo(); - setWindowEditorVersion(); - globalThis.__affineSetupEnv = true; -} - -export { config }; diff --git a/apps/web/src/types/index.ts b/apps/web/src/types/index.ts deleted file mode 100644 index cafdd95172..0000000000 --- a/apps/web/src/types/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { z } from 'zod'; - -export const publicRuntimeConfigSchema = z.object({ - PROJECT_NAME: z.string(), - BUILD_DATE: z.string(), - gitVersion: z.string(), - hash: z.string(), - serverAPI: z.string(), - editorVersion: z.string(), - enableIndexedDBProvider: z.boolean(), - enableBroadCastChannelProvider: z.boolean(), - prefetchWorkspace: z.boolean(), - // expose internal api to globalThis, **development only** - exposeInternal: z.boolean(), -}); - -export type PublicRuntimeConfig = z.infer; diff --git a/apps/web/src/utils/get-is-mobile.ts b/apps/web/src/utils/get-is-mobile.ts deleted file mode 100644 index de91853c6d..0000000000 --- a/apps/web/src/utils/get-is-mobile.ts +++ /dev/null @@ -1,18 +0,0 @@ -/* eslint-disable no-useless-escape */ -// Inspire by https://stackoverflow.com/a/11381730/8415727 -export function isMobile(userAgent: string) { - return !!( - /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test( - userAgent - ) || - /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test( - userAgent.substr(0, 4) - ) - ); -} - -export const getIsMobile = function () { - return isMobile( - navigator?.userAgent || navigator?.vendor || (window as any)?.opera - ); -}; diff --git a/packages/env/package.json b/packages/env/package.json new file mode 100644 index 0000000000..aab55cba06 --- /dev/null +++ b/packages/env/package.json @@ -0,0 +1,12 @@ +{ + "name": "@affine/env", + "private": true, + "main": "./src/index.ts", + "devDependencies": { + "next": "^13.2.3", + "zod": "^3.20.6" + }, + "dependencies": { + "@blocksuite/global": "0.4.1-20230220214107-0a354de" + } +} diff --git a/packages/env/src/index.ts b/packages/env/src/index.ts new file mode 100644 index 0000000000..4cdef45e76 --- /dev/null +++ b/packages/env/src/index.ts @@ -0,0 +1,146 @@ +import { assertEquals } from '@blocksuite/global/utils'; +import getConfig from 'next/config'; +import { z } from 'zod'; + +import { getUaHelper } from './ua-helper'; + +type BrowserBase = { + isBrowser: true; + isServer: false; + isDebug: boolean; + + // browser special properties + isLinux: boolean; + isMacOs: boolean; + isSafari: boolean; + isWindows: boolean; + isFireFox: boolean; + isMobile: boolean; + isChrome: boolean; +}; + +type NonChromeBrowser = BrowserBase & { + isChrome: false; +}; + +type ChromeBrowser = BrowserBase & { + isSafari: false; + isFireFox: false; + isChrome: true; + chromeVersion: number; +}; + +type Browser = NonChromeBrowser | ChromeBrowser; + +type Server = { + isBrowser: false; + isServer: true; + isDebug: boolean; +}; + +export type Environment = Browser | Server; + +let environment: Environment | null = null; + +export function getEnvironment() { + if (environment) { + return environment; + } + const isDebug = process.env.NODE_ENV === 'development'; + if (typeof window === 'undefined') { + environment = { + isBrowser: false, + isServer: true, + isDebug, + } satisfies Server; + } else { + const uaHelper = getUaHelper(); + environment = { + isBrowser: true, + isServer: false, + isDebug, + isLinux: uaHelper.isLinux, + isMacOs: uaHelper.isMacOs, + isSafari: uaHelper.isSafari, + isWindows: uaHelper.isWindows, + isFireFox: uaHelper.isFireFox, + isMobile: uaHelper.isMobile, + isChrome: uaHelper.isChrome, + } as Browser; + if (environment.isChrome === true) { + assertEquals(environment.isSafari, false); + assertEquals(environment.isFireFox, false); + environment = { + ...environment, + isSafari: false, + isFireFox: false, + isChrome: true, + chromeVersion: uaHelper.getChromeVersion(), + } satisfies ChromeBrowser; + } + } + globalThis.environment = environment; + return environment; +} + +export const publicRuntimeConfigSchema = z.object({ + PROJECT_NAME: z.string(), + BUILD_DATE: z.string(), + gitVersion: z.string(), + hash: z.string(), + serverAPI: z.string(), + editorVersion: z.string(), + enableIndexedDBProvider: z.boolean(), + enableBroadCastChannelProvider: z.boolean(), + prefetchWorkspace: z.boolean(), + // expose internal api to globalThis, **development only** + exposeInternal: z.boolean(), +}); + +export type PublicRuntimeConfig = z.infer; + +const { publicRuntimeConfig: config } = getConfig() as { + publicRuntimeConfig: PublicRuntimeConfig; +}; + +publicRuntimeConfigSchema.parse(config); + +function printBuildInfo() { + console.group('Build info'); + console.log('Project:', config.PROJECT_NAME); + console.log( + 'Build date:', + config.BUILD_DATE ? new Date(config.BUILD_DATE).toLocaleString() : 'Unknown' + ); + console.log('Editor Version:', config.editorVersion); + + console.log('Version:', config.gitVersion); + console.log( + 'AFFiNE is an open source project, you can view its source code on GitHub!' + ); + console.log(`https://github.com/toeverything/AFFiNE/tree/${config.hash}`); + console.groupEnd(); +} + +declare global { + // eslint-disable-next-line no-var + var environment: Environment; + // eslint-disable-next-line no-var + var $AFFINE_SETUP: boolean | undefined; + // eslint-disable-next-line no-var + var editorVersion: string | undefined; +} + +export function setupGlobal() { + if (globalThis.$AFFINE_SETUP) { + return; + } + globalThis.environment = getEnvironment(); + if (getEnvironment().isBrowser) { + printBuildInfo(); + globalThis.editorVersion = config.editorVersion; + } + globalThis.$AFFINE_SETUP = true; +} + +export { config }; diff --git a/apps/web/src/utils/useragent.ts b/packages/env/src/ua-helper.ts similarity index 80% rename from apps/web/src/utils/useragent.ts rename to packages/env/src/ua-helper.ts index b5185ef73e..8abf7727a5 100644 --- a/apps/web/src/utils/useragent.ts +++ b/packages/env/src/ua-helper.ts @@ -1,14 +1,12 @@ +import { assertExists } from '@blocksuite/global/utils'; + export function getUaHelper() { let uaHelper = null; (function (navigator) { const getUa = () => { const ua = navigator.userAgent; const uas = ua.toLowerCase(); - const mobile = - /mobile|tablet|ip(ad|hone|od)|android/i.test(ua) || - (uas.indexOf('safari') > -1 && - /Mac OS/i.test(ua) && - /Macintosh/i.test(ua)); + const mobile = /iPhone|iPad|iPod|Android/i.test(ua); const android = (mobile && (uas.indexOf('android') > -1 || uas.indexOf('linux') > -1)) || @@ -55,6 +53,14 @@ export function getUaHelper() { public isSafari = false; public isWindows = false; public isFireFox = false; + public isMobile = false; + public isChrome = false; + + getChromeVersion = (): number => { + const raw = navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./); + assertExists(raw); + return parseInt(raw[2], 10); + }; constructor() { this.uaMap = getUa(); @@ -71,6 +77,8 @@ export function getUaHelper() { this.isSafari = this.checkUseragent('safari'); this.isWindows = this.checkUseragent('win'); this.isFireFox = this.checkUseragent('firefox'); + this.isMobile = this.checkUseragent('mobile'); + this.isChrome = this.checkUseragent('chrome'); } } uaHelper = new UaHelper(); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bfb85c281d..87fe98bf51 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -144,6 +144,7 @@ importers: specifiers: '@affine/component': workspace:* '@affine/datacenter': workspace:* + '@affine/env': workspace:* '@affine/i18n': workspace:* '@blocksuite/blocks': 0.4.1-20230220214107-0a354de '@blocksuite/editor': 0.4.1-20230220214107-0a354de @@ -185,6 +186,7 @@ importers: dependencies: '@affine/component': link:../../packages/component '@affine/datacenter': link:../../packages/data-center + '@affine/env': link:../../packages/env '@affine/i18n': link:../../packages/i18n '@blocksuite/blocks': 0.4.1-20230220214107-0a354de_txcevohh7lsyxi5mbohonudlma '@blocksuite/editor': 0.4.1-20230220214107-0a354de_bsvfvsbxn3zjndsi6ntxj3sapa @@ -341,6 +343,17 @@ importers: '@types/debug': 4.1.7 debug: 4.3.4 + packages/env: + specifiers: + '@blocksuite/global': 0.4.1-20230220214107-0a354de + next: ^13.2.3 + zod: ^3.20.6 + dependencies: + '@blocksuite/global': 0.4.1-20230220214107-0a354de + devDependencies: + next: 13.2.3 + zod: 3.20.6 + packages/i18n: specifiers: '@affine/debug': workspace:* @@ -1719,6 +1732,18 @@ packages: turndown: 7.1.1 dev: false + /@blocksuite/global/0.4.1-20230220214107-0a354de: + resolution: {integrity: sha512-wC+TXvoqj5Ypx6uDj2gE+o8fclvs+K0jVtG7FnlOVJ6AZnYup5kBGGWBx1SwfhbwoXmF/ZcHOcAVZmdNsupfVA==} + peerDependencies: + lit: ^2.6 + peerDependenciesMeta: + lit: + optional: true + dependencies: + ansi-colors: 4.1.3 + zod: 3.20.6 + dev: false + /@blocksuite/global/0.4.1-20230220214107-0a354de_lit@2.6.1: resolution: {integrity: sha512-wC+TXvoqj5Ypx6uDj2gE+o8fclvs+K0jVtG7FnlOVJ6AZnYup5kBGGWBx1SwfhbwoXmF/ZcHOcAVZmdNsupfVA==} peerDependencies: @@ -1771,7 +1796,7 @@ packages: '@blocksuite/store': 0.4.1-20230220214107-0a354de_lit@2.6.1+yjs@13.5.47 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 - zustand: 4.3.3_react@18.2.0 + zustand: 4.3.5_react@18.2.0 transitivePeerDependencies: - immer - lit @@ -1789,7 +1814,7 @@ packages: flexsearch: 0.7.21 idb-keyval: 6.2.0 ky: 0.33.2 - lib0: 0.2.62 + lib0: 0.2.63 merge: 2.1.1 nanoid: 4.0.1 y-protocols: 1.0.5 @@ -6359,7 +6384,7 @@ packages: engines: {node: '>=10'} dependencies: delegates: 1.0.0 - readable-stream: 3.6.0 + readable-stream: 3.6.1 dev: true /arg/4.1.3: @@ -6679,7 +6704,7 @@ packages: dependencies: buffer: 5.7.1 inherits: 2.0.4 - readable-stream: 3.6.0 + readable-stream: 3.6.1 dev: true /body-parser/1.20.1: @@ -6875,7 +6900,7 @@ packages: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: function-bind: 1.1.1 - get-intrinsic: 1.1.3 + get-intrinsic: 1.2.0 /call-me-maybe/1.0.2: resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} @@ -7206,7 +7231,7 @@ packages: dependencies: buffer-from: 1.1.2 inherits: 2.0.4 - readable-stream: 2.3.7 + readable-stream: 2.3.8 typedarray: 0.0.6 dev: true @@ -7524,6 +7549,14 @@ packages: dependencies: has-property-descriptors: 1.0.0 object-keys: 1.1.1 + dev: true + + /define-properties/1.2.0: + resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} + engines: {node: '>= 0.4'} + dependencies: + has-property-descriptors: 1.0.0 + object-keys: 1.1.1 /defu/6.1.2: resolution: {integrity: sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ==} @@ -9032,6 +9065,14 @@ packages: function-bind: 1.1.1 has: 1.0.3 has-symbols: 1.0.3 + dev: true + + /get-intrinsic/1.2.0: + resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-symbols: 1.0.3 /get-nonce/1.0.1: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} @@ -9315,7 +9356,7 @@ packages: /has-property-descriptors/1.0.0: resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} dependencies: - get-intrinsic: 1.1.3 + get-intrinsic: 1.2.0 /has-proto/1.0.1: resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} @@ -9672,7 +9713,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 + define-properties: 1.2.0 dev: true /is-negative-zero/2.0.2: @@ -10251,6 +10292,13 @@ packages: dependencies: isomorphic.js: 0.2.5 + /lib0/0.2.63: + resolution: {integrity: sha512-JhUd/JXR4rnWsSP1zup904ACbVFcdRieWoIGwGAtHww4zms0gNyi8EM30Rfftnk+6A10qQMSufjLM0/ncq06xw==} + engines: {node: '>=14'} + dependencies: + isomorphic.js: 0.2.5 + dev: false + /lilconfig/2.0.6: resolution: {integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==} engines: {node: '>=10'} @@ -10957,6 +11005,51 @@ packages: - babel-plugin-macros dev: true + /next/13.2.3: + resolution: {integrity: sha512-nKFJC6upCPN7DWRx4+0S/1PIOT7vNlCT157w9AzbXEgKy6zkiPKEt5YyRUsRZkmpEqBVrGgOqNfwecTociyg+w==} + engines: {node: '>=14.6.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.4.0 + fibers: '>= 3.1.0' + node-sass: ^6.0.0 || ^7.0.0 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + fibers: + optional: true + node-sass: + optional: true + sass: + optional: true + dependencies: + '@next/env': 13.2.3 + '@swc/helpers': 0.4.14 + caniuse-lite: 1.0.30001419 + postcss: 8.4.14 + styled-jsx: 5.1.1 + optionalDependencies: + '@next/swc-android-arm-eabi': 13.2.3 + '@next/swc-android-arm64': 13.2.3 + '@next/swc-darwin-arm64': 13.2.3 + '@next/swc-darwin-x64': 13.2.3 + '@next/swc-freebsd-x64': 13.2.3 + '@next/swc-linux-arm-gnueabihf': 13.2.3 + '@next/swc-linux-arm64-gnu': 13.2.3 + '@next/swc-linux-arm64-musl': 13.2.3 + '@next/swc-linux-x64-gnu': 13.2.3 + '@next/swc-linux-x64-musl': 13.2.3 + '@next/swc-win32-arm64-msvc': 13.2.3 + '@next/swc-win32-ia32-msvc': 13.2.3 + '@next/swc-win32-x64-msvc': 13.2.3 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + dev: true + /next/13.2.3_react@18.2.0: resolution: {integrity: sha512-nKFJC6upCPN7DWRx4+0S/1PIOT7vNlCT157w9AzbXEgKy6zkiPKEt5YyRUsRZkmpEqBVrGgOqNfwecTociyg+w==} engines: {node: '>=14.6.0'} @@ -11186,7 +11279,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 + define-properties: 1.2.0 /object-keys/1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} @@ -11197,7 +11290,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 + define-properties: 1.2.0 has-symbols: 1.0.3 object-keys: 1.1.1 dev: true @@ -12127,8 +12220,8 @@ packages: strip-bom: 3.0.0 dev: true - /readable-stream/2.3.7: - resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} + /readable-stream/2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} dependencies: core-util-is: 1.0.3 inherits: 2.0.4 @@ -12139,8 +12232,8 @@ packages: util-deprecate: 1.0.2 dev: true - /readable-stream/3.6.0: - resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} + /readable-stream/3.6.1: + resolution: {integrity: sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==} engines: {node: '>= 6'} dependencies: inherits: 2.0.4 @@ -12151,7 +12244,7 @@ packages: resolution: {integrity: sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==} engines: {node: '>=8'} dependencies: - readable-stream: 3.6.0 + readable-stream: 3.6.1 dev: true /readdirp/3.6.0: @@ -12235,7 +12328,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 + define-properties: 1.2.0 functions-have-names: 1.2.3 /regexpp/3.2.0: @@ -12613,7 +12706,7 @@ packages: get-browser-rtc: 1.1.0 queue-microtask: 1.2.3 randombytes: 2.1.0 - readable-stream: 3.6.0 + readable-stream: 3.6.1 transitivePeerDependencies: - supports-color dev: false @@ -12956,6 +13049,22 @@ packages: peek-readable: 5.0.0 dev: true + /styled-jsx/5.1.1: + resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + dependencies: + client-only: 0.0.1 + dev: true + /styled-jsx/5.1.1_react@18.2.0: resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} engines: {node: '>= 12.0.0'} @@ -14167,7 +14276,7 @@ packages: engines: {node: '>=12'} hasBin: true dependencies: - lib0: 0.2.62 + lib0: 0.2.63 simple-peer: 9.11.1 y-protocols: 1.0.5 optionalDependencies: @@ -14296,10 +14405,9 @@ packages: /zod/3.20.6: resolution: {integrity: sha512-oyu0m54SGCtzh6EClBVqDDlAYRz4jrVtKwQ7ZnsEmMI9HnzuZFj8QFwAY1M5uniIYACdGvv0PBWPF2kO0aNofA==} - dev: false - /zustand/4.3.3_react@18.2.0: - resolution: {integrity: sha512-x2jXq8S0kfLGNwGh87nhRfEc2eZy37tSatpSoSIN+O6HIaBhgQHSONV/F9VNrNcBcKQu/E80K1DeHDYQC/zCrQ==} + /zustand/4.3.5_react@18.2.0: + resolution: {integrity: sha512-2iPUzfwx+g3f0PagOMz2vDO9mZzEp2puFpNe7vrAymVPOEIEUjCPkC4/zy84eAscxIWmTU4j9g6upXYkJdzEFQ==} engines: {node: '>=12.7.0'} peerDependencies: immer: '>=9.0' diff --git a/tsconfig.json b/tsconfig.json index 4cba605125..29cb4cad27 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -21,7 +21,8 @@ "@affine/datacenter": ["./packages/datacenter/src"], "@affine/i18n": ["./packages/i18n/src"], "@affine/logger": ["./packages/logger/src"], - "@affine/debug": ["./packages/store/debug"], + "@affine/debug": ["./packages/debug"], + "@affine/env": ["./packages/env"], "@toeverything/pathfinder-logger": ["./packages/logger"] } }, @@ -46,6 +47,9 @@ }, { "path": "./packages/logger" + }, + { + "path": "./packages/env" } ], "files": [],