From a35dc578a4e4a5c39b4cc62959d3606157e19a56 Mon Sep 17 00:00:00 2001 From: Simeon Simeonoff Date: Tue, 31 Oct 2023 16:28:59 +0200 Subject: [PATCH 1/4] refactor(*): bump to typedoc 0.25.3 and typedoc 5.2.2 Closes #12 --- package-lock.json | 89 ++++++++----------- package.json | 8 +- src/assets/css/elements/_buttons.sass | 22 +++++ .../js/src/typedoc/components/Search.ts | 17 ++-- src/index.tsx | 31 +++---- src/layouts/default.tsx | 8 +- src/partials/index.tsx | 8 +- src/partials/member.declarations.tsx | 5 +- src/partials/member.signature.body.tsx | 8 +- src/partials/navigation.tsx | 6 +- src/templates/reflection.tsx | 11 ++- src/utils/lib.tsx | 4 +- 12 files changed, 118 insertions(+), 99 deletions(-) diff --git a/package-lock.json b/package-lock.json index 716c311..db18880 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,9 +8,6 @@ "name": "ig-typedoc-theme", "version": "1.0.0", "license": "MIT", - "dependencies": { - "typedoc-plugin-localization": "file:../../../typedoc-plugin-localization-1.0.4.tgz" - }, "devDependencies": { "@types/fs-extra": "^9.0.13", "@types/lunr": "^2.3.3", @@ -31,8 +28,8 @@ "sass-loader": "^10.1.0", "style-loader": "^3.3.1", "ts-loader": "^8.0.12", - "typedoc": "^0.23.21", - "typescript": "^4.9.5", + "typedoc": "^0.25.3", + "typescript": "^5.2.2", "url-loader": "^4.1.1", "webpack": "^5.11.1", "webpack-cli": "^4.3.0", @@ -3018,6 +3015,7 @@ "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -3142,7 +3140,8 @@ "node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true }, "node_modules/has": { "version": "1.0.3", @@ -3800,6 +3799,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, "dependencies": { "universalify": "^2.0.0" }, @@ -6559,33 +6559,24 @@ "dev": true }, "node_modules/typedoc": { - "version": "0.23.28", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.28.tgz", - "integrity": "sha512-9x1+hZWTHEQcGoP7qFmlo4unUoVJLB0H/8vfO/7wqTnZxg4kPuji9y3uRzEu0ZKez63OJAUmiGhUrtukC6Uj3w==", + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.25.3.tgz", + "integrity": "sha512-Ow8Bo7uY1Lwy7GTmphRIMEo6IOZ+yYUyrc8n5KXIZg1svpqhZSWgni2ZrDhe+wLosFS8yswowUzljTAV/3jmWw==", "dev": true, "dependencies": { "lunr": "^2.3.9", - "marked": "^4.2.12", - "minimatch": "^7.1.3", + "marked": "^4.3.0", + "minimatch": "^9.0.3", "shiki": "^0.14.1" }, "bin": { "typedoc": "bin/typedoc" }, "engines": { - "node": ">= 14.14" + "node": ">= 16" }, "peerDependencies": { - "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x" - } - }, - "node_modules/typedoc-plugin-localization": { - "version": "1.0.4", - "resolved": "file:../../../typedoc-plugin-localization-1.0.4.tgz", - "integrity": "sha512-omX0aKz4GFtAozqb2vxEGYzXtanBHccMuZwuvc/V895Lta+Rr7Ef/+BcgVVRTBhAkwH4GCI0HzhpOKW+LmTRNg==", - "license": "MIT", - "dependencies": { - "fs-extra": "^10.1.0" + "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x" } }, "node_modules/typedoc/node_modules/brace-expansion": { @@ -6598,31 +6589,31 @@ } }, "node_modules/typedoc/node_modules/minimatch": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", - "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.17" } }, "node_modules/uglify-js": { @@ -6676,6 +6667,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, "engines": { "node": ">= 10.0.0" } @@ -10074,6 +10066,7 @@ "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, "requires": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -10167,7 +10160,8 @@ "graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true }, "has": { "version": "1.0.3", @@ -10677,6 +10671,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, "requires": { "graceful-fs": "^4.1.6", "universalify": "^2.0.0" @@ -12865,14 +12860,14 @@ "dev": true }, "typedoc": { - "version": "0.23.28", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.28.tgz", - "integrity": "sha512-9x1+hZWTHEQcGoP7qFmlo4unUoVJLB0H/8vfO/7wqTnZxg4kPuji9y3uRzEu0ZKez63OJAUmiGhUrtukC6Uj3w==", + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.25.3.tgz", + "integrity": "sha512-Ow8Bo7uY1Lwy7GTmphRIMEo6IOZ+yYUyrc8n5KXIZg1svpqhZSWgni2ZrDhe+wLosFS8yswowUzljTAV/3jmWw==", "dev": true, "requires": { "lunr": "^2.3.9", - "marked": "^4.2.12", - "minimatch": "^7.1.3", + "marked": "^4.3.0", + "minimatch": "^9.0.3", "shiki": "^0.14.1" }, "dependencies": { @@ -12886,9 +12881,9 @@ } }, "minimatch": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", - "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -12896,17 +12891,10 @@ } } }, - "typedoc-plugin-localization": { - "version": "file:..\\..\\..\\typedoc-plugin-localization-1.0.4.tgz", - "integrity": "sha512-omX0aKz4GFtAozqb2vxEGYzXtanBHccMuZwuvc/V895Lta+Rr7Ef/+BcgVVRTBhAkwH4GCI0HzhpOKW+LmTRNg==", - "requires": { - "fs-extra": "^10.1.0" - } - }, "typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", "dev": true }, "uglify-js": { @@ -12952,7 +12940,8 @@ "universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true }, "unset-value": { "version": "1.0.0", diff --git a/package.json b/package.json index f20212e..6572d21 100644 --- a/package.json +++ b/package.json @@ -43,15 +43,15 @@ "sass-loader": "^10.1.0", "style-loader": "^3.3.1", "ts-loader": "^8.0.12", - "typedoc": "^0.23.21", - "typescript": "^4.9.5", + "typedoc": "^0.25.3", + "typescript": "^5.2.2", "url-loader": "^4.1.1", "webpack": "^5.11.1", "webpack-cli": "^4.3.0", "webpack-merge": "^5.7.3" }, "peerDependecies": { - "typedoc": "^0.23.21", - "typedoc-plugin-localization": "^3.0.1" + "typedoc": "^0.25.3", + "typedoc-plugin-localization": "^3.0.2" } } diff --git a/src/assets/css/elements/_buttons.sass b/src/assets/css/elements/_buttons.sass index d6a80cf..26a9985 100644 --- a/src/assets/css/elements/_buttons.sass +++ b/src/assets/css/elements/_buttons.sass @@ -36,3 +36,25 @@ &:hover color: #fff + +pre + button + position: absolute + inset-block-start: 4px + inset-inline-end: 4px + background: transparent + color: #09f + border: 1px solid #09f + font-size: 12px + font-weight: 600 + text-transform: uppercase + padding: 9px 16px + transition: all .25s ease-in-out + + &:hover + background: #09f + color: #fff + &:active + background: transparent + color: #09f + diff --git a/src/assets/js/src/typedoc/components/Search.ts b/src/assets/js/src/typedoc/components/Search.ts index b799cab..ae56afd 100644 --- a/src/assets/js/src/typedoc/components/Search.ts +++ b/src/assets/js/src/typedoc/components/Search.ts @@ -125,24 +125,31 @@ function bindEvents( }); } -function checkIndex(state: SearchState, searchEl: HTMLElement) { +async function checkIndex(state: SearchState, searchEl: HTMLElement) { if (state.index) return; if (window.searchData) { searchEl.classList.remove("loading"); searchEl.classList.add("ready"); - state.data = window.searchData; - state.index = Index.load(window.searchData.index); + + const res = await fetch(window.searchData as unknown as RequestInfo); + const json = new Blob([await res.arrayBuffer()]) + .stream() + .pipeThrough(new DecompressionStream("gzip")); + + const data: IData = await new Response(json).json(); + state.data = data; + state.index = Index.load(data.index); } } -function updateResults( +async function updateResults( searchEl: HTMLElement, results: HTMLElement, query: HTMLInputElement, state: SearchState ) { - checkIndex(state, searchEl); + await checkIndex(state, searchEl); // Don't clear results if loading state is not ready, // because loading or error message can be removed. if (!state.index || !state.data) return; diff --git a/src/index.tsx b/src/index.tsx index d8ce97b..53ca536 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,5 +1,5 @@ -import path from 'path'; -import { copy } from "fs-extra"; +import { cpSync } from 'fs'; +import { resolve } from 'path'; import { navigation } from './partials/navigation'; import { index } from './partials/index'; import { memberSources } from './partials/member.sources'; @@ -8,7 +8,7 @@ import { reflectionTemplate } from './templates/reflection'; import { memberSignatureBody } from './partials/member.signature.body'; import { breadcrumb } from './partials/breadcrumb'; -import { Application, DefaultTheme, DefaultThemeRenderContext, JSX, Options, PageEvent, Reflection, Renderer, RendererEvent } from "typedoc"; +import { Application, DefaultTheme, DefaultThemeRenderContext, JSX, Options, PageEvent, Reflection, RenderTemplate, Renderer, RendererEvent } from "typedoc"; import { defaultLayout } from "./layouts/default"; function bind(fn: (f: F, ...a: L) => R, first: F) { @@ -16,8 +16,8 @@ function bind(fn: (f: F, ...a: L) => R, first: F) { } export class IgThemeRenderContext extends DefaultThemeRenderContext { - constructor(theme: DefaultTheme, options: Options) { - super(theme, options); + constructor(theme: DefaultTheme, page: PageEvent, options: Options) { + super(theme, page, options); this.reflectionTemplate = bind(reflectionTemplate, this); this.navigation = bind(navigation, this); @@ -27,9 +27,9 @@ export class IgThemeRenderContext extends DefaultThemeRenderContext { this.memberSignatureBody = bind(memberSignatureBody, this); this.breadcrumb = bind(breadcrumb, this); - this.defaultLayout = (props: PageEvent) => { + this.defaultLayout = (template: RenderTemplate>, props: PageEvent) => { return ( - defaultLayout(this, props) + defaultLayout(this, template, props) ); } } @@ -41,22 +41,17 @@ export class IgTheme extends DefaultTheme { public constructor(renderer: Renderer) { super(renderer); - renderer.on(RendererEvent.END, async () => { - const out = this.application.options.getValue('out'); - - await copy( - path.join( - process.cwd(), - '/node_modules/ig-typedoc-theme/dist/assets', - ), - path.join(out, '/assets'), - ); + renderer.on(RendererEvent.END, () => { + const from = resolve(__dirname, "./assets"); + const to = resolve(this.application.options.getValue("out"), "assets"); + cpSync(from, to, { recursive: true }); }); } - override getRenderContext(): IgThemeRenderContext { + override getRenderContext(pageEvent: PageEvent): IgThemeRenderContext { this._ctx ||= new IgThemeRenderContext( this, + pageEvent, this.application.options ); return this._ctx; diff --git a/src/layouts/default.tsx b/src/layouts/default.tsx index 8befaf3..a763e20 100644 --- a/src/layouts/default.tsx +++ b/src/layouts/default.tsx @@ -1,4 +1,4 @@ -import { DefaultThemeRenderContext, PageEvent, Reflection, JSX } from "typedoc"; +import { DefaultThemeRenderContext, PageEvent, Reflection, ReflectionKind, JSX, RenderTemplate } from "typedoc"; import { analytics } from "../partials/analytics"; import { footer } from "../partials/footer"; import { header } from "../partials/header"; @@ -6,7 +6,7 @@ import { navigation } from "../partials/navigation"; import { getConfigData, hasTypeParameters, join } from "../utils/lib"; const plugin = require('typedoc-plugin-localization'); -export const defaultLayout = (context: DefaultThemeRenderContext, props: PageEvent) => { +export const defaultLayout = (context: DefaultThemeRenderContext, template: RenderTemplate>, props: PageEvent) => { const defaultEnUrl = getConfigData(context, 'typedoc_default_url', 'en'); const defaultJpUrl = getConfigData(context, 'typedoc_default_url', 'jp'); const baseUrl = getConfigData(context, 'url'); @@ -109,7 +109,7 @@ export const defaultLayout = (context: DefaultThemeRenderContext, props: PageEve
{!!props.model.parent &&
    {context.breadcrumb(props.model)}
}

- {props.model.kindString !== "Project" && `${props.model.kindString ?? ""} `} + {ReflectionKind.singularString(props.model.kind) !== "Project" && `${ReflectionKind.singularString(props.model.kind) ?? ""} `} {props.model.name} {hasTypeParameters(props.model) && ( <> @@ -121,7 +121,7 @@ export const defaultLayout = (context: DefaultThemeRenderContext, props: PageEve

- {props.template(props)} + {template(props)} diff --git a/src/partials/index.tsx b/src/partials/index.tsx index e6a391e..60ff98f 100644 --- a/src/partials/index.tsx +++ b/src/partials/index.tsx @@ -1,4 +1,4 @@ -import { DefaultThemeRenderContext, ReflectionCategory, JSX, ContainerReflection} from "typedoc"; +import { DefaultThemeRenderContext, ReflectionCategory, JSX, ContainerReflection, ReflectionKind} from "typedoc"; import { wbr } from "../utils/lib"; function renderCategory({ urlTo }: DefaultThemeRenderContext, item: ReflectionCategory, prependName = "") { @@ -7,9 +7,9 @@ function renderCategory({ urlTo }: DefaultThemeRenderContext, item: ReflectionCa

{prependName ? `${prependName} ${item.title}` : item.title}