svelte-settings
Version:
> [!WARNING] > This project is a work in progress. Do not use it in any of your projects yet.
71 lines (70 loc) • 2.58 kB
JavaScript
import BasicPageRenderer from './components/pages/BasicPageRenderer.svelte';
import ChangelogPage from './components/pages/ChangelogPage.svelte';
import ListSettingPage from './components/pages/ListSettingPage.svelte';
import BasicItemRenderer from './components/items/BasicItemRenderer.svelte';
import ActionItem from './components/items/ActionItem.svelte';
import DescriptionItem from './components/items/DescriptionItem.svelte';
import PageItem from './components/items/PageItem.svelte';
import NotImplementedItem from './components/items/NotImplementedItem.svelte';
import ValueDisplayItem from './components/items/ValueDisplayItem.svelte';
import GroupWrapper from './components/wrappers/GroupWrapper.svelte';
import BooleanInput from './components/inputs/BooleanInput.svelte';
import SelectInput from './components/inputs/SelectInput.svelte';
import NumberInput from './components/inputs/NumberInput.svelte';
import MultiSelectInput from './components/inputs/MultiSelectInput.svelte';
import MultiSelectReorderInput from './components/inputs/MultiSelectReorderInput.svelte';
import TextInput from './components/inputs/TextInput.svelte';
// TODO: consider making this a real one-source-of-truth registry, where each component is registered, e.g.
// { key: 'changelog', type: 'page', component: ChangelogPage }
const inputs = {
select: SelectInput,
multiselect: MultiSelectInput,
'multiselect-reorder': MultiSelectReorderInput,
boolean: BooleanInput,
number: NumberInput,
text: TextInput,
};
export function getInputComponent(type) {
return inputs[type];
}
export function isInput(item) {
return item.type in inputs;
}
const pages = {
changelog: ChangelogPage,
list: ListSettingPage,
page: BasicPageRenderer,
};
export function getPageComponent(type) {
return pages[type];
}
export function isPage(item) {
return item.type in pages;
}
const items = {
action: ActionItem,
description: DescriptionItem,
value: ValueDisplayItem,
'not-implemented': NotImplementedItem,
};
export function getItemComponent(item) {
if (isPage(item))
return PageItem;
if (isInput(item))
return BasicItemRenderer;
if (isItem(item))
return items[item.type];
if (isWrapper(item))
return wrappers[item.type];
console.error('Settings item with unknown type: ', item);
return NotImplementedItem;
}
export function isItem(item) {
return item.type in items;
}
const wrappers = {
group: GroupWrapper,
};
export function isWrapper(item) {
return item.type in wrappers;
}