Skip to content

Commit 8f3443f

Browse files
committed
⚡ enable docusaurus faster config
1 parent 245db66 commit 8f3443f

File tree

12 files changed

+2671
-1790
lines changed

12 files changed

+2671
-1790
lines changed

packages/plugin-changelog/package.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,13 @@
1818
"watch": "tsc --build --watch"
1919
},
2020
"dependencies": {
21-
"@docusaurus/core": "3.5.2",
22-
"@docusaurus/plugin-content-docs": "3.5.2",
23-
"@docusaurus/utils-validation": "3.5.2",
21+
"@docusaurus/core": "3.6.2",
22+
"@docusaurus/plugin-content-docs": "3.6.2",
23+
"@docusaurus/utils-validation": "3.6.2",
2424
"fs-extra": "^11.2.0"
2525
},
2626
"devDependencies": {
27-
"@docusaurus/module-type-aliases": "3.5.2",
28-
"@docusaurus/types": "3.5.2"
27+
"@docusaurus/module-type-aliases": "3.6.2",
28+
"@docusaurus/types": "3.6.2"
2929
}
3030
}

packages/plugin-docsmenu/package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,12 @@
3030
"watch": "tsc --build --watch"
3131
},
3232
"dependencies": {
33-
"@docusaurus/core": "^3.5.2",
34-
"@docusaurus/plugin-content-docs": "^3.5.2"
33+
"@docusaurus/core": "^3.6.2",
34+
"@docusaurus/plugin-content-docs": "^3.6.2"
3535
},
3636
"devDependencies": {
37-
"@docusaurus/module-type-aliases": "3.5.2",
38-
"@docusaurus/types": "^3.5.2"
37+
"@docusaurus/module-type-aliases": "3.6.2",
38+
"@docusaurus/types": "^3.6.2"
3939
},
4040
"gitHead": "043290be093671405869575d2af51b1d71c23bce"
4141
}

packages/plugin-getsidebar/package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@
3030
"build": "tsc --build"
3131
},
3232
"dependencies": {
33-
"@docusaurus/core": "^3.5.2",
34-
"@docusaurus/plugin-content-docs": "^3.5.2"
33+
"@docusaurus/core": "^3.6.2",
34+
"@docusaurus/plugin-content-docs": "^3.6.2"
3535
},
3636
"devDependencies": {
37-
"@docusaurus/module-type-aliases": "3.5.2",
38-
"@docusaurus/types": "^3.5.2"
37+
"@docusaurus/module-type-aliases": "3.6.2",
38+
"@docusaurus/types": "^3.6.2"
3939
}
4040
}

packages/preset-nonepress/package.json

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,18 @@
1818
"watch": "tsc --watch"
1919
},
2020
"dependencies": {
21-
"@docusaurus/core": "3.5.2",
22-
"@docusaurus/plugin-content-docs": "3.5.2",
23-
"@docusaurus/plugin-content-pages": "3.5.2",
24-
"@docusaurus/plugin-debug": "3.5.2",
25-
"@docusaurus/plugin-google-analytics": "3.5.2",
26-
"@docusaurus/plugin-google-gtag": "3.5.2",
27-
"@docusaurus/plugin-google-tag-manager": "3.5.2",
28-
"@docusaurus/plugin-ideal-image": "3.5.2",
29-
"@docusaurus/plugin-sitemap": "3.5.2",
30-
"@docusaurus/theme-common": "3.5.2",
31-
"@docusaurus/theme-search-algolia": "3.5.2",
32-
"@docusaurus/types": "3.5.2",
21+
"@docusaurus/core": "3.6.2",
22+
"@docusaurus/plugin-content-docs": "3.6.2",
23+
"@docusaurus/plugin-content-pages": "3.6.2",
24+
"@docusaurus/plugin-debug": "3.6.2",
25+
"@docusaurus/plugin-google-analytics": "3.6.2",
26+
"@docusaurus/plugin-google-gtag": "3.6.2",
27+
"@docusaurus/plugin-google-tag-manager": "3.6.2",
28+
"@docusaurus/plugin-ideal-image": "3.6.2",
29+
"@docusaurus/plugin-sitemap": "3.6.2",
30+
"@docusaurus/theme-common": "3.6.2",
31+
"@docusaurus/theme-search-algolia": "3.6.2",
32+
"@docusaurus/types": "3.6.2",
3333
"@nullbot/docusaurus-theme-nonepress": "^3.2.2"
3434
},
3535
"peerDependencies": {

packages/theme-nonepress/package.json

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -37,18 +37,18 @@
3737
},
3838
"dependencies": {
3939
"@docsearch/react": "3.5.2",
40-
"@docusaurus/core": "3.5.2",
41-
"@docusaurus/mdx-loader": "3.5.2",
42-
"@docusaurus/module-type-aliases": "3.5.2",
43-
"@docusaurus/plugin-content-blog": "3.5.2",
44-
"@docusaurus/plugin-content-docs": "3.5.2",
45-
"@docusaurus/plugin-content-pages": "3.5.2",
46-
"@docusaurus/theme-common": "3.5.2",
47-
"@docusaurus/theme-translations": "3.5.2",
48-
"@docusaurus/types": "3.5.2",
49-
"@docusaurus/utils": "3.5.2",
50-
"@docusaurus/utils-common": "3.5.2",
51-
"@docusaurus/utils-validation": "3.5.2",
40+
"@docusaurus/core": "3.6.2",
41+
"@docusaurus/mdx-loader": "3.6.2",
42+
"@docusaurus/module-type-aliases": "3.6.2",
43+
"@docusaurus/plugin-content-blog": "3.6.2",
44+
"@docusaurus/plugin-content-docs": "3.6.2",
45+
"@docusaurus/plugin-content-pages": "3.6.2",
46+
"@docusaurus/theme-common": "3.6.2",
47+
"@docusaurus/theme-translations": "3.6.2",
48+
"@docusaurus/types": "3.6.2",
49+
"@docusaurus/utils": "3.6.2",
50+
"@docusaurus/utils-common": "3.6.2",
51+
"@docusaurus/utils-validation": "3.6.2",
5252
"@fortawesome/fontawesome-svg-core": "^6.4.0",
5353
"@fortawesome/free-brands-svg-icons": "^6.4.0",
5454
"@fortawesome/free-regular-svg-icons": "^6.4.0",
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
declare module "@docsearch/react/modal";
2+
3+
declare module "@docsearch/react/style";
4+
5+
// TODO incompatible declaration file
6+
declare module "eta" {
7+
export const defaultConfig: object;
8+
9+
export function compile(
10+
template: string,
11+
options?: object,
12+
): (data: object, config: object) => string;
13+
}

packages/theme-nonepress/src/index.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,14 +155,17 @@ export default async function themeNonepress(
155155
return modules;
156156
},
157157

158-
configureWebpack() {
158+
configureWebpack(__config, __isServer, { currentBundler }) {
159159
const prismLanguages = additionalLanguages
160160
.map((lang) => `prism-${lang}`)
161161
.join("|");
162162

163163
return {
164164
plugins: [
165-
new ContextReplacementPlugin(
165+
// This allows better optimization by only bundling those components
166+
// that the user actually needs, because the modules are dynamically
167+
// required and can't be known during compile time.
168+
new currentBundler.instance.ContextReplacementPlugin(
166169
/prismjs[\\/]components$/,
167170
new RegExp(`^./(${prismLanguages})$`),
168171
),

packages/theme-nonepress/src/theme/SearchBar/index.tsx

Lines changed: 49 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,10 @@
1-
import React, {
2-
useCallback,
3-
useEffect,
4-
useMemo,
5-
useRef,
6-
useState,
7-
} from "react";
1+
import React, { useCallback, useMemo, useRef, useState } from "react";
82

93
import { createPortal } from "react-dom";
104

11-
import { useDocSearchKeyboardEvents } from "@docsearch/react";
5+
import { DocSearchButton, useDocSearchKeyboardEvents } from "@docsearch/react";
126
import Head from "@docusaurus/Head";
137
import Link from "@docusaurus/Link";
14-
import Noop from "@docusaurus/Noop";
15-
import Translate from "@docusaurus/Translate";
168
import { useHistory } from "@docusaurus/router";
179
import {
1810
isRegexpStringMatch,
@@ -22,27 +14,21 @@ import {
2214
useAlgoliaContextualFacetFilters,
2315
useSearchResultUrlProcessor,
2416
} from "@docusaurus/theme-search-algolia/client";
17+
import Translate from "@docusaurus/Translate";
2518
import useDocusaurusContext from "@docusaurus/useDocusaurusContext";
2619

27-
import type { SearchClient } from "algoliasearch/lite";
28-
29-
import "./styles.css";
30-
31-
import { useNonepressThemeConfig } from "@nullbot/docusaurus-theme-nonepress/client";
32-
33-
import IconSearch from "@theme/Icon/Search";
3420
import translations from "@theme/SearchTranslations";
3521

22+
import type { AutocompleteState } from "@algolia/autocomplete-core";
23+
import type {
24+
DocSearchModalProps,
25+
DocSearchModal as DocSearchModalType,
26+
} from "@docsearch/react";
3627
import type {
3728
InternalDocSearchHit,
3829
StoredDocSearchHit,
3930
} from "@docsearch/react/dist/esm/types";
40-
import type {
41-
DocSearchModal as DocSearchModalType,
42-
DocSearchModalProps,
43-
DocSearchButtonProps,
44-
} from "@docsearch/react";
45-
import type { AutocompleteState } from "@algolia/autocomplete-core";
31+
import type { SearchClient } from "algoliasearch/lite";
4632

4733
type DocSearchProps = Omit<
4834
DocSearchModalProps,
@@ -97,54 +83,6 @@ function mergeFacetFilters(f1: FacetFilters, f2: FacetFilters): FacetFilters {
9783
return [...normalize(f1), ...normalize(f2)] as FacetFilters;
9884
}
9985

100-
const ACTION_KEY_DEFAULT = "Ctrl" as const;
101-
const ACTION_KEY_APPLE = "⌘" as const;
102-
103-
function isAppleDevice(): boolean {
104-
return /Mac|iPhone|iPod|iPad/i.test(navigator.platform);
105-
}
106-
107-
const DocSearchButton = React.forwardRef<
108-
HTMLButtonElement,
109-
DocSearchButtonProps
110-
>(({ translations = {}, ...props }, ref) => {
111-
const { buttonText = "Search", buttonAriaLabel = "Search" } = translations;
112-
113-
const [key, setKey] = useState<
114-
typeof ACTION_KEY_APPLE | typeof ACTION_KEY_DEFAULT | null
115-
>(null);
116-
117-
useEffect(() => {
118-
if (typeof navigator !== "undefined") {
119-
isAppleDevice() ? setKey(ACTION_KEY_APPLE) : setKey(ACTION_KEY_DEFAULT);
120-
}
121-
}, []);
122-
123-
return (
124-
<button
125-
type="button"
126-
className="doc-search-btn"
127-
aria-label={buttonAriaLabel}
128-
{...props}
129-
ref={ref}
130-
>
131-
<span className="doc-search-btn-container">
132-
<IconSearch className="doc-search-btn-icon" />
133-
<span className="doc-search-btn-placeholder">{buttonText}</span>
134-
</span>
135-
136-
<span className="doc-search-btn-keys">
137-
{key !== null && (
138-
<>
139-
<kbd className="kbd kbd-sm">{key}</kbd>
140-
<kbd className="kbd kbd-sm">K</kbd>
141-
</>
142-
)}
143-
</span>
144-
</button>
145-
);
146-
});
147-
14886
function DocSearch({
14987
contextualSearch,
15088
externalUrlRegex,
@@ -185,38 +123,46 @@ function DocSearch({
185123
}
186124

187125
return Promise.all([
188-
import("@docsearch/react/dist/esm/DocSearchModal.js"),
189-
import("@docsearch/css/dist/_variables.css"),
190-
import("@docsearch/css/dist/modal.css"),
126+
import("@docsearch/react/modal") as Promise<
127+
typeof import("@docsearch/react")
128+
>,
129+
import("@docsearch/react/style"),
130+
import("./styles.css"),
191131
]).then(([{ DocSearchModal: Modal }]) => {
192132
DocSearchModal = Modal;
193133
});
194134
}, []);
195135

196-
const onOpen = useCallback(() => {
197-
importDocSearchModalIfNeeded().then(() => {
198-
searchContainer.current = document.createElement("div");
199-
document.body.insertBefore(
200-
searchContainer.current,
201-
document.body.firstChild,
202-
);
203-
setIsOpen(true);
204-
});
205-
}, [importDocSearchModalIfNeeded, setIsOpen]);
136+
const prepareSearchContainer = useCallback(() => {
137+
if (!searchContainer.current) {
138+
const divElement = document.createElement("div");
139+
searchContainer.current = divElement;
140+
document.body.insertBefore(divElement, document.body.firstChild);
141+
}
142+
}, []);
143+
144+
const openModal = useCallback(() => {
145+
prepareSearchContainer();
146+
importDocSearchModalIfNeeded().then(() => setIsOpen(true));
147+
}, [importDocSearchModalIfNeeded, prepareSearchContainer]);
206148

207-
const onClose = useCallback(() => {
149+
const closeModal = useCallback(() => {
208150
setIsOpen(false);
209-
searchContainer.current?.remove();
210-
}, [setIsOpen]);
151+
searchButtonRef.current?.focus();
152+
}, []);
211153

212-
const onInput = useCallback(
154+
const handleInput = useCallback(
213155
(event: KeyboardEvent) => {
214-
importDocSearchModalIfNeeded().then(() => {
215-
setIsOpen(true);
216-
setInitialQuery(event.key);
217-
});
156+
if (event.key === "f" && (event.metaKey || event.ctrlKey)) {
157+
// ignore browser's ctrl+f
158+
return;
159+
}
160+
// prevents duplicate key insertion in the modal input
161+
event.preventDefault();
162+
setInitialQuery(event.key);
163+
openModal();
218164
},
219-
[importDocSearchModalIfNeeded, setIsOpen, setInitialQuery],
165+
[openModal],
220166
);
221167

222168
const navigator = useRef({
@@ -246,10 +192,10 @@ function DocSearch({
246192
const resultsFooterComponent: DocSearchProps["resultsFooterComponent"] =
247193
useMemo(
248194
() =>
249-
195+
// eslint-disable-next-line react/no-unstable-nested-components
250196
(footerProps: Omit<ResultsFooterProps, "onClose">): JSX.Element =>
251-
<ResultsFooter {...footerProps} onClose={onClose} />,
252-
[onClose],
197+
<ResultsFooter {...footerProps} onClose={closeModal} />,
198+
[closeModal],
253199
);
254200

255201
const transformSearchClient = useCallback(
@@ -266,9 +212,9 @@ function DocSearch({
266212

267213
useDocSearchKeyboardEvents({
268214
isOpen,
269-
onOpen,
270-
onClose,
271-
onInput,
215+
onOpen: openModal,
216+
onClose: closeModal,
217+
onInput: handleInput,
272218
searchButtonRef,
273219
});
274220

@@ -289,7 +235,7 @@ function DocSearch({
289235
onTouchStart={importDocSearchModalIfNeeded}
290236
onFocus={importDocSearchModalIfNeeded}
291237
onMouseOver={importDocSearchModalIfNeeded}
292-
onClick={onOpen}
238+
onClick={openModal}
293239
ref={searchButtonRef}
294240
translations={translations.button}
295241
/>
@@ -299,7 +245,7 @@ function DocSearch({
299245
searchContainer.current &&
300246
createPortal(
301247
<DocSearchModal
302-
onClose={onClose}
248+
onClose={closeModal}
303249
initialScrollY={window.scrollY}
304250
initialQuery={initialQuery}
305251
navigator={navigator}
@@ -321,9 +267,6 @@ function DocSearch({
321267
}
322268

323269
export default function SearchBar(): JSX.Element {
324-
const { algolia } = useNonepressThemeConfig();
325-
if (!algolia) {
326-
return <Noop />;
327-
}
328-
return <DocSearch {...(algolia as unknown as DocSearchProps)} />;
270+
const { siteConfig } = useDocusaurusContext();
271+
return <DocSearch {...(siteConfig.themeConfig.algolia as DocSearchProps)} />;
329272
}

website/babel.config.js

Lines changed: 0 additions & 3 deletions
This file was deleted.

0 commit comments

Comments
 (0)