Merge branch 'component-option-types' into preview-features

This commit is contained in:
the1812 2022-08-22 22:48:08 +08:00
commit fb81b76e66
36 changed files with 148 additions and 133 deletions

View File

@ -1,8 +1,8 @@
import { ComponentMetadata } from '@/components/types'
import { defineComponentMetadata } from '@/components/define'
import { getNumberValidator, getUID, none } from '@/core/utils'
import { autoMatchMedal } from './auto-match'
export const component: ComponentMetadata = {
export const component = defineComponentMetadata({
name: 'badgeHelper',
displayName: '直播勋章快速更换',
description: {
@ -37,4 +37,4 @@ export const component: ComponentMetadata = {
urlInclude: [
'//live.bilibili.com',
],
}
})

View File

@ -1,5 +1,5 @@
import { waitForControlBar } from '@/components/live/live-control-bar'
import { ComponentMetadata } from '@/components/types'
import { defineComponentMetadata } from '@/components/define'
import { getUID } from '@/core/utils'
import { liveUrls } from '@/core/utils/urls'
import { leftControllerSelector } from './original-elements'
@ -27,7 +27,7 @@ const entry = async () => {
},
})
}
export const component: ComponentMetadata = {
export const component = defineComponentMetadata({
name: 'liveDanmakuSendbar',
displayName: '直播弹幕发送栏',
tags: [
@ -40,4 +40,4 @@ export const component: ComponentMetadata = {
reload: () => document.body.classList.remove('danmaku-send-bar-unloaded'),
unload: () => document.body.classList.add('danmaku-send-bar-unloaded'),
urlInclude: liveUrls,
}
})

View File

@ -1,6 +1,6 @@
import { ComponentMetadata } from '@/components/types'
import { defineComponentMetadata } from '@/components/define'
export const component: ComponentMetadata = {
export const component = defineComponentMetadata({
name: 'downloadLiveRecords',
displayName: '直播录像下载',
description: {
@ -16,4 +16,4 @@ export const component: ComponentMetadata = {
urlInclude: [
/^https:\/\/live\.bilibili\.com\/record\/(.+)/,
],
}
})

View File

@ -1,5 +1,5 @@
import { waitForControlBar } from '@/components/live/live-control-bar'
import { ComponentMetadata } from '@/components/types'
import { defineComponentMetadata } from '@/components/define'
import { select as spinSelect } from '@/core/spin-query'
import { addStyle, removeStyle } from '@/core/style'
import { liveUrls } from '@/core/utils/urls'
@ -220,7 +220,7 @@ function unload() {
removeStyle(componentName)
}
export const component: ComponentMetadata = {
export const component = defineComponentMetadata({
name: componentName,
displayName: '直播全屏包裹',
description: {
@ -231,4 +231,4 @@ export const component: ComponentMetadata = {
entry,
reload,
unload,
}
})

View File

@ -1,9 +1,9 @@
import { ComponentMetadata } from '@/components/types'
import { defineComponentMetadata } from '@/components/define'
import { addComponentListener } from '@/core/settings'
import { addStyle, removeStyle } from '@/core/style'
const liveHome = /^https:\/\/live\.bilibili\.com\/(index\.html)?$/
export const component: ComponentMetadata = {
export const component = defineComponentMetadata({
name: 'liveHomeMute',
displayName: '直播首页静音',
tags: [
@ -47,4 +47,4 @@ export const component: ComponentMetadata = {
})
},
},
}
})

View File

@ -1,8 +1,8 @@
import { ComponentMetadata } from '@/components/types'
import { defineComponentMetadata } from '@/components/define'
import { toggleStyle } from '@/components/styled-component'
import { liveUrls } from '@/core/utils/urls'
export const component: ComponentMetadata = {
export const component = defineComponentMetadata({
...toggleStyle('removeLiveWatermark', () => import('./remove-watermark.scss')),
displayName: '删除直播水印',
tags: [
@ -13,4 +13,4 @@ export const component: ComponentMetadata = {
'zh-CN': '删除观看直播时角落的水印.',
},
urlInclude: liveUrls,
}
})

View File

@ -1,4 +1,4 @@
import { ComponentMetadata } from '@/components/types'
import { defineComponentMetadata } from '@/components/define'
import { liveUrls } from '@/core/utils/urls'
const id = 'dpi-live-showgirl'
@ -14,7 +14,7 @@ const entry = async () => {
`, id)
}
}
export const component: ComponentMetadata = {
export const component = defineComponentMetadata({
name: 'dpiLiveShowgirl',
displayName: '直播看板娘高 DPI 适配',
enabledByDefault: window.devicePixelRatio > 1,
@ -31,4 +31,4 @@ export const component: ComponentMetadata = {
document.getElementById(id)?.remove()
},
urlInclude: liveUrls,
}
})

View File

@ -1,7 +1,7 @@
import { ComponentMetadata } from '@/components/types'
import { defineComponentMetadata } from '@/components/define'
import { liveUrls } from '@/core/utils/urls'
export const component: ComponentMetadata = {
export const component = defineComponentMetadata({
name: 'collapseLiveSideBar',
entry: none,
instantStyles: [
@ -17,4 +17,4 @@ export const component: ComponentMetadata = {
componentsTags.style,
],
urlInclude: liveUrls,
}
})

View File

@ -1,11 +1,11 @@
import { toggleStyle } from '@/components/styled-component'
import { ComponentMetadata } from '@/components/types'
import { defineComponentMetadata } from '@/components/define'
export const component: ComponentMetadata = {
export const component = defineComponentMetadata({
...toggleStyle('alwaysShowDuration', () => import('./always-show-duration.scss')),
displayName: '总是显示视频时长',
description: {
'zh-CN': '使脚本展示的各种视频卡片中的时长无需鼠标经过也能一直显示.',
},
tags: [componentsTags.video, componentsTags.style],
}
})

View File

@ -1,8 +1,8 @@
import { ComponentMetadata } from '@/components/types'
import { defineComponentMetadata } from '@/components/define'
import { addComponentListener } from '@/core/settings'
import { getNumberValidator } from '@/core/utils'
export const component: ComponentMetadata = {
export const component = defineComponentMetadata({
name: 'autoHideSidebar',
entry: () => {
addComponentListener('autoHideSidebar.triggerWidth', (value: number) => {
@ -28,4 +28,4 @@ export const component: ComponentMetadata = {
description: {
'zh-CN': '自动隐藏脚本的侧栏 (功能和设置图标). 设置面板停靠在右侧时不建议使用, 因为网页的滚动条会占用右边缘的触发区域.',
},
}
})

View File

@ -1,10 +1,10 @@
import { ComponentMetadata } from '@/components/types'
import { defineComponentMetadata } from '@/components/define'
import { LaunchBarActionProvider } from '@/components/launch-bar/launch-bar-action'
import { urlInclude, urlExclude } from './urls'
import { entry } from './entry'
const styleID = 'custom-navbar-style'
export const component: ComponentMetadata = {
export const component = defineComponentMetadata({
name: 'customNavbar',
displayName: '自定义顶栏',
description: `
@ -121,4 +121,4 @@ export const component: ComponentMetadata = {
})
},
},
}
})

View File

@ -1,4 +1,4 @@
import { ComponentMetadata } from '@/components/types'
import { defineComponentMetadata } from '@/components/define'
import { darkExcludes } from './dark-urls'
const changeDelay = 200
@ -27,7 +27,7 @@ const remove = async () => {
}
}
export const component: ComponentMetadata = {
export const component = defineComponentMetadata({
name: 'darkMode',
displayName: '夜间模式',
entry: () => {
@ -73,4 +73,4 @@ export const component: ComponentMetadata = {
},
},
urlExclude: darkExcludes,
}
})

View File

@ -1,8 +1,8 @@
import { ComponentMetadata } from '@/components/types'
import { defineComponentMetadata } from '@/components/define'
import { toggleStyle } from '@/components/styled-component'
import { bangumiUrls } from '@/core/utils/urls'
export const component: ComponentMetadata = {
export const component = defineComponentMetadata({
displayName: '隐藏番剧点评',
tags: [
componentsTags.style,
@ -12,4 +12,4 @@ export const component: ComponentMetadata = {
description: {
'zh-CN': '隐藏番剧播放页面里的点评板块.',
},
}
})

View File

@ -1,8 +1,8 @@
import { ComponentMetadata } from '@/components/types'
import { defineComponentMetadata } from '@/components/define'
import { toggleStyle } from '@/components/styled-component'
import { bangumiUrls } from '@/core/utils/urls'
export const component: ComponentMetadata = {
export const component = defineComponentMetadata({
displayName: '隐藏番剧承包',
tags: [
componentsTags.style,
@ -12,4 +12,4 @@ export const component: ComponentMetadata = {
description: {
'zh-CN': '隐藏番剧页面下方的承包榜, 以及右边的承包按钮.',
},
}
})

View File

@ -1,7 +1,7 @@
import { ComponentMetadata } from '@/components/types'
import { defineComponentMetadata } from '@/components/define'
import { mainSiteUrls } from '@/core/utils/urls'
export const component: ComponentMetadata = {
export const component = defineComponentMetadata({
name: 'hideBanner',
entry: none,
displayName: '隐藏顶部横幅',
@ -16,4 +16,4 @@ export const component: ComponentMetadata = {
'zh-CN': '隐藏首页顶部横幅.',
},
urlInclude: mainSiteUrls,
}
})

View File

@ -1,7 +1,7 @@
import { ComponentMetadata } from '@/components/types'
import { defineComponentMetadata } from '@/components/define'
import { videoUrls } from '@/core/utils/urls'
export const component: ComponentMetadata = {
export const component = defineComponentMetadata({
name: 'hideRecommendedLive',
entry: none,
instantStyles: [
@ -19,4 +19,4 @@ export const component: ComponentMetadata = {
'zh-CN': '隐藏视频页面右侧下方的直播推荐.',
},
urlInclude: videoUrls,
}
})

View File

@ -1,7 +1,7 @@
import { ComponentMetadata } from '@/components/types'
import { defineComponentMetadata } from '@/components/define'
import { videoAndBangumiUrls } from '@/core/utils/urls'
export const component: ComponentMetadata = {
export const component = defineComponentMetadata({
name: 'hideRelatedVideos',
displayName: '隐藏视频推荐',
entry: none,
@ -19,4 +19,4 @@ export const component: ComponentMetadata = {
'zh-CN': '隐藏番剧和视频页面右侧的推荐视频列表. 注意: 如果你想关闭 b 站的自动连播 (自动播放下一个推荐视频) 功能, 需要先取消隐藏视频推荐才能看到开关.',
},
urlInclude: videoAndBangumiUrls,
}
})

View File

@ -1,8 +1,8 @@
import { ComponentMetadata } from '@/components/types'
import { defineComponentMetadata } from '@/components/define'
import { toggleStyle } from '@/components/styled-component'
import { playerUrls } from '@/core/utils/urls'
export const component: ComponentMetadata = {
export const component = defineComponentMetadata({
displayName: '隐藏视频标题层',
...toggleStyle('hideVideoTopMask', () => import('./top-mask.scss')),
tags: [
@ -12,4 +12,4 @@ export const component: ComponentMetadata = {
'zh-CN': '隐藏视频里鼠标经过时出现在右上角的覆盖层.',
},
urlInclude: playerUrls,
}
})

View File

@ -1,10 +1,10 @@
import { ComponentMetadata } from '@/components/types'
import { defineComponentMetadata } from '@/components/define'
import { contentLoaded } from '@/core/life-cycle'
import { addComponentListener } from '@/core/settings'
import { getNumberValidator, mountVueComponent } from '@/core/utils'
import { homeUrls } from '../urls'
export const component: ComponentMetadata = {
export const component = defineComponentMetadata({
name: 'freshHome',
displayName: '清爽首页',
urlInclude: homeUrls,
@ -56,4 +56,4 @@ export const component: ComponentMetadata = {
style: () => import('../hide-original.scss'),
},
],
}
})

View File

@ -1,6 +1,6 @@
import { ComponentMetadata } from '@/components/types'
import { defineComponentMetadata } from '@/components/define'
export const component: ComponentMetadata = {
export const component = defineComponentMetadata({
name: 'playerOnTop',
displayName: '播放器置顶',
description: {
@ -14,4 +14,4 @@ export const component: ComponentMetadata = {
],
tags: [componentsTags.style, componentsTags.video],
entry: none,
}
})

View File

@ -1,7 +1,7 @@
import { ComponentMetadata } from '@/components/types'
import { defineComponentMetadata } from '@/components/define'
import { allVideoUrls } from '@/core/utils/urls'
export const component: ComponentMetadata = {
export const component = defineComponentMetadata({
name: 'playerShadow',
displayName: '播放器投影',
entry: none,
@ -19,4 +19,4 @@ export const component: ComponentMetadata = {
'zh-CN': '为播放器添加主题色投影.',
},
urlInclude: allVideoUrls,
}
})

View File

@ -1,6 +1,6 @@
import { ComponentMetadata } from '@/components/types'
import { defineComponentMetadata } from '@/components/define'
export const component: ComponentMetadata = {
export const component = defineComponentMetadata({
name: 'elegantScrollbar',
entry: none,
displayName: '使用细滚动条',
@ -15,4 +15,4 @@ export const component: ComponentMetadata = {
style: () => import('./scrollbar.scss'),
},
],
}
})

View File

@ -1,8 +1,8 @@
import { ComponentMetadata } from '@/components/types'
import { defineComponentMetadata } from '@/components/define'
import { addComponentListener } from '@/core/settings'
import { getNumberValidator } from '@/core/utils'
export const component: ComponentMetadata = {
export const component = defineComponentMetadata({
name: 'sidebarOffset',
displayName: '侧栏垂直偏移',
tags: [componentsTags.style],
@ -27,4 +27,4 @@ export const component: ComponentMetadata = {
validator: getNumberValidator(-40, 40),
},
},
}
})

View File

@ -1,7 +1,7 @@
import { ComponentMetadata } from '@/components/types'
import { defineComponentMetadata } from '@/components/define'
const name = 'simplifyComments'
export const component: ComponentMetadata = {
export const component = defineComponentMetadata({
name,
entry: async ({ metadata }) => {
const { addComponentListener } = await import('@/core/settings')
@ -32,4 +32,4 @@ export const component: ComponentMetadata = {
tags: [
componentsTags.style,
],
}
})

View File

@ -1,16 +1,31 @@
import { ComponentEntry, ComponentMetadata } from '@/components/types'
import { defineComponentMetadata, defineOptionsMetadata, OptionsOfMetadata } from '@/components/define'
import { ComponentEntry } from '@/components/types'
import { toggleStyle } from '@/components/styled-component'
import { playerUrls } from '@/core/utils/urls'
import { addComponentListener } from '@/core/settings'
const entry: ComponentEntry = ({ metadata, settings: { options } }) => {
Object.keys(options).forEach(disableType => {
const options = defineOptionsMetadata({
highlight: {
displayName: '禁用高赞弹幕',
defaultValue: true,
},
up: {
displayName: '禁用UP主弹幕',
defaultValue: true,
},
})
type Options = OptionsOfMetadata<typeof options>
const entry: ComponentEntry<Options> = ({ metadata, settings }) => {
Object.keys(settings.options).forEach(disableType => {
addComponentListener(`${metadata.name}.${disableType}`, (value: boolean) => {
document.body.classList.toggle(`disable-${disableType}-danmaku-style`, value)
}, true)
})
}
export const component: ComponentMetadata = {
export const component = defineComponentMetadata({
displayName: '禁用特殊弹幕样式',
tags: [
componentsTags.style,
@ -20,14 +35,5 @@ export const component: ComponentMetadata = {
description: {
'zh-CN': '移除高赞弹幕或 UP 主弹幕的特殊样式, 弹幕内容不会移除.',
},
options: {
highlight: {
displayName: '禁用高赞弹幕',
defaultValue: true,
},
up: {
displayName: '禁用UP主弹幕',
defaultValue: true,
},
},
}
options,
})

View File

@ -1,6 +1,6 @@
import { ComponentMetadata } from '@/components/types'
import { defineComponentMetadata } from '@/components/define'
export const component: ComponentMetadata = {
export const component = defineComponentMetadata({
name: 'v1PanelStyle',
displayName: 'v1 风格设置面板',
tags: [componentsTags.style],
@ -12,4 +12,4 @@ export const component: ComponentMetadata = {
name: 'v1PanelStyle',
style: () => import('./v1-panel.scss'),
}],
}
})

View File

@ -1,4 +1,6 @@
import { defineComponentMetadata, defineOptionsMetadata } from '@/components/define'
import {
defineComponentMetadata, defineOptionsMetadata, OptionsOfMetadata,
} from '@/components/define'
import { ComponentEntry } from '@/components/types'
import { matchUrlPattern } from '@/core/utils'
import { videoUrls, watchlaterUrls } from '@/core/utils/urls'
@ -10,7 +12,10 @@ const options = defineOptionsMetadata({
displayName: '在稍后再看页面中仍然显示',
},
})
const entry: ComponentEntry<typeof options> = async ({ settings }) => {
type Options = OptionsOfMetadata<typeof options>
const entry: ComponentEntry<Options> = async ({ settings }) => {
if (watchlaterUrls.some(matchUrlPattern) && !settings.options.showInWatchlaterPages) {
return
}

View File

@ -278,8 +278,12 @@ export class ExtendSpeedComponent extends EntrySpeedComponent<Options> {
protected unpatch: TeardownLogic
protected migrate() {
type MixedRememberSpeedOptions = Partial<RememberSpeedOptions> & {
extendList?: number[]
extend?: unknown
}
const { options } = this.settings
const { options: rememberSpeedOptions } = getComponentSettings('rememberVideoSpeed') as ComponentSettings<RememberSpeedOptions>
const { options: rememberSpeedOptions } = getComponentSettings('rememberVideoSpeed') as ComponentSettings<MixedRememberSpeedOptions>
if (rememberSpeedOptions.extendList) {
options.extendSpeedList = Array.from(rememberSpeedOptions.extendList as number[])
delete rememberSpeedOptions.extendList

View File

@ -62,7 +62,12 @@ export class RememberSpeedComponent extends EntrySpeedComponent<Options> {
}
protected migrate() {
const { options } = this.settings
type MinedOptions = Partial<Options> & {
speed?: number
individualRememberList?: Record<string, (number | string)[]>
remember?: boolean
}
const { options }: { options: MinedOptions } = this.settings
let flag = false
if (options.speed) {
options.globalSpeed = +options.speed || 1
@ -72,7 +77,7 @@ export class RememberSpeedComponent extends EntrySpeedComponent<Options> {
if (options.individualRememberList) {
options.individualRememberRecord = lodash.cloneDeep(
options.individualRememberList,
) as Record<string, (number | string)[]>
)
delete options.individualRememberList
flag = true
}

View File

@ -1,4 +1,6 @@
import { defineComponentMetadata, defineOptionsMetadata } from '@/components/define'
import {
defineComponentMetadata, defineOptionsMetadata, OptionsOfMetadata,
} from '@/components/define'
import { ComponentEntry } from '@/components/types'
import { matchUrlPattern } from '@/core/utils'
import { favoriteListUrls, videoUrls } from '@/core/utils/urls'
@ -15,7 +17,10 @@ const options = defineOptionsMetadata({
displayName: '在收藏夹播放页面仍然显示',
},
})
const entry: ComponentEntry<typeof options> = async ({ settings }) => {
type Options = OptionsOfMetadata<typeof options>
const entry: ComponentEntry<Options> = async ({ settings }) => {
if (favoriteListUrls.some(matchUrlPattern) && !settings.options.showInFavoritePages) {
return
}

View File

@ -1,6 +1,11 @@
import { PluginMetadata } from '@/plugins/plugin'
import { TagFilter } from '@/components/settings-panel/tag-filter'
import { ComponentMetadata } from '@/components/types'
import type { Options as SettingPanelOptions } from '@/components/settings-panel'
type ExtendedOptions = SettingPanelOptions & {
recentComponents?: Record<string, number>
}
export const plugin: PluginMetadata = {
name: 'settingsPanel.tagFilters.recentComponents',
@ -9,7 +14,7 @@ export const plugin: PluginMetadata = {
setup: ({ addData, addHook }) => {
const getRecentComponents = async () => {
const { getGeneralSettings } = await import('@/core/settings')
const generalSettings = getGeneralSettings()
const generalSettings: ExtendedOptions = getGeneralSettings()
if (!generalSettings.recentComponents) {
generalSettings.recentComponents = {}
}

View File

@ -62,7 +62,9 @@ const optionsMetadata = defineOptionsMetadata({
},
})
const entry: ComponentEntry<typeof optionsMetadata> = async ({
type Options = OptionsOfMetadata<typeof optionsMetadata>
const entry: ComponentEntry<Options> = async ({
settings: { options: opt },
}) => {
if (isIframe()) {

View File

@ -1,6 +1,5 @@
import {
ComponentMetadata,
OptionalOptionsMetadata,
ComponentMetadata, EmptyOptions,
OptionMetadata,
OptionsMetadata,
UnknownOptions,
@ -23,5 +22,5 @@ export const defineOptionsMetadata = <
/** 定义组件 */
export const defineComponentMetadata = <
Om extends OptionalOptionsMetadata
>(m: ComponentMetadata<Om>): ComponentMetadata<Om> => m
O extends UnknownOptions = EmptyOptions
>(m: ComponentMetadata<O>): ComponentMetadata<O> => m

View File

@ -71,7 +71,7 @@ const options = defineOptionsMetadata({
export type Options = OptionsOfMetadata<typeof options>
const entry: ComponentEntry<typeof options> = async ({ metadata }) => {
const entry: ComponentEntry<Options> = async ({ metadata }) => {
const { isIframe } = await import('@/core/utils')
if (isIframe()) {
return

View File

@ -154,41 +154,32 @@ export const componentsTags = {
} as ComponentTag,
}
/**
* OptionalOptionsMetadata Options
* undefined EmptyOptions
*/
export type OptionsFromOptionalMetadata<M extends OptionalOptionsMetadata> = (
M extends undefined | Record<string, never> ? EmptyOptions :
M extends OptionsMetadata<infer O> ? O : never
)
/** 组件入口函数的参数 */
export interface ComponentEntryContext<
Om extends OptionalOptionsMetadata = OptionalOptionsMetadata
O extends UnknownOptions = UnknownOptions
> {
/** 当前组件的设置 */
settings: ComponentSettings<OptionsFromOptionalMetadata<Om>>
settings: ComponentSettings<O>
/** 当前组件的信息 */
metadata: ComponentMetadata<Om>
metadata: ComponentMetadata<O>
/** 核心 API */
coreApis: CoreApis
}
/** 组件入口函数 */
export type ComponentEntry<
Om extends OptionalOptionsMetadata = OptionalOptionsMetadata,
O extends UnknownOptions = UnknownOptions,
T = unknown
> = (
context: ComponentEntryContext<Om>
context: ComponentEntryContext<O>
) => T | Promise<T>
/** 带有函数/复杂对象的组件信息 */
export interface FunctionalMetadata<
Om extends OptionalOptionsMetadata = OptionalOptionsMetadata
O extends UnknownOptions = UnknownOptions
> {
/** 主入口, 重新开启时不会再运行 */
entry: ComponentEntry<Om>
entry: ComponentEntry<O>
/** 导出小组件 */
widget?: Omit<Widget, 'name'>
/** 首屏样式, 会尽快注入 (before DCL) */
@ -216,15 +207,10 @@ export interface FunctionalMetadata<
i18n?: Record<string, LanguagePack | Executable<LanguagePack>>
}
/** ComponentMetadata 的类型参数,用于表达其可选参数 options 的类型 */
export type OptionalOptionsMetadata<O extends UnknownOptions = UnknownOptions> = (
OptionsMetadata<O> | undefined
)
/** 组件基本信息 */
export interface ComponentMetadata<
Om extends OptionalOptionsMetadata = OptionalOptionsMetadata
> extends FeatureBase, FunctionalMetadata<Om> {
O extends UnknownOptions = UnknownOptions
> extends FeatureBase, FunctionalMetadata<O> {
/** 组件名称 */
name: string
/** 显示名称 */
@ -238,7 +224,7 @@ export interface ComponentMetadata<
/** 是否在设置界面中隐藏 (代码仍可操作) */
hidden?: boolean
/** 组件子选项 */
options?: Om
options?: OptionsMetadata<O>
/** 是否支持热重载 */
// allowHotReload?: boolean
}

View File

@ -1,8 +1,6 @@
import {
ComponentMetadata,
componentsMap,
OptionalOptionsMetadata,
OptionsFromOptionalMetadata,
OptionsMetadata,
UnknownOptions,
} from '@/components/component'
@ -24,9 +22,9 @@ export const metadataToOptions = <O extends UnknownOptions>(
*
* @param component
*/
export const componentToSettings = <Om extends OptionalOptionsMetadata>(
component: ComponentMetadata<Om>,
): ComponentSettings<OptionsFromOptionalMetadata<Om>> => {
export const componentToSettings = <O extends UnknownOptions>(
component: ComponentMetadata<O>,
): ComponentSettings<O> => {
const { options: meta } = component
return {
enabled: component.enabledByDefault ?? true,